@interactors/core 0.3.0
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/CHANGELOG.md +14 -0
- package/README.md +9 -0
- package/dist/cjs/constructor.js +260 -0
- package/dist/cjs/constructor.js.map +1 -0
- package/dist/cjs/converge.js +27 -0
- package/dist/cjs/converge.js.map +1 -0
- package/dist/cjs/create-interactor.js +24 -0
- package/dist/cjs/create-interactor.js.map +1 -0
- package/dist/cjs/dispatch.js +34 -0
- package/dist/cjs/dispatch.js.map +1 -0
- package/dist/cjs/element/click.js +12 -0
- package/dist/cjs/element/click.js.map +1 -0
- package/dist/cjs/element/fill-in.js +71 -0
- package/dist/cjs/element/fill-in.js.map +1 -0
- package/dist/cjs/errors.js +32 -0
- package/dist/cjs/errors.js.map +1 -0
- package/dist/cjs/escape-html.js +13 -0
- package/dist/cjs/escape-html.js.map +1 -0
- package/dist/cjs/filter-set.js +50 -0
- package/dist/cjs/filter-set.js.map +1 -0
- package/dist/cjs/focused.js +47 -0
- package/dist/cjs/focused.js.map +1 -0
- package/dist/cjs/format-table.js +30 -0
- package/dist/cjs/format-table.js.map +1 -0
- package/dist/cjs/index.js +47 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/inspector.js +22 -0
- package/dist/cjs/inspector.js.map +1 -0
- package/dist/cjs/interaction.js +53 -0
- package/dist/cjs/interaction.js.map +1 -0
- package/dist/cjs/locator.js +19 -0
- package/dist/cjs/locator.js.map +1 -0
- package/dist/cjs/match.js +135 -0
- package/dist/cjs/match.js.map +1 -0
- package/dist/cjs/matcher.js +30 -0
- package/dist/cjs/matcher.js.map +1 -0
- package/dist/cjs/matchers/and.js +16 -0
- package/dist/cjs/matchers/and.js.map +1 -0
- package/dist/cjs/matchers/every.js +16 -0
- package/dist/cjs/matchers/every.js.map +1 -0
- package/dist/cjs/matchers/including.js +15 -0
- package/dist/cjs/matchers/including.js.map +1 -0
- package/dist/cjs/matchers/matching.js +15 -0
- package/dist/cjs/matchers/matching.js.map +1 -0
- package/dist/cjs/matchers/not.js +16 -0
- package/dist/cjs/matchers/not.js.map +1 -0
- package/dist/cjs/matchers/or.js +16 -0
- package/dist/cjs/matchers/or.js.map +1 -0
- package/dist/cjs/matchers/some.js +16 -0
- package/dist/cjs/matchers/some.js.map +1 -0
- package/dist/cjs/merge-objects.js +3 -0
- package/dist/cjs/merge-objects.js.map +1 -0
- package/dist/cjs/perform.js +13 -0
- package/dist/cjs/perform.js.map +1 -0
- package/dist/cjs/specification.js +4 -0
- package/dist/cjs/specification.js.map +1 -0
- package/dist/constructor.d.ts +11 -0
- package/dist/constructor.d.ts.map +1 -0
- package/dist/converge.d.ts +2 -0
- package/dist/converge.d.ts.map +1 -0
- package/dist/create-interactor.d.ts +18 -0
- package/dist/create-interactor.d.ts.map +1 -0
- package/dist/dispatch.d.ts +6 -0
- package/dist/dispatch.d.ts.map +1 -0
- package/dist/element/click.d.ts +2 -0
- package/dist/element/click.d.ts.map +1 -0
- package/dist/element/fill-in.d.ts +12 -0
- package/dist/element/fill-in.d.ts.map +1 -0
- package/dist/errors.d.ts +13 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/escape-html.d.ts +2 -0
- package/dist/escape-html.d.ts.map +1 -0
- package/dist/esm/constructor.js +248 -0
- package/dist/esm/constructor.js.map +1 -0
- package/dist/esm/converge.js +23 -0
- package/dist/esm/converge.js.map +1 -0
- package/dist/esm/create-interactor.js +20 -0
- package/dist/esm/create-interactor.js.map +1 -0
- package/dist/esm/dispatch.js +26 -0
- package/dist/esm/dispatch.js.map +1 -0
- package/dist/esm/element/click.js +5 -0
- package/dist/esm/element/click.js.map +1 -0
- package/dist/esm/element/fill-in.js +67 -0
- package/dist/esm/element/fill-in.js.map +1 -0
- package/dist/esm/errors.js +25 -0
- package/dist/esm/errors.js.map +1 -0
- package/dist/esm/escape-html.js +9 -0
- package/dist/esm/escape-html.js.map +1 -0
- package/dist/esm/filter-set.js +46 -0
- package/dist/esm/filter-set.js.map +1 -0
- package/dist/esm/focused.js +41 -0
- package/dist/esm/focused.js.map +1 -0
- package/dist/esm/format-table.js +26 -0
- package/dist/esm/format-table.js.map +1 -0
- package/dist/esm/index.js +17 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/inspector.js +18 -0
- package/dist/esm/inspector.js.map +1 -0
- package/dist/esm/interaction.js +45 -0
- package/dist/esm/interaction.js.map +1 -0
- package/dist/esm/locator.js +15 -0
- package/dist/esm/locator.js.map +1 -0
- package/dist/esm/match.js +127 -0
- package/dist/esm/match.js.map +1 -0
- package/dist/esm/matcher.js +21 -0
- package/dist/esm/matcher.js.map +1 -0
- package/dist/esm/matchers/and.js +12 -0
- package/dist/esm/matchers/and.js.map +1 -0
- package/dist/esm/matchers/every.js +12 -0
- package/dist/esm/matchers/every.js.map +1 -0
- package/dist/esm/matchers/including.js +11 -0
- package/dist/esm/matchers/including.js.map +1 -0
- package/dist/esm/matchers/matching.js +11 -0
- package/dist/esm/matchers/matching.js.map +1 -0
- package/dist/esm/matchers/not.js +12 -0
- package/dist/esm/matchers/not.js.map +1 -0
- package/dist/esm/matchers/or.js +12 -0
- package/dist/esm/matchers/or.js.map +1 -0
- package/dist/esm/matchers/some.js +12 -0
- package/dist/esm/matchers/some.js.map +1 -0
- package/dist/esm/merge-objects.js +2 -0
- package/dist/esm/merge-objects.js.map +1 -0
- package/dist/esm/perform.js +9 -0
- package/dist/esm/perform.js.map +1 -0
- package/dist/esm/specification.js +3 -0
- package/dist/esm/specification.js.map +1 -0
- package/dist/filter-set.d.ts +10 -0
- package/dist/filter-set.d.ts.map +1 -0
- package/dist/focused.d.ts +30 -0
- package/dist/focused.d.ts.map +1 -0
- package/dist/format-table.d.ts +6 -0
- package/dist/format-table.d.ts.map +1 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/inspector.d.ts +17 -0
- package/dist/inspector.d.ts.map +1 -0
- package/dist/interaction.d.ts +42 -0
- package/dist/interaction.d.ts.map +1 -0
- package/dist/locator.d.ts +10 -0
- package/dist/locator.d.ts.map +1 -0
- package/dist/match.d.ts +54 -0
- package/dist/match.d.ts.map +1 -0
- package/dist/matcher.d.ts +9 -0
- package/dist/matcher.d.ts.map +1 -0
- package/dist/matchers/and.d.ts +3 -0
- package/dist/matchers/and.d.ts.map +1 -0
- package/dist/matchers/every.d.ts +3 -0
- package/dist/matchers/every.d.ts.map +1 -0
- package/dist/matchers/including.d.ts +3 -0
- package/dist/matchers/including.d.ts.map +1 -0
- package/dist/matchers/matching.d.ts +3 -0
- package/dist/matchers/matching.d.ts.map +1 -0
- package/dist/matchers/not.d.ts +3 -0
- package/dist/matchers/not.d.ts.map +1 -0
- package/dist/matchers/or.d.ts +3 -0
- package/dist/matchers/or.d.ts.map +1 -0
- package/dist/matchers/some.d.ts +3 -0
- package/dist/matchers/some.d.ts.map +1 -0
- package/dist/merge-objects.d.ts +2 -0
- package/dist/merge-objects.d.ts.map +1 -0
- package/dist/perform.d.ts +3 -0
- package/dist/perform.d.ts.map +1 -0
- package/dist/specification.d.ts +217 -0
- package/dist/specification.d.ts.map +1 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -0
- package/package.json +65 -0
- package/src/constructor.ts +298 -0
- package/src/converge.ts +22 -0
- package/src/create-interactor.ts +21 -0
- package/src/dispatch.ts +24 -0
- package/src/element/click.ts +5 -0
- package/src/element/fill-in.ts +76 -0
- package/src/errors.ts +15 -0
- package/src/escape-html.ts +8 -0
- package/src/filter-set.ts +45 -0
- package/src/focused.ts +43 -0
- package/src/format-table.ts +34 -0
- package/src/index.ts +20 -0
- package/src/inspector.ts +42 -0
- package/src/interaction.ts +82 -0
- package/src/locator.ts +15 -0
- package/src/match.ts +162 -0
- package/src/matcher.ts +28 -0
- package/src/matchers/and.ts +12 -0
- package/src/matchers/every.ts +12 -0
- package/src/matchers/including.ts +12 -0
- package/src/matchers/matching.ts +12 -0
- package/src/matchers/not.ts +12 -0
- package/src/matchers/or.ts +12 -0
- package/src/matchers/some.ts +12 -0
- package/src/merge-objects.ts +2 -0
- package/src/perform.ts +11 -0
- package/src/specification.ts +253 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"converge.d.ts","sourceRoot":"","sources":["../src/converge.ts"],"names":[],"mappings":"AAOA,wBAAsB,QAAQ,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAczD"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { EmptyObject, InteractorConstructor } from './specification';
|
|
2
|
+
/**
|
|
3
|
+
* Create a custom interactor with the given name.
|
|
4
|
+
*
|
|
5
|
+
* ### Creating a simple interactor
|
|
6
|
+
*
|
|
7
|
+
* ``` typescript
|
|
8
|
+
* let Paragraph = createInteractor('paragraph').selector('p');
|
|
9
|
+
* ```
|
|
10
|
+
*
|
|
11
|
+
* Note the double function call!
|
|
12
|
+
*
|
|
13
|
+
* @param interactorName The human readable name of the interactor, used mainly for debugging purposes and error messages
|
|
14
|
+
* @typeParam E The type of DOM Element that this interactor operates on. By specifying the element type, actions and filters defined for the interactor can be type checked against the actual element type.
|
|
15
|
+
* @returns You will need to call the returned builder to create an interactor.
|
|
16
|
+
*/
|
|
17
|
+
export declare function createInteractor<E extends Element>(name: string): InteractorConstructor<E, EmptyObject, EmptyObject, EmptyObject>;
|
|
18
|
+
//# sourceMappingURL=create-interactor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-interactor.d.ts","sourceRoot":"","sources":["../src/create-interactor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAGrE;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,qBAAqB,CAAC,CAAC,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,CAAC,CAEjI"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export declare function dispatchChange(element: HTMLElement): boolean;
|
|
2
|
+
export declare function dispatchInput(element: HTMLElement, options?: InputEventInit): boolean;
|
|
3
|
+
export declare function dispatchKeyDown(element: HTMLElement, options?: KeyboardEventInit): boolean;
|
|
4
|
+
export declare function dispatchKeyUp(element: HTMLElement, options?: KeyboardEventInit): boolean;
|
|
5
|
+
export declare function dispatchClick(element: HTMLElement, options?: MouseEventInit): boolean;
|
|
6
|
+
//# sourceMappingURL=dispatch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dispatch.d.ts","sourceRoot":"","sources":["../src/dispatch.ts"],"names":[],"mappings":"AAAA,wBAAgB,cAAc,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAG5D;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,WAAW,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAGzF;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,WAAW,EAAE,OAAO,GAAE,iBAAsB,GAAG,OAAO,CAG9F;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,WAAW,EAAE,OAAO,GAAE,iBAAsB,GAAG,OAAO,CAG5F;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,WAAW,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAGzF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"click.d.ts","sourceRoot":"","sources":["../../src/element/click.ts"],"names":[],"mappings":"AAEA,wBAAgB,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,cAAc,QAE5D"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
declare type TextFieldElement = HTMLInputElement | HTMLTextAreaElement;
|
|
2
|
+
/**
|
|
3
|
+
* Fill in text into an element by emulating how a user would do it, first
|
|
4
|
+
* focusing the element, then filling in the text letter by letter, generating
|
|
5
|
+
* the appropriate keyboard events.
|
|
6
|
+
*
|
|
7
|
+
* @param element The element to fill in text in
|
|
8
|
+
* @param value The text value to fill in
|
|
9
|
+
*/
|
|
10
|
+
export declare function fillIn(element: TextFieldElement, value: string): void;
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=fill-in.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fill-in.d.ts","sourceRoot":"","sources":["../../src/element/fill-in.ts"],"names":[],"mappings":"AAEA,aAAK,gBAAgB,GAAG,gBAAgB,GAAG,mBAAmB,CAAC;AAoD/D;;;;;;;GAOG;AACH,wBAAgB,MAAM,CAAC,OAAO,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAarE"}
|
package/dist/errors.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export declare class NoSuchElementError extends Error {
|
|
2
|
+
name: string;
|
|
3
|
+
}
|
|
4
|
+
export declare class AmbiguousElementError extends Error {
|
|
5
|
+
name: string;
|
|
6
|
+
}
|
|
7
|
+
export declare class NotAbsentError extends Error {
|
|
8
|
+
name: string;
|
|
9
|
+
}
|
|
10
|
+
export declare class FilterNotMatchingError extends Error {
|
|
11
|
+
name: string;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,kBAAmB,SAAQ,KAAK;IAC3C,IAAI,SAAwB;CAC7B;AAED,qBAAa,qBAAsB,SAAQ,KAAK;IAC9C,IAAI,SAA2B;CAChC;AAED,qBAAa,cAAe,SAAQ,KAAK;IACvC,IAAI,SAAoB;CACzB;AAED,qBAAa,sBAAuB,SAAQ,KAAK;IAC/C,IAAI,SAA4B;CACjC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"escape-html.d.ts","sourceRoot":"","sources":["../src/escape-html.ts"],"names":[],"mappings":"AAAA,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAO/C"}
|
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
2
|
+
import { globals } from '@interactors/globals';
|
|
3
|
+
import { converge } from './converge';
|
|
4
|
+
import { FilterSet } from './filter-set';
|
|
5
|
+
import { Locator } from './locator';
|
|
6
|
+
import { MatchFilter, applyFilter } from './match';
|
|
7
|
+
import { formatTable } from './format-table';
|
|
8
|
+
import { FilterNotMatchingError } from './errors';
|
|
9
|
+
import { interaction, interactionFilter, check, checkFilter } from './interaction';
|
|
10
|
+
import { Match } from './match';
|
|
11
|
+
import { NoSuchElementError, NotAbsentError, AmbiguousElementError } from './errors';
|
|
12
|
+
import { isMatcher } from './matcher';
|
|
13
|
+
import { matching } from './matchers/matching';
|
|
14
|
+
const defaultLocator = (element) => element.textContent || "";
|
|
15
|
+
const defaultSelector = 'div';
|
|
16
|
+
export function findElements(parentElement, interactor) {
|
|
17
|
+
if (typeof (interactor.specification.selector) === 'function') {
|
|
18
|
+
return interactor.specification.selector(parentElement);
|
|
19
|
+
}
|
|
20
|
+
else if (interactor.specification.selector === ':root') {
|
|
21
|
+
// this is a bit of a hack, because otherwise there isn't a good way of selecting the root element
|
|
22
|
+
return [parentElement.ownerDocument.querySelector(':root')];
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
return Array.from(parentElement.querySelectorAll(interactor.specification.selector || defaultSelector));
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
function findMatches(parentElement, interactor) {
|
|
29
|
+
if (!interactor.name) {
|
|
30
|
+
throw new Error('One of your interactors was created without a name. Please provide a label for your interactor:\n\tHTML.extend(\'my interactor\') || createInteractor(\'my interactor\')');
|
|
31
|
+
}
|
|
32
|
+
return findElements(parentElement, interactor).map((e) => new Match(e, interactor.filter, interactor.locator));
|
|
33
|
+
}
|
|
34
|
+
function findMatchesMatching(parentElement, interactor) {
|
|
35
|
+
return findMatches(parentElement, interactor).filter((m) => m.matches);
|
|
36
|
+
}
|
|
37
|
+
function findMatchesNonEmpty(parentElement, interactor) {
|
|
38
|
+
let matches = findMatches(parentElement, interactor);
|
|
39
|
+
let matching = matches.filter((m) => m.matches);
|
|
40
|
+
if (matching.length > 0) {
|
|
41
|
+
return matching;
|
|
42
|
+
}
|
|
43
|
+
else if (matches.length === 0) {
|
|
44
|
+
throw new NoSuchElementError(`did not find ${description(interactor)}`);
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
let table = formatTable({
|
|
48
|
+
headers: interactor.locator ? [interactor.name, ...interactor.filter.asTableHeader()] : interactor.filter.asTableHeader(),
|
|
49
|
+
rows: matches.slice().sort((a, b) => b.sortWeight - a.sortWeight).map((m) => m.asTableRow()),
|
|
50
|
+
});
|
|
51
|
+
throw new NoSuchElementError(`did not find ${description(interactor)}, did you mean one of:\n\n${table}`);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
// Given a parent element, and an interactor, find exactly one matching element
|
|
55
|
+
// and return it. If no elements match, raise an error. If more than one
|
|
56
|
+
// element matches, raise an error.
|
|
57
|
+
export function resolveUnique(parentElement, interactor) {
|
|
58
|
+
let matching = findMatchesNonEmpty(parentElement, interactor);
|
|
59
|
+
if (matching.length === 1) {
|
|
60
|
+
return matching[0].element;
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
let alternatives = matching.map((m) => '- ' + m.elementDescription());
|
|
64
|
+
throw new AmbiguousElementError(`${description(interactor)} matches multiple elements:\n\n${alternatives.join('\n')}`);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
// Given a parent element, and an interactor, find all matching elements and
|
|
68
|
+
// return them. If no elements match, raise an error.
|
|
69
|
+
export function resolveNonEmpty(parentElement, interactor) {
|
|
70
|
+
return findMatchesNonEmpty(parentElement, interactor).map(m => m.element);
|
|
71
|
+
}
|
|
72
|
+
// Given a parent element, and an interactor, check if there are any matching
|
|
73
|
+
// elements, and throw an error if there are. Otherwise return undefined.
|
|
74
|
+
export function resolveEmpty(parentElement, interactor) {
|
|
75
|
+
let matching = findMatchesMatching(parentElement, interactor);
|
|
76
|
+
if (matching.length !== 0) {
|
|
77
|
+
let alternatives = matching.map((m) => '- ' + m.elementDescription());
|
|
78
|
+
throw new NotAbsentError(`${description(interactor)} exists but should not:\n\n${alternatives.join('\n')}`);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
function ownDescription(options) {
|
|
82
|
+
if (options.locator) {
|
|
83
|
+
return `${options.name} ${options.locator.description} ${options.filter.description}`.trim();
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
return `${options.name} ${options.filter.description}`.trim();
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
function description(options) {
|
|
90
|
+
let ancestorsAndSelf = options.ancestors.concat(options);
|
|
91
|
+
return ancestorsAndSelf.reverse().map(ownDescription).join(' within ');
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Removes any default values for a filter from the lookup if that filter is present in the
|
|
95
|
+
* assertion. Otherwise, it is not possible to make an assertion on a filter that might conflict
|
|
96
|
+
* see https://github.com/thefrontside/bigtest/issues/966
|
|
97
|
+
*/
|
|
98
|
+
function getLookupFilterForAssertion(filter, filters) {
|
|
99
|
+
let lookupFilter = new FilterSet(filter.specification, Object.assign({}, filter.filters));
|
|
100
|
+
let specFilters = lookupFilter.specification.filters;
|
|
101
|
+
for (let key in specFilters) {
|
|
102
|
+
if (typeof specFilters[key] !== 'function'
|
|
103
|
+
&& 'default' in specFilters[key]
|
|
104
|
+
&& key in filters
|
|
105
|
+
&& !(key in lookupFilter.filters)) {
|
|
106
|
+
lookupFilter.filters[key] = filters[key];
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
return lookupFilter;
|
|
110
|
+
}
|
|
111
|
+
export function unsafeSyncResolveParent(options) {
|
|
112
|
+
return options.ancestors.reduce(resolveUnique, globals.document.documentElement);
|
|
113
|
+
}
|
|
114
|
+
export function unsafeSyncResolveUnique(options) {
|
|
115
|
+
return resolveUnique(unsafeSyncResolveParent(options), options);
|
|
116
|
+
}
|
|
117
|
+
export function instantiateBaseInteractor(options, resolver) {
|
|
118
|
+
let interactor = {
|
|
119
|
+
options,
|
|
120
|
+
get description() {
|
|
121
|
+
return description(options);
|
|
122
|
+
},
|
|
123
|
+
perform(fn) {
|
|
124
|
+
return interaction(`run perform on ${description(options)}`, () => converge(() => fn(resolver(options))));
|
|
125
|
+
},
|
|
126
|
+
assert(fn) {
|
|
127
|
+
return check(`${description(options)} asserts`, () => {
|
|
128
|
+
return converge(() => {
|
|
129
|
+
fn(resolver(options));
|
|
130
|
+
});
|
|
131
|
+
});
|
|
132
|
+
},
|
|
133
|
+
has(filters) {
|
|
134
|
+
return interactor.is(filters);
|
|
135
|
+
},
|
|
136
|
+
is(filters) {
|
|
137
|
+
let filter = new FilterSet(options.specification, filters);
|
|
138
|
+
return check(`${description(options)} matches filters: ${filter.description}`, () => {
|
|
139
|
+
return converge(() => {
|
|
140
|
+
let element = resolver({ ...options, filter: getLookupFilterForAssertion(options.filter, filters) });
|
|
141
|
+
let match = new MatchFilter(element, filter);
|
|
142
|
+
if (!match.matches) {
|
|
143
|
+
throw new FilterNotMatchingError(`${description(options)} does not match filters:\n\n${match.formatAsExpectations()}`);
|
|
144
|
+
}
|
|
145
|
+
});
|
|
146
|
+
});
|
|
147
|
+
},
|
|
148
|
+
apply(parentElement) {
|
|
149
|
+
let element = [...options.ancestors, options].reduce(resolveUnique, parentElement);
|
|
150
|
+
return applyFilter(options.specification.locator || defaultLocator, element);
|
|
151
|
+
}
|
|
152
|
+
};
|
|
153
|
+
for (let [actionName, action] of Object.entries(options.specification.actions || {})) {
|
|
154
|
+
if (!interactor.hasOwnProperty(actionName)) {
|
|
155
|
+
Object.defineProperty(interactor, actionName, {
|
|
156
|
+
value: function (...args) {
|
|
157
|
+
let actionDescription = actionName;
|
|
158
|
+
if (args.length) {
|
|
159
|
+
actionDescription += ` with ` + args.map((a) => JSON.stringify(a)).join(', ');
|
|
160
|
+
}
|
|
161
|
+
return interaction(`${actionDescription} on ${description(options)}`, () => action(interactor, ...args));
|
|
162
|
+
},
|
|
163
|
+
configurable: true,
|
|
164
|
+
writable: true,
|
|
165
|
+
enumerable: false,
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
for (let [filterName, filter] of Object.entries(options.specification.filters || {})) {
|
|
170
|
+
if (!interactor.hasOwnProperty(filterName)) {
|
|
171
|
+
Object.defineProperty(interactor, filterName, {
|
|
172
|
+
value: function () {
|
|
173
|
+
return interactionFilter(`${filterName} of ${description(options)}`, async () => {
|
|
174
|
+
return applyFilter(filter, resolver(options));
|
|
175
|
+
}, (parentElement) => {
|
|
176
|
+
let element = [...options.ancestors, options].reduce(resolveUnique, parentElement);
|
|
177
|
+
return applyFilter(filter, element);
|
|
178
|
+
});
|
|
179
|
+
},
|
|
180
|
+
configurable: true,
|
|
181
|
+
writable: true,
|
|
182
|
+
enumerable: false,
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
return interactor;
|
|
187
|
+
}
|
|
188
|
+
export function instantiateInteractor(options) {
|
|
189
|
+
let interactor = instantiateBaseInteractor(options, unsafeSyncResolveUnique);
|
|
190
|
+
return Object.assign(interactor, {
|
|
191
|
+
find(child) {
|
|
192
|
+
return instantiateInteractor({
|
|
193
|
+
...child.options,
|
|
194
|
+
ancestors: [...options.ancestors, options, ...child.options.ancestors]
|
|
195
|
+
});
|
|
196
|
+
},
|
|
197
|
+
exists() {
|
|
198
|
+
return checkFilter(`${description(options)} exists`, () => {
|
|
199
|
+
return converge(() => {
|
|
200
|
+
resolveNonEmpty(unsafeSyncResolveParent(options), options);
|
|
201
|
+
});
|
|
202
|
+
}, (element) => {
|
|
203
|
+
return findMatchesMatching(element, options).length > 0;
|
|
204
|
+
});
|
|
205
|
+
},
|
|
206
|
+
absent() {
|
|
207
|
+
return checkFilter(`${description(options)} does not exist`, () => {
|
|
208
|
+
return converge(() => {
|
|
209
|
+
resolveEmpty(unsafeSyncResolveParent(options), options);
|
|
210
|
+
});
|
|
211
|
+
}, (element) => {
|
|
212
|
+
return findMatchesMatching(element, options).length === 0;
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
export function createConstructor(name, specification) {
|
|
218
|
+
function initInteractor(...args) {
|
|
219
|
+
let locator, filter;
|
|
220
|
+
let locatorValue = args[0] instanceof RegExp ? matching(args[0]) : args[0];
|
|
221
|
+
if (typeof (locatorValue) === 'string' || isMatcher(locatorValue)) {
|
|
222
|
+
locator = new Locator(specification.locator || defaultLocator, locatorValue);
|
|
223
|
+
filter = new FilterSet(specification, args[1] || {});
|
|
224
|
+
}
|
|
225
|
+
else {
|
|
226
|
+
filter = new FilterSet(specification, args[0] || {});
|
|
227
|
+
}
|
|
228
|
+
return instantiateInteractor({ name, specification, filter, locator, ancestors: [] });
|
|
229
|
+
}
|
|
230
|
+
return Object.assign(initInteractor, {
|
|
231
|
+
selector: (value) => {
|
|
232
|
+
return createConstructor(name, { ...specification, selector: value });
|
|
233
|
+
},
|
|
234
|
+
locator: (value) => {
|
|
235
|
+
return createConstructor(name, { ...specification, locator: value });
|
|
236
|
+
},
|
|
237
|
+
filters: (filters) => {
|
|
238
|
+
return createConstructor(name, { ...specification, filters: { ...specification.filters, ...filters } });
|
|
239
|
+
},
|
|
240
|
+
actions: (actions) => {
|
|
241
|
+
return createConstructor(name, { ...specification, actions: Object.assign({}, specification.actions, actions) });
|
|
242
|
+
},
|
|
243
|
+
extend: (newName) => {
|
|
244
|
+
return createConstructor(newName, specification);
|
|
245
|
+
},
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
//# sourceMappingURL=constructor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constructor.js","sourceRoot":"","sources":["../../src/constructor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { performance } from 'performance-api';
|
|
2
|
+
import { globals } from '@interactors/globals';
|
|
3
|
+
function wait(ms) {
|
|
4
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
5
|
+
}
|
|
6
|
+
export async function converge(fn) {
|
|
7
|
+
let startTime = performance.now();
|
|
8
|
+
while (true) {
|
|
9
|
+
try {
|
|
10
|
+
return fn();
|
|
11
|
+
}
|
|
12
|
+
catch (e) {
|
|
13
|
+
let diff = performance.now() - startTime;
|
|
14
|
+
if (diff > globals.interactorTimeout) {
|
|
15
|
+
throw e;
|
|
16
|
+
}
|
|
17
|
+
else {
|
|
18
|
+
await wait(1);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=converge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"converge.js","sourceRoot":"","sources":["../../src/converge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAA;AAE9C,SAAS,IAAI,CAAC,EAAU;IACtB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAI,EAAW;IAC3C,IAAI,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;IAClC,OAAM,IAAI,EAAE;QACV,IAAI;YACF,OAAO,EAAE,EAAE,CAAC;SACb;QAAC,OAAM,CAAC,EAAE;YACT,IAAI,IAAI,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;YACzC,IAAG,IAAI,GAAG,OAAO,CAAC,iBAAiB,EAAE;gBACnC,MAAM,CAAC,CAAC;aACT;iBAAM;gBACL,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC;aACf;SACF;KACF;AACH,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { createConstructor } from './constructor';
|
|
2
|
+
/**
|
|
3
|
+
* Create a custom interactor with the given name.
|
|
4
|
+
*
|
|
5
|
+
* ### Creating a simple interactor
|
|
6
|
+
*
|
|
7
|
+
* ``` typescript
|
|
8
|
+
* let Paragraph = createInteractor('paragraph').selector('p');
|
|
9
|
+
* ```
|
|
10
|
+
*
|
|
11
|
+
* Note the double function call!
|
|
12
|
+
*
|
|
13
|
+
* @param interactorName The human readable name of the interactor, used mainly for debugging purposes and error messages
|
|
14
|
+
* @typeParam E The type of DOM Element that this interactor operates on. By specifying the element type, actions and filters defined for the interactor can be type checked against the actual element type.
|
|
15
|
+
* @returns You will need to call the returned builder to create an interactor.
|
|
16
|
+
*/
|
|
17
|
+
export function createInteractor(name) {
|
|
18
|
+
return createConstructor(name, {});
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=create-interactor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-interactor.js","sourceRoot":"","sources":["../../src/create-interactor.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAElD;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,gBAAgB,CAAoB,IAAY;IAC9D,OAAO,iBAAiB,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;AACrC,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export function dispatchChange(element) {
|
|
2
|
+
var _a;
|
|
3
|
+
let Event = ((_a = element.ownerDocument.defaultView) === null || _a === void 0 ? void 0 : _a.Event) || window.Event;
|
|
4
|
+
return element.dispatchEvent(new Event('change', { bubbles: true, cancelable: false }));
|
|
5
|
+
}
|
|
6
|
+
export function dispatchInput(element, options = {}) {
|
|
7
|
+
var _a;
|
|
8
|
+
let InputEvent = ((_a = element.ownerDocument.defaultView) === null || _a === void 0 ? void 0 : _a.InputEvent) || window.InputEvent;
|
|
9
|
+
return element.dispatchEvent(new InputEvent('input', Object.assign({ bubbles: true, cancelable: false }, options)));
|
|
10
|
+
}
|
|
11
|
+
export function dispatchKeyDown(element, options = {}) {
|
|
12
|
+
var _a;
|
|
13
|
+
let KeyboardEvent = ((_a = element.ownerDocument.defaultView) === null || _a === void 0 ? void 0 : _a.KeyboardEvent) || window.KeyboardEvent;
|
|
14
|
+
return element.dispatchEvent(new KeyboardEvent('keydown', Object.assign({ bubbles: true, cancelable: true }, options)));
|
|
15
|
+
}
|
|
16
|
+
export function dispatchKeyUp(element, options = {}) {
|
|
17
|
+
var _a;
|
|
18
|
+
let KeyboardEvent = ((_a = element.ownerDocument.defaultView) === null || _a === void 0 ? void 0 : _a.KeyboardEvent) || window.KeyboardEvent;
|
|
19
|
+
return element.dispatchEvent(new KeyboardEvent('keyup', Object.assign({ bubbles: true, cancelable: true }, options)));
|
|
20
|
+
}
|
|
21
|
+
export function dispatchClick(element, options = {}) {
|
|
22
|
+
var _a;
|
|
23
|
+
let MouseEvent = ((_a = element.ownerDocument.defaultView) === null || _a === void 0 ? void 0 : _a.MouseEvent) || window.MouseEvent;
|
|
24
|
+
return element.dispatchEvent(new MouseEvent('click', Object.assign({ bubbles: true, cancelable: true }, options)));
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=dispatch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dispatch.js","sourceRoot":"","sources":["../../src/dispatch.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,cAAc,CAAC,OAAoB;;IACjD,IAAI,KAAK,GAAG,CAAA,MAAA,OAAO,CAAC,aAAa,CAAC,WAAW,0CAAE,KAAK,KAAI,MAAM,CAAC,KAAK,CAAC;IACrE,OAAO,OAAO,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;AAC1F,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,OAAoB,EAAE,UAA0B,EAAE;;IAC9E,IAAI,UAAU,GAAG,CAAA,MAAA,OAAO,CAAC,aAAa,CAAC,WAAW,0CAAE,UAAU,KAAI,MAAM,CAAC,UAAU,CAAC;IACpF,OAAO,OAAO,CAAC,aAAa,CAAC,IAAI,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;AACtH,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,OAAoB,EAAE,UAA6B,EAAE;;IACnF,IAAI,aAAa,GAAG,CAAA,MAAA,OAAO,CAAC,aAAa,CAAC,WAAW,0CAAE,aAAa,KAAI,MAAM,CAAC,aAAa,CAAC;IAC7F,OAAO,OAAO,CAAC,aAAa,CAAC,IAAI,aAAa,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;AAC1H,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,OAAoB,EAAE,UAA6B,EAAE;;IACjF,IAAI,aAAa,GAAG,CAAA,MAAA,OAAO,CAAC,aAAa,CAAC,WAAW,0CAAE,aAAa,KAAI,MAAM,CAAC,aAAa,CAAC;IAC7F,OAAO,OAAO,CAAC,aAAa,CAAC,IAAI,aAAa,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;AACxH,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,OAAoB,EAAE,UAA0B,EAAE;;IAC9E,IAAI,UAAU,GAAG,CAAA,MAAA,OAAO,CAAC,aAAa,CAAC,WAAW,0CAAE,UAAU,KAAI,MAAM,CAAC,UAAU,CAAC;IACpF,OAAO,OAAO,CAAC,aAAa,CAAC,IAAI,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;AACrH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"click.js","sourceRoot":"","sources":["../../../src/element/click.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,6BAA6B,CAAA;AAEnD,MAAM,UAAU,KAAK,CAAC,OAAgB,EAAE,IAAqB;IAC3D,OAAO,SAAS,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;AACxC,CAAC"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { dispatchChange, dispatchInput, dispatchKeyDown, dispatchKeyUp } from '../dispatch';
|
|
2
|
+
// do a best effort at determining the key code
|
|
3
|
+
function guessCode(letter) {
|
|
4
|
+
if (letter.match(/^[a-zA-Z]$/)) {
|
|
5
|
+
return `Key${letter.toUpperCase()}`;
|
|
6
|
+
}
|
|
7
|
+
else if (letter.match(/^[0-9]$/)) {
|
|
8
|
+
return `Digit${letter}`;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
function clearText(element) {
|
|
12
|
+
if (element.value.length) {
|
|
13
|
+
setValue(element, "");
|
|
14
|
+
dispatchInput(element, { inputType: 'deleteContentBackward', data: null });
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
function enterText(element, value) {
|
|
18
|
+
for (let letter of value) {
|
|
19
|
+
if (dispatchKeyDown(element, { key: letter, code: guessCode(letter) })) {
|
|
20
|
+
// don't change the value if the keydown event was stopped
|
|
21
|
+
setValue(element, element.value + letter);
|
|
22
|
+
// input is not dispatched if the keydown event was stopped
|
|
23
|
+
dispatchInput(element, { inputType: 'insertText', data: letter });
|
|
24
|
+
}
|
|
25
|
+
// keyup is always dispatched
|
|
26
|
+
dispatchKeyUp(element, { key: letter, code: guessCode(letter) });
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Use the prototype setter of the element in order to set the value, that way any behavior that monkey patches
|
|
31
|
+
* the element itself is circumvented. This has the effect of the value just "magically" appearing on the input
|
|
32
|
+
* element just like it does when the browser sets the value because of the default action of an event.
|
|
33
|
+
* We have to do this because React actually does do this monkey-patching as an optimization. Basically, they
|
|
34
|
+
* short-circuit syncing the react state whenever someone sets input.value and then ignore the next `change` event.
|
|
35
|
+
*
|
|
36
|
+
* See https://github.com/cypress-io/cypress/issues/536
|
|
37
|
+
*/
|
|
38
|
+
function setValue(element, value) {
|
|
39
|
+
let property = Object.getOwnPropertyDescriptor(Object.getPrototypeOf(element), 'value');
|
|
40
|
+
if (property && property.set) {
|
|
41
|
+
property.set.call(element, value);
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
// if the value property on the element protoype is not present
|
|
45
|
+
// then there are worse problems. But this is very typesafe!
|
|
46
|
+
element.value = value;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Fill in text into an element by emulating how a user would do it, first
|
|
51
|
+
* focusing the element, then filling in the text letter by letter, generating
|
|
52
|
+
* the appropriate keyboard events.
|
|
53
|
+
*
|
|
54
|
+
* @param element The element to fill in text in
|
|
55
|
+
* @param value The text value to fill in
|
|
56
|
+
*/
|
|
57
|
+
export function fillIn(element, value) {
|
|
58
|
+
let originalValue = element.value;
|
|
59
|
+
element.focus();
|
|
60
|
+
clearText(element);
|
|
61
|
+
enterText(element, value);
|
|
62
|
+
if (originalValue !== value) {
|
|
63
|
+
dispatchChange(element);
|
|
64
|
+
}
|
|
65
|
+
element.blur();
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=fill-in.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fill-in.js","sourceRoot":"","sources":["../../../src/element/fill-in.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAI5F,+CAA+C;AAC/C,SAAS,SAAS,CAAC,MAAc;IAC/B,IAAG,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE;QAC7B,OAAO,MAAM,MAAM,CAAC,WAAW,EAAE,EAAE,CAAC;KACrC;SAAM,IAAG,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE;QACjC,OAAO,QAAQ,MAAM,EAAE,CAAC;KACzB;AACH,CAAC;AAED,SAAS,SAAS,CAAC,OAAyB;IAC1C,IAAG,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE;QACvB,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QACtB,aAAa,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,uBAAuB,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;KAC5E;AACH,CAAC;AAED,SAAS,SAAS,CAAC,OAAyB,EAAE,KAAa;IACzD,KAAI,IAAI,MAAM,IAAI,KAAK,EAAE;QACvB,IAAG,eAAe,CAAC,OAAO,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE;YACrE,0DAA0D;YAC1D,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,GAAG,MAAM,CAAC,CAAC;YAC1C,2DAA2D;YAC3D,aAAa,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;SACnE;QACD,6BAA6B;QAC7B,aAAa,CAAC,OAAO,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;KAClE;AACH,CAAC;AAGD;;;;;;;;GAQG;AACH,SAAS,QAAQ,CAAC,OAAyB,EAAE,KAAa;IACxD,IAAI,QAAQ,GAAG,MAAM,CAAC,wBAAwB,CAAC,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC;IACxF,IAAI,QAAQ,IAAI,QAAQ,CAAC,GAAG,EAAE;QAC5B,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;KACnC;SAAM;QACL,+DAA+D;QAC/D,4DAA4D;QAC5D,OAAO,CAAC,KAAK,GAAG,KAAK,CAAC;KACvB;AACH,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,MAAM,CAAC,OAAyB,EAAE,KAAa;IAC7D,IAAI,aAAa,GAAG,OAAO,CAAC,KAAK,CAAC;IAElC,OAAO,CAAC,KAAK,EAAE,CAAC;IAEhB,SAAS,CAAC,OAAO,CAAC,CAAC;IACnB,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAE1B,IAAG,aAAa,KAAK,KAAK,EAAE;QAC1B,cAAc,CAAC,OAAO,CAAC,CAAC;KACzB;IAED,OAAO,CAAC,IAAI,EAAE,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export class NoSuchElementError extends Error {
|
|
2
|
+
constructor() {
|
|
3
|
+
super(...arguments);
|
|
4
|
+
this.name = "NoSuchElementError";
|
|
5
|
+
}
|
|
6
|
+
}
|
|
7
|
+
export class AmbiguousElementError extends Error {
|
|
8
|
+
constructor() {
|
|
9
|
+
super(...arguments);
|
|
10
|
+
this.name = "AmbiguousElementError";
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
export class NotAbsentError extends Error {
|
|
14
|
+
constructor() {
|
|
15
|
+
super(...arguments);
|
|
16
|
+
this.name = "NotAbsentError";
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
export class FilterNotMatchingError extends Error {
|
|
20
|
+
constructor() {
|
|
21
|
+
super(...arguments);
|
|
22
|
+
this.name = "FilterNotMatchingError";
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAA7C;;QACE,SAAI,GAAG,oBAAoB,CAAC;IAC9B,CAAC;CAAA;AAED,MAAM,OAAO,qBAAsB,SAAQ,KAAK;IAAhD;;QACE,SAAI,GAAG,uBAAuB,CAAC;IACjC,CAAC;CAAA;AAED,MAAM,OAAO,cAAe,SAAQ,KAAK;IAAzC;;QACE,SAAI,GAAG,gBAAgB,CAAC;IAC1B,CAAC;CAAA;AAED,MAAM,OAAO,sBAAuB,SAAQ,KAAK;IAAjD;;QACE,SAAI,GAAG,wBAAwB,CAAC;IAClC,CAAC;CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"escape-html.js","sourceRoot":"","sources":["../../src/escape-html.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,OAAO,IAAI;SACP,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC;SACvB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AAC9B,CAAC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { noCase } from 'change-case';
|
|
2
|
+
import { matcherDescription } from './matcher';
|
|
3
|
+
export class FilterSet {
|
|
4
|
+
constructor(
|
|
5
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
6
|
+
specification, filters) {
|
|
7
|
+
this.specification = specification;
|
|
8
|
+
this.filters = filters;
|
|
9
|
+
}
|
|
10
|
+
;
|
|
11
|
+
get description() {
|
|
12
|
+
let entries = Object.entries(this.filters);
|
|
13
|
+
if (entries.length === 0) {
|
|
14
|
+
return '';
|
|
15
|
+
}
|
|
16
|
+
else {
|
|
17
|
+
return entries.map(([key, value]) => {
|
|
18
|
+
if (typeof (value) === 'boolean') {
|
|
19
|
+
if (value) {
|
|
20
|
+
return `which is ${noCase(key)}`;
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
return `which is not ${noCase(key)}`;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
return `with ${noCase(key)} ${matcherDescription(value)}`;
|
|
28
|
+
}
|
|
29
|
+
}).join(' and ');
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
get all() {
|
|
33
|
+
let filter = Object.assign({}, this.filters);
|
|
34
|
+
for (let key in this.specification.filters) {
|
|
35
|
+
let definition = this.specification.filters[key];
|
|
36
|
+
if (!(key in this.filters) && typeof (definition) !== 'function' && 'default' in definition) {
|
|
37
|
+
filter[key] = definition.default;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return filter;
|
|
41
|
+
}
|
|
42
|
+
asTableHeader() {
|
|
43
|
+
return Object.entries(this.all).map(([key, value]) => `${key}: ${matcherDescription(value)}`);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=filter-set.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filter-set.js","sourceRoot":"","sources":["../../src/filter-set.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAE/C,MAAM,OAAO,SAAS;IACpB;IACE,8DAA8D;IACvD,aAAiD,EACjD,OAA2B;QAD3B,kBAAa,GAAb,aAAa,CAAoC;QACjD,YAAO,GAAP,OAAO,CAAoB;IACjC,CAAC;IAAA,CAAC;IAEL,IAAI,WAAW;QACb,IAAI,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC3C,IAAG,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE;YACvB,OAAO,EAAE,CAAC;SACX;aAAM;YACL,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;gBAClC,IAAG,OAAM,CAAC,KAAK,CAAC,KAAK,SAAS,EAAE;oBAC9B,IAAG,KAAK,EAAE;wBACR,OAAO,YAAY,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;qBAClC;yBAAM;wBACL,OAAO,gBAAgB,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;qBACtC;iBACF;qBAAM;oBACL,OAAO,QAAQ,MAAM,CAAC,GAAG,CAAC,IAAI,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAA;iBAC1D;YACH,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;SAClB;IACH,CAAC;IAED,IAAI,GAAG;QACL,IAAI,MAAM,GAA4B,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QACtE,KAAI,IAAI,GAAG,IAAI,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE;YACzC,IAAI,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,GAAG,CAAoD,CAAC;YACpG,IAAG,CAAC,CAAC,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,OAAM,CAAC,UAAU,CAAC,KAAK,UAAU,IAAI,SAAS,IAAI,UAAU,EAAE;gBACzF,MAAM,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC,OAAO,CAAC;aAClC;SACF;QACD,OAAO,MAA4B,CAAC;IACtC,CAAC;IAED,aAAa;QACX,OAAO,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,KAAK,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAChG,CAAC;CACF"}
|