@@ -14,6 +14,8 @@ module.exports = function(grunt) {
1414
1515 modules . livereload = require ( './assets/js/grunts/livereload' ) ( modules ) ;
1616
17+ RegExp . quote = require ( 'regexp-quote' )
18+
1719 // Project configuration.
1820 grunt . initConfig ( {
1921
@@ -26,11 +28,11 @@ module.exports = function(grunt) {
2628 '*\n' +
2729 '* Designed and built with all the love in the world by @alademann, @mdo and @fat.\n' +
2830 '*/\n' ,
29- jqueryCheck : 'if (! jQuery) { throw new Error(\"Sass Bootstrap requires jQuery\") }\n\n' ,
31+ jqueryCheck : 'if (typeof jQuery === "undefined" ) { throw new Error(\"Sass Bootstrap requires jQuery\") }\n\n' ,
3032
3133 // Task configuration.
3234 clean : {
33- dist : [ 'dist' , '<%= pkg.name %>-dist.zip' ]
35+ dist : [ 'dist' , '_gh_pages' , ' <%= pkg.name %>-dist.zip']
3436 } ,
3537
3638 jshint : {
@@ -80,7 +82,8 @@ module.exports = function(grunt) {
8082
8183 uglify : {
8284 options : {
83- banner : '<%= banner %>'
85+ banner : '<%= banner %>' ,
86+ report : 'min'
8487 } ,
8588 bootstrap : {
8689 src : [ '<%= concat.bootstrap.dest %>' ] ,
@@ -174,7 +177,12 @@ module.exports = function(grunt) {
174177
175178 validation : {
176179 options : {
177- reset : false
180+ reset : true ,
181+ maxTry : 1 ,
182+ relaxerror : [
183+ "Bad value X-UA-Compatible for attribute http-equiv on element meta." ,
184+ "Element img is missing required attribute src." ,
185+ ]
178186 } ,
179187 files : {
180188 src : [ "_gh_pages/**/*.html" ]
@@ -234,43 +242,57 @@ module.exports = function(grunt) {
234242 livereload : true
235243 }
236244 }
245+ } ,
246+
247+ sed : {
248+ versionNumber : {
249+ pattern : ( function ( ) {
250+ var old = grunt . option ( 'oldver' )
251+ return old ? RegExp . quote ( old ) : old
252+ } ) ( ) ,
253+ replacement : grunt . option ( 'newver' ) ,
254+ recursive : true
255+ }
237256 }
238257 } ) ;
239258
240259
241260 // These plugins provide necessary tasks.
242- grunt . loadNpmTasks ( 'grunt-contrib-connect ' ) ;
261+ // grunt.loadNpmTasks('browserstack-runner ');
243262 grunt . loadNpmTasks ( 'grunt-contrib-clean' ) ;
244- grunt . loadNpmTasks ( 'grunt-contrib-compass' ) ;
263+ grunt . loadNpmTasks ( 'grunt-contrib-compress' ) ;
264+ grunt . loadNpmTasks ( 'grunt-css' ) ;
245265 grunt . loadNpmTasks ( 'grunt-contrib-cssmin' ) ;
246266 grunt . loadNpmTasks ( 'grunt-contrib-concat' ) ;
247- grunt . loadNpmTasks ( 'grunt-contrib-compress ' ) ;
267+ grunt . loadNpmTasks ( 'grunt-contrib-connect ' ) ;
248268 grunt . loadNpmTasks ( 'grunt-contrib-copy' ) ;
249269 grunt . loadNpmTasks ( 'grunt-contrib-jshint' ) ;
250270 grunt . loadNpmTasks ( 'grunt-contrib-qunit' ) ;
251271 grunt . loadNpmTasks ( 'grunt-contrib-uglify' ) ;
252272 grunt . loadNpmTasks ( 'grunt-contrib-watch' ) ;
253273 grunt . loadNpmTasks ( 'grunt-html-validation' ) ;
254- grunt . loadNpmTasks ( 'grunt-css' ) ;
255274 grunt . loadNpmTasks ( 'grunt-jekyll' ) ;
275+ grunt . loadNpmTasks ( 'grunt-contrib-compass' ) ;
276+ grunt . loadNpmTasks ( 'grunt-sed' ) ;
277+
256278
257279 grunt . registerTask ( 'lr' , modules . livereload ) ;
258280
259281 // Docs HTML validation task
260- grunt . registerTask ( 'validate-html' , [ 'jekyll' , 'validation' ] ) ;
282+ grunt . registerTask ( 'validate-html' , [ 'clean' , ' jekyll', 'validation' ] ) ;
261283
262284 // Test task.
263- grunt . registerTask ( ' testSubtasks' , [ 'jshint' , 'qunit' , 'validate-html' ] ) ;
264- grunt . registerTask ( 'testSubtasksNoValidation ', [ 'jshint' , 'qunit' ] ) ;
265- grunt . registerTask ( 'test' ,
266- function ( ) {
267- if ( grunt . option ( 'validate' ) ) {
268- grunt . task . run ( 'testSubtasks' ) ;
269- } else {
270- grunt . task . run ( 'testSubtasksNoValidation' ) ;
271- }
272- }
273- ) ;
285+ var testSubtasks = [ 'dist-css' , 'jshint' , 'qunit' , 'validate-html' ] ;
286+ var testSubtasksNoHTMLValidation = [ 'dist-css ', 'jshint' , 'qunit' ] ;
287+ // Only run BrowserStack tests under Travis
288+ // if (process.env.TRAVIS ) {
289+ // // Only run BrowserStack tests if this is a mainline commit in twbs/bootstrap, or you have your own BrowserStack key
290+ // if ((process.env.TRAVIS_REPO_SLUG === 'alademann/sass-bootstrap' && process.env.TRAVIS_PULL_REQUEST === 'false') || process.env.ALADEMANN_HAVE_OWN_BROWSERSTACK_KEY) {
291+ // testSubtasks.push('browserstack_runner');
292+ // }
293+ // }
294+ grunt . registerTask ( 'test' , testSubtasks ) ;
295+ grunt . registerTask ( 'test-no-html' , testSubtasksNoHTMLValidation ) ;
274296
275297 // JS distribution task.
276298 grunt . registerTask ( 'dist-js' , [ 'concat' , 'uglify' ] ) ;
@@ -285,20 +307,21 @@ module.exports = function(grunt) {
285307 grunt . registerTask ( 'dist' , [ 'clean' , 'dist-fonts' , 'dist-css' , 'dist-js' , 'compress:dist' ] ) ;
286308
287309 // Default task.
288- grunt . registerTask ( 'default' , [ 'test' , 'dist' ] ) ;
310+ grunt . registerTask ( 'default' , [ 'test-no-html ' , 'dist' ] ) ;
289311
290- // Default task that runs jekyll server, delivers uncompressed css and watch capabilities
312+ // Dev 'default' task that runs jekyll server, delivers uncompressed css and watch capabilities
291313 grunt . registerTask ( 'dev' ,
292314 [
293- 'lr' ,
294- 'connect:docs' ,
295- 'dist-fonts' ,
296- 'dist-css' ,
297- 'test' ,
298- 'dist-js' ,
299- 'compress:dist' ,
315+ 'lr' ,
316+ 'connect:docs' ,
317+ 'default' ,
300318 'watch'
301319 ]
302320 ) ;
303321
304- } ;
322+ // Version numbering task.
323+ // grunt change-version-number --oldver=A.B.C --newver=X.Y.Z
324+ // This can be overzealous, so its changes should always be manually reviewed!
325+ grunt . registerTask ( 'change-version-number' , [ 'sed' ] ) ;
326+
327+ } ;
0 commit comments