-
-
Notifications
You must be signed in to change notification settings - Fork 12
/
Copy pathaudit.js
124 lines (105 loc) · 3.35 KB
/
audit.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
import axeCore from 'axe-core'
let cache = {}
let style = {}
let lastNotification = ''
const deferred = {}
const impacts = [...axeCore.constants.impact].reverse()
export function checkAndReport (options, node, label) {
const deferred = createDeferred()
style = { ...options.style }
axeCore.run(node || options.element || document, options.runOptions, (error, results) => {
if (error) deferred.reject(error)
if (results && !results.violations.length) return
if (JSON.stringify(results.violations) === lastNotification) return
if (options.clearConsoleOnUpdate) {
console.clear()
}
options.customResultHandler ? options.customResultHandler(error, results) : standardResultHandler(error, results, label)
deferred.resolve()
lastNotification = JSON.stringify(results.violations)
})
return deferred.promise
}
const standardResultHandler = function (errorInfo, results, label) {
results.violations = results.violations.filter(result => {
result.nodes = result.nodes.filter(node => {
const key = node.target.toString() + result.id
const retVal = (!cache[key])
cache[key] = key
return retVal
})
return (!!result.nodes.length)
})
if (results.violations.length) {
const violations = sortViolations(results.violations)
console.group(`%cAxe issues ${label ? '- ' + label : ''}`, style.head)
violations.forEach(result => {
console.groupCollapsed('%c%s%c %s %s %c%s', style[result.impact || 'minor'], result.impact, style.title, result.help, '\n', style.url, result.helpUrl)
result.nodes.forEach(node => {
failureSummary(node, 'any')
failureSummary(node, 'none')
})
console.groupEnd()
})
console.groupEnd()
}
}
export function resetCache () {
cache = {}
}
export function resetLastNotification () {
lastNotification = ''
}
export const draf = (cb) => requestAnimationFrame(() => requestAnimationFrame(cb))
function sortViolations (violations) {
let sorted = []
impacts.forEach(impact => {
sorted = [...sorted, ...violations.filter(violation => violation.impact === impact)]
})
return sorted
}
function createDeferred () {
deferred.promise = new Promise((resolve, reject) => {
deferred.resolve = resolve
deferred.reject = reject
})
return deferred
}
function failureSummary (node, key) {
if (node[key].length > 0) {
logElement(node, console.groupCollapsed)
logHtml(node)
logFailureMessage(node, key)
var relatedNodes = []
node[key].forEach(check => {
relatedNodes = relatedNodes.concat(check.relatedNodes)
})
if (relatedNodes.length > 0) {
console.groupCollapsed('Related nodes')
relatedNodes.forEach(relatedNode => {
logElement(relatedNode, console.log)
logHtml(relatedNode)
})
console.groupEnd()
}
console.groupEnd()
}
}
function logElement (node, logFn) {
const el = document.querySelector(node.target.toString())
if (!el) {
return logFn('Selector: %c%s', style.boldCourier, node.target.toString())
}
logFn('Element: %o', el)
}
function logHtml (node) {
console.log('HTML: %c%s', style.boldCourier, node.html)
}
function logFailureMessage (node, key) {
const message = axeCore._audit.data.failureSummaries[key]
.failureMessage(node[key]
.map(function (check) {
return check.message || ''
}))
console.error(message)
}