*/
module.exports = function (grunt) {
- 'use strict';
+ 'use strict'
// Force use of Unix newlines
- grunt.util.linefeed = '\n';
+ grunt.util.linefeed = '\n'
RegExp.quote = function (string) {
- return string.replace(/[-\\^$*+?.()|[\]{}]/g, '\\$&');
- };
+ return string.replace(/[-\\^$*+?.()|[\]{}]/g, '\\$&')
+ }
- var fs = require('fs');
- var path = require('path');
- var isTravis = require('is-travis');
+ var path = require('path')
+ var isTravis = require('is-travis')
- var configBridge = grunt.file.readJSON('./grunt/configBridge.json', { encoding: 'utf8' });
+ 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);
- });
- });
+ arr[i] = path.join('./docs', val)
+ })
+ })
// Project configuration.
grunt.initConfig({
options: {
// Custom function to remove all export and import statements
process: function (src) {
- return src.replace(/^(export|import).*/gm, '');
+ return src.replace(/^(export|import).*/gm, '')
}
},
bootstrap: {
}
}
- });
+ })
// These plugins provide necessary tasks.
require('load-grunt-tasks')(grunt, { scope: 'devDependencies',
// Exclude Sass compilers. We choose the one to load later on.
- pattern: ['grunt-*', '!grunt-sass', '!grunt-contrib-sass'] });
- require('time-grunt')(grunt);
+ pattern: ['grunt-*', '!grunt-sass', '!grunt-contrib-sass'] })
+ require('time-grunt')(grunt)
// Docs HTML validation task
- grunt.registerTask('validate-html', ['jekyll:docs', 'htmllint', 'exec:htmlhint']);
+ grunt.registerTask('validate-html', ['jekyll:docs', 'htmllint', 'exec:htmlhint'])
var runSubset = function (subset) {
- return !process.env.TWBS_TEST || process.env.TWBS_TEST === subset;
- };
+ return !process.env.TWBS_TEST || process.env.TWBS_TEST === subset
+ }
var isUndefOrNonZero = function (val) {
- return val === undefined || val !== '0';
- };
+ return val === undefined || val !== '0'
+ }
// Test task.
- var testSubtasks = [];
+ 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']);
+ 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');
+ 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']);
+ 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');
+ testSubtasks.push('connect')
+ testSubtasks.push('saucelabs-qunit')
}
}
- grunt.registerTask('test', testSubtasks);
+ grunt.registerTask('test', testSubtasks)
// JS distribution task.
- grunt.registerTask('dist-js', ['babel:dev', 'concat', 'babel:dist', 'stamp', 'exec:uglify']);
+ grunt.registerTask('dist-js', ['babel:dev', 'concat', 'babel:dist', 'stamp', 'exec:uglify'])
grunt.registerTask('test-scss', ['exec:scss-lint']);
// CSS distribution task.
// Supported Compilers: sass (Ruby) and libsass.
(function (sassCompilerName) {
- require('./grunt/bs-sass-compile/' + sassCompilerName + '.js')(grunt);
- })(process.env.TWBS_SASS || 'libsass');
+ require('./grunt/bs-sass-compile/' + sassCompilerName + '.js')(grunt)
+ }(process.env.TWBS_SASS || 'libsass'))
// grunt.registerTask('sass-compile', ['sass:core', 'sass:extras', 'sass:docs']);
- grunt.registerTask('sass-compile', ['sass:core', 'sass:extras', 'sass:docs']);
+ grunt.registerTask('sass-compile', ['sass:core', 'sass:extras', 'sass:docs'])
- grunt.registerTask('dist-css', ['sass-compile', 'exec:postcss', 'exec:clean-css', 'exec:clean-css-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']);
+ grunt.registerTask('dist', ['clean:dist', 'dist-css', 'dist-js'])
// Default task.
- grunt.registerTask('default', ['clean:dist', 'test']);
+ 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('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']);
+ grunt.registerTask('prep-release', ['dist', 'docs', 'docs-github', 'compress'])
// Publish to GitHub
- grunt.registerTask('publish', ['buildcontrol:pages']);
-};
+ grunt.registerTask('publish', ['buildcontrol:pages'])
+}
#!/usr/bin/env node
-'use strict';
+
+'use strict'
/*!
* Script to update version number references in the project.
* Copyright 2015 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
*/
-var fs = require('fs');
-var path = require('path');
-var sh = require('shelljs');
-sh.config.fatal = true;
-var sed = sh.sed;
+
+/* global Set */
+
+var fs = require('fs')
+var path = require('path')
+var sh = require('shelljs')
+sh.config.fatal = true
+var sed = sh.sed
// Blame TC39... https://github.com/benjamingr/RegExp.escape/issues/37
RegExp.quote = function (string) {
- return string.replace(/[-\\^$*+?.()|[\]{}]/g, '\\$&');
-};
+ return string.replace(/[-\\^$*+?.()|[\]{}]/g, '\\$&')
+}
RegExp.quoteReplacement = function (string) {
- return string.replace(/[$]/g, '$$');
-};
+ return string.replace(/[$]/g, '$$')
+}
-var DRY_RUN = false;
+var DRY_RUN = false
function walkAsync(directory, excludedDirectories, fileCallback, errback) {
if (excludedDirectories.has(path.parse(directory).base)) {
- return;
+ return
}
fs.readdir(directory, function (err, names) {
if (err) {
- errback(err);
- return;
+ errback(err)
+ return
}
names.forEach(function (name) {
- var filepath = path.join(directory, name);
+ var filepath = path.join(directory, name)
fs.lstat(filepath, function (err, stats) {
if (err) {
- process.nextTick(errback, err);
- return;
+ process.nextTick(errback, err)
+ return
}
if (stats.isSymbolicLink()) {
- return;
+ return
}
else if (stats.isDirectory()) {
- process.nextTick(walkAsync, filepath, excludedDirectories, fileCallback, errback);
+ process.nextTick(walkAsync, filepath, excludedDirectories, fileCallback, errback)
}
else if (stats.isFile()) {
- process.nextTick(fileCallback, filepath);
+ process.nextTick(fileCallback, filepath)
}
- });
- });
- });
+ })
+ })
+ })
}
function replaceRecursively(directory, excludedDirectories, allowedExtensions, original, replacement) {
- original = new RegExp(RegExp.quote(original), 'g');
- replacement = RegExp.quoteReplacement(replacement);
+ original = new RegExp(RegExp.quote(original), 'g')
+ replacement = RegExp.quoteReplacement(replacement)
var updateFile = !DRY_RUN ? function (filepath) {
if (allowedExtensions.has(path.parse(filepath).ext)) {
- sed('-i', original, replacement, filepath);
+ sed('-i', original, replacement, filepath)
}
} : function (filepath) {
if (allowedExtensions.has(path.parse(filepath).ext)) {
- console.log('FILE: ' + filepath);
+ console.log('FILE: ' + filepath)
}
else {
- console.log('EXCLUDED:' + filepath);
+ console.log('EXCLUDED:' + filepath)
}
- };
+ }
walkAsync(directory, excludedDirectories, updateFile, function (err) {
- console.error('ERROR while traversing directory!:');
- console.error(err);
- process.exit(1);
- });
+ console.error('ERROR while traversing directory!:')
+ console.error(err)
+ process.exit(1)
+ })
}
function main(args) {
if (args.length !== 2) {
- console.error('USAGE: change-version old_version new_version');
- console.error('Got arguments:', args);
- process.exit(1);
+ console.error('USAGE: change-version old_version new_version')
+ console.error('Got arguments:', args)
+ process.exit(1)
}
- var oldVersion = args[0];
- var newVersion = args[1];
+ var oldVersion = args[0]
+ var newVersion = args[1]
var EXCLUDED_DIRS = new Set([
'.git',
'node_modules',
'vendor'
- ]);
+ ])
var INCLUDED_EXTENSIONS = new Set([
// This extension whitelist is how we avoid modifying binary files
'',
'.scss',
'.txt',
'.yml'
- ]);
- replaceRecursively('.', EXCLUDED_DIRS, INCLUDED_EXTENSIONS, oldVersion, newVersion);
+ ])
+ replaceRecursively('.', EXCLUDED_DIRS, INCLUDED_EXTENSIONS, oldVersion, newVersion)
}
-main(process.argv.slice(2));
+main(process.argv.slice(2))