@code-pushup/axe-plugin 0.99.0 → 0.100.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +3 -3
- package/src/lib/axe-plugin.js +5 -5
- package/src/lib/axe-plugin.js.map +1 -1
- package/src/lib/constants.d.ts +3 -0
- package/src/lib/constants.js +7 -0
- package/src/lib/constants.js.map +1 -1
- package/src/lib/meta/format.d.ts +1 -0
- package/src/lib/meta/format.js +4 -0
- package/src/lib/meta/format.js.map +1 -0
- package/src/lib/{processing.d.ts → meta/processing.d.ts} +1 -1
- package/src/lib/meta/processing.js +21 -0
- package/src/lib/meta/processing.js.map +1 -0
- package/src/lib/runner/run-axe.d.ts +14 -1
- package/src/lib/runner/run-axe.js +55 -28
- package/src/lib/runner/run-axe.js.map +1 -1
- package/src/lib/runner/runner.js +52 -31
- package/src/lib/runner/runner.js.map +1 -1
- package/src/lib/processing.js +0 -17
- package/src/lib/processing.js.map +0 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@code-pushup/axe-plugin",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.100.1",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"description": "Code PushUp plugin for detecting accessibility issues using Axe 🌐",
|
|
6
6
|
"homepage": "https://github.com/code-pushup/cli/tree/main/packages/plugin-axe#readme",
|
|
@@ -42,8 +42,8 @@
|
|
|
42
42
|
"type": "module",
|
|
43
43
|
"dependencies": {
|
|
44
44
|
"@axe-core/playwright": "^4.11.0",
|
|
45
|
-
"@code-pushup/models": "0.
|
|
46
|
-
"@code-pushup/utils": "0.
|
|
45
|
+
"@code-pushup/models": "0.100.1",
|
|
46
|
+
"@code-pushup/utils": "0.100.1",
|
|
47
47
|
"axe-core": "^4.11.0",
|
|
48
48
|
"playwright-core": "^1.56.1",
|
|
49
49
|
"zod": "^4.1.12"
|
package/src/lib/axe-plugin.js
CHANGED
|
@@ -2,8 +2,8 @@ import { createRequire } from 'node:module';
|
|
|
2
2
|
import { validate, } from '@code-pushup/models';
|
|
3
3
|
import { normalizeUrlInput } from '@code-pushup/utils';
|
|
4
4
|
import { axePluginOptionsSchema } from './config.js';
|
|
5
|
-
import { AXE_PLUGIN_SLUG } from './constants.js';
|
|
6
|
-
import { processAuditsAndGroups } from './processing.js';
|
|
5
|
+
import { AXE_PLUGIN_SLUG, AXE_PLUGIN_TITLE } from './constants.js';
|
|
6
|
+
import { processAuditsAndGroups } from './meta/processing.js';
|
|
7
7
|
import { createRunnerFunction } from './runner/runner.js';
|
|
8
8
|
/**
|
|
9
9
|
* Code PushUp plugin for accessibility testing using axe-core.
|
|
@@ -20,12 +20,12 @@ export function axePlugin(urls, options = {}) {
|
|
|
20
20
|
const packageJson = createRequire(import.meta.url)('../../package.json');
|
|
21
21
|
return {
|
|
22
22
|
slug: AXE_PLUGIN_SLUG,
|
|
23
|
-
|
|
24
|
-
version: packageJson.version,
|
|
25
|
-
title: 'Axe Accessibility',
|
|
23
|
+
title: AXE_PLUGIN_TITLE,
|
|
26
24
|
icon: 'folder-syntax',
|
|
27
25
|
description: 'Official Code PushUp Axe plugin for automated accessibility testing',
|
|
28
26
|
docsUrl: 'https://www.npmjs.com/package/@code-pushup/axe-plugin',
|
|
27
|
+
packageName: packageJson.name,
|
|
28
|
+
version: packageJson.version,
|
|
29
29
|
audits,
|
|
30
30
|
groups,
|
|
31
31
|
runner: createRunnerFunction(normalizedUrls, ruleIds, timeout),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"axe-plugin.js","sourceRoot":"","sources":["../../../src/lib/axe-plugin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAGL,QAAQ,GACT,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAyB,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAC5E,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"axe-plugin.js","sourceRoot":"","sources":["../../../src/lib/axe-plugin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAGL,QAAQ,GACT,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAyB,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAC5E,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACnE,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAE1D;;;;;;;GAOG;AACH,MAAM,UAAU,SAAS,CACvB,IAAgB,EAChB,UAA4B,EAAE;IAE9B,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,GAAG,QAAQ,CAChD,sBAAsB,EACtB,OAAO,CACR,CAAC;IAEF,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAElE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,sBAAsB,CACxD,cAAc,EACd,MAAM,CACP,CAAC;IAEF,MAAM,WAAW,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAChD,oBAAoB,CACkB,CAAC;IAEzC,OAAO;QACL,IAAI,EAAE,eAAe;QACrB,KAAK,EAAE,gBAAgB;QACvB,IAAI,EAAE,eAAe;QACrB,WAAW,EACT,qEAAqE;QACvE,OAAO,EAAE,uDAAuD;QAChE,WAAW,EAAE,WAAW,CAAC,IAAI;QAC7B,OAAO,EAAE,WAAW,CAAC,OAAO;QAC5B,MAAM;QACN,MAAM;QACN,MAAM,EAAE,oBAAoB,CAAC,cAAc,EAAE,OAAO,EAAE,OAAO,CAAC;QAC9D,OAAO;QACP,GAAG,CAAC,YAAY,IAAI,EAAE,YAAY,EAAE,CAAC;KACtC,CAAC;AACJ,CAAC"}
|
package/src/lib/constants.d.ts
CHANGED
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
import type { AxePreset } from './config.js';
|
|
1
2
|
export declare const AXE_PLUGIN_SLUG = "axe";
|
|
3
|
+
export declare const AXE_PLUGIN_TITLE = "Axe";
|
|
2
4
|
export declare const AXE_DEFAULT_PRESET = "wcag21aa";
|
|
3
5
|
export declare const DEFAULT_TIMEOUT_MS = 30000;
|
|
6
|
+
export declare const AXE_PRESET_NAMES: Record<AxePreset, string>;
|
package/src/lib/constants.js
CHANGED
|
@@ -1,4 +1,11 @@
|
|
|
1
1
|
export const AXE_PLUGIN_SLUG = 'axe';
|
|
2
|
+
export const AXE_PLUGIN_TITLE = 'Axe';
|
|
2
3
|
export const AXE_DEFAULT_PRESET = 'wcag21aa';
|
|
3
4
|
export const DEFAULT_TIMEOUT_MS = 30_000;
|
|
5
|
+
export const AXE_PRESET_NAMES = {
|
|
6
|
+
wcag21aa: 'WCAG 2.1 AA',
|
|
7
|
+
wcag22aa: 'WCAG 2.2 AA',
|
|
8
|
+
'best-practice': 'Best practices',
|
|
9
|
+
all: 'All',
|
|
10
|
+
};
|
|
4
11
|
//# sourceMappingURL=constants.js.map
|
package/src/lib/constants.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/lib/constants.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/lib/constants.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,CAAC;AACrC,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,CAAC;AAEtC,MAAM,CAAC,MAAM,kBAAkB,GAAG,UAAU,CAAC;AAE7C,MAAM,CAAC,MAAM,kBAAkB,GAAG,MAAM,CAAC;AAEzC,MAAM,CAAC,MAAM,gBAAgB,GAA8B;IACzD,QAAQ,EAAE,aAAa;IACvB,QAAQ,EAAE,aAAa;IACvB,eAAe,EAAE,gBAAgB;IACjC,GAAG,EAAE,KAAK;CACX,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const formatMetaLog: (message: string) => string;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.js","sourceRoot":"","sources":["../../../../src/lib/meta/format.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAEnD,MAAM,CAAC,MAAM,aAAa,GAAG,sBAAsB,CAAC,gBAAgB,CAAC,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { Audit, Group } from '@code-pushup/models';
|
|
2
|
-
import type { AxePreset } from '
|
|
2
|
+
import type { AxePreset } from '../config.js';
|
|
3
3
|
export declare function processAuditsAndGroups(urls: string[], preset: AxePreset): {
|
|
4
4
|
audits: Audit[];
|
|
5
5
|
groups: Group[];
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import ansis from 'ansis';
|
|
2
|
+
import { expandAuditsForUrls, expandGroupsForUrls, logger, pluralizeToken, shouldExpandForUrls, } from '@code-pushup/utils';
|
|
3
|
+
import { AXE_PRESET_NAMES } from '../constants.js';
|
|
4
|
+
import { formatMetaLog } from './format.js';
|
|
5
|
+
import { loadAxeRules, transformRulesToAudits, transformRulesToGroups, } from './transform.js';
|
|
6
|
+
export function processAuditsAndGroups(urls, preset) {
|
|
7
|
+
const rules = loadAxeRules(preset);
|
|
8
|
+
const ruleIds = rules.map(({ ruleId }) => ruleId);
|
|
9
|
+
const audits = transformRulesToAudits(rules);
|
|
10
|
+
const groups = transformRulesToGroups(rules);
|
|
11
|
+
logger.info(formatMetaLog(`Loaded ${pluralizeToken('Axe rule', rules.length)} for ${ansis.bold(AXE_PRESET_NAMES[preset])} preset, mapped to audits`));
|
|
12
|
+
logger.info(formatMetaLog(`Created ${pluralizeToken('group', groups.length)} from Axe categories`));
|
|
13
|
+
if (!shouldExpandForUrls(urls.length)) {
|
|
14
|
+
return { audits, groups, ruleIds };
|
|
15
|
+
}
|
|
16
|
+
const expandedAudits = expandAuditsForUrls(audits, urls);
|
|
17
|
+
const expandedGroups = expandGroupsForUrls(groups, urls);
|
|
18
|
+
logger.info(formatMetaLog(`Expanded audits (${audits.length} → ${expandedAudits.length}) and groups (${groups.length} → ${expandedGroups.length}) for ${pluralizeToken('URL', urls.length)}`));
|
|
19
|
+
return { audits: expandedAudits, groups: expandedGroups, ruleIds };
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=processing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"processing.js","sourceRoot":"","sources":["../../../../src/lib/meta/processing.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,MAAM,EACN,cAAc,EACd,mBAAmB,GACpB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EACL,YAAY,EACZ,sBAAsB,EACtB,sBAAsB,GACvB,MAAM,gBAAgB,CAAC;AAExB,MAAM,UAAU,sBAAsB,CACpC,IAAc,EACd,MAAiB;IAMjB,MAAM,KAAK,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;IACnC,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC;IAClD,MAAM,MAAM,GAAG,sBAAsB,CAAC,KAAK,CAAC,CAAC;IAC7C,MAAM,MAAM,GAAG,sBAAsB,CAAC,KAAK,CAAC,CAAC;IAE7C,MAAM,CAAC,IAAI,CACT,aAAa,CACX,UAAU,cAAc,CAAC,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC,QAAQ,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,2BAA2B,CAC1H,CACF,CAAC;IACF,MAAM,CAAC,IAAI,CACT,aAAa,CACX,WAAW,cAAc,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,sBAAsB,CACxE,CACF,CAAC;IAEF,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACtC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;IACrC,CAAC;IAED,MAAM,cAAc,GAAG,mBAAmB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACzD,MAAM,cAAc,GAAG,mBAAmB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACzD,MAAM,CAAC,IAAI,CACT,aAAa,CACX,oBAAoB,MAAM,CAAC,MAAM,MAAM,cAAc,CAAC,MAAM,iBAAiB,MAAM,CAAC,MAAM,MAAM,cAAc,CAAC,MAAM,SAAS,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,CACnK,CACF,CAAC;IACF,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,CAAC;AACrE,CAAC"}
|
|
@@ -1,3 +1,16 @@
|
|
|
1
|
+
import type { AxeResults } from 'axe-core';
|
|
1
2
|
import type { AuditOutputs } from '@code-pushup/models';
|
|
2
|
-
export
|
|
3
|
+
export type AxeUrlArgs = {
|
|
4
|
+
url: string;
|
|
5
|
+
urlIndex: number;
|
|
6
|
+
urlsCount: number;
|
|
7
|
+
ruleIds: string[];
|
|
8
|
+
timeout: number;
|
|
9
|
+
};
|
|
10
|
+
export type AxeUrlResult = {
|
|
11
|
+
url: string;
|
|
12
|
+
axeResults: AxeResults;
|
|
13
|
+
auditOutputs: AuditOutputs;
|
|
14
|
+
};
|
|
15
|
+
export declare function runAxeForUrl(args: AxeUrlArgs): Promise<AxeUrlResult>;
|
|
3
16
|
export declare function closeBrowser(): Promise<void>;
|
|
@@ -1,39 +1,35 @@
|
|
|
1
1
|
import { AxeBuilder } from '@axe-core/playwright';
|
|
2
|
+
import ansis from 'ansis';
|
|
2
3
|
import { createRequire } from 'node:module';
|
|
3
4
|
import path from 'node:path';
|
|
4
5
|
import { chromium } from 'playwright-core';
|
|
5
|
-
import { executeProcess, logger, pluralizeToken,
|
|
6
|
+
import { executeProcess, formatAsciiTable, indentLines, logger, pluralizeToken, } from '@code-pushup/utils';
|
|
6
7
|
import { toAuditOutputs } from './transform.js';
|
|
7
8
|
/* eslint-disable functional/no-let */
|
|
8
9
|
let browser;
|
|
9
10
|
let browserChecked = false;
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
}
|
|
11
|
+
export async function runAxeForUrl(args) {
|
|
12
|
+
const { url, urlIndex, urlsCount } = args;
|
|
13
|
+
if (!browser) {
|
|
14
|
+
await ensureBrowserInstalled();
|
|
15
|
+
browser = await logger.task('Launching Chromium browser', async () => ({
|
|
16
|
+
message: 'Launched Chromium browser',
|
|
17
|
+
result: await chromium.launch({ headless: true }),
|
|
18
|
+
}));
|
|
19
|
+
}
|
|
20
|
+
const prefix = ansis.gray(`[${urlIndex + 1}/${urlsCount}]`);
|
|
21
|
+
return await logger.task(`${prefix} Analyzing URL ${url}`, async () => {
|
|
22
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
18
23
|
const context = await browser.newContext();
|
|
19
24
|
try {
|
|
20
25
|
const page = await context.newPage();
|
|
21
26
|
try {
|
|
22
|
-
await page
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
if (ruleIds.length > 0) {
|
|
29
|
-
axeBuilder.withRules(ruleIds);
|
|
30
|
-
}
|
|
31
|
-
const results = await axeBuilder.analyze();
|
|
32
|
-
const incompleteCount = results.incomplete.length;
|
|
33
|
-
if (incompleteCount > 0) {
|
|
34
|
-
logger.warn(`Axe returned ${pluralizeToken('incomplete result', incompleteCount)} for ${url}`);
|
|
35
|
-
}
|
|
36
|
-
return toAuditOutputs(results, url);
|
|
27
|
+
const axeResults = await runAxeForPage(page, args);
|
|
28
|
+
const auditOutputs = toAuditOutputs(axeResults, url);
|
|
29
|
+
return {
|
|
30
|
+
message: `${prefix} Analyzed URL ${url}`,
|
|
31
|
+
result: { url, axeResults, auditOutputs },
|
|
32
|
+
};
|
|
37
33
|
}
|
|
38
34
|
finally {
|
|
39
35
|
await page.close();
|
|
@@ -42,16 +38,47 @@ export async function runAxeForUrl(url, ruleIds, timeout) {
|
|
|
42
38
|
finally {
|
|
43
39
|
await context.close();
|
|
44
40
|
}
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
async function runAxeForPage(page, { url, ruleIds, timeout }) {
|
|
44
|
+
await page.goto(url, {
|
|
45
|
+
waitUntil: 'networkidle',
|
|
46
|
+
timeout,
|
|
47
|
+
});
|
|
48
|
+
const axeBuilder = new AxeBuilder({ page });
|
|
49
|
+
// Use withRules() to include experimental/deprecated rules
|
|
50
|
+
if (ruleIds.length > 0) {
|
|
51
|
+
axeBuilder.withRules(ruleIds);
|
|
45
52
|
}
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
53
|
+
const results = await axeBuilder.analyze();
|
|
54
|
+
logger.debug(formatAsciiTable({
|
|
55
|
+
columns: ['left', 'right'],
|
|
56
|
+
rows: [
|
|
57
|
+
['Passes', results.passes.length],
|
|
58
|
+
['Violations', results.violations.length],
|
|
59
|
+
['Incomplete', results.incomplete.length],
|
|
60
|
+
['Inapplicable', results.inapplicable.length],
|
|
61
|
+
],
|
|
62
|
+
}));
|
|
63
|
+
if (results.incomplete.length > 0) {
|
|
64
|
+
logger.warn(`Axe returned ${pluralizeToken('incomplete result', results.incomplete.length)}`);
|
|
65
|
+
logger.debug(results.incomplete
|
|
66
|
+
.flatMap(res => [
|
|
67
|
+
`• ${res.id}`,
|
|
68
|
+
indentLines(res.nodes
|
|
69
|
+
.flatMap(node => [...node.all, ...node.any])
|
|
70
|
+
.map(check => `- ${check.message}`)
|
|
71
|
+
.join('\n'), 2),
|
|
72
|
+
])
|
|
73
|
+
.join('\n'));
|
|
49
74
|
}
|
|
75
|
+
return results;
|
|
50
76
|
}
|
|
51
77
|
export async function closeBrowser() {
|
|
52
78
|
if (browser) {
|
|
53
79
|
await browser.close();
|
|
54
80
|
browser = undefined;
|
|
81
|
+
logger.debug('Closed Chromium browser');
|
|
55
82
|
}
|
|
56
83
|
}
|
|
57
84
|
/**
|
|
@@ -64,7 +91,7 @@ async function ensureBrowserInstalled() {
|
|
|
64
91
|
if (browserChecked) {
|
|
65
92
|
return;
|
|
66
93
|
}
|
|
67
|
-
logger.debug('Checking Chromium browser installation...');
|
|
94
|
+
logger.debug('Checking Chromium browser installation ...');
|
|
68
95
|
const require = createRequire(import.meta.url);
|
|
69
96
|
const pkgPath = require.resolve('playwright-core/package.json');
|
|
70
97
|
const pkg = require(pkgPath);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-axe.js","sourceRoot":"","sources":["../../../../src/lib/runner/run-axe.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,
|
|
1
|
+
{"version":3,"file":"run-axe.js","sourceRoot":"","sources":["../../../../src/lib/runner/run-axe.ts"],"names":[],"mappings":"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"}
|
package/src/lib/runner/runner.js
CHANGED
|
@@ -1,41 +1,62 @@
|
|
|
1
|
-
import { addIndex, logger, pluralizeToken, shouldExpandForUrls, stringifyError, } from '@code-pushup/utils';
|
|
2
|
-
import { closeBrowser, runAxeForUrl } from './run-axe.js';
|
|
1
|
+
import { addIndex, asyncSequential, formatAsciiTable, logger, pluralizeToken, shouldExpandForUrls, stringifyError, } from '@code-pushup/utils';
|
|
2
|
+
import { closeBrowser, runAxeForUrl, } from './run-axe.js';
|
|
3
3
|
export function createRunnerFunction(urls, ruleIds, timeout) {
|
|
4
|
-
return async (
|
|
5
|
-
const
|
|
6
|
-
|
|
7
|
-
logger.info(`Running Axe accessibility checks for ${pluralizeToken('URL', urlCount)}...`);
|
|
4
|
+
return async () => {
|
|
5
|
+
const urlsCount = urls.length;
|
|
6
|
+
logger.info(`Running Axe accessibility checks for ${pluralizeToken('URL', urlsCount)} ...`);
|
|
8
7
|
try {
|
|
9
|
-
const
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
: auditOutputs.map(audit => ({
|
|
17
|
-
...audit,
|
|
18
|
-
slug: addIndex(audit.slug, index),
|
|
19
|
-
}));
|
|
20
|
-
return [...acc, ...processedOutputs];
|
|
21
|
-
}
|
|
22
|
-
catch (error) {
|
|
23
|
-
logger.warn(stringifyError(error));
|
|
24
|
-
return acc;
|
|
25
|
-
}
|
|
26
|
-
}, Promise.resolve([]));
|
|
27
|
-
const totalAuditCount = allResults.length;
|
|
28
|
-
if (totalAuditCount === 0) {
|
|
29
|
-
throw new Error(isSingleUrl
|
|
30
|
-
? 'Axe did not produce any results.'
|
|
31
|
-
: 'Axe failed to produce results for all URLs.');
|
|
8
|
+
const results = await asyncSequential(urls, async (url, urlIndex) => runForUrl({ urlsCount, ruleIds, timeout, url, urlIndex }));
|
|
9
|
+
const collectedResults = results.filter(res => res != null);
|
|
10
|
+
const auditOutputs = collectedResults.flatMap(res => res.auditOutputs);
|
|
11
|
+
if (collectedResults.length === 0) {
|
|
12
|
+
throw new Error(shouldExpandForUrls(urlsCount)
|
|
13
|
+
? 'Axe failed to produce results for all URLs.'
|
|
14
|
+
: 'Axe did not produce any results.');
|
|
32
15
|
}
|
|
33
|
-
|
|
34
|
-
return
|
|
16
|
+
logResultsForAllUrls(collectedResults);
|
|
17
|
+
return auditOutputs;
|
|
35
18
|
}
|
|
36
19
|
finally {
|
|
37
20
|
await closeBrowser();
|
|
38
21
|
}
|
|
39
22
|
};
|
|
40
23
|
}
|
|
24
|
+
async function runForUrl(args) {
|
|
25
|
+
const { url, urlsCount, urlIndex } = args;
|
|
26
|
+
try {
|
|
27
|
+
const result = await runAxeForUrl(args);
|
|
28
|
+
if (shouldExpandForUrls(urlsCount)) {
|
|
29
|
+
return {
|
|
30
|
+
...result,
|
|
31
|
+
auditOutputs: result.auditOutputs.map(audit => ({
|
|
32
|
+
...audit,
|
|
33
|
+
slug: addIndex(audit.slug, urlIndex),
|
|
34
|
+
})),
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
return result;
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
logger.warn(`Axe execution failed for ${url}: ${stringifyError(error)}`);
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
function logResultsForAllUrls(results) {
|
|
45
|
+
logger.info(formatAsciiTable({
|
|
46
|
+
columns: [
|
|
47
|
+
{ key: 'url', label: 'URL', align: 'left' },
|
|
48
|
+
{ key: 'passes', label: 'Passes', align: 'right' },
|
|
49
|
+
{ key: 'violations', label: 'Violations', align: 'right' },
|
|
50
|
+
{ key: 'incomplete', label: 'Incomplete', align: 'right' },
|
|
51
|
+
{ key: 'inapplicable', label: 'Inapplicable', align: 'right' },
|
|
52
|
+
],
|
|
53
|
+
rows: results.map(res => ({
|
|
54
|
+
url: res.url,
|
|
55
|
+
passes: res.axeResults.passes.length,
|
|
56
|
+
violations: res.axeResults.violations.length,
|
|
57
|
+
incomplete: res.axeResults.incomplete.length,
|
|
58
|
+
inapplicable: res.axeResults.inapplicable.length,
|
|
59
|
+
})),
|
|
60
|
+
}));
|
|
61
|
+
}
|
|
41
62
|
//# sourceMappingURL=runner.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../../../src/lib/runner/runner.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../../../src/lib/runner/runner.ts"],"names":[],"mappings":"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"}
|
package/src/lib/processing.js
DELETED
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import { expandAuditsForUrls, expandGroupsForUrls, shouldExpandForUrls, } from '@code-pushup/utils';
|
|
2
|
-
import { loadAxeRules, transformRulesToAudits, transformRulesToGroups, } from './meta/transform.js';
|
|
3
|
-
export function processAuditsAndGroups(urls, preset) {
|
|
4
|
-
const rules = loadAxeRules(preset);
|
|
5
|
-
const ruleIds = rules.map(({ ruleId }) => ruleId);
|
|
6
|
-
const audits = transformRulesToAudits(rules);
|
|
7
|
-
const groups = transformRulesToGroups(rules);
|
|
8
|
-
if (!shouldExpandForUrls(urls.length)) {
|
|
9
|
-
return { audits, groups, ruleIds };
|
|
10
|
-
}
|
|
11
|
-
return {
|
|
12
|
-
audits: expandAuditsForUrls(audits, urls),
|
|
13
|
-
groups: expandGroupsForUrls(groups, urls),
|
|
14
|
-
ruleIds,
|
|
15
|
-
};
|
|
16
|
-
}
|
|
17
|
-
//# sourceMappingURL=processing.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"processing.js","sourceRoot":"","sources":["../../../src/lib/processing.ts"],"names":[],"mappings":"AACA,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,YAAY,EACZ,sBAAsB,EACtB,sBAAsB,GACvB,MAAM,qBAAqB,CAAC;AAE7B,MAAM,UAAU,sBAAsB,CACpC,IAAc,EACd,MAAiB;IAMjB,MAAM,KAAK,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;IACnC,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC;IAClD,MAAM,MAAM,GAAG,sBAAsB,CAAC,KAAK,CAAC,CAAC;IAC7C,MAAM,MAAM,GAAG,sBAAsB,CAAC,KAAK,CAAC,CAAC;IAE7C,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACtC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;IACrC,CAAC;IAED,OAAO;QACL,MAAM,EAAE,mBAAmB,CAAC,MAAM,EAAE,IAAI,CAAC;QACzC,MAAM,EAAE,mBAAmB,CAAC,MAAM,EAAE,IAAI,CAAC;QACzC,OAAO;KACR,CAAC;AACJ,CAAC"}
|