axe-core
Version:
Accessibility engine for automated Web UI testing
84 lines (72 loc) • 2.56 kB
JavaScript
/**
* Check if a rule matches the value of runOnly type=tag
* @private
* @param {object} rule
* @param {object} runOnly Value of runOnly with type=tags
* @return {bool}
*/
function matchTags(rule, runOnly) {
var include, exclude, matching;
var defaultExclude =
// TODO: es-modules_audit
axe._audit && axe._audit.tagExclude ? axe._audit.tagExclude : [];
// normalize include/exclude
if (runOnly.hasOwnProperty('include') || runOnly.hasOwnProperty('exclude')) {
// Wrap include and exclude if it's not already an array
include = runOnly.include || [];
include = Array.isArray(include) ? include : [include];
exclude = runOnly.exclude || [];
exclude = Array.isArray(exclude) ? exclude : [exclude];
// add defaults, unless mentioned in include
exclude = exclude.concat(
defaultExclude.filter(tag => {
return include.indexOf(tag) === -1;
})
);
// Otherwise, only use the include value, ignore exclude
} else {
include = Array.isArray(runOnly) ? runOnly : [runOnly];
// exclude the defaults not included
exclude = defaultExclude.filter(tag => {
return include.indexOf(tag) === -1;
});
}
matching = include.some(tag => {
return rule.tags.indexOf(tag) !== -1;
});
if (matching || (include.length === 0 && rule.enabled !== false)) {
return exclude.every(tag => {
return rule.tags.indexOf(tag) === -1;
});
} else {
return false;
}
}
/**
* Determines whether a rule should run
* @param {Rule} rule The rule to test
* @param {Context} context The context of the Audit
* @param {Object} options Options object
* @return {Boolean}
*/
function ruleShouldRun(rule, context, options) {
var runOnly = options.runOnly || {};
var ruleOptions = (options.rules || {})[rule.id];
// Never run page level rules if the context is not on the page
if (rule.pageLevel && !context.page) {
return false;
// First, runOnly type rule overrides anything else
} else if (runOnly.type === 'rule') {
return runOnly.values.indexOf(rule.id) !== -1;
// Second, if options.rules[rule].enabled is set, it overrides all
} else if (ruleOptions && typeof ruleOptions.enabled === 'boolean') {
return ruleOptions.enabled;
// Third, if tags are set, look at those
} else if (runOnly.type === 'tag' && runOnly.values) {
return matchTags(rule, runOnly.values);
// If nothing is set, only check for default excludes
} else {
return matchTags(rule, []);
}
}
export default ruleShouldRun;