2014-01-21 01:00:52 +01:00
|
|
|
/*!
|
|
|
|
* Bootstrap's Gruntfile
|
2016-10-03 18:55:59 +02:00
|
|
|
* https://getbootstrap.com
|
2016-12-31 16:20:11 +01:00
|
|
|
* Copyright 2013-2017 The Bootstrap Authors
|
|
|
|
* Copyright 2013-2017 Twitter, Inc.
|
2014-01-21 01:00:52 +01:00
|
|
|
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
|
|
|
*/
|
2013-08-04 01:03:38 +02:00
|
|
|
|
2013-12-07 01:51:59 +01:00
|
|
|
module.exports = function (grunt) {
|
2016-12-31 06:25:26 +01:00
|
|
|
'use strict'
|
2013-08-04 01:03:38 +02:00
|
|
|
|
2013-12-03 12:07:57 +01:00
|
|
|
// Force use of Unix newlines
|
2016-12-31 06:25:26 +01:00
|
|
|
grunt.util.linefeed = '\n'
|
2013-12-03 12:07:57 +01:00
|
|
|
|
2013-12-08 11:24:47 +01:00
|
|
|
RegExp.quote = function (string) {
|
2016-12-31 06:25:26 +01:00
|
|
|
return string.replace(/[-\\^$*+?.()|[\]{}]/g, '\\$&')
|
|
|
|
}
|
2013-12-28 23:33:32 +01:00
|
|
|
|
2016-12-31 06:25:26 +01:00
|
|
|
var path = require('path')
|
|
|
|
var isTravis = require('is-travis')
|
2014-12-10 22:51:43 +01:00
|
|
|
|
2016-12-31 06:25:26 +01:00
|
|
|
var configBridge = grunt.file.readJSON('./grunt/configBridge.json', { encoding: 'utf8' })
|
2014-11-03 16:19:40 +01:00
|
|
|
|
|
|
|
Object.keys(configBridge.paths).forEach(function (key) {
|
|
|
|
configBridge.paths[key].forEach(function (val, i, arr) {
|
2016-12-31 06:25:26 +01:00
|
|
|
arr[i] = path.join('./docs', val)
|
|
|
|
})
|
|
|
|
})
|
2013-12-28 23:33:32 +01:00
|
|
|
|
2013-08-04 01:03:38 +02:00
|
|
|
// Project configuration.
|
|
|
|
grunt.initConfig({
|
|
|
|
|
|
|
|
// Metadata.
|
|
|
|
pkg: grunt.file.readJSON('package.json'),
|
2013-09-11 04:21:44 +02:00
|
|
|
banner: '/*!\n' +
|
2014-01-28 12:16:13 +01:00
|
|
|
' * Bootstrap v<%= pkg.version %> (<%= pkg.homepage %>)\n' +
|
|
|
|
' * Copyright 2011-<%= grunt.template.today("yyyy") %> <%= pkg.author %>\n' +
|
2015-08-10 08:16:43 +02:00
|
|
|
' * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n' +
|
2014-01-28 12:16:13 +01:00
|
|
|
' */\n',
|
2014-12-17 05:17:54 +01:00
|
|
|
jqueryCheck: 'if (typeof jQuery === \'undefined\') {\n' +
|
2016-11-27 03:46:28 +01:00
|
|
|
' throw new Error(\'Bootstrap\\\'s JavaScript requires jQuery. jQuery must be included before Bootstrap\\\'s JavaScript.\')\n' +
|
2014-12-17 05:17:54 +01:00
|
|
|
'}\n',
|
|
|
|
jqueryVersionCheck: '+function ($) {\n' +
|
|
|
|
' var version = $.fn.jquery.split(\' \')[0].split(\'.\')\n' +
|
2016-06-29 07:19:46 +02:00
|
|
|
' if ((version[0] < 2 && version[1] < 9) || (version[0] == 1 && version[1] == 9 && version[2] < 1) || (version[0] >= 4)) {\n' +
|
|
|
|
' throw new Error(\'Bootstrap\\\'s JavaScript requires at least jQuery v1.9.1 but less than v4.0.0\')\n' +
|
2014-12-17 05:17:54 +01:00
|
|
|
' }\n' +
|
|
|
|
'}(jQuery);\n\n',
|
2013-08-04 01:03:38 +02:00
|
|
|
|
|
|
|
// Task configuration.
|
|
|
|
clean: {
|
2014-08-14 02:47:16 +02:00
|
|
|
dist: 'dist',
|
|
|
|
docs: 'docs/dist'
|
2013-08-04 01:03:38 +02:00
|
|
|
},
|
|
|
|
|
2015-05-13 01:52:54 +02:00
|
|
|
// JS build configuration
|
2015-05-07 21:48:22 +02:00
|
|
|
babel: {
|
2015-05-13 21:48:34 +02:00
|
|
|
dev: {
|
2015-05-13 01:52:54 +02:00
|
|
|
options: {
|
2016-10-06 15:21:05 +02:00
|
|
|
sourceMap: true
|
2014-02-07 13:34:17 +01:00
|
|
|
},
|
2015-05-07 21:48:22 +02:00
|
|
|
files: {
|
2015-05-11 21:05:35 +02:00
|
|
|
'js/dist/util.js' : 'js/src/util.js',
|
|
|
|
'js/dist/alert.js' : 'js/src/alert.js',
|
|
|
|
'js/dist/button.js' : 'js/src/button.js',
|
|
|
|
'js/dist/carousel.js' : 'js/src/carousel.js',
|
|
|
|
'js/dist/collapse.js' : 'js/src/collapse.js',
|
|
|
|
'js/dist/dropdown.js' : 'js/src/dropdown.js',
|
|
|
|
'js/dist/modal.js' : 'js/src/modal.js',
|
2015-05-11 21:29:06 +02:00
|
|
|
'js/dist/scrollspy.js' : 'js/src/scrollspy.js',
|
2015-05-12 08:32:37 +02:00
|
|
|
'js/dist/tab.js' : 'js/src/tab.js',
|
2015-05-12 23:28:11 +02:00
|
|
|
'js/dist/tooltip.js' : 'js/src/tooltip.js',
|
|
|
|
'js/dist/popover.js' : 'js/src/popover.js'
|
2015-05-07 21:48:22 +02:00
|
|
|
}
|
2013-08-04 01:03:38 +02:00
|
|
|
},
|
2015-05-13 01:52:54 +02:00
|
|
|
dist: {
|
2014-03-17 08:07:21 +01:00
|
|
|
options: {
|
2016-10-06 15:21:05 +02:00
|
|
|
extends: '../../js/.babelrc'
|
2014-03-17 08:07:21 +01:00
|
|
|
},
|
2015-05-13 01:52:54 +02:00
|
|
|
files: {
|
|
|
|
'<%= concat.bootstrap.dest %>' : '<%= concat.bootstrap.dest %>'
|
|
|
|
}
|
2013-08-04 01:03:38 +02:00
|
|
|
}
|
|
|
|
},
|
2013-08-08 08:06:29 +02:00
|
|
|
|
2015-05-13 01:52:54 +02:00
|
|
|
stamp: {
|
2013-08-04 01:03:38 +02:00
|
|
|
options: {
|
2016-10-06 15:21:05 +02:00
|
|
|
banner: '<%= banner %>\n<%= jqueryCheck %>\n<%= jqueryVersionCheck %>\n+function () {\n',
|
|
|
|
footer: '\n}();'
|
2013-08-04 01:03:38 +02:00
|
|
|
},
|
|
|
|
bootstrap: {
|
2015-05-13 01:52:54 +02:00
|
|
|
files: {
|
|
|
|
src: '<%= concat.bootstrap.dest %>'
|
|
|
|
}
|
2013-08-04 01:03:38 +02:00
|
|
|
}
|
|
|
|
},
|
2013-08-08 08:06:29 +02:00
|
|
|
|
2013-08-04 01:03:38 +02:00
|
|
|
concat: {
|
2014-06-15 16:41:24 +02:00
|
|
|
options: {
|
2016-04-02 09:03:04 +02:00
|
|
|
// Custom function to remove all export and import statements
|
|
|
|
process: function (src) {
|
2016-12-31 06:25:26 +01:00
|
|
|
return src.replace(/^(export|import).*/gm, '')
|
2016-10-06 15:21:05 +02:00
|
|
|
}
|
2014-06-15 16:41:24 +02:00
|
|
|
},
|
2013-08-04 01:03:38 +02:00
|
|
|
bootstrap: {
|
2015-01-03 22:58:44 +01:00
|
|
|
src: [
|
2015-05-13 01:52:54 +02:00
|
|
|
'js/src/util.js',
|
|
|
|
'js/src/alert.js',
|
|
|
|
'js/src/button.js',
|
|
|
|
'js/src/carousel.js',
|
|
|
|
'js/src/collapse.js',
|
|
|
|
'js/src/dropdown.js',
|
|
|
|
'js/src/modal.js',
|
|
|
|
'js/src/scrollspy.js',
|
|
|
|
'js/src/tab.js',
|
|
|
|
'js/src/tooltip.js',
|
|
|
|
'js/src/popover.js'
|
2015-01-03 22:58:44 +01:00
|
|
|
],
|
2013-08-04 01:03:38 +02:00
|
|
|
dest: 'dist/js/<%= pkg.name %>.js'
|
2015-01-03 22:58:44 +01:00
|
|
|
}
|
|
|
|
},
|
|
|
|
|
2014-03-10 00:09:36 +01:00
|
|
|
qunit: {
|
|
|
|
options: {
|
|
|
|
inject: 'js/tests/unit/phantom.js'
|
|
|
|
},
|
|
|
|
files: 'js/tests/index.html'
|
|
|
|
},
|
|
|
|
|
2015-05-13 01:52:54 +02:00
|
|
|
// CSS build configuration
|
2013-08-18 09:36:51 +02:00
|
|
|
copy: {
|
2013-12-31 20:38:32 +01:00
|
|
|
docs: {
|
2015-02-20 10:22:06 +01:00
|
|
|
expand: true,
|
|
|
|
cwd: 'dist/',
|
|
|
|
src: [
|
|
|
|
'**/*'
|
|
|
|
],
|
|
|
|
dest: 'docs/dist/'
|
2013-08-18 09:36:51 +02:00
|
|
|
}
|
|
|
|
},
|
|
|
|
|
2013-08-04 01:03:38 +02:00
|
|
|
connect: {
|
|
|
|
server: {
|
|
|
|
options: {
|
|
|
|
port: 3000,
|
|
|
|
base: '.'
|
2013-05-04 16:55:52 +02:00
|
|
|
}
|
2013-08-04 01:03:38 +02:00
|
|
|
}
|
|
|
|
},
|
|
|
|
|
2013-08-13 00:01:06 +02:00
|
|
|
jekyll: {
|
2014-11-14 14:00:02 +01:00
|
|
|
options: {
|
2015-08-25 07:43:47 +02:00
|
|
|
bundleExec: true,
|
2015-10-28 06:20:47 +01:00
|
|
|
config: '_config.yml',
|
|
|
|
incremental: false
|
2014-11-14 14:00:02 +01:00
|
|
|
},
|
|
|
|
docs: {},
|
|
|
|
github: {
|
|
|
|
options: {
|
|
|
|
raw: 'github: true'
|
|
|
|
}
|
|
|
|
}
|
2013-08-13 00:01:06 +02:00
|
|
|
},
|
|
|
|
|
2013-08-04 01:03:38 +02:00
|
|
|
watch: {
|
|
|
|
src: {
|
2016-06-05 02:46:36 +02:00
|
|
|
files: '<%= concat.bootstrap.src %>',
|
2015-05-13 21:48:34 +02:00
|
|
|
tasks: ['babel:dev']
|
2013-08-04 01:03:38 +02:00
|
|
|
},
|
2015-01-09 11:26:16 +01:00
|
|
|
sass: {
|
|
|
|
files: 'scss/**/*.scss',
|
2015-08-13 05:14:14 +02:00
|
|
|
tasks: ['dist-css', 'docs']
|
2015-08-15 07:45:55 +02:00
|
|
|
},
|
|
|
|
docs: {
|
|
|
|
files: 'docs/assets/scss/**/*.scss',
|
|
|
|
tasks: ['dist-css', 'docs']
|
2013-08-04 01:03:38 +02:00
|
|
|
}
|
2013-11-02 02:15:25 +01:00
|
|
|
},
|
|
|
|
|
2013-12-04 03:42:31 +01:00
|
|
|
'saucelabs-qunit': {
|
|
|
|
all: {
|
|
|
|
options: {
|
|
|
|
build: process.env.TRAVIS_JOB_ID,
|
2014-01-16 00:55:47 +01:00
|
|
|
concurrency: 10,
|
2014-06-24 21:12:21 +02:00
|
|
|
maxRetries: 3,
|
2015-01-05 21:40:43 +01:00
|
|
|
maxPollRetries: 4,
|
2015-03-01 09:20:00 +01:00
|
|
|
urls: ['http://127.0.0.1:3000/js/tests/index.html?hidepassed'],
|
2014-03-17 04:30:04 +01:00
|
|
|
browsers: grunt.file.readYAML('grunt/sauce_browsers.yml')
|
2013-12-04 03:42:31 +01:00
|
|
|
}
|
|
|
|
}
|
2014-01-20 22:06:13 +01:00
|
|
|
},
|
|
|
|
|
|
|
|
exec: {
|
2016-12-23 05:02:54 +01:00
|
|
|
'clean-css': {
|
|
|
|
command: 'npm run clean-css'
|
|
|
|
},
|
|
|
|
'clean-css-docs': {
|
|
|
|
command: 'npm run clean-css-docs'
|
|
|
|
},
|
2016-06-21 01:18:21 +02:00
|
|
|
postcss: {
|
|
|
|
command: 'npm run postcss'
|
|
|
|
},
|
|
|
|
'postcss-docs': {
|
|
|
|
command: 'npm run postcss-docs'
|
2016-06-27 23:19:10 +02:00
|
|
|
},
|
2016-07-15 01:22:56 +02:00
|
|
|
htmlhint: {
|
|
|
|
command: 'npm run htmlhint'
|
2016-12-21 07:38:32 +01:00
|
|
|
},
|
2017-01-23 10:38:34 +01:00
|
|
|
htmllint: {
|
|
|
|
command: 'npm run htmllint'
|
|
|
|
},
|
2017-01-03 01:46:57 +01:00
|
|
|
sass: {
|
|
|
|
command: 'npm run sass'
|
|
|
|
},
|
|
|
|
'sass-docs': {
|
|
|
|
command: 'npm run sass-docs'
|
|
|
|
},
|
2016-12-21 07:38:32 +01:00
|
|
|
'scss-lint': {
|
|
|
|
command: 'npm run scss-lint'
|
|
|
|
},
|
|
|
|
'scss-lint-docs': {
|
|
|
|
command: 'npm run scss-lint-docs'
|
2016-12-23 13:43:46 +01:00
|
|
|
},
|
|
|
|
uglify: {
|
|
|
|
command: 'npm run uglify'
|
|
|
|
},
|
|
|
|
'uglify-docs': {
|
|
|
|
command: 'npm run uglify-docs'
|
2016-06-21 01:18:21 +02:00
|
|
|
}
|
2015-08-19 07:47:26 +02:00
|
|
|
},
|
|
|
|
|
|
|
|
buildcontrol: {
|
|
|
|
options: {
|
|
|
|
dir: '_gh_pages',
|
|
|
|
commit: true,
|
|
|
|
push: true,
|
|
|
|
message: 'Built %sourceName% from commit %sourceCommit% on branch %sourceBranch%'
|
|
|
|
},
|
|
|
|
pages: {
|
|
|
|
options: {
|
|
|
|
remote: 'git@github.com:twbs/derpstrap.git',
|
|
|
|
branch: 'gh-pages'
|
|
|
|
}
|
|
|
|
}
|
2015-11-16 17:05:29 +01:00
|
|
|
},
|
|
|
|
|
|
|
|
compress: {
|
|
|
|
main: {
|
|
|
|
options: {
|
|
|
|
archive: 'bootstrap-<%= pkg.version %>-dist.zip',
|
|
|
|
mode: 'zip',
|
|
|
|
level: 9,
|
|
|
|
pretty: true
|
|
|
|
},
|
|
|
|
files: [
|
|
|
|
{
|
|
|
|
expand: true,
|
|
|
|
cwd: 'dist/',
|
|
|
|
src: ['**'],
|
|
|
|
dest: 'bootstrap-<%= pkg.version %>-dist'
|
|
|
|
}
|
|
|
|
]
|
|
|
|
}
|
2013-08-04 01:03:38 +02:00
|
|
|
}
|
2015-11-16 17:05:29 +01:00
|
|
|
|
2016-12-31 06:25:26 +01:00
|
|
|
})
|
2013-05-04 16:55:52 +02:00
|
|
|
|
|
|
|
|
2013-08-04 01:03:38 +02:00
|
|
|
// These plugins provide necessary tasks.
|
2017-01-03 01:46:57 +01:00
|
|
|
require('load-grunt-tasks')(grunt)
|
2016-12-31 06:25:26 +01:00
|
|
|
require('time-grunt')(grunt)
|
2013-05-04 16:55:52 +02:00
|
|
|
|
2013-08-13 00:01:06 +02:00
|
|
|
// Docs HTML validation task
|
2017-01-23 10:38:34 +01:00
|
|
|
grunt.registerTask('validate-html', ['jekyll:docs', 'exec:htmllint', 'exec:htmlhint'])
|
2013-08-13 00:01:06 +02:00
|
|
|
|
2014-05-19 00:52:42 +02:00
|
|
|
var runSubset = function (subset) {
|
2016-12-31 06:25:26 +01:00
|
|
|
return !process.env.TWBS_TEST || process.env.TWBS_TEST === subset
|
|
|
|
}
|
2014-05-19 00:53:40 +02:00
|
|
|
var isUndefOrNonZero = function (val) {
|
2016-12-31 06:25:26 +01:00
|
|
|
return val === undefined || val !== '0'
|
|
|
|
}
|
2014-05-19 00:52:42 +02:00
|
|
|
|
2013-08-04 01:03:38 +02:00
|
|
|
// Test task.
|
2016-12-31 06:25:26 +01:00
|
|
|
var testSubtasks = []
|
2013-12-15 04:09:44 +01:00
|
|
|
// Skip core tests if running a different subset of the test suite
|
2014-11-20 00:43:23 +01:00
|
|
|
if (runSubset('core') &&
|
2014-12-01 05:29:47 +01:00
|
|
|
// Skip core tests if this is a Savage build
|
2014-12-15 19:18:27 +01:00
|
|
|
process.env.TRAVIS_REPO_SLUG !== 'twbs-savage/bootstrap') {
|
2016-12-31 06:25:26 +01:00
|
|
|
testSubtasks = testSubtasks.concat(['dist-css', 'dist-js', 'test-scss', 'qunit', 'docs'])
|
2013-12-15 04:09:44 +01:00
|
|
|
}
|
|
|
|
// Skip HTML validation if running a different subset of the test suite
|
2014-05-19 00:53:40 +02:00
|
|
|
if (runSubset('validate-html') &&
|
2015-09-26 00:32:42 +02:00
|
|
|
isTravis &&
|
|
|
|
// Skip HTML5 validator when [skip validator] is in the commit message
|
2014-05-19 00:53:40 +02:00
|
|
|
isUndefOrNonZero(process.env.TWBS_DO_VALIDATOR)) {
|
2016-12-31 06:25:26 +01:00
|
|
|
testSubtasks.push('validate-html')
|
2013-12-15 04:09:44 +01:00
|
|
|
}
|
2013-12-04 03:42:31 +01:00
|
|
|
// Only run Sauce Labs tests if there's a Sauce access key
|
2014-01-17 20:51:53 +01:00
|
|
|
if (typeof process.env.SAUCE_ACCESS_KEY !== 'undefined' &&
|
2013-12-15 04:09:44 +01:00
|
|
|
// Skip Sauce if running a different subset of the test suite
|
2016-06-27 23:19:10 +02:00
|
|
|
runSubset('sauce-js-unit')) {
|
2016-12-31 06:25:26 +01:00
|
|
|
testSubtasks = testSubtasks.concat(['dist', 'docs-css', 'docs-js', 'clean:docs', 'copy:docs'])
|
2016-06-27 23:19:10 +02:00
|
|
|
// Skip Sauce on Travis when [skip sauce] is in the commit message
|
|
|
|
if (isUndefOrNonZero(process.env.TWBS_DO_SAUCE)) {
|
2016-12-31 06:25:26 +01:00
|
|
|
testSubtasks.push('connect')
|
|
|
|
testSubtasks.push('saucelabs-qunit')
|
2016-06-27 23:19:10 +02:00
|
|
|
}
|
2013-08-06 09:39:35 +02:00
|
|
|
}
|
2016-12-31 06:25:26 +01:00
|
|
|
grunt.registerTask('test', testSubtasks)
|
2013-05-04 16:55:52 +02:00
|
|
|
|
2013-08-04 01:03:38 +02:00
|
|
|
// JS distribution task.
|
2016-12-31 06:25:26 +01:00
|
|
|
grunt.registerTask('dist-js', ['babel:dev', 'concat', 'babel:dist', 'stamp', 'exec:uglify'])
|
2013-05-04 16:55:52 +02:00
|
|
|
|
2017-01-03 01:46:57 +01:00
|
|
|
grunt.registerTask('test-scss', ['exec:scss-lint'])
|
2014-12-09 04:02:25 +01:00
|
|
|
|
2013-08-04 01:03:38 +02:00
|
|
|
// CSS distribution task.
|
2017-01-03 01:46:57 +01:00
|
|
|
grunt.registerTask('sass-compile', ['exec:sass', 'exec:sass-docs'])
|
2014-12-15 19:18:27 +01:00
|
|
|
|
2016-12-31 06:25:26 +01:00
|
|
|
grunt.registerTask('dist-css', ['sass-compile', 'exec:postcss', 'exec:clean-css', 'exec:clean-css-docs'])
|
2013-08-18 09:36:51 +02:00
|
|
|
|
2013-08-04 01:03:38 +02:00
|
|
|
// Full distribution task.
|
2016-12-31 06:25:26 +01:00
|
|
|
grunt.registerTask('dist', ['clean:dist', 'dist-css', 'dist-js'])
|
2013-05-04 16:55:52 +02:00
|
|
|
|
2013-08-04 01:03:38 +02:00
|
|
|
// Default task.
|
2016-12-31 06:25:26 +01:00
|
|
|
grunt.registerTask('default', ['clean:dist', 'test'])
|
2013-08-08 08:06:29 +02:00
|
|
|
|
2014-08-14 02:47:16 +02:00
|
|
|
// Docs task.
|
2016-12-31 06:25:26 +01:00
|
|
|
grunt.registerTask('docs-css', ['exec:clean-css-docs', 'exec:postcss-docs'])
|
|
|
|
grunt.registerTask('lint-docs-css', ['exec:scss-lint-docs'])
|
|
|
|
grunt.registerTask('docs-js', ['exec:uglify-docs'])
|
|
|
|
grunt.registerTask('docs', ['lint-docs-css', 'docs-css', 'docs-js', 'clean:docs', 'copy:docs'])
|
|
|
|
grunt.registerTask('docs-github', ['jekyll:github'])
|
2014-08-14 02:47:16 +02:00
|
|
|
|
2016-12-31 06:25:26 +01:00
|
|
|
grunt.registerTask('prep-release', ['dist', 'docs', 'docs-github', 'compress'])
|
2014-11-14 14:00:02 +01:00
|
|
|
|
2015-08-19 07:49:26 +02:00
|
|
|
// Publish to GitHub
|
2016-12-31 06:25:26 +01:00
|
|
|
grunt.registerTask('publish', ['buildcontrol:pages'])
|
|
|
|
}
|