From f3189e26cff5142e200568a81ef3db608530cc6f Mon Sep 17 00:00:00 2001 From: Thomas Park Date: Fri, 27 Jun 2014 01:07:56 -0400 Subject: 3.1.1 -> 3.2.0 --- bower_components/bootstrap/Gruntfile.js | 253 ++++++++++++++++++++------------ 1 file changed, 156 insertions(+), 97 deletions(-) (limited to 'bower_components/bootstrap/Gruntfile.js') diff --git a/bower_components/bootstrap/Gruntfile.js b/bower_components/bootstrap/Gruntfile.js index 600c1f12..66e1de36 100644 --- a/bower_components/bootstrap/Gruntfile.js +++ b/bower_components/bootstrap/Gruntfile.js @@ -17,10 +17,10 @@ module.exports = function (grunt) { var fs = require('fs'); var path = require('path'); + var npmShrinkwrap = require('npm-shrinkwrap'); var generateGlyphiconsData = require('./grunt/bs-glyphicons-data-generator.js'); var BsLessdocParser = require('./grunt/bs-lessdoc-parser.js'); - var generateRawFilesJs = require('./grunt/bs-raw-files-generator.js'); - var updateShrinkwrap = require('./grunt/shrinkwrap.js'); + var generateRawFiles = require('./grunt/bs-raw-files-generator.js'); // Project configuration. grunt.initConfig({ @@ -32,6 +32,7 @@ module.exports = function (grunt) { ' * Copyright 2011-<%= grunt.template.today("yyyy") %> <%= pkg.author %>\n' + ' * Licensed under <%= pkg.license.type %> (<%= pkg.license.url %>)\n' + ' */\n', + // NOTE: This jqueryCheck code is duplicated in customizer.js; if making changes here, be sure to update the other copy too. jqueryCheck: 'if (typeof jQuery === \'undefined\') { throw new Error(\'Bootstrap\\\'s JavaScript requires jQuery\') }\n\n', // Task configuration. @@ -53,43 +54,37 @@ module.exports = function (grunt) { src: 'js/*.js' }, test: { + options: { + jshintrc: 'js/tests/unit/.jshintrc' + }, src: 'js/tests/unit/*.js' }, assets: { - src: ['docs/assets/js/application.js', 'docs/assets/js/customizer.js'] + src: ['docs/assets/js/_src/*.js', 'docs/assets/js/*.js', '!docs/assets/js/*.min.js'] } }, jscs: { options: { - config: 'js/.jscs.json', + config: 'js/.jscsrc' }, grunt: { - src: ['Gruntfile.js', 'grunt/*.js'] + src: '<%= jshint.grunt.src %>' }, src: { - src: 'js/*.js' + src: '<%= jshint.src.src %>' }, test: { - src: 'js/tests/unit/*.js' + src: '<%= jshint.test.src %>' }, assets: { - src: ['docs/assets/js/application.js', 'docs/assets/js/customizer.js'] + options: { + requireCamelCaseOrUpperCaseIdentifiers: null + }, + src: '<%= jshint.assets.src %>' } }, - csslint: { - options: { - csslintrc: 'less/.csslintrc' - }, - src: [ - 'dist/css/bootstrap.css', - 'dist/css/bootstrap-theme.css', - 'docs/assets/css/docs.css', - 'docs/examples/**/*.css' - ] - }, - concat: { options: { banner: '<%= banner %>\n<%= jqueryCheck %>', @@ -116,42 +111,41 @@ module.exports = function (grunt) { uglify: { options: { - report: 'min' + preserveComments: 'some' }, bootstrap: { - options: { - banner: '<%= banner %>' - }, src: '<%= concat.bootstrap.dest %>', dest: 'dist/js/<%= pkg.name %>.min.js' }, customize: { - options: { - preserveComments: 'some' - }, src: [ - 'docs/assets/js/vendor/less.min.js', - 'docs/assets/js/vendor/jszip.min.js', - 'docs/assets/js/vendor/uglify.min.js', - 'docs/assets/js/vendor/blob.js', - 'docs/assets/js/vendor/filesaver.js', + 'docs/assets/js/_vendor/less.min.js', + 'docs/assets/js/_vendor/jszip.min.js', + 'docs/assets/js/_vendor/uglify.min.js', + 'docs/assets/js/_vendor/blob.js', + 'docs/assets/js/_vendor/filesaver.js', 'docs/assets/js/raw-files.min.js', - 'docs/assets/js/customizer.js' + 'docs/assets/js/_src/customizer.js' ], dest: 'docs/assets/js/customize.min.js' }, docsJs: { - options: { - preserveComments: 'some' - }, src: [ - 'docs/assets/js/vendor/holder.js', - 'docs/assets/js/application.js' + 'docs/assets/js/_vendor/holder.js', + 'docs/assets/js/_vendor/ZeroClipboard.min.js', + 'docs/assets/js/_src/application.js' ], dest: 'docs/assets/js/docs.min.js' } }, + qunit: { + options: { + inject: 'js/tests/unit/phantom.js' + }, + files: 'js/tests/index.html' + }, + less: { compileCore: { options: { @@ -176,49 +170,93 @@ module.exports = function (grunt) { files: { 'dist/css/<%= pkg.name %>-theme.css': 'less/theme.less' } + } + }, + + autoprefixer: { + options: { + browsers: [ + 'Android 2.3', + 'Android >= 4', + 'Chrome >= 20', + 'Firefox >= 24', // Firefox 24 is the latest ESR + 'Explorer >= 8', + 'iOS >= 6', + 'Opera >= 12', + 'Safari >= 6' + ] }, - minify: { + core: { options: { - cleancss: true, - report: 'min' + map: true }, - files: { - 'dist/css/<%= pkg.name %>.min.css': 'dist/css/<%= pkg.name %>.css', - 'dist/css/<%= pkg.name %>-theme.min.css': 'dist/css/<%= pkg.name %>-theme.css' - } + src: 'dist/css/<%= pkg.name %>.css' + }, + theme: { + options: { + map: true + }, + src: 'dist/css/<%= pkg.name %>-theme.css' + }, + docs: { + src: 'docs/assets/css/_src/docs.css' + }, + examples: { + expand: true, + cwd: 'docs/examples/', + src: ['**/*.css'], + dest: 'docs/examples/' } }, - cssmin: { - compress: { + csslint: { + options: { + csslintrc: 'less/.csslintrc' + }, + src: [ + 'dist/css/bootstrap.css', + 'dist/css/bootstrap-theme.css' + ], + examples: [ + 'docs/examples/**/*.css' + ], + docs: { options: { - keepSpecialComments: '*', - noAdvanced: true, // turn advanced optimizations off until the issue is fixed in clean-css - report: 'min', - selectorsMergeMode: 'ie8' + ids: false, + 'overqualified-elements': false }, + src: 'docs/assets/css/_src/docs.css' + } + }, + + cssmin: { + options: { + compatibility: 'ie8', + keepSpecialComments: '*', + noAdvanced: true + }, + core: { + files: { + 'dist/css/<%= pkg.name %>.min.css': 'dist/css/<%= pkg.name %>.css', + 'dist/css/<%= pkg.name %>-theme.min.css': 'dist/css/<%= pkg.name %>-theme.css' + } + }, + docs: { src: [ - 'docs/assets/css/docs.css', - 'docs/assets/css/pygments-manni.css' + 'docs/assets/css/_src/docs.css', + 'docs/assets/css/_src/pygments-manni.css' ], dest: 'docs/assets/css/docs.min.css' } }, usebanner: { - dist: { - options: { - position: 'top', - banner: '<%= banner %>' - }, - files: { - src: [ - 'dist/css/<%= pkg.name %>.css', - 'dist/css/<%= pkg.name %>.min.css', - 'dist/css/<%= pkg.name %>-theme.css', - 'dist/css/<%= pkg.name %>-theme.min.css' - ] - } + options: { + position: 'top', + banner: '<%= banner %>' + }, + files: { + src: 'dist/css/*.css' } }, @@ -227,16 +265,21 @@ module.exports = function (grunt) { config: 'less/.csscomb.json' }, dist: { - files: { - 'dist/css/<%= pkg.name %>.css': 'dist/css/<%= pkg.name %>.css', - 'dist/css/<%= pkg.name %>-theme.css': 'dist/css/<%= pkg.name %>-theme.css' - } + expand: true, + cwd: 'dist/css/', + src: ['*.css', '!*.min.css'], + dest: 'dist/css/' }, examples: { expand: true, cwd: 'docs/examples/', - src: ['**/*.css'], + src: '**/*.css', dest: 'docs/examples/' + }, + docs: { + files: { + 'docs/assets/css/_src/docs.css': 'docs/assets/css/_src/docs.css' + } } }, @@ -258,13 +301,6 @@ module.exports = function (grunt) { } }, - qunit: { - options: { - inject: 'js/tests/unit/phantom.js' - }, - files: 'js/tests/index.html' - }, - connect: { server: { options: { @@ -284,14 +320,14 @@ module.exports = function (grunt) { pretty: true, data: function () { var filePath = path.join(__dirname, 'less/variables.less'); - var fileContent = fs.readFileSync(filePath, {encoding: 'utf8'}); + var fileContent = fs.readFileSync(filePath, { encoding: 'utf8' }); var parser = new BsLessdocParser(fileContent); - return {sections: parser.parseFile()}; + return { sections: parser.parseFile() }; } }, files: { - 'docs/_includes/customizer-variables.html': 'docs/jade/customizer-variables.jade', - 'docs/_includes/nav-customize.html': 'docs/jade/customizer-nav.jade' + 'docs/_includes/customizer-variables.html': 'docs/_jade/customizer-variables.jade', + 'docs/_includes/nav/customize.html': 'docs/_jade/customizer-nav.jade' } } }, @@ -343,8 +379,9 @@ module.exports = function (grunt) { options: { build: process.env.TRAVIS_JOB_ID, concurrency: 10, + maxRetries: 3, urls: ['http://127.0.0.1:3000/js/tests/index.html'], - browsers: grunt.file.readYAML('test-infra/sauce_browsers.yml') + browsers: grunt.file.readYAML('grunt/sauce_browsers.yml') } } }, @@ -352,34 +389,43 @@ module.exports = function (grunt) { exec: { npmUpdate: { command: 'npm update' - }, - npmShrinkWrap: { - command: 'npm shrinkwrap --dev' } } }); // These plugins provide necessary tasks. - require('load-grunt-tasks')(grunt, {scope: 'devDependencies'}); + require('load-grunt-tasks')(grunt, { scope: 'devDependencies' }); + require('time-grunt')(grunt); // Docs HTML validation task grunt.registerTask('validate-html', ['jekyll', 'validation']); + var runSubset = function (subset) { + return !process.env.TWBS_TEST || process.env.TWBS_TEST === subset; + }; + var isUndefOrNonZero = function (val) { + return val === undefined || val !== '0'; + }; + // Test task. var testSubtasks = []; // Skip core tests if running a different subset of the test suite - if (!process.env.TWBS_TEST || process.env.TWBS_TEST === 'core') { + if (runSubset('core')) { testSubtasks = testSubtasks.concat(['dist-css', 'csslint', 'jshint', 'jscs', 'qunit', 'build-customizer-html']); } // Skip HTML validation if running a different subset of the test suite - if (!process.env.TWBS_TEST || process.env.TWBS_TEST === 'validate-html') { + if (runSubset('validate-html') && + // Skip HTML5 validator on Travis when [skip validator] is in the commit message + isUndefOrNonZero(process.env.TWBS_DO_VALIDATOR)) { testSubtasks.push('validate-html'); } // Only run Sauce Labs tests if there's a Sauce access key if (typeof process.env.SAUCE_ACCESS_KEY !== 'undefined' && // Skip Sauce if running a different subset of the test suite - (!process.env.TWBS_TEST || process.env.TWBS_TEST === 'sauce-js-unit')) { + runSubset('sauce-js-unit') && + // Skip Sauce on Travis when [skip sauce] is in the commit message + isUndefOrNonZero(process.env.TWBS_DO_SAUCE)) { testSubtasks.push('connect'); testSubtasks.push('saucelabs-qunit'); } @@ -389,7 +435,8 @@ module.exports = function (grunt) { grunt.registerTask('dist-js', ['concat', 'uglify']); // CSS distribution task. - grunt.registerTask('dist-css', ['less', 'cssmin', 'csscomb', 'usebanner']); + grunt.registerTask('less-compile', ['less:compileCore', 'less:compileTheme']); + grunt.registerTask('dist-css', ['less-compile', 'autoprefixer', 'usebanner', 'csscomb', 'cssmin']); // Docs distribution task. grunt.registerTask('dist-docs', 'copy:docs'); @@ -398,24 +445,36 @@ module.exports = function (grunt) { grunt.registerTask('dist', ['clean', 'dist-css', 'copy:fonts', 'dist-js', 'dist-docs']); // Default task. - grunt.registerTask('default', ['test', 'dist', 'build-glyphicons-data', 'build-customizer', 'update-shrinkwrap']); + grunt.registerTask('default', ['test', 'dist', 'build-glyphicons-data', 'build-customizer']); // Version numbering task. // grunt change-version-number --oldver=A.B.C --newver=X.Y.Z // This can be overzealous, so its changes should always be manually reviewed! grunt.registerTask('change-version-number', 'sed'); - grunt.registerTask('build-glyphicons-data', generateGlyphiconsData); + grunt.registerTask('build-glyphicons-data', function () { generateGlyphiconsData.call(this, grunt); }); // task for building customizer grunt.registerTask('build-customizer', ['build-customizer-html', 'build-raw-files']); grunt.registerTask('build-customizer-html', 'jade'); grunt.registerTask('build-raw-files', 'Add scripts/less files to customizer.', function () { var banner = grunt.template.process('<%= banner %>'); - generateRawFilesJs(banner); + generateRawFiles(grunt, banner); }); - // Task for updating the npm packages used by the Travis build. - grunt.registerTask('update-shrinkwrap', ['exec:npmUpdate', 'exec:npmShrinkWrap', '_update-shrinkwrap']); - grunt.registerTask('_update-shrinkwrap', function () { updateShrinkwrap.call(this, grunt); }); + // Task for updating the cached npm packages used by the Travis build (which are controlled by test-infra/npm-shrinkwrap.json). + // This task should be run and the updated file should be committed whenever Bootstrap's dependencies change. + grunt.registerTask('update-shrinkwrap', ['exec:npmUpdate', '_update-shrinkwrap']); + grunt.registerTask('_update-shrinkwrap', function () { + var done = this.async(); + npmShrinkwrap({ dev: true, dirname: __dirname }, function (err) { + if (err) { + grunt.fail.warn(err) + } + var dest = 'test-infra/npm-shrinkwrap.json'; + fs.renameSync('npm-shrinkwrap.json', dest); + grunt.log.writeln('File ' + dest.cyan + ' updated.'); + done(); + }); + }); }; -- cgit v1.2.3