@jterrazz/test 16.0.0 → 16.1.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/dist/appium.adapter.js +59 -4
- package/dist/browser/index.js +203 -42
- package/dist/checker.js +305 -63
- package/dist/index.d.ts +35 -4
- package/dist/index.js +47 -24
- package/dist/oxlint.cjs +123 -28
- package/dist/oxlint.js +123 -28
- package/dist/playwright.adapter.js +88 -50
- package/dist/substring-warning.js +282 -0
- package/dist/vitest.js +91 -12
- package/docs/01-architecture.md +95 -0
- package/docs/02-developing.md +351 -0
- package/docs/03-testing.md +495 -0
- package/docs/04-operating.md +101 -0
- package/docs/05-module-tests.md +152 -0
- package/docs/06-integration.md +180 -0
- package/docs/07-component.md +246 -0
- package/docs/08-website.md +404 -0
- package/docs/09-mobile.md +270 -0
- package/docs/10-api.md +264 -0
- package/docs/11-jobs.md +157 -0
- package/docs/12-cli.md +677 -0
- package/docs/13-elements.md +248 -0
- package/docs/14-assertions.md +314 -0
- package/docs/15-tokens.md +253 -0
- package/docs/16-contracts.md +438 -0
- package/docs/17-services.md +188 -0
- package/docs/18-conventions.md +332 -0
- package/docs/19-linting.md +512 -0
- package/docs/README.md +36 -0
- package/docs/decisions/001-v9-conventions-on-three-channels.md +50 -0
- package/docs/decisions/002-the-statique-channel-holds-only-what-upstream-does-not.md +49 -0
- package/docs/decisions/003-a-rendered-component-is-a-facet-on-vitest-browser-mode.md +84 -0
- package/docs/decisions/004-a-module-against-real-services-or-a-golden-is-the-integration-facet.md +81 -0
- package/docs/decisions/005-the-doubles-ladder-is-closed.md +86 -0
- package/docs/decisions/006-the-catalogue-reaches-a-file-by-its-role.md +245 -0
- package/docs/decisions/007-compose-mode-leaves-the-package.md +53 -0
- package/docs/decisions/008-vitest-5-node-24-and-the-native-seams-as-optional-peers.md +75 -0
- package/docs/decisions/_template.md +22 -0
- package/docs/reference/classes/Matcher.md +120 -0
- package/docs/reference/classes/ProcessHandle.md +368 -0
- package/docs/reference/functions/defineContract.md +39 -0
- package/docs/reference/functions/defineContracts.md +36 -0
- package/docs/reference/functions/disabled.md +28 -0
- package/docs/reference/functions/enabled.md +20 -0
- package/docs/reference/functions/focused.md +26 -0
- package/docs/reference/functions/mockOf.md +79 -0
- package/docs/reference/functions/postgres.md +31 -0
- package/docs/reference/functions/process.md +33 -0
- package/docs/reference/functions/redis.md +28 -0
- package/docs/reference/functions/required.md +41 -0
- package/docs/reference/functions/selected.md +26 -0
- package/docs/reference/functions/sqlite.md +33 -0
- package/docs/reference/functions/testId.md +20 -0
- package/docs/reference/functions/text.md +40 -0
- package/docs/reference/functions/valued.md +28 -0
- package/docs/reference/functions/waitUntil.md +46 -0
- package/docs/reference/functions/within.md +29 -0
- package/docs/reference/index.md +196 -0
- package/docs/reference/interfaces/BaseResult.md +87 -0
- package/docs/reference/interfaces/CallResult.md +160 -0
- package/docs/reference/interfaces/CaptureScope.md +82 -0
- package/docs/reference/interfaces/CliResult.md +253 -0
- package/docs/reference/interfaces/ContainerAccessor.md +166 -0
- package/docs/reference/interfaces/DirectoryAccessor.md +33 -0
- package/docs/reference/interfaces/FetchResult.md +180 -0
- package/docs/reference/interfaces/FilesystemAccessor.md +46 -0
- package/docs/reference/interfaces/HttpResult.md +126 -0
- package/docs/reference/interfaces/JsonAccessor.md +46 -0
- package/docs/reference/interfaces/PageResult.md +356 -0
- package/docs/reference/interfaces/RenderResult.md +72 -0
- package/docs/reference/interfaces/RenderedText.md +110 -0
- package/docs/reference/interfaces/ResponseAccessor.md +47 -0
- package/docs/reference/interfaces/ScreenResult.md +128 -0
- package/docs/reference/interfaces/TableAccessor.md +26 -0
- package/docs/reference/interfaces/TextAccessor.md +96 -0
- package/docs/reference/type-aliases/ApiHandle.md +68 -0
- package/docs/reference/type-aliases/ApiSpecification.md +213 -0
- package/docs/reference/type-aliases/ApiSpecificationOptions.md +68 -0
- package/docs/reference/type-aliases/BrowserConsoleMessage.md +30 -0
- package/docs/reference/type-aliases/BrowserLinkElement.md +50 -0
- package/docs/reference/type-aliases/BrowserMetaElement.md +40 -0
- package/docs/reference/type-aliases/BrowserOpenOptions.md +87 -0
- package/docs/reference/type-aliases/BrowserPage.md +132 -0
- package/docs/reference/type-aliases/BrowserPort.md +51 -0
- package/docs/reference/type-aliases/CliEnv.md +11 -0
- package/docs/reference/type-aliases/CliHandle.md +80 -0
- package/docs/reference/type-aliases/CliInput.md +36 -0
- package/docs/reference/type-aliases/CliOutput.md +46 -0
- package/docs/reference/type-aliases/CliPort.md +58 -0
- package/docs/reference/type-aliases/CliSpecification.md +144 -0
- package/docs/reference/type-aliases/CliSpecificationOptions.md +134 -0
- package/docs/reference/type-aliases/ComponentChain.md +156 -0
- package/docs/reference/type-aliases/ComponentScenario.md +20 -0
- package/docs/reference/type-aliases/ComponentUi.md +47 -0
- package/docs/reference/type-aliases/ComponentVisitor.md +10 -0
- package/docs/reference/type-aliases/ContainerPort.md +113 -0
- package/docs/reference/type-aliases/Contract.md +68 -0
- package/docs/reference/type-aliases/ContractInput.md +13 -0
- package/docs/reference/type-aliases/ContractRequest.md +95 -0
- package/docs/reference/type-aliases/ContractResponder.md +23 -0
- package/docs/reference/type-aliases/ContractResponse.md +78 -0
- package/docs/reference/type-aliases/ContractResponseValue.md +13 -0
- package/docs/reference/type-aliases/Contracts.md +48 -0
- package/docs/reference/type-aliases/DatabaseKeys.md +16 -0
- package/docs/reference/type-aliases/DatabasePort.md +72 -0
- package/docs/reference/type-aliases/DeviceOpenOptions.md +46 -0
- package/docs/reference/type-aliases/DevicePort.md +51 -0
- package/docs/reference/type-aliases/DeviceScreen.md +32 -0
- package/docs/reference/type-aliases/DeviceTimeouts.md +39 -0
- package/docs/reference/type-aliases/DockerSpecConfig.md +43 -0
- package/docs/reference/type-aliases/DomMount.md +21 -0
- package/docs/reference/type-aliases/ElementKind.md +27 -0
- package/docs/reference/type-aliases/ElementMatch.md +74 -0
- package/docs/reference/type-aliases/ElementOptions.md +29 -0
- package/docs/reference/type-aliases/ElementRef.md +128 -0
- package/docs/reference/type-aliases/ExecOptions.md +37 -0
- package/docs/reference/type-aliases/FileAccessor.md +54 -0
- package/docs/reference/type-aliases/HonoApp.md +31 -0
- package/docs/reference/type-aliases/HttpContractFilter.md +49 -0
- package/docs/reference/type-aliases/HttpResponseInit.md +46 -0
- package/docs/reference/type-aliases/HttpStreamInit.md +58 -0
- package/docs/reference/type-aliases/IntegrationHandle.md +46 -0
- package/docs/reference/type-aliases/IntegrationSpecification.md +111 -0
- package/docs/reference/type-aliases/IntegrationSpecificationOptions.md +42 -0
- package/docs/reference/type-aliases/Intercept.md +19 -0
- package/docs/reference/type-aliases/InterceptOptions.md +28 -0
- package/docs/reference/type-aliases/InterceptScope.md +11 -0
- package/docs/reference/type-aliases/IsolationStrategy.md +75 -0
- package/docs/reference/type-aliases/JobHandle.md +34 -0
- package/docs/reference/type-aliases/JobsHandle.md +57 -0
- package/docs/reference/type-aliases/JobsResult.md +16 -0
- package/docs/reference/type-aliases/JobsSpecification.md +94 -0
- package/docs/reference/type-aliases/JobsSpecificationOptions.md +56 -0
- package/docs/reference/type-aliases/LandmarkKind.md +20 -0
- package/docs/reference/type-aliases/LiterateRunFlags.md +27 -0
- package/docs/reference/type-aliases/LiterateServeRegistration.md +70 -0
- package/docs/reference/type-aliases/MatchFixtureOptions.md +27 -0
- package/docs/reference/type-aliases/MatchableRequest.md +61 -0
- package/docs/reference/type-aliases/MatcherKind.md +34 -0
- package/docs/reference/type-aliases/MobileBackendOptions.md +28 -0
- package/docs/reference/type-aliases/MobileElementKind.md +14 -0
- package/docs/reference/type-aliases/MobileElementMatch.md +60 -0
- package/docs/reference/type-aliases/MobileElementRef.md +20 -0
- package/docs/reference/type-aliases/MobileHandle.md +65 -0
- package/docs/reference/type-aliases/MobileScenario.md +20 -0
- package/docs/reference/type-aliases/MobileSpecification.md +51 -0
- package/docs/reference/type-aliases/MobileSpecificationOptions.md +126 -0
- package/docs/reference/type-aliases/MobileVisitor.md +81 -0
- package/docs/reference/type-aliases/MockOfOptions.md +26 -0
- package/docs/reference/type-aliases/MockPort.md +10 -0
- package/docs/reference/type-aliases/PinnedClock.md +10 -0
- package/docs/reference/type-aliases/PostgresOptions.md +32 -0
- package/docs/reference/type-aliases/ProcessOptions.md +112 -0
- package/docs/reference/type-aliases/RedisOptions.md +20 -0
- package/docs/reference/type-aliases/RenderSubject.md +12 -0
- package/docs/reference/type-aliases/ScreenNode.md +67 -0
- package/docs/reference/type-aliases/ServerPort.md +36 -0
- package/docs/reference/type-aliases/ServerResponse.md +46 -0
- package/docs/reference/type-aliases/ServerSpec.md +21 -0
- package/docs/reference/type-aliases/ServiceHandle.md +216 -0
- package/docs/reference/type-aliases/ServiceRecord.md +12 -0
- package/docs/reference/type-aliases/SpecDocument.md +84 -0
- package/docs/reference/type-aliases/SpecEnvToken.md +21 -0
- package/docs/reference/type-aliases/SpecFileAssertion.md +27 -0
- package/docs/reference/type-aliases/SpecFixture.md +30 -0
- package/docs/reference/type-aliases/SpecKind.md +8 -0
- package/docs/reference/type-aliases/SpecRun.md +108 -0
- package/docs/reference/type-aliases/SpecServeEntry.md +40 -0
- package/docs/reference/type-aliases/SpecStream.md +32 -0
- package/docs/reference/type-aliases/SpecificationConfig.md +290 -0
- package/docs/reference/type-aliases/SqliteOptions.md +36 -0
- package/docs/reference/type-aliases/SseEvent.md +58 -0
- package/docs/reference/type-aliases/StreamBody.md +61 -0
- package/docs/reference/type-aliases/TextFilter.md +22 -0
- package/docs/reference/type-aliases/VisitScenario.md +20 -0
- package/docs/reference/type-aliases/Visitor.md +215 -0
- package/docs/reference/type-aliases/WaitUntilOptions.md +46 -0
- package/docs/reference/type-aliases/WebsiteBackendOptions.md +37 -0
- package/docs/reference/type-aliases/WebsiteHandle.md +51 -0
- package/docs/reference/type-aliases/WebsiteSpecification.md +118 -0
- package/docs/reference/type-aliases/WebsiteSpecificationOptions.md +40 -0
- package/docs/reference/variables/anthropic.md +19 -0
- package/docs/reference/variables/banner.md +10 -0
- package/docs/reference/variables/button.md +10 -0
- package/docs/reference/variables/clock.md +16 -0
- package/docs/reference/variables/complementary.md +10 -0
- package/docs/reference/variables/component.md +10 -0
- package/docs/reference/variables/content.md +10 -0
- package/docs/reference/variables/contentinfo.md +10 -0
- package/docs/reference/variables/dialog.md +10 -0
- package/docs/reference/variables/field.md +10 -0
- package/docs/reference/variables/form.md +10 -0
- package/docs/reference/variables/heading.md +10 -0
- package/docs/reference/variables/http.md +40 -0
- package/docs/reference/variables/intercept.md +11 -0
- package/docs/reference/variables/link.md +10 -0
- package/docs/reference/variables/listitem.md +10 -0
- package/docs/reference/variables/main.md +10 -0
- package/docs/reference/variables/match.md +8 -0
- package/docs/reference/variables/navigation.md +10 -0
- package/docs/reference/variables/openai.md +21 -0
- package/docs/reference/variables/option.md +17 -0
- package/docs/reference/variables/region.md +10 -0
- package/docs/reference/variables/row.md +10 -0
- package/docs/reference/variables/search.md +10 -0
- package/docs/reference/variables/specification.md +8 -0
- package/docs/reference/variables/status.md +10 -0
- package/docs/reference/variables/table.md +10 -0
- package/package.json +3 -2
- package/dist/ambiguity.js +0 -146
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
<!-- GENERATED by `typescript docs` — DO NOT EDIT -->
|
|
2
|
+
# Variable: specification
|
|
3
|
+
|
|
4
|
+
```ts
|
|
5
|
+
const specification: Specification;
|
|
6
|
+
```
|
|
7
|
+
|
|
8
|
+
Defined in: [src/facets/specification.ts:42](https://github.com/jterrazz/package-test/blob/main/src/facets/specification.ts#L42)
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
<!-- GENERATED by `typescript docs` — DO NOT EDIT -->
|
|
2
|
+
# Variable: status
|
|
3
|
+
|
|
4
|
+
```ts
|
|
5
|
+
const status: LandmarkFactory;
|
|
6
|
+
```
|
|
7
|
+
|
|
8
|
+
Defined in: [src/model/elements/elements.ts:130](https://github.com/jterrazz/package-test/blob/main/src/model/elements/elements.ts#L130)
|
|
9
|
+
|
|
10
|
+
A live region announcing a result — `role="status"`, an `<output>`.
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
<!-- GENERATED by `typescript docs` — DO NOT EDIT -->
|
|
2
|
+
# Variable: table
|
|
3
|
+
|
|
4
|
+
```ts
|
|
5
|
+
const table: LandmarkFactory;
|
|
6
|
+
```
|
|
7
|
+
|
|
8
|
+
Defined in: [src/model/elements/elements.ts:133](https://github.com/jterrazz/package-test/blob/main/src/model/elements/elements.ts#L133)
|
|
9
|
+
|
|
10
|
+
A table, by its caption or accessible name.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jterrazz/test",
|
|
3
|
-
"version": "16.
|
|
3
|
+
"version": "16.1.1",
|
|
4
4
|
"description": "Declarative testing framework for HTTP APIs, CLIs, background jobs, websites, mobile apps and rendered components — one entry point, real infrastructure and a real browser, golden-file assertions, plus an oxlint convention plugin.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"api-testing",
|
|
@@ -32,6 +32,7 @@
|
|
|
32
32
|
"dist",
|
|
33
33
|
"!dist/catalog.*",
|
|
34
34
|
"!dist/coverage.*",
|
|
35
|
+
"docs",
|
|
35
36
|
"schema"
|
|
36
37
|
],
|
|
37
38
|
"type": "module",
|
|
@@ -76,7 +77,7 @@
|
|
|
76
77
|
},
|
|
77
78
|
"devDependencies": {
|
|
78
79
|
"@hono/node-server": "^2.0.8",
|
|
79
|
-
"@jterrazz/typescript": "^10.
|
|
80
|
+
"@jterrazz/typescript": "^10.3.1",
|
|
80
81
|
"@types/better-sqlite3": "^7.6.13",
|
|
81
82
|
"@types/node": "^26.1.1",
|
|
82
83
|
"@types/pg": "^8.20.0",
|
package/dist/ambiguity.js
DELETED
|
@@ -1,146 +0,0 @@
|
|
|
1
|
-
//#region src/model/elements/ambiguity.ts
|
|
2
|
-
/**
|
|
3
|
-
* The ambiguity refusal — CONVENTIONS W3.
|
|
4
|
-
*
|
|
5
|
-
* A visit descriptor must designate exactly one element. Acting on "the
|
|
6
|
-
* first match" is the failure mode this module exists to prevent: the spec
|
|
7
|
-
* keeps passing while the visitor clicks something else, and nothing ever
|
|
8
|
-
* reports it. So when a descriptor matches several elements the framework
|
|
9
|
-
* refuses, and the refusal has to carry everything needed to fix it without
|
|
10
|
-
* opening a browser — the descriptor in the caller's own vocabulary, every
|
|
11
|
-
* candidate, and the concrete rewrites that would resolve it.
|
|
12
|
-
*
|
|
13
|
-
* Pure string building: it takes captured data and returns a message, so the
|
|
14
|
-
* wording is unit-testable and the browser integration stays a thin adapter.
|
|
15
|
-
*/
|
|
16
|
-
/** `kind` → the constructor that builds it, so errors echo the caller's source. */
|
|
17
|
-
const CONSTRUCTORS = {
|
|
18
|
-
banner: "banner",
|
|
19
|
-
button: "button",
|
|
20
|
-
complementary: "complementary",
|
|
21
|
-
contentinfo: "contentinfo",
|
|
22
|
-
dialog: "dialog",
|
|
23
|
-
field: "field",
|
|
24
|
-
form: "form",
|
|
25
|
-
heading: "heading",
|
|
26
|
-
link: "link",
|
|
27
|
-
listitem: "listitem",
|
|
28
|
-
main: "main",
|
|
29
|
-
navigation: "navigation",
|
|
30
|
-
option: "option",
|
|
31
|
-
region: "region",
|
|
32
|
-
row: "row",
|
|
33
|
-
search: "search",
|
|
34
|
-
status: "status",
|
|
35
|
-
table: "table",
|
|
36
|
-
testId: "testId",
|
|
37
|
-
text: "content"
|
|
38
|
-
};
|
|
39
|
-
/** The landmark a context string maps back to, for a copy-pasteable suggestion. */
|
|
40
|
-
const CONTEXT_LANDMARKS = {
|
|
41
|
-
aside: "complementary()",
|
|
42
|
-
banner: "banner()",
|
|
43
|
-
complementary: "complementary()",
|
|
44
|
-
contentinfo: "contentinfo()",
|
|
45
|
-
footer: "contentinfo()",
|
|
46
|
-
form: "form()",
|
|
47
|
-
header: "banner()",
|
|
48
|
-
main: "main()",
|
|
49
|
-
nav: "navigation()",
|
|
50
|
-
navigation: "navigation()",
|
|
51
|
-
search: "search()"
|
|
52
|
-
};
|
|
53
|
-
/**
|
|
54
|
-
* Render a descriptor as the source that would build it — `link('Articles')`,
|
|
55
|
-
* `within(navigation(), link('Articles', { exact: false }))`. The error speaks
|
|
56
|
-
* the vocabulary the author wrote, never playwright's — so the option appears
|
|
57
|
-
* only when the AUTHOR stated one, whichever way.
|
|
58
|
-
*/
|
|
59
|
-
function formatElement(element) {
|
|
60
|
-
const bare = formatBare(element);
|
|
61
|
-
return element.scope ? `within(${formatElement(element.scope)}, ${bare})` : bare;
|
|
62
|
-
}
|
|
63
|
-
function formatBare(element) {
|
|
64
|
-
const args = [];
|
|
65
|
-
if (element.name !== void 0) args.push(JSON.stringify(element.name));
|
|
66
|
-
if (element.exact !== void 0) args.push(`{ exact: ${String(element.exact)} }`);
|
|
67
|
-
return `${CONSTRUCTORS[element.kind]}(${args.join(", ")})`;
|
|
68
|
-
}
|
|
69
|
-
/** `1. <a href="/articles">Articles</a> in <nav>` — one evidence line per candidate. */
|
|
70
|
-
function formatMatch(match, index) {
|
|
71
|
-
const attribute = match.detail ? ` ${quoteDetail(match)}` : "";
|
|
72
|
-
const named = match.accessibleName ? ` named ${JSON.stringify(match.accessibleName)}` : "";
|
|
73
|
-
const context = match.context ? ` in <${match.context}>` : "";
|
|
74
|
-
return ` ${index + 1}. <${match.tag}${attribute}>${match.text}</${match.tag}>${named}${context}`;
|
|
75
|
-
}
|
|
76
|
-
function quoteDetail(match) {
|
|
77
|
-
return `${match.tag === "a" ? "href" : "name"}=${JSON.stringify(match.detail)}`;
|
|
78
|
-
}
|
|
79
|
-
/** Each landmark the candidates sit in, and how many of them it holds. */
|
|
80
|
-
function landmarkCounts(matches) {
|
|
81
|
-
const counts = /* @__PURE__ */ new Map();
|
|
82
|
-
for (const match of matches) {
|
|
83
|
-
const landmark = match.context === void 0 ? void 0 : CONTEXT_LANDMARKS[match.context];
|
|
84
|
-
if (landmark !== void 0) counts.set(landmark, (counts.get(landmark) ?? 0) + 1);
|
|
85
|
-
}
|
|
86
|
-
return [...counts].toSorted(([, a], [, b]) => a - b);
|
|
87
|
-
}
|
|
88
|
-
/**
|
|
89
|
-
* The rewrites worth offering, in the order they should be tried. Scoping is
|
|
90
|
-
* always available; `exact` only when it would actually narrow the set, and
|
|
91
|
-
* the count it would leave is stated so a still-ambiguous suggestion never
|
|
92
|
-
* reads as a fix.
|
|
93
|
-
*/
|
|
94
|
-
function formatFixes(element, matches) {
|
|
95
|
-
const fixes = [];
|
|
96
|
-
const narrowing = landmarkCounts(matches).filter(([, count]) => count < matches.length);
|
|
97
|
-
if (!element.scope) {
|
|
98
|
-
const [first, ...rest] = narrowing;
|
|
99
|
-
const alsoHere = rest.length > 0 ? ` [also here: ${rest.map(([name]) => name).join(", ")}]` : "";
|
|
100
|
-
fixes.push(first === void 0 ? `scope it within(<a container holding only this one>, ${formatBare(element)})` : `scope it within(${first[0]}, ${formatBare(element)}) [leaves ${first[1]} of ${matches.length}]${alsoHere}`);
|
|
101
|
-
}
|
|
102
|
-
if (element.exact === false && element.name !== void 0) {
|
|
103
|
-
const remaining = matches.filter((match) => match.text === element.name).length;
|
|
104
|
-
if (remaining > 0 && remaining < matches.length) fixes.push(`exact name ${formatBare({
|
|
105
|
-
...element,
|
|
106
|
-
exact: true
|
|
107
|
-
})} [leaves ${remaining} of ${matches.length}]`);
|
|
108
|
-
}
|
|
109
|
-
fixes.push("other element a heading(), button() or field() may name one thing where this does not");
|
|
110
|
-
return fixes;
|
|
111
|
-
}
|
|
112
|
-
/**
|
|
113
|
-
* The W3 refusal. A distinct class so the visit wrapper can recognize an
|
|
114
|
-
* already-complete message and let it through instead of nesting it inside
|
|
115
|
-
* `visit scenario failed: …`, which would print the whole thing twice.
|
|
116
|
-
*/
|
|
117
|
-
var AmbiguousElementError = class extends Error {
|
|
118
|
-
name = "AmbiguousElementError";
|
|
119
|
-
};
|
|
120
|
-
/**
|
|
121
|
-
* Build the refusal thrown when a descriptor matches more than one element.
|
|
122
|
-
*
|
|
123
|
-
* @param options.element The descriptor as the caller wrote it.
|
|
124
|
-
* @param options.matches Every candidate, in DOM order (already truncated).
|
|
125
|
-
* @param options.url The page the visitor was on when it happened.
|
|
126
|
-
*/
|
|
127
|
-
function describeAmbiguity(options) {
|
|
128
|
-
const { element, matches, url } = options;
|
|
129
|
-
const fixes = formatFixes(element, matches).map((fix) => ` • ${fix}`);
|
|
130
|
-
return [
|
|
131
|
-
`Ambiguous element: ${formatElement(element)} matched ${matches.length} elements on ${url}.`,
|
|
132
|
-
"",
|
|
133
|
-
"A spec must designate exactly one element. Acting on the first match would let",
|
|
134
|
-
"this test keep passing while the visitor interacts with something else.",
|
|
135
|
-
"",
|
|
136
|
-
"Matched:",
|
|
137
|
-
...matches.map((match, index) => formatMatch(match, index)),
|
|
138
|
-
"",
|
|
139
|
-
"Disambiguate with one of:",
|
|
140
|
-
...fixes,
|
|
141
|
-
"",
|
|
142
|
-
"Docs: docs/13-elements.md#designating-exactly-one-element (CONVENTIONS W3)"
|
|
143
|
-
].join("\n");
|
|
144
|
-
}
|
|
145
|
-
//#endregion
|
|
146
|
-
export { describeAmbiguity as n, formatElement as r, AmbiguousElementError as t };
|