Skip to content

Commit d941100

Browse files
committed
Update of plugin files
1 parent 360cd00 commit d941100

File tree

3 files changed

+146
-0
lines changed

3 files changed

+146
-0
lines changed

src/constants.js

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
export const OPTIONS_DEFAULT = {
2+
config: {
3+
checks: [{
4+
id: 'color-contrast',
5+
options: {
6+
noScroll: true
7+
}
8+
}]
9+
}
10+
}
11+
12+
export const IMPACT = {
13+
critical: 'critical',
14+
serious: 'serious',
15+
moderate: 'moderate',
16+
minor: 'minor'
17+
}
18+
19+
export const STYLE = {
20+
head: 'padding:6px;font-size:20px;background-color:#8ba6c5;color:#fff;font-weight:bold;',
21+
boldCourier: 'font-weight:bold;font-family:Courier;',
22+
critical: 'color:#aa0000;font-weight:bold;',
23+
serious: 'color:#aa0000;font-weight:normal;',
24+
moderate: 'color:orange;font-weight:bold;',
25+
minor: 'color:orange;font-weight:normal;',
26+
defaultReset: 'font-color:black;font-weight:normal;'
27+
}

src/index.js

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import axeCore from 'axe-core'
2+
import { checkAndReport } from './utils'
3+
import { OPTIONS_DEFAULT } from './constants'
4+
5+
export default function install (Vue, options) {
6+
// Browser only
7+
if (typeof window === 'undefined') return
8+
9+
// Configure the format data
10+
axeCore.configure({ ...OPTIONS_DEFAULT.config, ...options.config })
11+
12+
// Rechecking when updating specific component
13+
Vue.mixin({
14+
updated () {
15+
this.$nextTick(() => {
16+
checkAndReport(this.$el)
17+
})
18+
}
19+
})
20+
21+
Vue.nextTick(() => {
22+
return checkAndReport(document)
23+
})
24+
}

src/utils.js

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
import axeCore from 'axe-core'
2+
import {
3+
IMPACT,
4+
STYLE
5+
} from './constants'
6+
7+
let cache = {}
8+
let nodes = []
9+
let deferred = {}
10+
11+
export function checkAndReport (node) {
12+
nodes.push(node)
13+
let deferred = createDeferred()
14+
15+
axeCore.run(node, { reporter: 'v2' }, (error, results) => {
16+
if (error) deferred.reject(error)
17+
18+
results.violations = results.violations.filter(result => {
19+
result.nodes = result.nodes.filter(node => {
20+
let key = node.target.toString() + result.id
21+
let retVal = (!cache[key])
22+
cache[key] = key
23+
return retVal
24+
})
25+
return (!!result.nodes.length)
26+
})
27+
28+
if (results.violations.length) {
29+
console.group('%cNew aXe issues', STYLE.head)
30+
results.violations.forEach(result => {
31+
let styl = IMPACT.hasOwnProperty(result.impact) ? IMPACT[result.impact] : IMPACT.minor
32+
console.groupCollapsed('%c%s: %c%s %s', STYLE[styl], result.impact, STYLE.defaultReset, result.help, result.helpUrl)
33+
result.nodes.forEach(function (node) {
34+
failureSummary(node, 'any')
35+
failureSummary(node, 'none')
36+
})
37+
console.groupEnd()
38+
})
39+
console.groupEnd()
40+
}
41+
deferred.resolve()
42+
})
43+
}
44+
45+
function createDeferred () {
46+
deferred.promise = new Promise((resolve, reject) => {
47+
deferred.resolve = resolve
48+
deferred.reject = reject
49+
})
50+
return deferred
51+
}
52+
53+
function failureSummary (node, key) {
54+
if (node[key].length > 0) {
55+
logElement(node, console.groupCollapsed)
56+
logHtml(node)
57+
logFailureMessage(node, key)
58+
59+
var relatedNodes = []
60+
node[key].forEach(function (check) {
61+
relatedNodes = relatedNodes.concat(check.relatedNodes)
62+
})
63+
64+
if (relatedNodes.length > 0) {
65+
console.groupCollapsed('Related nodes')
66+
relatedNodes.forEach(function (relatedNode) {
67+
logElement(relatedNode, console.log)
68+
logHtml(relatedNode)
69+
})
70+
console.groupEnd()
71+
}
72+
73+
console.groupEnd()
74+
}
75+
}
76+
77+
function logElement (node, logFn) {
78+
var el = document.querySelector(node.target.toString())
79+
if (!el) {
80+
logFn('Selector: %c%s', STYLE.boldCourier, node.target.toString())
81+
} else {
82+
logFn('Element: %o', el)
83+
}
84+
}
85+
86+
function logHtml (node) {
87+
console.log('HTML: %c%s', STYLE.boldCourier, node.html)
88+
}
89+
90+
function logFailureMessage (node, key) {
91+
var message = axeCore._audit.data.failureSummaries[key].failureMessage(node[key].map(function (check) {
92+
return check.message || ''
93+
}))
94+
console.error(message)
95+
}

0 commit comments

Comments
 (0)