axe-sarif-converter
Version:
Convert axe-core accessibility scan results to the SARIF format
175 lines (174 loc) • 8.51 kB
JavaScript
"use strict";
var __assign = (this && this.__assign) || function () {
__assign = Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.AxeRawSarifConverter = void 0;
exports.defaultAxeRawSarifConverter = defaultAxeRawSarifConverter;
var array_utils_1 = require("./array-utils");
var artifact_property_provider_1 = require("./artifact-property-provider");
var axe_tool_property_provider_1 = require("./axe-tool-property-provider");
var converter_property_provider_1 = require("./converter-property-provider");
var invocation_provider_1 = require("./invocation-provider");
var result_to_rule_converter_1 = require("./result-to-rule-converter");
var sarif_result_message_formatter_1 = require("./sarif-result-message-formatter");
var wcag_link_data_1 = require("./wcag-link-data");
var wcag_link_data_indexer_1 = require("./wcag-link-data-indexer");
var wcag_taxonomy_provider_1 = require("./wcag-taxonomy-provider");
function defaultAxeRawSarifConverter() {
return new AxeRawSarifConverter(converter_property_provider_1.getConverterProperties, axe_tool_property_provider_1.getAxeToolProperties, invocation_provider_1.getInvocations, artifact_property_provider_1.getArtifactProperties);
}
var AxeRawSarifConverter = /** @class */ (function () {
function AxeRawSarifConverter(getConverterToolProperties, getAxeProperties, invocationConverter, getArtifactProperties) {
this.getConverterToolProperties = getConverterToolProperties;
this.getAxeProperties = getAxeProperties;
this.invocationConverter = invocationConverter;
this.getArtifactProperties = getArtifactProperties;
this.tagsToWcagLinkData = wcag_link_data_1.axeTagsToWcagLinkData;
this.wcagLinkDataIndexer = new wcag_link_data_indexer_1.WCAGLinkDataIndexer(this.tagsToWcagLinkData);
}
AxeRawSarifConverter.prototype.convert = function (results, converterOptions, environmentData) {
return {
version: '2.1.0',
$schema: 'https://raw.githubusercontent.com/oasis-tcs/sarif-spec/master/Schemata/sarif-schema-2.1.0.json',
runs: [this.convertRun(results, converterOptions, environmentData)],
};
};
AxeRawSarifConverter.prototype.convertRun = function (results, converterOptions, environmentData) {
var resultToRuleConverter = result_to_rule_converter_1.ResultToRuleConverter.fromRawResults(results, this.wcagLinkDataIndexer.getSortedWcagTags(), this.wcagLinkDataIndexer.getWcagTagsToTaxaIndices());
return {
conversion: this.getConverterToolProperties(),
tool: {
driver: __assign(__assign({}, this.getAxeProperties(environmentData)), { rules: resultToRuleConverter.getRulePropertiesFromResults() }),
},
invocations: this.invocationConverter(environmentData),
artifacts: [this.getArtifactProperties(environmentData)],
results: this.convertRawResults(results, resultToRuleConverter.getRuleIdsToRuleIndices(), environmentData),
taxonomies: [
(0, wcag_taxonomy_provider_1.getWcagTaxonomy)(this.wcagLinkDataIndexer.getSortedWcagTags(), this.tagsToWcagLinkData),
],
};
};
AxeRawSarifConverter.prototype.convertRawResults = function (results, ruleIdsToRuleIndices, environmentData) {
var resultArray = [];
for (var _i = 0, results_1 = results; _i < results_1.length; _i++) {
var result = results_1[_i];
var axeRawNodeResultArrays = [
result.violations,
result.passes,
result.incomplete,
result.inapplicable,
];
for (var _a = 0, axeRawNodeResultArrays_1 = axeRawNodeResultArrays; _a < axeRawNodeResultArrays_1.length; _a++) {
var axeRawNodeResultArray = axeRawNodeResultArrays_1[_a];
if (!axeRawNodeResultArray) {
continue;
}
resultArray.push.apply(resultArray, this.convertRawNodeResults(axeRawNodeResultArray, ruleIdsToRuleIndices, environmentData, result.id));
}
if (axeRawNodeResultArrays.every(array_utils_1.isEmpty)) {
resultArray.push(this.generateResultForInapplicableRule(ruleIdsToRuleIndices, result.id, result.description));
}
}
return resultArray;
};
AxeRawSarifConverter.prototype.convertRawNodeResults = function (rawNodeResults, ruleIdsToRuleIndices, environmentData, ruleId) {
var _this = this;
if (rawNodeResults) {
return rawNodeResults.map(function (rawNodeResult) {
return _this.convertRawNodeResult(rawNodeResult, ruleIdsToRuleIndices, environmentData, ruleId);
});
}
return [];
};
AxeRawSarifConverter.prototype.convertRawNodeResult = function (axeRawNodeResult, ruleIdsToRuleIndices, environmentData, ruleId) {
var kind = this.getSarifResultKind(axeRawNodeResult.result);
return {
ruleId: ruleId,
ruleIndex: ruleIdsToRuleIndices[ruleId],
kind: kind,
level: this.getResultLevelFromResultKind(kind),
message: (0, sarif_result_message_formatter_1.formatSarifResultMessage)(axeRawNodeResult, kind),
locations: [
{
physicalLocation: {
artifactLocation: (0, artifact_property_provider_1.getArtifactLocation)(environmentData),
region: {
startLine: 1,
snippet: {
text: axeRawNodeResult.node.source,
},
},
},
logicalLocations: this.getLogicalLocations(axeRawNodeResult),
},
],
};
};
AxeRawSarifConverter.prototype.getLogicalLocations = function (node) {
var selector = this.getSelectorFromRawNode(node);
var xpath = this.getXpathFromRawNode(node);
var logicalLocations = [
this.formatLogicalLocation(selector),
];
if (xpath) {
logicalLocations.push(this.formatLogicalLocation(xpath));
}
return logicalLocations;
};
AxeRawSarifConverter.prototype.formatLogicalLocation = function (name) {
return {
fullyQualifiedName: name,
kind: 'element',
};
};
AxeRawSarifConverter.prototype.generateResultForInapplicableRule = function (ruleIdsToRuleIndices, ruleId, ruleDescription) {
return {
ruleId: ruleId,
ruleIndex: ruleIdsToRuleIndices[ruleId],
kind: 'notApplicable',
level: 'none',
message: {
text: ruleDescription + '.',
},
locations: [],
};
};
AxeRawSarifConverter.prototype.getSarifResultKind = function (resultValue) {
var resultToKindMapping = {
passed: 'pass',
failed: 'fail',
inapplicable: 'notApplicable',
cantTell: 'open',
};
if (!resultValue) {
throw new Error('getSarifResultKind(resultValue): resultValue is undefined');
}
return resultToKindMapping[resultValue];
};
AxeRawSarifConverter.prototype.getSelectorFromRawNode = function (axeRawNodeResult) {
if (!axeRawNodeResult.node.selector) {
throw new Error('getSelectorFromRawNode: axe result contained a node with no selector');
}
return axeRawNodeResult.node.selector.join(';');
};
AxeRawSarifConverter.prototype.getXpathFromRawNode = function (axeRawNodeResult) {
if (!axeRawNodeResult.node.xpath) {
throw new Error('getXpathFromRawNode: axe result contained a node with no xpath');
}
return axeRawNodeResult.node.xpath.join(';');
};
AxeRawSarifConverter.prototype.getResultLevelFromResultKind = function (kind) {
return kind === 'fail' ? 'error' : 'none';
};
return AxeRawSarifConverter;
}());
exports.AxeRawSarifConverter = AxeRawSarifConverter;