UNPKG

axe-sarif-converter

Version:

Convert axe-core accessibility scan results to the SARIF format

175 lines (174 loc) 8.51 kB
"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;