-
-
Notifications
You must be signed in to change notification settings - Fork 78.9k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Improve build tool to make it easier to maintain and more pleasant to use #21777
Changes from all commits
744d551
930bac8
23d5422
89a2273
56cddad
e0c6916
613ca46
1b1f8b4
ebf062e
1668990
e27d1c1
43da12d
e3f3025
eda1847
039a5bb
9c4bcc1
d2ab23b
9c2fca2
bbf949d
e0cc3c7
3983833
3a4f7e6
1af212f
31217db
adfda7e
d39ff71
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -2,3 +2,7 @@ | |
**/vendor/* | ||
**/dist/* | ||
js/tests/* | ||
build/grunt/* | ||
build/config/* | ||
build/utils/* | ||
Gruntfile.js |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,338 +1,26 @@ | ||
/*! | ||
/** | ||
* -------------------------------------------------------------------------- | ||
* Bootstrap's Gruntfile | ||
* https://getbootstrap.com | ||
* Copyright 2013-2017 The Bootstrap Authors | ||
* Copyright 2013-2017 Twitter, Inc. | ||
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) | ||
* -------------------------------------------------------------------------- | ||
*/ | ||
|
||
module.exports = function (grunt) { | ||
'use strict' | ||
|
||
// Force use of Unix newlines | ||
grunt.util.linefeed = '\n' | ||
|
||
RegExp.quote = function (string) { | ||
return string.replace(/[-\\^$*+?.()|[\]{}]/g, '\\$&') | ||
} | ||
|
||
var path = require('path') | ||
var isTravis = require('is-travis') | ||
|
||
var configBridge = grunt.file.readJSON('./grunt/configBridge.json', { encoding: 'utf8' }) | ||
|
||
Object.keys(configBridge.paths).forEach(function (key) { | ||
configBridge.paths[key].forEach(function (val, i, arr) { | ||
arr[i] = path.join('./docs', val) | ||
}) | ||
}) | ||
|
||
// Project configuration. | ||
grunt.initConfig({ | ||
|
||
// Metadata. | ||
pkg: grunt.file.readJSON('package.json'), | ||
banner: '/*!\n' + | ||
' * Bootstrap v<%= pkg.version %> (<%= pkg.homepage %>)\n' + | ||
' * Copyright 2011-<%= grunt.template.today("yyyy") %> <%= pkg.author %>\n' + | ||
' * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n' + | ||
' */\n', | ||
jqueryCheck: 'if (typeof jQuery === \'undefined\') {\n' + | ||
' throw new Error(\'Bootstrap\\\'s JavaScript requires jQuery. jQuery must be included before Bootstrap\\\'s JavaScript.\')\n' + | ||
'}\n', | ||
jqueryVersionCheck: '+function ($) {\n' + | ||
' var version = $.fn.jquery.split(\' \')[0].split(\'.\')\n' + | ||
' 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' + | ||
' }\n' + | ||
'}(jQuery);\n\n', | ||
|
||
// Task configuration. | ||
clean: { | ||
dist: 'dist', | ||
docs: 'docs/dist' | ||
}, | ||
|
||
// JS build configuration | ||
babel: { | ||
dev: { | ||
options: { | ||
sourceMap: true | ||
}, | ||
files: { | ||
'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', | ||
'js/dist/scrollspy.js' : 'js/src/scrollspy.js', | ||
'js/dist/tab.js' : 'js/src/tab.js', | ||
'js/dist/tooltip.js' : 'js/src/tooltip.js', | ||
'js/dist/popover.js' : 'js/src/popover.js' | ||
} | ||
}, | ||
dist: { | ||
options: { | ||
extends: '../../js/.babelrc' | ||
}, | ||
files: { | ||
'<%= concat.bootstrap.dest %>' : '<%= concat.bootstrap.dest %>' | ||
} | ||
} | ||
}, | ||
|
||
stamp: { | ||
options: { | ||
banner: '<%= banner %>\n<%= jqueryCheck %>\n<%= jqueryVersionCheck %>\n+function () {\n', | ||
footer: '\n}();' | ||
}, | ||
bootstrap: { | ||
files: { | ||
src: '<%= concat.bootstrap.dest %>' | ||
} | ||
} | ||
}, | ||
|
||
concat: { | ||
options: { | ||
// Custom function to remove all export and import statements | ||
process: function (src) { | ||
return src.replace(/^(export|import).*/gm, '') | ||
} | ||
}, | ||
bootstrap: { | ||
src: [ | ||
'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' | ||
], | ||
dest: 'dist/js/<%= pkg.name %>.js' | ||
} | ||
}, | ||
|
||
qunit: { | ||
options: { | ||
inject: 'js/tests/unit/phantom.js' | ||
}, | ||
files: 'js/tests/index.html' | ||
}, | ||
|
||
// CSS build configuration | ||
copy: { | ||
docs: { | ||
expand: true, | ||
cwd: 'dist/', | ||
src: [ | ||
'**/*' | ||
], | ||
dest: 'docs/dist/' | ||
} | ||
}, | ||
|
||
connect: { | ||
server: { | ||
options: { | ||
port: 3000, | ||
base: '.' | ||
} | ||
} | ||
}, | ||
|
||
jekyll: { | ||
options: { | ||
bundleExec: true, | ||
config: '_config.yml', | ||
incremental: false | ||
}, | ||
docs: {}, | ||
github: { | ||
options: { | ||
raw: 'github: true' | ||
} | ||
} | ||
}, | ||
|
||
watch: { | ||
src: { | ||
files: '<%= concat.bootstrap.src %>', | ||
tasks: ['babel:dev'] | ||
}, | ||
sass: { | ||
files: 'scss/**/*.scss', | ||
tasks: ['dist-css', 'docs'] | ||
}, | ||
docs: { | ||
files: 'docs/assets/scss/**/*.scss', | ||
tasks: ['dist-css', 'docs'] | ||
} | ||
}, | ||
|
||
'saucelabs-qunit': { | ||
all: { | ||
options: { | ||
build: process.env.TRAVIS_JOB_ID, | ||
concurrency: 10, | ||
maxRetries: 3, | ||
maxPollRetries: 4, | ||
urls: ['http://127.0.0.1:3000/js/tests/index.html?hidepassed'], | ||
browsers: grunt.file.readYAML('grunt/sauce_browsers.yml') | ||
} | ||
} | ||
}, | ||
|
||
exec: { | ||
'clean-css': { | ||
command: 'npm run clean-css' | ||
}, | ||
'clean-css-docs': { | ||
command: 'npm run clean-css-docs' | ||
}, | ||
postcss: { | ||
command: 'npm run postcss' | ||
}, | ||
'postcss-docs': { | ||
command: 'npm run postcss-docs' | ||
}, | ||
htmlhint: { | ||
command: 'npm run htmlhint' | ||
}, | ||
htmllint: { | ||
command: 'npm run htmllint' | ||
}, | ||
sass: { | ||
command: 'npm run sass' | ||
}, | ||
'sass-docs': { | ||
command: 'npm run sass-docs' | ||
}, | ||
'scss-lint': { | ||
command: 'npm run scss-lint' | ||
}, | ||
'scss-lint-docs': { | ||
command: 'npm run scss-lint-docs' | ||
}, | ||
uglify: { | ||
command: 'npm run uglify' | ||
}, | ||
'uglify-docs': { | ||
command: 'npm run uglify-docs' | ||
} | ||
}, | ||
|
||
buildcontrol: { | ||
options: { | ||
dir: '_gh_pages', | ||
commit: true, | ||
push: true, | ||
message: 'Built %sourceName% from commit %sourceCommit% on branch %sourceBranch%' | ||
}, | ||
pages: { | ||
options: { | ||
remote: '[email protected]:twbs/derpstrap.git', | ||
branch: 'gh-pages' | ||
} | ||
require('time-grunt')(grunt) | ||
require('load-grunt-config')(grunt, { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Unexpected require() global-require |
||
configPath: require('path').join(process.cwd(), 'build/grunt'), | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Unexpected require() global-require |
||
jitGrunt: { | ||
staticMappings: { | ||
buildcontrol: 'grunt-build-control', | ||
'saucelabs-qunit': 'grunt-saucelabs' | ||
} | ||
}, | ||
|
||
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' | ||
} | ||
] | ||
} | ||
data: { | ||
pkg: grunt.file.readJSON('package.json'), | ||
stampConf: require('./build/config/stamp.js') | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Unexpected require() global-require |
||
} | ||
|
||
}) | ||
|
||
|
||
// These plugins provide necessary tasks. | ||
require('load-grunt-tasks')(grunt) | ||
require('time-grunt')(grunt) | ||
|
||
// Docs HTML validation task | ||
grunt.registerTask('validate-html', ['jekyll:docs', 'exec:htmllint', 'exec:htmlhint']) | ||
|
||
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 (runSubset('core') && | ||
// Skip core tests if this is a Savage build | ||
process.env.TRAVIS_REPO_SLUG !== 'twbs-savage/bootstrap') { | ||
testSubtasks = testSubtasks.concat(['dist-css', 'dist-js', 'test-scss', 'qunit', 'docs']) | ||
} | ||
// Skip HTML validation if running a different subset of the test suite | ||
if (runSubset('validate-html') && | ||
isTravis && | ||
// Skip HTML5 validator 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 | ||
runSubset('sauce-js-unit')) { | ||
testSubtasks = testSubtasks.concat(['dist', 'docs-css', 'docs-js', 'clean:docs', 'copy:docs']) | ||
// Skip Sauce on Travis when [skip sauce] is in the commit message | ||
if (isUndefOrNonZero(process.env.TWBS_DO_SAUCE)) { | ||
testSubtasks.push('connect') | ||
testSubtasks.push('saucelabs-qunit') | ||
} | ||
} | ||
grunt.registerTask('test', testSubtasks) | ||
|
||
// JS distribution task. | ||
grunt.registerTask('dist-js', ['babel:dev', 'concat', 'babel:dist', 'stamp', 'exec:uglify']) | ||
|
||
grunt.registerTask('test-scss', ['exec:scss-lint']) | ||
|
||
// CSS distribution task. | ||
grunt.registerTask('sass-compile', ['exec:sass', 'exec:sass-docs']) | ||
|
||
grunt.registerTask('dist-css', ['sass-compile', 'exec:postcss', 'exec:clean-css', 'exec:clean-css-docs']) | ||
|
||
// Full distribution task. | ||
grunt.registerTask('dist', ['clean:dist', 'dist-css', 'dist-js']) | ||
|
||
// Default task. | ||
grunt.registerTask('default', ['clean:dist', 'test']) | ||
|
||
// Docs task. | ||
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']) | ||
|
||
grunt.registerTask('prep-release', ['dist', 'docs', 'docs-github', 'compress']) | ||
|
||
// Publish to GitHub | ||
grunt.registerTask('publish', ['buildcontrol:pages']) | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Unexpected require() global-require
'require' is not defined no-undef