2017-09-27 17:18:23 +02:00
#!/usr/bin/env node
/ * !
* Script to run vnu - jar if Java is available .
* Copyright 2017 The Bootstrap Authors
* Copyright 2017 Twitter , Inc .
* Licensed under MIT ( https : //github.com/twbs/bootstrap/blob/master/LICENSE)
* /
2017-09-27 16:41:58 +02:00
'use strict'
const childProcess = require ( 'child_process' )
2017-09-27 17:18:23 +02:00
const vnu = require ( 'vnu-jar' )
2017-10-31 12:06:39 +01:00
childProcess . exec ( 'java -version' , ( error , stdout , stderr ) => {
2017-09-27 17:18:23 +02:00
if ( error ) {
console . error ( 'Skipping HTML lint test; Java is missing.' )
return
}
2017-09-27 16:41:58 +02:00
2017-10-31 12:06:39 +01:00
const is32bitJava = ! stderr . match ( /64-Bit/ )
2017-10-30 16:34:02 +01:00
// vnu-jar accepts multiple ignores joined with a `|`
2017-09-27 17:18:23 +02:00
const ignores = [
2017-10-31 14:50:31 +01:00
// "autocomplete" is included in <button> and checkboxes and radio <input>s due to
// Firefox's non-standard autocomplete behavior - see https://bugzilla.mozilla.org/show_bug.cgi?id=654072
2017-09-27 17:18:23 +02:00
'Attribute “autocomplete” is only allowed when the input type is “color”, “date”, “datetime-local”, “email”, “hidden”, “month”, “number”, “password”, “range”, “search”, “tel”, “text”, “time”, “url”, or “week”.' ,
'Attribute “autocomplete” not allowed on element “button” at this point.' ,
'Bad value “tablist” for attribute “role” on element “nav”.' ,
2017-10-30 16:34:02 +01:00
// We use holder.js with `data-src` and no `src`; we could work around this, not sure it's worth it.
2017-09-27 17:18:23 +02:00
'Element “img” is missing required attribute “src”.' ,
2017-10-31 14:50:31 +01:00
// Markup used in Components > Forms > Layout > Form grid > Horizontal form is currently invalid,
// but used this way due to lack of support for flexbox layout on <fieldset> element in most browsers
2017-10-30 16:34:02 +01:00
'Element “legend” not allowed as child of element “div” in this context.*' ,
'The “datetime-local” input type is not supported in all browsers. Please be sure to test, and consider using a polyfill.' ,
// The next one we are using it because IE11 doesn't recognise <main>.
// So, redundant for modern browsers, but not invalid.
'The “main” role is unnecessary for element “main”.'
2017-09-27 17:18:23 +02:00
] . join ( '|' )
2017-09-27 16:41:58 +02:00
2017-09-27 17:18:23 +02:00
const args = [
'-jar' ,
vnu ,
'--asciiquotes' ,
'--skip-non-html' ,
2017-10-30 16:34:02 +01:00
'--Werror' ,
2017-09-27 17:18:23 +02:00
` --filterpattern " ${ ignores } " ` ,
'_gh_pages/' ,
'js/tests/'
]
2017-09-27 16:41:58 +02:00
2017-10-31 12:06:39 +01:00
// For the 32-bit Java we need to pass `-Xss512k`
if ( is32bitJava ) {
args . splice ( 0 , 0 , '-Xss512k' )
}
2017-09-27 17:18:23 +02:00
return childProcess . spawn ( 'java' , args , {
shell : true ,
stdio : 'inherit'
2017-09-27 16:41:58 +02:00
} )
2017-09-27 17:18:23 +02:00
. on ( 'exit' , process . exit )
} )