Skip to content
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

Closed
wants to merge 26 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
744d551
Merge branch 'fix-scrollspy-test-markup' into build-rework
pvdlg Jan 18, 2017
930bac8
Full build tool rework
pvdlg Jan 18, 2017
23d5422
Merge branch 'twbs/v4-dev' into build-rework
pvdlg Jan 18, 2017
89a2273
Remove build task, fix Unit test
pvdlg Jan 19, 2017
56cddad
Remove path.json for simplification
pvdlg Jan 19, 2017
e0c6916
Don't analyze grunt tasks in Hound
pvdlg Jan 19, 2017
613ca46
Re-use previous code for Travis test env detection
pvdlg Jan 19, 2017
1b1f8b4
Add to houndignore the script that I just added :-0
pvdlg Jan 19, 2017
ebf062e
Add Gruntfile.js
pvdlg Jan 19, 2017
1668990
Use concat instead of stamp, as stamp scream the sourcemap (it's off …
pvdlg Jan 19, 2017
e27d1c1
Fix sourcemaps
pvdlg Jan 19, 2017
43da12d
Simplify task hierarchy
pvdlg Jan 20, 2017
e3f3025
Do htmllint only for Travis build
pvdlg Jan 20, 2017
eda1847
Make lint expression shorter
pvdlg Jan 20, 2017
039a5bb
Fix js doc clean
pvdlg Jan 20, 2017
9c4bcc1
Add watch task for js individual build and and Qunit
pvdlg Jan 20, 2017
d2ab23b
Use docs.css in dev, docs.min.css in prod
pvdlg Jan 21, 2017
9c2fca2
Merge branch 'twbs/v4-dev' into build-rework
pvdlg Jan 21, 2017
bbf949d
Merge branch 'twbs/v4-dev' into build-rework
pvdlg Jan 22, 2017
e0cc3c7
Merge branch 'twbs/v4-dev' into build-rework
pvdlg Jan 22, 2017
3983833
Parameter for live reload port
pvdlg Jan 23, 2017
3a4f7e6
Merge branch 'twbs/v4-dev' into build-rework
pvdlg Jan 23, 2017
1af212f
Merge branch 'twbs/v4-dev' into build-rework
pvdlg Jan 23, 2017
31217db
Add htmllintrc
pvdlg Jan 23, 2017
adfda7e
Merge branch 'twbs/v4-dev' into build-rework
pvdlg Jan 23, 2017
d39ff71
Merge branch 'twbs/v4-dev' into build-rework
pvdlg Feb 6, 2017
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions .houndignore
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,7 @@
**/vendor/*
**/dist/*
js/tests/*
build/grunt/*
build/config/*
build/utils/*
Gruntfile.js
4 changes: 2 additions & 2 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,10 @@ before_install:
- if [ "$TRAVIS_REPO_SLUG" = twbs-savage/bootstrap ]; then export TWBS_DO_VALIDATOR=0; fi
install:
- bundle install --deployment --jobs=3 --retry=3
- cp grunt/npm-shrinkwrap.json ./
- cp build/npm-shrinkwrap.json ./
- npm install
after_success:
- if [ "$TWBS_TEST" = sauce-js-unit ]; then grunt/upload-preview.sh; fi
- if [ "$TWBS_TEST" = sauce-js-unit ]; then build/upload-preview.sh; fi
cache:
directories:
- node_modules
Expand Down
338 changes: 13 additions & 325 deletions 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)

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

require('load-grunt-config')(grunt, {

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

configPath: require('path').join(process.cwd(), 'build/grunt'),

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
'process' is not defined no-undef

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')

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

}

})


// 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'])
}
6 changes: 3 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -71,9 +71,9 @@ Bootstrap's documentation, included in this repo in the root directory, is built

### Running documentation locally

1. Run through the [tooling setup](https://github.com/twbs/bootstrap/blob/v4-dev/docs/getting-started/build-tools.md#tooling-setup) to install Jekyll (the site builder) and other Ruby dependencies with `bundle install`.
2. Run `grunt` (or a specific set of Grunt tasks) to rebuild distributed CSS and JavaScript files, as well as our docs assets.
3. From the root `/bootstrap` directory, run `bundle exec jekyll serve` in the command line.
1. Run through the [tooling setup](https://github.com/twbs/bootstrap/blob/v4-dev/docs/getting-started/build-tools.md#tooling-setup) to install Node and Ruby (required for Jekyll, the site builder).
2. From the root `/bootstrap` directory, run `npm run install` to install all dependencies.
3. Run `npm run watch` to start a local server.
4. Open <http://localhost:9001> in your browser, and voilà.

Learn more about using Jekyll by reading its [documentation](https://jekyllrb.com/docs/home/).
Expand Down
File renamed without changes.
Loading