@axe-core/watcher 3.11.0 → 3.11.1-next.06e682d4
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/dist/Controller.d.ts +9 -1
- package/dist/Controller.js +24 -10
- package/dist/Controller.js.map +1 -1
- package/dist/EventForwarder.js +4 -6
- package/dist/EventForwarder.js.map +1 -1
- package/dist/createDebugger.d.ts +9 -0
- package/dist/createDebugger.js +27 -0
- package/dist/createDebugger.js.map +1 -0
- package/dist/cypress.d.ts +1 -1
- package/dist/cypress.js +30 -20
- package/dist/cypress.js.map +1 -1
- package/dist/cypressCommands.d.ts +3 -1
- package/dist/cypressCommands.js +78 -39
- package/dist/cypressCommands.js.map +1 -1
- package/dist/git.d.ts +2 -1
- package/dist/git.js +5 -4
- package/dist/git.js.map +1 -1
- package/dist/playwright.d.ts +1 -1
- package/dist/playwright.js +10 -7
- package/dist/playwright.js.map +1 -1
- package/dist/playwrightTest.js +10 -4
- package/dist/playwrightTest.js.map +1 -1
- package/dist/playwrightWrapping.d.ts +1 -1
- package/dist/playwrightWrapping.js +41 -41
- package/dist/playwrightWrapping.js.map +1 -1
- package/dist/puppeteer.d.ts +1 -1
- package/dist/puppeteer.js +11 -8
- package/dist/puppeteer.js.map +1 -1
- package/dist/puppeteerWrapping.d.ts +3 -2
- package/dist/puppeteerWrapping.js +100 -42
- package/dist/puppeteerWrapping.js.map +1 -1
- package/dist/sendResultsToServer.d.ts +9 -2
- package/dist/sendResultsToServer.js +25 -43
- package/dist/sendResultsToServer.js.map +1 -1
- package/dist/utils/constants.d.ts +4 -0
- package/dist/utils/constants.js +16 -0
- package/dist/utils/constants.js.map +1 -0
- package/dist/utils/headlessNotSupportedError.d.ts +5 -0
- package/dist/utils/headlessNotSupportedError.js +17 -0
- package/dist/utils/headlessNotSupportedError.js.map +1 -0
- package/dist/utils/headlessNotSupportedError.test.d.ts +1 -0
- package/dist/utils/headlessNotSupportedError.test.js +21 -0
- package/dist/utils/headlessNotSupportedError.test.js.map +1 -0
- package/dist/utils/mergeChromeArgs.d.ts +12 -0
- package/dist/utils/mergeChromeArgs.js +73 -0
- package/dist/utils/mergeChromeArgs.js.map +1 -0
- package/dist/utils/mergeChromeArgs.test.d.ts +1 -0
- package/dist/utils/mergeChromeArgs.test.js +260 -0
- package/dist/utils/mergeChromeArgs.test.js.map +1 -0
- package/dist/utils/proxyHandlers.d.ts +12 -0
- package/dist/utils/proxyHandlers.js +62 -0
- package/dist/utils/proxyHandlers.js.map +1 -0
- package/dist/utils/proxyHandlers.test.d.ts +1 -0
- package/dist/utils/proxyHandlers.test.js +28 -0
- package/dist/utils/proxyHandlers.test.js.map +1 -0
- package/dist/utils/readVariables.d.ts +7 -0
- package/dist/utils/readVariables.js +17 -0
- package/dist/utils/readVariables.js.map +1 -0
- package/dist/utils/updateAutoAnalyze.d.ts +7 -0
- package/dist/utils/updateAutoAnalyze.js +20 -0
- package/dist/utils/updateAutoAnalyze.js.map +1 -0
- package/dist/utils/validateApiKey.d.ts +7 -0
- package/dist/utils/validateApiKey.js +34 -0
- package/dist/utils/validateApiKey.js.map +1 -0
- package/dist/utils/validateApiKey.test.d.ts +1 -0
- package/dist/utils/validateApiKey.test.js +66 -0
- package/dist/utils/validateApiKey.test.js.map +1 -0
- package/dist/utils/validateAxeRunContext.d.ts +2 -0
- package/dist/utils/validateAxeRunContext.js +59 -0
- package/dist/utils/validateAxeRunContext.js.map +1 -0
- package/dist/utils/validateAxeRunContext.test.d.ts +1 -0
- package/dist/utils/validateAxeRunContext.test.js +100 -0
- package/dist/utils/validateAxeRunContext.test.js.map +1 -0
- package/dist/utils/validateAxeRunOptions.d.ts +13 -0
- package/dist/utils/validateAxeRunOptions.js +161 -0
- package/dist/utils/validateAxeRunOptions.js.map +1 -0
- package/dist/utils/validateAxeRunOptions.test.d.ts +1 -0
- package/dist/utils/validateAxeRunOptions.test.js +230 -0
- package/dist/utils/validateAxeRunOptions.test.js.map +1 -0
- package/dist/utils/writeExtensionManifest.d.ts +7 -0
- package/dist/utils/writeExtensionManifest.js +18 -0
- package/dist/utils/writeExtensionManifest.js.map +1 -0
- package/dist/utils/writeVariables.d.ts +64 -0
- package/dist/utils/writeVariables.js +119 -0
- package/dist/utils/writeVariables.js.map +1 -0
- package/dist/utils/writeVariables.test.d.ts +1 -0
- package/dist/utils/writeVariables.test.js +184 -0
- package/dist/utils/writeVariables.test.js.map +1 -0
- package/dist/wdio.d.ts +1 -1
- package/dist/wdio.js +18 -13
- package/dist/wdio.js.map +1 -1
- package/dist/webdriver.d.ts +1 -1
- package/dist/webdriver.js +15 -8
- package/dist/webdriver.js.map +1 -1
- package/dist/webdriverWrapping.d.ts +1 -1
- package/dist/webdriverWrapping.js +16 -16
- package/dist/webdriverWrapping.js.map +1 -1
- package/extension/background.js +1 -1
- package/extension/content.js +1 -1
- package/package.json +11 -8
- package/dist/util.d.ts +0 -66
- package/dist/util.js +0 -167
- package/dist/util.js.map +0 -1
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
require("mocha");
|
|
7
|
+
const chai_1 = require("chai");
|
|
8
|
+
const sinon_1 = __importDefault(require("sinon"));
|
|
9
|
+
const proxyquire_1 = __importDefault(require("proxyquire"));
|
|
10
|
+
describe('validateApiKey', () => {
|
|
11
|
+
describe('when the server returns a non-200 response', () => {
|
|
12
|
+
it('throws an error', () => {
|
|
13
|
+
const requestStub = sinon_1.default
|
|
14
|
+
.stub()
|
|
15
|
+
.returns({ statusCode: 500, getBody: () => '{"error":"boom"}' });
|
|
16
|
+
const fn = (0, proxyquire_1.default)('./validateApiKey', {
|
|
17
|
+
'sync-request': requestStub
|
|
18
|
+
}).default;
|
|
19
|
+
chai_1.assert.throws(() => {
|
|
20
|
+
fn({ apiKey: 'abc', serverURL: 'http://localhost:3000' });
|
|
21
|
+
}, 'boom');
|
|
22
|
+
});
|
|
23
|
+
});
|
|
24
|
+
describe('when the server returns a 200 response', () => {
|
|
25
|
+
it('does not throw an error', () => {
|
|
26
|
+
const requestStub = sinon_1.default
|
|
27
|
+
.stub()
|
|
28
|
+
.returns({ statusCode: 200, getBody: () => '{}' });
|
|
29
|
+
const fn = (0, proxyquire_1.default)('./validateApiKey', {
|
|
30
|
+
'sync-request': requestStub
|
|
31
|
+
}).default;
|
|
32
|
+
chai_1.assert.doesNotThrow(() => {
|
|
33
|
+
fn({ apiKey: 'abc', serverURL: 'http://localhost:3000' });
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
it('throws an error when a user provides an empty string as an API key', () => {
|
|
37
|
+
const requestStub = sinon_1.default
|
|
38
|
+
.stub()
|
|
39
|
+
.returns({ statusCode: 200, getBody: () => '{}' });
|
|
40
|
+
const fn = (0, proxyquire_1.default)('./validateApiKey', {
|
|
41
|
+
'sync-request': requestStub
|
|
42
|
+
}).default;
|
|
43
|
+
chai_1.assert.throws(() => {
|
|
44
|
+
fn({ apiKey: '', serverURL: 'http://localhost:3000' });
|
|
45
|
+
}, 'API key is required');
|
|
46
|
+
});
|
|
47
|
+
it('sends API key authentication request with correct format', () => {
|
|
48
|
+
const requestStub = sinon_1.default
|
|
49
|
+
.stub()
|
|
50
|
+
.returns({ statusCode: 200, getBody: () => '{}' });
|
|
51
|
+
const fn = (0, proxyquire_1.default)('./validateApiKey', {
|
|
52
|
+
'sync-request': requestStub
|
|
53
|
+
}).default;
|
|
54
|
+
const apiKey = 'test-api-key';
|
|
55
|
+
const serverURL = 'http://localhost:3000';
|
|
56
|
+
fn({ apiKey, serverURL });
|
|
57
|
+
(0, chai_1.assert)(requestStub.calledOnce, 'api-key authentication requested more than once');
|
|
58
|
+
const callArgs = requestStub.getCall(0).args;
|
|
59
|
+
const [method, url, options] = callArgs;
|
|
60
|
+
chai_1.assert.strictEqual(method, 'GET', 'Request method is not GET');
|
|
61
|
+
chai_1.assert.strictEqual(url, `${serverURL}/api/api-keys/validate/axe-devtools-watcher`, 'URL does not match');
|
|
62
|
+
chai_1.assert.strictEqual(options.headers['X-API-Key'], apiKey, 'X-API-Key header does not match');
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
});
|
|
66
|
+
//# sourceMappingURL=validateApiKey.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validateApiKey.test.js","sourceRoot":"","sources":["../../src/utils/validateApiKey.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.validateAxeRunContext = validateAxeRunContext;
|
|
4
|
+
function validateAxeRunContext(runContext = undefined) {
|
|
5
|
+
if (!runContext) {
|
|
6
|
+
return;
|
|
7
|
+
}
|
|
8
|
+
if (!isContextObject(runContext)) {
|
|
9
|
+
throw new Error(`\`runContext\` must be an object, an array of objects, or a string. Examples: \n
|
|
10
|
+
- Object: { runContext: { include: 'selector' } }\n
|
|
11
|
+
- Array: { runContext: ['selector1', 'selector2'] }\n
|
|
12
|
+
- String: { runContext: 'selector' }\n
|
|
13
|
+
|
|
14
|
+
For more detailed examples: https://www.deque.com/axe/core-documentation/api-documentation/#context-parameter
|
|
15
|
+
`);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Validates the context object for the `runContext` parameter of the `axe.run` method.
|
|
20
|
+
* Borrowed from axe-core's original implementation.
|
|
21
|
+
*
|
|
22
|
+
* @see https://github.com/dequelabs/axe-core/blob/0577a74fab385a590b31c9118f3da7ad55051097/lib/core/base/context/normalize-context.js#L92
|
|
23
|
+
*
|
|
24
|
+
* Removed `window.node` check
|
|
25
|
+
*
|
|
26
|
+
* @param contextSpec - The context object to validate
|
|
27
|
+
* @returns `true` if the context object is valid, `false` otherwise
|
|
28
|
+
*/
|
|
29
|
+
function isContextObject(contextSpec) {
|
|
30
|
+
return ['include', 'exclude'].some(prop => objectHasOwn(contextSpec, prop) &&
|
|
31
|
+
isContextProp(contextSpec[prop]));
|
|
32
|
+
}
|
|
33
|
+
//@see https://github.com/dequelabs/axe-core/blob/0577a74fab385a590b31c9118f3da7ad55051097/lib/core/base/context/normalize-context.js#L98
|
|
34
|
+
function isContextProp(contextList) {
|
|
35
|
+
return (typeof contextList === 'string' ||
|
|
36
|
+
isLabelledFramesSelector(contextList) ||
|
|
37
|
+
isLabelledShadowDomSelector(contextList) ||
|
|
38
|
+
isArrayLike(contextList));
|
|
39
|
+
}
|
|
40
|
+
// @see https://github.com/dequelabs/axe-core/blob/0577a74fab385a590b31c9118f3da7ad55051097/lib/core/base/context/normalize-context.js#L178-L184
|
|
41
|
+
function objectHasOwn(obj, prop) {
|
|
42
|
+
if (!obj || typeof obj !== 'object') {
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
return Object.prototype.hasOwnProperty.call(obj, prop);
|
|
46
|
+
}
|
|
47
|
+
//@see https://github.com/dequelabs/axe-core/blob/0577a74fab385a590b31c9118f3da7ad55051097/lib/core/base/context/normalize-context.js#L108
|
|
48
|
+
function isLabelledFramesSelector(selector) {
|
|
49
|
+
return objectHasOwn(selector, 'fromFrames');
|
|
50
|
+
}
|
|
51
|
+
//@see https://github.com/dequelabs/axe-core/blob/0577a74fab385a590b31c9118f3da7ad55051097/lib/core/base/context/normalize-context.js#L112
|
|
52
|
+
function isLabelledShadowDomSelector(selector) {
|
|
53
|
+
return objectHasOwn(selector, 'fromShadowDom');
|
|
54
|
+
}
|
|
55
|
+
// @see https://github.com/dequelabs/axe-core/blob/0577a74fab385a590b31c9118f3da7ad55051097/lib/core/base/context/normalize-context.js#L160C1-L168C2
|
|
56
|
+
function isArrayLike(arr) {
|
|
57
|
+
return arr && typeof arr === 'object' && typeof arr.length === 'number';
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=validateAxeRunContext.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validateAxeRunContext.js","sourceRoot":"","sources":["../../src/utils/validateAxeRunContext.ts"],"names":[],"mappings":";;AAEA,sDAkBC;AAlBD,SAAgB,qBAAqB,CACnC,aAAyC,SAAS;IAElD,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAM;IACR,CAAC;IAED,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CACb;;;;;;OAMC,CACF,CAAA;IACH,CAAC;AACH,CAAC;AAED;;;;;;;;;;GAUG;AACH,SAAS,eAAe,CAAC,WAA2B;IAClD,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,IAAI,CAChC,IAAI,CAAC,EAAE,CACL,YAAY,CAAC,WAAW,EAAE,IAAI,CAAC;QAC/B,aAAa,CAAC,WAAW,CAAC,IAA4B,CAAC,CAAC,CAC3D,CAAA;AACH,CAAC;AAED,yIAAyI;AACzI,SAAS,aAAa,CACpB,WAAiD;IAEjD,OAAO,CACL,OAAO,WAAW,KAAK,QAAQ;QAC/B,wBAAwB,CAAC,WAAW,CAAC;QACrC,2BAA2B,CAAC,WAAW,CAAC;QACxC,WAAW,CAAC,WAAW,CAAC,CACzB,CAAA;AACH,CAAC;AAED,gJAAgJ;AAChJ,SAAS,YAAY,CAAC,GAAY,EAAE,IAAiB;IACnD,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QACpC,OAAO,KAAK,CAAA;IACd,CAAC;IACD,OAAO,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;AACxD,CAAC;AAED,0IAA0I;AAC1I,SAAS,wBAAwB,CAAC,QAAiB;IACjD,OAAO,YAAY,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAA;AAC7C,CAAC;AAED,0IAA0I;AAC1I,SAAS,2BAA2B,CAAC,QAAiB;IACpD,OAAO,YAAY,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAA;AAChD,CAAC;AAED,oJAAoJ;AACpJ,SAAS,WAAW,CAAC,GAAc;IACjC,OAAO,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ,CAAA;AACzE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import 'mocha';
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
require("mocha");
|
|
4
|
+
const chai_1 = require("chai");
|
|
5
|
+
const validateAxeRunContext_1 = require("./validateAxeRunContext");
|
|
6
|
+
describe('validateAxeRunContext', () => {
|
|
7
|
+
describe('when no run context is provided', () => {
|
|
8
|
+
it('does not throw an error', () => {
|
|
9
|
+
chai_1.assert.doesNotThrow(() => (0, validateAxeRunContext_1.validateAxeRunContext)());
|
|
10
|
+
});
|
|
11
|
+
});
|
|
12
|
+
describe('given a valid run context', () => {
|
|
13
|
+
describe('when the run context is a string', () => {
|
|
14
|
+
it('does not throw an error', () => {
|
|
15
|
+
chai_1.assert.doesNotThrow(() => (0, validateAxeRunContext_1.validateAxeRunContext)({ include: 'selector' }));
|
|
16
|
+
});
|
|
17
|
+
});
|
|
18
|
+
describe('when the run context is an array of strings', () => {
|
|
19
|
+
it('does not throw an error', () => {
|
|
20
|
+
chai_1.assert.doesNotThrow(() => (0, validateAxeRunContext_1.validateAxeRunContext)({ include: ['selector1', 'selector2'] }));
|
|
21
|
+
});
|
|
22
|
+
});
|
|
23
|
+
describe('when the run context is an object', () => {
|
|
24
|
+
describe('when the object has an `include` property', () => {
|
|
25
|
+
it('does not throw an error', () => {
|
|
26
|
+
chai_1.assert.doesNotThrow(() => (0, validateAxeRunContext_1.validateAxeRunContext)({ include: 'selector' }));
|
|
27
|
+
});
|
|
28
|
+
describe('and a `fromFrames` property', () => {
|
|
29
|
+
it('does not throw an error', () => {
|
|
30
|
+
chai_1.assert.doesNotThrow(() => (0, validateAxeRunContext_1.validateAxeRunContext)({
|
|
31
|
+
include: {
|
|
32
|
+
fromFrames: ['selector', 'selector']
|
|
33
|
+
}
|
|
34
|
+
}));
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
describe('and a `fromShadowDom` property', () => {
|
|
38
|
+
it('does not throw an error', () => {
|
|
39
|
+
chai_1.assert.doesNotThrow(() => (0, validateAxeRunContext_1.validateAxeRunContext)({
|
|
40
|
+
include: {
|
|
41
|
+
fromShadowDom: ['selector', 'selector']
|
|
42
|
+
}
|
|
43
|
+
}));
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
describe('when the object has an `exclude` property', () => {
|
|
48
|
+
it('does not throw an error', () => {
|
|
49
|
+
chai_1.assert.doesNotThrow(() => (0, validateAxeRunContext_1.validateAxeRunContext)({ exclude: 'selector' }));
|
|
50
|
+
});
|
|
51
|
+
describe('and a `fromFrames` property', () => {
|
|
52
|
+
it('does not throw an error', () => {
|
|
53
|
+
chai_1.assert.doesNotThrow(() => (0, validateAxeRunContext_1.validateAxeRunContext)({
|
|
54
|
+
exclude: {
|
|
55
|
+
fromFrames: ['selector', 'selector']
|
|
56
|
+
}
|
|
57
|
+
}));
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
describe('and a `fromShadowDom` property', () => {
|
|
61
|
+
it('does not throw an error', () => {
|
|
62
|
+
chai_1.assert.doesNotThrow(() => (0, validateAxeRunContext_1.validateAxeRunContext)({
|
|
63
|
+
exclude: {
|
|
64
|
+
fromShadowDom: ['selector', 'selector']
|
|
65
|
+
}
|
|
66
|
+
}));
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
describe('when the object has both `include` and `exclude` properties', () => {
|
|
71
|
+
it('does not throw an error', () => {
|
|
72
|
+
chai_1.assert.doesNotThrow(() => (0, validateAxeRunContext_1.validateAxeRunContext)({ include: 'selector', exclude: 'selector' }));
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
describe('given an invalid run context', () => {
|
|
78
|
+
describe('and does not have an `include` or `exclude` property', () => {
|
|
79
|
+
describe('and is not a string', () => {
|
|
80
|
+
it('throws an error', () => {
|
|
81
|
+
//@ts-expect-error - Testing invalid input
|
|
82
|
+
chai_1.assert.throws(() => (0, validateAxeRunContext_1.validateAxeRunContext)(1));
|
|
83
|
+
});
|
|
84
|
+
});
|
|
85
|
+
describe('and is not an array of strings', () => {
|
|
86
|
+
it('throws an error', () => {
|
|
87
|
+
//@ts-expect-error - Testing invalid input
|
|
88
|
+
chai_1.assert.throws(() => (0, validateAxeRunContext_1.validateAxeRunContext)([1, 2]));
|
|
89
|
+
});
|
|
90
|
+
});
|
|
91
|
+
describe('and does not have a `fromFrames` or `fromShadowDom` property', () => {
|
|
92
|
+
it('throws an error', () => {
|
|
93
|
+
//@ts-expect-error - Testing invalid input
|
|
94
|
+
chai_1.assert.throws(() => (0, validateAxeRunContext_1.validateAxeRunContext)({ a: 'a' }));
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
});
|
|
98
|
+
});
|
|
99
|
+
});
|
|
100
|
+
//# sourceMappingURL=validateAxeRunContext.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validateAxeRunContext.test.js","sourceRoot":"","sources":["../../src/utils/validateAxeRunContext.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { RunOptions as AxeRunOptions } from 'axe-core';
|
|
2
|
+
export type RunOptions = Pick<AxeRunOptions, 'runOnly' | 'rules' | 'ancestry'>;
|
|
3
|
+
/**
|
|
4
|
+
* We only provide a subset of axe-core's RunOptions.
|
|
5
|
+
* We want to sanitize the user's input to ensure they are not providing
|
|
6
|
+
* any invalid properties that are outside of the subset we provide.
|
|
7
|
+
*
|
|
8
|
+
* @param runOptions The user's run options.
|
|
9
|
+
*/
|
|
10
|
+
export declare function validateAxeRunOptions(runOptions?: RunOptions | undefined): asserts runOptions is RunOptions;
|
|
11
|
+
/** Helper functions */
|
|
12
|
+
/** Checks if the value provided is an object */
|
|
13
|
+
export declare function isObject(value: unknown): value is Record<string, unknown>;
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.validateAxeRunOptions = validateAxeRunOptions;
|
|
4
|
+
exports.isObject = isObject;
|
|
5
|
+
const VALID_RUN_ONLY_TYPES = [
|
|
6
|
+
'rules',
|
|
7
|
+
'rule',
|
|
8
|
+
'tag',
|
|
9
|
+
'tags'
|
|
10
|
+
];
|
|
11
|
+
/**
|
|
12
|
+
* We only provide a subset of axe-core's RunOptions.
|
|
13
|
+
* We want to sanitize the user's input to ensure they are not providing
|
|
14
|
+
* any invalid properties that are outside of the subset we provide.
|
|
15
|
+
*
|
|
16
|
+
* @param runOptions The user's run options.
|
|
17
|
+
*/
|
|
18
|
+
function validateAxeRunOptions(runOptions = undefined) {
|
|
19
|
+
if (!runOptions) {
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
const runOptionsKeys = Object.keys(runOptions);
|
|
23
|
+
const validKeys = [
|
|
24
|
+
'runOnly',
|
|
25
|
+
'rules',
|
|
26
|
+
'ancestry'
|
|
27
|
+
];
|
|
28
|
+
for (const key of runOptionsKeys) {
|
|
29
|
+
switch (key) {
|
|
30
|
+
case 'ancestry':
|
|
31
|
+
if (!isBoolean(runOptions.ancestry)) {
|
|
32
|
+
throw new Error('`ancestry` property must be a boolean. Full example: `{ ancestry: true }`');
|
|
33
|
+
}
|
|
34
|
+
break;
|
|
35
|
+
case 'rules':
|
|
36
|
+
validateRulesProperty(runOptions.rules);
|
|
37
|
+
break;
|
|
38
|
+
case 'runOnly':
|
|
39
|
+
validateRunOnlyProperty(runOptions.runOnly);
|
|
40
|
+
break;
|
|
41
|
+
default:
|
|
42
|
+
throw new Error(`Invalid property found in \`runOptions\`: ${key}. The available properties are: ${validKeys.join(', ')}`);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/** Helper functions */
|
|
47
|
+
/** Checks if the value provided is an object */
|
|
48
|
+
function isObject(value) {
|
|
49
|
+
return value !== null && typeof value === 'object' && !Array.isArray(value);
|
|
50
|
+
}
|
|
51
|
+
/** Checks if the value provided is a boolean */
|
|
52
|
+
function isBoolean(value) {
|
|
53
|
+
return typeof value === 'boolean';
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Validate the user's `rules` object and its values. As a user can provide:
|
|
57
|
+
* @example
|
|
58
|
+
* {
|
|
59
|
+
* rules: {
|
|
60
|
+
* 'ruleId1': { enabled: false },
|
|
61
|
+
* 'ruleId2': { enabled: false }
|
|
62
|
+
* 'ruleId3': { enabled: false }
|
|
63
|
+
* // ...
|
|
64
|
+
* }
|
|
65
|
+
* }
|
|
66
|
+
*
|
|
67
|
+
* @param rules The user's rules object.
|
|
68
|
+
*/
|
|
69
|
+
function validateRulesProperty(rules) {
|
|
70
|
+
if (!isObject(rules)) {
|
|
71
|
+
throw new Error('`rules` property must be an object. Full example: `{ rules: { "ruleId": { enabled: false } } }`');
|
|
72
|
+
}
|
|
73
|
+
if (!Object.keys(rules).length) {
|
|
74
|
+
throw new Error('`rules` object must contain at least one key-value pair. Full example: `{ rules: { "ruleId": { enabled: false } } }`');
|
|
75
|
+
}
|
|
76
|
+
// Validate each K:V pair in the `rules` object e.g. { 'ruleId': { enabled: false } }
|
|
77
|
+
for (const ruleKey of Object.keys(rules)) {
|
|
78
|
+
const ruleValue = rules[ruleKey];
|
|
79
|
+
if (!isObject(ruleValue)) {
|
|
80
|
+
throw new Error(`The value of the \`${ruleKey}\` key in the \`rules\` object must be an object. Full example: \`{ rules: { "ruleId": { enabled: false } } }\``);
|
|
81
|
+
}
|
|
82
|
+
if (Object.keys(ruleValue).length !== 1) {
|
|
83
|
+
throw new Error(`The \`${ruleKey}\` key in the \`rules\` object must only contain the \`enabled\` property. Full example: \`{ rules: { "ruleId": { enabled: false } } }\``);
|
|
84
|
+
}
|
|
85
|
+
if (!('enabled' in ruleValue)) {
|
|
86
|
+
throw new Error(`The \`${ruleKey}\` key in the \`rules\` object must contain an \`enabled\` property. Full example: \`{ rules: { "ruleId": { enabled: false } } }\``);
|
|
87
|
+
}
|
|
88
|
+
if (!isBoolean(ruleValue.enabled)) {
|
|
89
|
+
throw new Error(`The \`enabled\` property of the \`${ruleKey}\` key in the \`rules\` object must be a boolean. Full example: \`{ rules: { "ruleId": { enabled: false } } }\``);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Validate the user's `runOnly` configuration. A user can provide:
|
|
95
|
+
* @example
|
|
96
|
+
* {
|
|
97
|
+
* runOnly: {
|
|
98
|
+
* type: 'rule',
|
|
99
|
+
* values: ['ruleId1', 'ruleId2', 'ruleId3']
|
|
100
|
+
* }
|
|
101
|
+
* }
|
|
102
|
+
*
|
|
103
|
+
* OR
|
|
104
|
+
*
|
|
105
|
+
* @example
|
|
106
|
+
* {
|
|
107
|
+
* runOnly: ['ruleId1', 'ruleId2', 'ruleId3']
|
|
108
|
+
* }
|
|
109
|
+
*
|
|
110
|
+
* OR
|
|
111
|
+
*
|
|
112
|
+
* @example
|
|
113
|
+
* {
|
|
114
|
+
* runOnly: 'ruleId1'
|
|
115
|
+
* }
|
|
116
|
+
*
|
|
117
|
+
* @param runOnly The user's runOnly object, array, or string.
|
|
118
|
+
*/
|
|
119
|
+
function validateRunOnlyProperty(runOnly) {
|
|
120
|
+
const isRunOnlyObject = isObject(runOnly);
|
|
121
|
+
const isRunOnlyArray = Array.isArray(runOnly);
|
|
122
|
+
const isRunOnlyString = typeof runOnly === 'string';
|
|
123
|
+
if (!isRunOnlyObject && !isRunOnlyArray && !isRunOnlyString) {
|
|
124
|
+
throw new Error(`\`runOnly\` property must be an object, an array, or a string. Examples: \n
|
|
125
|
+
- Object: { runOnly: { type: 'rule', values: ['ruleId1'] } }\n
|
|
126
|
+
- Array: { runOnly: ['ruleId1', 'ruleId2', 'ruleId3'] }\n
|
|
127
|
+
- String: { runOnly: 'ruleId1' }\n
|
|
128
|
+
|
|
129
|
+
For more detailed examples: https://www.deque.com/axe/core-documentation/api-documentation/#options-parameter
|
|
130
|
+
`);
|
|
131
|
+
}
|
|
132
|
+
if (isRunOnlyArray) {
|
|
133
|
+
if (!runOnly.length) {
|
|
134
|
+
throw new Error(`\`runOnly\` array must contain at least one string value. Example: { runOnly: ['ruleId1', 'ruleId2'] }`);
|
|
135
|
+
}
|
|
136
|
+
if (runOnly.some(value => typeof value !== 'string')) {
|
|
137
|
+
throw new Error(`\`runOnly\` array must contain only strings. Example: { runOnly: ['ruleId1', 'ruleId2'] }`);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
if (isRunOnlyObject) {
|
|
141
|
+
if (!('type' in runOnly)) {
|
|
142
|
+
throw new Error(`\`runOnly\` object must contain a \`type\` property. Example: { runOnly: { type: 'rule', values: ['ruleId1'] } }`);
|
|
143
|
+
}
|
|
144
|
+
if (!('values' in runOnly)) {
|
|
145
|
+
throw new Error(`\`runOnly\` object must contain a \`values\` property. Example: { runOnly: { type: 'rule', values: ['ruleId1'] } }`);
|
|
146
|
+
}
|
|
147
|
+
if (!VALID_RUN_ONLY_TYPES.includes(runOnly.type)) {
|
|
148
|
+
throw new Error(`\`runOnly\` object's \`type\` property must be one of the following: ${VALID_RUN_ONLY_TYPES.join(', ')}`);
|
|
149
|
+
}
|
|
150
|
+
if (!Array.isArray(runOnly.values)) {
|
|
151
|
+
throw new Error(`\`runOnly\` object's \`values\` property must be an array. Example: { runOnly: { type: 'rule', values: ['ruleId1'] } }`);
|
|
152
|
+
}
|
|
153
|
+
if (!runOnly.values.length) {
|
|
154
|
+
throw new Error(`\`runOnly\` object's \`values\` property must contain at least one value. Example: { runOnly: { type: 'rule', values: ['ruleId1'] } }`);
|
|
155
|
+
}
|
|
156
|
+
if (runOnly.values.some(value => typeof value !== 'string')) {
|
|
157
|
+
throw new Error(`\`runOnly\` object's \`values\` property must contain only strings. Example: { runOnly: { type: 'rule', values: ['ruleId1'] } }`);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
//# sourceMappingURL=validateAxeRunOptions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validateAxeRunOptions.js","sourceRoot":"","sources":["../../src/utils/validateAxeRunOptions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import 'mocha';
|