summaryrefslogtreecommitdiff
path: root/templates/assets/bootstrap/Gruntfile.js
diff options
context:
space:
mode:
Diffstat (limited to 'templates/assets/bootstrap/Gruntfile.js')
-rw-r--r--templates/assets/bootstrap/Gruntfile.js321
1 files changed, 321 insertions, 0 deletions
diff --git a/templates/assets/bootstrap/Gruntfile.js b/templates/assets/bootstrap/Gruntfile.js
new file mode 100644
index 0000000..7675e2f
--- /dev/null
+++ b/templates/assets/bootstrap/Gruntfile.js
@@ -0,0 +1,321 @@
+/*!
+ * 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 isTravis = require('is-travis')
+
+ // 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: '../../.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: '.'
+ }
+ }
+ },
+
+ 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'
+ },
+ jekyll: {
+ command: 'npm run jekyll'
+ },
+ 'jekyll-github': {
+ command: 'npm run jekyll-github'
+ },
+ 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: 'git@github.com:twbs/derpstrap.git',
+ branch: 'gh-pages'
+ }
+ }
+ },
+
+ 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'
+ }
+ ]
+ }
+ }
+
+ })
+
+
+ // These plugins provide necessary tasks.
+ require('load-grunt-tasks')(grunt)
+ require('time-grunt')(grunt)
+
+ // Docs HTML validation task
+ grunt.registerTask('validate-html', ['exec:jekyll', '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', ['exec:jekyll-github'])
+
+ grunt.registerTask('prep-release', ['dist', 'docs', 'docs-github', 'compress'])
+
+ // Publish to GitHub
+ grunt.registerTask('publish', ['buildcontrol:pages'])
+}