axe-sarif-converter
Version:
Convert axe-core accessibility scan results to the SARIF format
145 lines (144 loc) • 7.39 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.SarifConverter = void 0;
exports.defaultSarifConverter = defaultSarifConverter;
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 environment_data_provider_1 = require("./environment-data-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 defaultSarifConverter() {
return new SarifConverter(converter_property_provider_1.getConverterProperties, axe_tool_property_provider_1.getAxeToolProperties, invocation_provider_1.getInvocations, artifact_property_provider_1.getArtifactProperties);
}
var SarifConverter = /** @class */ (function () {
function SarifConverter(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);
}
SarifConverter.prototype.convert = function (results, options) {
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, options)],
};
};
SarifConverter.prototype.convertRun = function (results, options) {
var resultToRuleConverter = result_to_rule_converter_1.ResultToRuleConverter.fromV2Results(results, this.wcagLinkDataIndexer.getSortedWcagTags(), this.wcagLinkDataIndexer.getWcagTagsToTaxaIndices());
var environmentData = (0, environment_data_provider_1.getEnvironmentDataFromResults)(results);
return {
conversion: this.getConverterToolProperties(),
tool: {
driver: __assign(__assign({}, this.getAxeProperties(environmentData)), { rules: resultToRuleConverter.getRulePropertiesFromResults() }),
},
invocations: this.invocationConverter(environmentData),
artifacts: [this.getArtifactProperties(environmentData)],
results: this.convertResults(results, resultToRuleConverter.getRuleIdsToRuleIndices()),
taxonomies: [
(0, wcag_taxonomy_provider_1.getWcagTaxonomy)(this.wcagLinkDataIndexer.getSortedWcagTags(), this.tagsToWcagLinkData),
],
};
};
SarifConverter.prototype.convertResults = function (results, ruleIdsToRuleIndices) {
var resultArray = [];
var environmentData = (0, environment_data_provider_1.getEnvironmentDataFromResults)(results);
this.convertRuleResults(resultArray, results.violations, ruleIdsToRuleIndices, 'fail', environmentData);
this.convertRuleResults(resultArray, results.passes, ruleIdsToRuleIndices, 'pass', environmentData);
this.convertRuleResults(resultArray, results.incomplete, ruleIdsToRuleIndices, 'open', environmentData);
this.convertRuleResultsWithoutNodes(resultArray, results.inapplicable, ruleIdsToRuleIndices, 'notApplicable');
return resultArray;
};
SarifConverter.prototype.convertRuleResults = function (resultArray, ruleResults, ruleIdsToRuleIndices, kind, environmentData) {
if (ruleResults) {
for (var _i = 0, ruleResults_1 = ruleResults; _i < ruleResults_1.length; _i++) {
var ruleResult = ruleResults_1[_i];
for (var _a = 0, _b = ruleResult.nodes; _a < _b.length; _a++) {
var node = _b[_a];
resultArray.push(this.convertRuleResult(node, ruleResult, ruleIdsToRuleIndices, kind, environmentData));
}
}
}
};
SarifConverter.prototype.convertRuleResult = function (node, ruleResult, ruleIdsToRuleIndices, kind, environmentData) {
return {
ruleId: ruleResult.id,
ruleIndex: ruleIdsToRuleIndices[ruleResult.id],
kind: kind,
level: this.getResultLevelFromResultKind(kind),
message: (0, sarif_result_message_formatter_1.formatSarifResultMessage)(node, kind),
locations: [
{
physicalLocation: {
artifactLocation: (0, artifact_property_provider_1.getArtifactLocation)(environmentData),
region: {
startLine: 1,
snippet: {
text: node.html,
},
},
},
logicalLocations: this.getLogicalLocations(node),
},
],
};
};
SarifConverter.prototype.getLogicalLocations = function (node) {
var selector = node.target.join(';');
var logicalLocations = [
this.formatLogicalLocation(selector),
];
// casting node as "any" works around axe-core/#1636
if (node.xpath) {
var nodeXpath = node.xpath.join(';');
logicalLocations.push(this.formatLogicalLocation(nodeXpath));
}
return logicalLocations;
};
SarifConverter.prototype.formatLogicalLocation = function (name) {
return {
fullyQualifiedName: name,
kind: 'element',
};
};
SarifConverter.prototype.convertRuleResultsWithoutNodes = function (resultArray, ruleResults, ruleIdsToRuleIndices, kind) {
if (ruleResults) {
for (var _i = 0, ruleResults_2 = ruleResults; _i < ruleResults_2.length; _i++) {
var ruleResult = ruleResults_2[_i];
resultArray.push({
ruleId: ruleResult.id,
ruleIndex: ruleIdsToRuleIndices[ruleResult.id],
kind: kind,
level: this.getResultLevelFromResultKind(kind),
message: {
text: ruleResult.description + '.',
},
locations: [],
});
}
}
};
SarifConverter.prototype.getResultLevelFromResultKind = function (kind) {
return kind === 'fail' ? 'error' : 'none';
};
return SarifConverter;
}());
exports.SarifConverter = SarifConverter;