@@ -9,9 +9,10 @@ import {
99 preload ,
1010 findBy ,
1111 ruleShouldRun ,
12- performanceTimer
12+ performanceTimer ,
13+ serializeError
1314} from '../utils' ;
14- import doT from '@deque/dot ' ;
15+ import { doT } from '../imports ' ;
1516import constants from '../constants' ;
1617
1718const dotRegex = / \{ \{ .+ ?\} \} / g;
@@ -183,15 +184,15 @@ export default class Audit {
183184 * Initializes the rules and checks
184185 */
185186 _init ( ) {
186- var audit = getDefaultConfiguration ( this . defaultConfig ) ;
187+ const audit = getDefaultConfiguration ( this . defaultConfig ) ;
187188 this . lang = audit . lang || 'en' ;
188189 this . reporter = audit . reporter ;
189190 this . commands = { } ;
190191 this . rules = [ ] ;
191192 this . checks = { } ;
192193 this . brand = 'axe' ;
193194 this . application = 'axeAPI' ;
194- this . tagExclude = [ 'experimental' ] ;
195+ this . tagExclude = [ 'experimental' , 'deprecated' ] ;
195196 this . noHtml = audit . noHtml ;
196197 this . allowedOrigins = audit . allowedOrigins ;
197198 unpackToObject ( audit . rules , this , 'addRule' ) ;
@@ -366,16 +367,26 @@ export default class Audit {
366367 * @param {Mixed } options Options object to pass into rules and/or disable rules or checks
367368 */
368369 after ( results , options ) {
369- var rules = this . rules ;
370+ const rules = this . rules ;
370371 return results . map ( ruleResult => {
371- var rule = findBy ( rules , 'id' , ruleResult . id ) ;
372+ if ( ruleResult . error ) {
373+ return ruleResult ;
374+ }
375+ const rule = findBy ( rules , 'id' , ruleResult . id ) ;
372376 if ( ! rule ) {
373377 // If you see this, you're probably running the Mocha tests with the axe extension installed
374378 throw new Error (
375379 'Result for unknown rule. You may be running mismatch axe-core versions'
376380 ) ;
377381 }
378- return rule . after ( ruleResult , options ) ;
382+ try {
383+ return rule . after ( ruleResult , options ) ;
384+ } catch ( err ) {
385+ if ( options . debug ) {
386+ throw err ;
387+ }
388+ return createIncompleteErrorResult ( rule , err ) ;
389+ }
379390 } ) ;
380391 }
381392 /**
@@ -393,7 +404,7 @@ export default class Audit {
393404 * @return {Object } Validated options object
394405 */
395406 normalizeOptions ( options ) {
396- var audit = this ;
407+ const audit = this ;
397408 const tags = [ ] ;
398409 const ruleIds = [ ] ;
399410 audit . rules . forEach ( rule => {
@@ -498,7 +509,7 @@ export default class Audit {
498509 }
499510 _constructHelpUrls ( previous = null ) {
500511 // TODO: es-modules-version
501- var version = ( axe . version . match ( / ^ [ 1 - 9 ] [ 0 - 9 ] * \. [ 0 - 9 ] + / ) || [ 'x.y' ] ) [ 0 ] ;
512+ const version = ( axe . version . match ( / ^ [ 1 - 9 ] [ 0 - 9 ] * \. [ 0 - 9 ] + / ) || [ 'x.y' ] ) [ 0 ] ;
502513 this . rules . forEach ( rule => {
503514 if ( ! this . data . rules [ rule . id ] ) {
504515 this . data . rules [ rule . id ] = { } ;
@@ -732,36 +743,37 @@ function getDefferedRule(rule, context, options) {
732743 rule . run (
733744 context ,
734745 options ,
735- // resolve callback for rule `run`
736- ruleResult => {
737- // resolve
738- resolve ( ruleResult ) ;
739- } ,
740- // reject callback for rule `run`
746+ ruleResult => resolve ( ruleResult ) ,
741747 err => {
742- // if debug - construct error details
743- if ( ! options . debug ) {
744- const errResult = Object . assign ( new RuleResult ( rule ) , {
745- result : constants . CANTTELL ,
746- description : 'An error occured while running this rule' ,
747- message : err . message ,
748- stack : err . stack ,
749- error : err ,
750- // Add a serialized reference to the node the rule failed on for easier debugging.
751- // See https://github.com/dequelabs/axe-core/issues/1317.
752- errorNode : err . errorNode
753- } ) ;
754- // resolve
755- resolve ( errResult ) ;
756- } else {
757- // reject
748+ if ( options . debug ) {
758749 reject ( err ) ;
750+ } else {
751+ resolve ( createIncompleteErrorResult ( rule , err ) ) ;
759752 }
760753 }
761754 ) ;
762755 } ;
763756}
764757
758+ function createIncompleteErrorResult ( rule , error ) {
759+ const { errorNode } = error ;
760+ const serialError = serializeError ( error ) ;
761+ const none = [
762+ {
763+ id : 'error-occurred' ,
764+ result : undefined ,
765+ data : serialError ,
766+ relatedNodes : [ ]
767+ }
768+ ] ;
769+ const node = errorNode || new DqElement ( document . documentElement ) ;
770+ return Object . assign ( new RuleResult ( rule ) , {
771+ error : serialError ,
772+ result : constants . CANTTELL ,
773+ nodes : [ { any : [ ] , all : [ ] , none, node } ]
774+ } ) ;
775+ }
776+
765777/**
766778 * For all the rules, create the helpUrl and add it to the data for that rule
767779 */
0 commit comments