@unotest/web 0.46.0 → 0.47.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 +49 -3
- package/README.md +5 -0
- package/dist/config/schema.d.ts +106 -106
- package/dist/config/schema.js +1 -1
- package/dist/driver/index.d.ts +7 -2
- package/dist/driver/index.js +1 -1
- package/dist/dsl/index.d.ts +7 -2
- package/dist/dsl/index.js +1 -1
- package/dist/dsl/web-dsl-language-service.js +1 -1
- package/dist/inspection/page-inject.d.ts +10 -2
- package/dist/inspection/page-inject.js +12 -0
- package/dist/{interfaces-CYoL4Taq.d.ts → interfaces-LE6GsJ0c.d.ts} +22 -1
- package/dist/mcp/server.js +1 -1
- package/dist/runner/cli.js +1 -1
- package/dist/runner/init/chrome-probe.js +1 -1
- package/dist/runner/init.js +1 -1
- package/dist/runner/install-chromium.js +1 -1
- package/dist/runner/prepare-fix.js +1 -1
- package/dist/runner/scaffold-workspace.js +1 -1
- package/dist/runner/serve-fixture.js +1 -1
- package/dist/runner/web-runner-adapter.js +1 -1
- package/guides/dsl-reference.md +168 -5
- package/package.json +8 -8
- package/types/unotest-dsl.d.ts +54 -5
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,51 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [0.47.0] - 2026-10-07
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- 2e847ae: New DSL getter `computedStyle(locator, property)`: the element's computed CSS value as the browser resolved it — `computedStyle(card, "opacity")` → `"0.5"`, custom properties too (`"--accent"`), `""` when the property is not set. A missing or ambiguous element fails as `getAttribute` does. Replaces reading styles through `evaluate`.
|
|
8
|
+
- 3c558c8: New DSL call `emulateMedia({ reducedMotion?, colorScheme? })` changes the media features the current tab reports mid-scenario — `prefers-reduced-motion` (`'reduce'` / `'no-preference'`) and `prefers-color-scheme` (`'light'` / `'dark'` / `'no-preference'`), as `matchMedia` and CSS `@media` see them. It applies to the current tab only; a tab or popup opened later starts without it. Replaces overriding `matchMedia` through `evaluate`.
|
|
9
|
+
- aa2c57f: New DSL functions for numbers, so a scenario no longer shells out to `node -e` to compare one. `toNumber(text, {decimal?})` reads a number as a page writes it: spaces and NBSP group digits, `1,234.56` and `1.234,56` both read as 1234.56, and an ambiguous `1,234` fails the step naming both readings until `{decimal}` settles it; units and currency fail, quoting the input. `round(n, digits?)` rounds half away from zero on the decimal as written, so `round(1.005, 2)` is 1.01. `formatNumber(n, {locale?, minFractionDigits?, maxFractionDigits?})` formats through `Intl.NumberFormat`, en-US unless a locale is given, whatever the machine's language. The lint answer to `parseInt`, `parseFloat`, `Number`, `toFixed` and `toLocaleString` now points at these functions.
|
|
10
|
+
- 832e6de: Quoted DSL strings now decode the ES5 escapes `\r`, `\f`, `\v`, `\0`, `\xHH` and `\uXXXX`. Behaviour change: `'\u00A0'` used to be six characters and is now one non-breaking space, and a malformed `\u12` or `\xG1` is a parse error instead of being kept as text. In a string a regex is built from, `\x2e` / `\u002e` now give the character itself — a `.` that matches anything — not an escaped one; for a literal dot write `\\.`. Any other backslash pair stays as written, `\b` included (a word boundary in a regex string, never a backspace), so `'\d+'` and `'\bword\b'` work as before; backtick strings remain raw.
|
|
11
|
+
- a89bf5e: New DSL calls for CSS animations: `waitForAnimations(locator, { timeout? })` waits until the element and its descendants have no animation still running (default 5000 ms; a timeout names the element and how many were left), and `hasAnimation(locator)` says whether one is running. Infinite animations such as spinners, and paused ones, are not waited for. Replaces waiting on `getAnimations()` through `evaluate`.
|
|
12
|
+
- 783151c: An environment on a box that somebody pointed at a bundle by hand can follow its branch again. Selecting a bundle in the viewer holds the environment on it, and later pushes to the branch did not arrive; nothing showed why, and nothing let go short of a restart. The bundle menu now says `pinned by <name>` and offers "follow <branch> again", which moves the environment to the branch's newest bundle and keeps it following. The viewer's workspace file gains an optional `follow` field (`path`, `branch`), present only while such a selection holds; older viewers ignore it, and an older box never writes it.
|
|
13
|
+
- b16e326: A scenario that calls `assertJudge` now checks its judge before the browser starts, instead of failing at the first verdict after the steps before it had already run. The check follows calls into helpers, and a scenario that never judges is not held up by a broken judge setup. `e2e` refuses with exit code 78 and the message that names what to fix: the mode is unset, a provider variable is missing in `local` mode, or in `remote` mode the service does not answer its `/health` (start one with `npx @unotest/judge`). A collection asks once, before any scenario starts. MCP `run_test` answers such a refusal with the new `status: "config_error"` rather than `spawn_failed`, so an agent fixes the setup, not the launch. The viewer's environment check gains an "LLM judge (assertJudge)" line that asks the same question.
|
|
14
|
+
- 0f1fca5: `bundle push` names the project the bundle landed in: `✓ uploaded to <box> · project <name>`. The token decides the project, not the repository, so when the box maps the bundle's repository to no project the push still lands and is followed by a warning that says where it went and on which token; the box logs the same warning. `--json` carries `project`, `tokenLabel` and, when it applies, `unmappedRepo`. A box older than these fields gets the previous line, without the project.
|
|
15
|
+
- af57556: `bundle push --run` prints the id of every run it queued and, when the box reports one, the run's link in the box's viewer. `--json` carries the link as `runs[].url`. A box that does not know the address it is reached at, or one older than this field, sends no link: the id is printed alone.
|
|
16
|
+
- 03e37b8: `bundle push --run --follow` waits for the runs it ordered and exits with their verdict: `0` when every suite passed, `1` when one failed, `2` when there is no verdict to give (a box too old to be followed, a box that restarted and forgot the run, or an hour without an ending), each with its reason and the run's link. The box shows a run's state only to the push token that ordered it, so a CI job needs no read token and no session. `--json` adds `follow`. The box's guard lets a run's state through on the project token without a session for `GET` only; every other method on that path still needs a session.
|
|
17
|
+
- 0c1d214: `assertUrl` and `waitForUrl` take a `/regex/` as well as a string. A regex is tested against the whole URL, unanchored, so `assertUrl(/\/cars\/\d+$/)` checks a path with an id in it; a failed `assertUrl` names the pattern as `/source/flags`. A string is still a substring match, so existing scenarios behave as before. The documented `{timeout}` option of both is no longer flagged as an extra argument by the editor and `lint`.
|
|
18
|
+
|
|
19
|
+
### Patch Changes
|
|
20
|
+
|
|
21
|
+
- 1a159a8: A collection whose `webServer` sets `reuseExistingServer: false` no longer fails every scenario with "already serving". The collection starts the server once for the whole suite, its scenarios run on that server, and it is stopped after the last one. A port held by another process still fails the collection before its first scenario.
|
|
22
|
+
- b374e1d: `readFile`, `readFileInfo`, `readJson`, `upload()` and the file waits (`waitForFile`, `readJsonLine`, `waitForJsonLine` and the rest) now read the file they checked. A process writing in the project could swap a file for a symlink out of it between the check and the read, and the scenario got the outside file. The file is opened once and read from that handle only when it is the file the path leads to; a one-off read that meets a file changing under it fails saying so, a wait reads it again on its next tick.
|
|
23
|
+
- d7ab07d: The "follow again" row in the viewer's bundle menu now shows its explanation in full: `pinned by <name> — the next push to <branch> will not arrive until then` wraps onto a second line instead of being cut off with an ellipsis. The bundle rows above it are unchanged.
|
|
24
|
+
- d33d8c0: The `lint:evaluate-discouraged` warning now names the typed calls that replace the common `evaluate` uses — `computedStyle` for styles, `boundingBox` for geometry, `hasAnimation` / `waitForAnimations` for animations — next to the attribute and text getters.
|
|
25
|
+
- e924fec: A tool error from an MCP server that started before its code was last built now says so. Right after a package update, `run_test` on a scenario using a new DSL feature answered a bare parse error from the old modules still loaded in the server; now any tool error on such a server comes back as JSON `{error, serverStale: true, serverStaleWarning}` — the original message plus the advice to restart the MCP server. On a server that is up to date, errors read exactly as before.
|
|
26
|
+
- b9e6cd5: An MCP server closed right after it started no longer leaves a browser running. The server starts its browser in the background as soon as the client connects; a client that closed within those first seconds made the server exit mid-launch, and the browser came up afterwards with nothing left to close it. The server now waits for that launch before it shuts down.
|
|
27
|
+
- ada5785: `mockRoute('**/*', {abort: true})` no longer kills a browser extension's own pages and scripts. A mask reaches web requests only (http, https, ws, wss), so an extension panel keeps loading under a network allowlist instead of going dead with nothing in the console. To mock an extension resource, start the mask with its scheme, as in `chrome-extension://<id>/panel.js`; such a mask still answers even when a `**/*` mock was added after it.
|
|
28
|
+
- 6f872c9: A link to a collection run now opens that run even when it is older than the first page of the viewer's history. Such links — from `bundle push --run`, CI statuses and notifications — opened the run's tab and then showed "not found". The tab now shows the collection's scenarios as for a recent run, says "loading run…" while it is fetched, and reports "not found" only when the run really does not exist.
|
|
29
|
+
- 87487b2: A link to a run on a box — in a CI check, a run notification or the output of `bundle push --run` — now opens that run in the box's viewer. Links have the form `<box>/_guard/runs/<project>/<environment>/<run id>`; following one without a session signs in first and comes back to the same run. The viewer opens a run named by `?run=<id>` in its own tab, and ignores an id it does not have.
|
|
30
|
+
- f07e83f: A run on a box gets `TMPDIR=/tmp` beside `HOME=/tmp`, and an environment's value of the same name does not replace it. Node already fell back to `/tmp`; a shell script or another tool in a `shell()` step did not, and wrote into the read-only sources instead.
|
|
31
|
+
- ff19ac3: Switching an environment to another bundle from the viewer now needs an `Origin`, like ordering a run and following the branch again. A request under a session cookie that carries no `Origin` is refused with 403 `origin required` before it reaches the box daemon; the viewer's own bundle menu sends one and works as before.
|
|
32
|
+
- cccd35c: Messages about a remote judge no longer print the user, password or query of `UNOTEST_JUDGE_URL` — the places where gateways put keys. The check before the first step, the MCP `config_error` reason, a refused collection and a failed `assertJudge` name the service by scheme, host and path only; requests still go to the URL as given. A URL with a user or password in it, which fetch never sent, is now refused up front with a pointer to `UNOTEST_JUDGE_TOKEN`, and a value that is not a URL is refused without being repeated.
|
|
33
|
+
- 2fb7385: The viewer rebuilds its run history index again on its own after a failure, instead of waiting for a restart. A rebuild the disk refuses (permissions on the runs folder, a volume mounted late) is retried with a growing pause, from 5 seconds up to 5 minutes, until it succeeds. `/api/health` still answers 200 and now carries `runIndex`: `building`, `built`, or `failed` with the error code, the path inside the project, the number of attempts and the time of the last one.
|
|
34
|
+
- Updated dependencies [832e6de]
|
|
35
|
+
- Updated dependencies [783151c]
|
|
36
|
+
- Updated dependencies [d7ab07d]
|
|
37
|
+
- Updated dependencies [6f872c9]
|
|
38
|
+
- Updated dependencies [0f1fca5]
|
|
39
|
+
- Updated dependencies [af57556]
|
|
40
|
+
- Updated dependencies [03e37b8]
|
|
41
|
+
- Updated dependencies [87487b2]
|
|
42
|
+
- Updated dependencies [2fb7385]
|
|
43
|
+
- @unotest/dsl@0.47.0
|
|
44
|
+
- @unotest/viewer@0.47.0
|
|
45
|
+
- @unotest/protocol@0.47.0
|
|
46
|
+
- @unotest/core@0.47.0
|
|
47
|
+
- @unotest/grounder-client@0.47.0
|
|
48
|
+
|
|
3
49
|
## [0.46.0] - 2026-10-02
|
|
4
50
|
|
|
5
51
|
### Minor Changes
|
|
@@ -1524,7 +1570,7 @@ picker on` fetches this project's own access and writes the three grounder
|
|
|
1524
1570
|
|
|
1525
1571
|
That screen named one command:
|
|
1526
1572
|
|
|
1527
|
-
|
|
1573
|
+
npx @unotest/web bundle push --run --env ENVIRONMENT
|
|
1528
1574
|
|
|
1529
1575
|
In a project that has just been created, the command refuses with `no box
|
|
1530
1576
|
address` before it does anything: the project holds neither the box's address
|
|
@@ -1533,8 +1579,8 @@ address` before it does anything: the project holds neither the box's address
|
|
|
1533
1579
|
|
|
1534
1580
|
The screen now names both steps, in the order they have to happen:
|
|
1535
1581
|
|
|
1536
|
-
|
|
1537
|
-
|
|
1582
|
+
npx @unotest/web box access larch
|
|
1583
|
+
npx @unotest/web bundle push --run --env ENVIRONMENT
|
|
1538
1584
|
|
|
1539
1585
|
The box's own name is filled in when its licence carries one. `box access`
|
|
1540
1586
|
with no name refuses, and its refusal offers to create a box — to somebody who
|
package/README.md
CHANGED
|
@@ -164,6 +164,11 @@ one of them, and `box logs` the end of a box's own log without logging in to
|
|
|
164
164
|
it; `box destroy` does what it says, and `whoami` and `logout` complete the
|
|
165
165
|
set. In CI, export `UNOTEST_CLOUD_TOKEN` instead of signing in.
|
|
166
166
|
|
|
167
|
+
On a box the suite's files are read-only and a run may write in two places
|
|
168
|
+
only. Which ones, the variables a run is given and where a `shell()` step
|
|
169
|
+
starts are on one page:
|
|
170
|
+
[What a run gets](https://docs.unotest.com/box/what-a-run-gets/).
|
|
171
|
+
|
|
167
172
|
Credit is added in the cabinet, by card, under "Add credit" on its home page
|
|
168
173
|
— never from the terminal. When the balance does not cover a new box's first
|
|
169
174
|
hour, `box create` says how much is missing (as far as the key may read the
|
package/dist/config/schema.d.ts
CHANGED
|
@@ -42,10 +42,10 @@ declare const RetryConfigSchema: z.ZodObject<{
|
|
|
42
42
|
on: z.ZodArray<z.ZodEnum<["transient", "network", "crash"]>, "many">;
|
|
43
43
|
}, "strict", z.ZodTypeAny, {
|
|
44
44
|
count: number;
|
|
45
|
-
on: ("
|
|
45
|
+
on: ("network" | "transient" | "crash")[];
|
|
46
46
|
}, {
|
|
47
47
|
count: number;
|
|
48
|
-
on: ("
|
|
48
|
+
on: ("network" | "transient" | "crash")[];
|
|
49
49
|
}>;
|
|
50
50
|
type RetryConfig = z.infer<typeof RetryConfigSchema>;
|
|
51
51
|
declare const FailureBundleConfigSchema: z.ZodObject<{
|
|
@@ -241,15 +241,15 @@ declare const WebServerConfigSchema: z.ZodObject<{
|
|
|
241
241
|
/** How long to wait for the URL to come up after spawning. */
|
|
242
242
|
timeoutMs: z.ZodDefault<z.ZodNumber>;
|
|
243
243
|
}, "strict", z.ZodTypeAny, {
|
|
244
|
-
command: string;
|
|
245
244
|
url: string;
|
|
246
|
-
reuseExistingServer: boolean;
|
|
247
245
|
timeoutMs: number;
|
|
248
|
-
}, {
|
|
249
246
|
command: string;
|
|
247
|
+
reuseExistingServer: boolean;
|
|
248
|
+
}, {
|
|
250
249
|
url: string;
|
|
251
|
-
|
|
250
|
+
command: string;
|
|
252
251
|
timeoutMs?: number | undefined;
|
|
252
|
+
reuseExistingServer?: boolean | undefined;
|
|
253
253
|
}>;
|
|
254
254
|
type WebServerConfig = z.infer<typeof WebServerConfigSchema>;
|
|
255
255
|
/** `webServer`: one server, or several (a front and its fake backends),
|
|
@@ -273,15 +273,15 @@ declare const WebServersConfigSchema: z.ZodEffects<z.ZodEffects<z.ZodUnion<[z.Zo
|
|
|
273
273
|
/** How long to wait for the URL to come up after spawning. */
|
|
274
274
|
timeoutMs: z.ZodDefault<z.ZodNumber>;
|
|
275
275
|
}, "strict", z.ZodTypeAny, {
|
|
276
|
-
command: string;
|
|
277
276
|
url: string;
|
|
278
|
-
reuseExistingServer: boolean;
|
|
279
277
|
timeoutMs: number;
|
|
280
|
-
}, {
|
|
281
278
|
command: string;
|
|
279
|
+
reuseExistingServer: boolean;
|
|
280
|
+
}, {
|
|
282
281
|
url: string;
|
|
283
|
-
|
|
282
|
+
command: string;
|
|
284
283
|
timeoutMs?: number | undefined;
|
|
284
|
+
reuseExistingServer?: boolean | undefined;
|
|
285
285
|
}>, z.ZodArray<z.ZodObject<{
|
|
286
286
|
/** Shell command that starts the app under test (`npm run dev`,
|
|
287
287
|
* `python manage.py runserver`, …). Runs in the user's shell from the
|
|
@@ -299,45 +299,45 @@ declare const WebServersConfigSchema: z.ZodEffects<z.ZodEffects<z.ZodUnion<[z.Zo
|
|
|
299
299
|
/** How long to wait for the URL to come up after spawning. */
|
|
300
300
|
timeoutMs: z.ZodDefault<z.ZodNumber>;
|
|
301
301
|
}, "strict", z.ZodTypeAny, {
|
|
302
|
-
command: string;
|
|
303
302
|
url: string;
|
|
304
|
-
reuseExistingServer: boolean;
|
|
305
303
|
timeoutMs: number;
|
|
306
|
-
}, {
|
|
307
304
|
command: string;
|
|
305
|
+
reuseExistingServer: boolean;
|
|
306
|
+
}, {
|
|
308
307
|
url: string;
|
|
309
|
-
|
|
308
|
+
command: string;
|
|
310
309
|
timeoutMs?: number | undefined;
|
|
310
|
+
reuseExistingServer?: boolean | undefined;
|
|
311
311
|
}>, "many">]>, {
|
|
312
|
-
command: string;
|
|
313
312
|
url: string;
|
|
314
|
-
reuseExistingServer: boolean;
|
|
315
313
|
timeoutMs: number;
|
|
316
|
-
}[], {
|
|
317
314
|
command: string;
|
|
315
|
+
reuseExistingServer: boolean;
|
|
316
|
+
}[], {
|
|
318
317
|
url: string;
|
|
319
|
-
|
|
318
|
+
command: string;
|
|
320
319
|
timeoutMs?: number | undefined;
|
|
320
|
+
reuseExistingServer?: boolean | undefined;
|
|
321
321
|
} | {
|
|
322
|
-
command: string;
|
|
323
322
|
url: string;
|
|
324
|
-
|
|
323
|
+
command: string;
|
|
325
324
|
timeoutMs?: number | undefined;
|
|
325
|
+
reuseExistingServer?: boolean | undefined;
|
|
326
326
|
}[]>, {
|
|
327
|
-
command: string;
|
|
328
327
|
url: string;
|
|
329
|
-
reuseExistingServer: boolean;
|
|
330
328
|
timeoutMs: number;
|
|
331
|
-
}[], {
|
|
332
329
|
command: string;
|
|
330
|
+
reuseExistingServer: boolean;
|
|
331
|
+
}[], {
|
|
333
332
|
url: string;
|
|
334
|
-
|
|
333
|
+
command: string;
|
|
335
334
|
timeoutMs?: number | undefined;
|
|
335
|
+
reuseExistingServer?: boolean | undefined;
|
|
336
336
|
} | {
|
|
337
|
-
command: string;
|
|
338
337
|
url: string;
|
|
339
|
-
|
|
338
|
+
command: string;
|
|
340
339
|
timeoutMs?: number | undefined;
|
|
340
|
+
reuseExistingServer?: boolean | undefined;
|
|
341
341
|
}[]>;
|
|
342
342
|
declare const EnvConfigSchema: z.ZodObject<{
|
|
343
343
|
/** Variable names whose base `.env` value is deliberately shared by
|
|
@@ -373,15 +373,15 @@ declare const UnotestConfigSchema: z.ZodEffects<z.ZodObject<{
|
|
|
373
373
|
/** How long to wait for the URL to come up after spawning. */
|
|
374
374
|
timeoutMs: z.ZodDefault<z.ZodNumber>;
|
|
375
375
|
}, "strict", z.ZodTypeAny, {
|
|
376
|
-
command: string;
|
|
377
376
|
url: string;
|
|
378
|
-
reuseExistingServer: boolean;
|
|
379
377
|
timeoutMs: number;
|
|
380
|
-
}, {
|
|
381
378
|
command: string;
|
|
379
|
+
reuseExistingServer: boolean;
|
|
380
|
+
}, {
|
|
382
381
|
url: string;
|
|
383
|
-
|
|
382
|
+
command: string;
|
|
384
383
|
timeoutMs?: number | undefined;
|
|
384
|
+
reuseExistingServer?: boolean | undefined;
|
|
385
385
|
}>, z.ZodArray<z.ZodObject<{
|
|
386
386
|
/** Shell command that starts the app under test (`npm run dev`,
|
|
387
387
|
* `python manage.py runserver`, …). Runs in the user's shell from the
|
|
@@ -399,45 +399,45 @@ declare const UnotestConfigSchema: z.ZodEffects<z.ZodObject<{
|
|
|
399
399
|
/** How long to wait for the URL to come up after spawning. */
|
|
400
400
|
timeoutMs: z.ZodDefault<z.ZodNumber>;
|
|
401
401
|
}, "strict", z.ZodTypeAny, {
|
|
402
|
-
command: string;
|
|
403
402
|
url: string;
|
|
404
|
-
reuseExistingServer: boolean;
|
|
405
403
|
timeoutMs: number;
|
|
406
|
-
}, {
|
|
407
404
|
command: string;
|
|
405
|
+
reuseExistingServer: boolean;
|
|
406
|
+
}, {
|
|
408
407
|
url: string;
|
|
409
|
-
|
|
408
|
+
command: string;
|
|
410
409
|
timeoutMs?: number | undefined;
|
|
410
|
+
reuseExistingServer?: boolean | undefined;
|
|
411
411
|
}>, "many">]>, {
|
|
412
|
-
command: string;
|
|
413
412
|
url: string;
|
|
414
|
-
reuseExistingServer: boolean;
|
|
415
413
|
timeoutMs: number;
|
|
416
|
-
}[], {
|
|
417
414
|
command: string;
|
|
415
|
+
reuseExistingServer: boolean;
|
|
416
|
+
}[], {
|
|
418
417
|
url: string;
|
|
419
|
-
|
|
418
|
+
command: string;
|
|
420
419
|
timeoutMs?: number | undefined;
|
|
420
|
+
reuseExistingServer?: boolean | undefined;
|
|
421
421
|
} | {
|
|
422
|
-
command: string;
|
|
423
422
|
url: string;
|
|
424
|
-
|
|
423
|
+
command: string;
|
|
425
424
|
timeoutMs?: number | undefined;
|
|
425
|
+
reuseExistingServer?: boolean | undefined;
|
|
426
426
|
}[]>, {
|
|
427
|
-
command: string;
|
|
428
427
|
url: string;
|
|
429
|
-
reuseExistingServer: boolean;
|
|
430
428
|
timeoutMs: number;
|
|
431
|
-
}[], {
|
|
432
429
|
command: string;
|
|
430
|
+
reuseExistingServer: boolean;
|
|
431
|
+
}[], {
|
|
433
432
|
url: string;
|
|
434
|
-
|
|
433
|
+
command: string;
|
|
435
434
|
timeoutMs?: number | undefined;
|
|
435
|
+
reuseExistingServer?: boolean | undefined;
|
|
436
436
|
} | {
|
|
437
|
-
command: string;
|
|
438
437
|
url: string;
|
|
439
|
-
|
|
438
|
+
command: string;
|
|
440
439
|
timeoutMs?: number | undefined;
|
|
440
|
+
reuseExistingServer?: boolean | undefined;
|
|
441
441
|
}[]>>;
|
|
442
442
|
browsers: z.ZodArray<z.ZodEnum<["chromium", "firefox", "webkit"]>, "many">;
|
|
443
443
|
channel: z.ZodOptional<z.ZodUnion<[z.ZodEnum<["chrome", "msedge", "chrome-beta", "chromium"]>, z.ZodEffects<z.ZodLiteral<"bundled">, null, "bundled">, z.ZodNull]>>;
|
|
@@ -482,23 +482,23 @@ declare const UnotestConfigSchema: z.ZodEffects<z.ZodObject<{
|
|
|
482
482
|
profile: z.ZodOptional<z.ZodLiteral<"per-test">>;
|
|
483
483
|
args: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
484
484
|
}, "strict", z.ZodTypeAny, {
|
|
485
|
+
args?: string[] | undefined;
|
|
485
486
|
userDataDir?: string | undefined;
|
|
486
487
|
profile?: "per-test" | undefined;
|
|
487
|
-
args?: string[] | undefined;
|
|
488
488
|
}, {
|
|
489
|
+
args?: string[] | undefined;
|
|
489
490
|
userDataDir?: string | undefined;
|
|
490
491
|
profile?: "per-test" | undefined;
|
|
491
|
-
args?: string[] | undefined;
|
|
492
492
|
}>>;
|
|
493
493
|
retry: z.ZodObject<{
|
|
494
494
|
count: z.ZodNumber;
|
|
495
495
|
on: z.ZodArray<z.ZodEnum<["transient", "network", "crash"]>, "many">;
|
|
496
496
|
}, "strict", z.ZodTypeAny, {
|
|
497
497
|
count: number;
|
|
498
|
-
on: ("
|
|
498
|
+
on: ("network" | "transient" | "crash")[];
|
|
499
499
|
}, {
|
|
500
500
|
count: number;
|
|
501
|
-
on: ("
|
|
501
|
+
on: ("network" | "transient" | "crash")[];
|
|
502
502
|
}>;
|
|
503
503
|
failureBundle: z.ZodObject<{
|
|
504
504
|
/** Tier 1 is always on by D-16. Schema lock — not user-toggleable. */
|
|
@@ -709,13 +709,12 @@ declare const UnotestConfigSchema: z.ZodEffects<z.ZodObject<{
|
|
|
709
709
|
readRoots?: string[] | undefined;
|
|
710
710
|
}>;
|
|
711
711
|
}, "strict", z.ZodTypeAny, {
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
};
|
|
712
|
+
defaultTimeoutMs: number;
|
|
713
|
+
defaultNavigationTimeoutMs: number;
|
|
715
714
|
browsers: ("chromium" | "firefox" | "webkit")[];
|
|
716
715
|
retry: {
|
|
717
716
|
count: number;
|
|
718
|
-
on: ("
|
|
717
|
+
on: ("network" | "transient" | "crash")[];
|
|
719
718
|
};
|
|
720
719
|
failureBundle: {
|
|
721
720
|
tier1: true;
|
|
@@ -734,8 +733,9 @@ declare const UnotestConfigSchema: z.ZodEffects<z.ZodObject<{
|
|
|
734
733
|
dialogPolicy: "accept" | "dismiss" | "manual";
|
|
735
734
|
testDir: string;
|
|
736
735
|
helpersDir: string;
|
|
737
|
-
|
|
738
|
-
|
|
736
|
+
env: {
|
|
737
|
+
shared: string[];
|
|
738
|
+
};
|
|
739
739
|
linter: {
|
|
740
740
|
enabled: boolean;
|
|
741
741
|
rules: Partial<Record<"lint:deep-css" | "lint:xpath" | "lint:obfuscated-class" | "lint:pause-explicit" | "lint:disambig-by-index" | "lint:evaluate-discouraged" | "lint:scenario-in-root" | "lint:mustache-in-dsl" | "lint:goto-concat" | "lint:regex-invalid" | "lint:echo-assert" | "lint:api-call-file-body" | "lint:lint-ok-missing-reason" | "lint:flow-returns-value" | "lint:legacy-layout" | "lint:external-variable-undeclared" | "lint:env-host-from-base" | "lint:one-test-per-file" | "lint:shadows-dsl-function" | "lint:skip-outside-test" | "lint:set-test-timeout-outside-test" | "validator:unknown-function" | "validator:arity" | "validator:arg-kind" | "validator:step-coverage" | "validator:step-shape" | "validator:meta-shape" | "validator:function-shape" | "validator:for-shape" | "validator:if-shape" | "validator:var-shape" | "validator:unsupported-statement" | "validator:unsupported-expression" | "validator:string-concat" | "validator:semantic-loss" | "validator:list-arg" | "validator:wrapped-format", "off" | "warn" | "error">>;
|
|
@@ -762,39 +762,38 @@ declare const UnotestConfigSchema: z.ZodEffects<z.ZodObject<{
|
|
|
762
762
|
uploadDir?: string | undefined;
|
|
763
763
|
readRoots?: string[] | undefined;
|
|
764
764
|
};
|
|
765
|
+
locale?: string | undefined;
|
|
766
|
+
timezone?: string | undefined;
|
|
767
|
+
testTimeoutMs?: number | undefined;
|
|
765
768
|
baseUrl?: string | undefined;
|
|
766
769
|
webServer?: {
|
|
767
|
-
command: string;
|
|
768
770
|
url: string;
|
|
769
|
-
reuseExistingServer: boolean;
|
|
770
771
|
timeoutMs: number;
|
|
772
|
+
command: string;
|
|
773
|
+
reuseExistingServer: boolean;
|
|
771
774
|
}[] | undefined;
|
|
772
|
-
channel?: "
|
|
775
|
+
channel?: "chrome" | "msedge" | "chrome-beta" | "chromium" | null | undefined;
|
|
773
776
|
viewport?: {
|
|
774
777
|
width?: number | undefined;
|
|
775
778
|
height?: number | undefined;
|
|
776
779
|
deviceScaleFactor?: number | undefined;
|
|
777
780
|
} | null | undefined;
|
|
778
781
|
device?: string | undefined;
|
|
779
|
-
timezone?: string | undefined;
|
|
780
|
-
locale?: string | undefined;
|
|
781
782
|
maxContexts?: number | undefined;
|
|
782
783
|
launch?: {
|
|
784
|
+
args?: string[] | undefined;
|
|
783
785
|
userDataDir?: string | undefined;
|
|
784
786
|
profile?: "per-test" | undefined;
|
|
785
|
-
args?: string[] | undefined;
|
|
786
787
|
} | undefined;
|
|
787
788
|
storageState?: string | undefined;
|
|
788
789
|
teardownTimeoutMs?: number | undefined;
|
|
789
|
-
testTimeoutMs?: number | undefined;
|
|
790
790
|
}, {
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
};
|
|
791
|
+
defaultTimeoutMs: number;
|
|
792
|
+
defaultNavigationTimeoutMs: number;
|
|
794
793
|
browsers: ("chromium" | "firefox" | "webkit")[];
|
|
795
794
|
retry: {
|
|
796
795
|
count: number;
|
|
797
|
-
on: ("
|
|
796
|
+
on: ("network" | "transient" | "crash")[];
|
|
798
797
|
};
|
|
799
798
|
failureBundle: {
|
|
800
799
|
tier2: boolean;
|
|
@@ -813,8 +812,9 @@ declare const UnotestConfigSchema: z.ZodEffects<z.ZodObject<{
|
|
|
813
812
|
dialogPolicy: "accept" | "dismiss" | "manual";
|
|
814
813
|
testDir: string;
|
|
815
814
|
helpersDir: string;
|
|
816
|
-
|
|
817
|
-
|
|
815
|
+
env: {
|
|
816
|
+
shared?: string[] | undefined;
|
|
817
|
+
};
|
|
818
818
|
linter: {
|
|
819
819
|
enabled: boolean;
|
|
820
820
|
rules: Partial<Record<"lint:deep-css" | "lint:xpath" | "lint:obfuscated-class" | "lint:pause-explicit" | "lint:disambig-by-index" | "lint:evaluate-discouraged" | "lint:scenario-in-root" | "lint:mustache-in-dsl" | "lint:goto-concat" | "lint:regex-invalid" | "lint:echo-assert" | "lint:api-call-file-body" | "lint:lint-ok-missing-reason" | "lint:flow-returns-value" | "lint:legacy-layout" | "lint:external-variable-undeclared" | "lint:env-host-from-base" | "lint:one-test-per-file" | "lint:shadows-dsl-function" | "lint:skip-outside-test" | "lint:set-test-timeout-outside-test" | "validator:unknown-function" | "validator:arity" | "validator:arg-kind" | "validator:step-coverage" | "validator:step-shape" | "validator:meta-shape" | "validator:function-shape" | "validator:for-shape" | "validator:if-shape" | "validator:var-shape" | "validator:unsupported-statement" | "validator:unsupported-expression" | "validator:string-concat" | "validator:semantic-loss" | "validator:list-arg" | "validator:wrapped-format", "off" | "warn" | "error">>;
|
|
@@ -835,36 +835,36 @@ declare const UnotestConfigSchema: z.ZodEffects<z.ZodObject<{
|
|
|
835
835
|
uploadDir?: string | undefined;
|
|
836
836
|
readRoots?: string[] | undefined;
|
|
837
837
|
};
|
|
838
|
+
locale?: string | undefined;
|
|
839
|
+
timezone?: string | undefined;
|
|
840
|
+
testTimeoutMs?: number | undefined;
|
|
838
841
|
baseUrl?: string | undefined;
|
|
839
842
|
webServer?: {
|
|
840
|
-
command: string;
|
|
841
843
|
url: string;
|
|
842
|
-
|
|
844
|
+
command: string;
|
|
843
845
|
timeoutMs?: number | undefined;
|
|
846
|
+
reuseExistingServer?: boolean | undefined;
|
|
844
847
|
} | {
|
|
845
|
-
command: string;
|
|
846
848
|
url: string;
|
|
847
|
-
|
|
849
|
+
command: string;
|
|
848
850
|
timeoutMs?: number | undefined;
|
|
851
|
+
reuseExistingServer?: boolean | undefined;
|
|
849
852
|
}[] | undefined;
|
|
850
|
-
channel?: "
|
|
853
|
+
channel?: "chrome" | "msedge" | "chrome-beta" | "chromium" | "bundled" | null | undefined;
|
|
851
854
|
viewport?: {
|
|
852
855
|
width?: number | undefined;
|
|
853
856
|
height?: number | undefined;
|
|
854
857
|
deviceScaleFactor?: number | undefined;
|
|
855
858
|
} | null | undefined;
|
|
856
859
|
device?: string | undefined;
|
|
857
|
-
timezone?: string | undefined;
|
|
858
|
-
locale?: string | undefined;
|
|
859
860
|
maxContexts?: number | undefined;
|
|
860
861
|
launch?: {
|
|
862
|
+
args?: string[] | undefined;
|
|
861
863
|
userDataDir?: string | undefined;
|
|
862
864
|
profile?: "per-test" | undefined;
|
|
863
|
-
args?: string[] | undefined;
|
|
864
865
|
} | undefined;
|
|
865
866
|
storageState?: string | undefined;
|
|
866
867
|
teardownTimeoutMs?: number | undefined;
|
|
867
|
-
testTimeoutMs?: number | undefined;
|
|
868
868
|
schedules?: {
|
|
869
869
|
collection: string;
|
|
870
870
|
cron: string;
|
|
@@ -872,13 +872,12 @@ declare const UnotestConfigSchema: z.ZodEffects<z.ZodObject<{
|
|
|
872
872
|
prepare?: string | undefined;
|
|
873
873
|
}[] | undefined;
|
|
874
874
|
}>, {
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
};
|
|
875
|
+
defaultTimeoutMs: number;
|
|
876
|
+
defaultNavigationTimeoutMs: number;
|
|
878
877
|
browsers: ("chromium" | "firefox" | "webkit")[];
|
|
879
878
|
retry: {
|
|
880
879
|
count: number;
|
|
881
|
-
on: ("
|
|
880
|
+
on: ("network" | "transient" | "crash")[];
|
|
882
881
|
};
|
|
883
882
|
failureBundle: {
|
|
884
883
|
tier1: true;
|
|
@@ -897,8 +896,9 @@ declare const UnotestConfigSchema: z.ZodEffects<z.ZodObject<{
|
|
|
897
896
|
dialogPolicy: "accept" | "dismiss" | "manual";
|
|
898
897
|
testDir: string;
|
|
899
898
|
helpersDir: string;
|
|
900
|
-
|
|
901
|
-
|
|
899
|
+
env: {
|
|
900
|
+
shared: string[];
|
|
901
|
+
};
|
|
902
902
|
linter: {
|
|
903
903
|
enabled: boolean;
|
|
904
904
|
rules: Partial<Record<"lint:deep-css" | "lint:xpath" | "lint:obfuscated-class" | "lint:pause-explicit" | "lint:disambig-by-index" | "lint:evaluate-discouraged" | "lint:scenario-in-root" | "lint:mustache-in-dsl" | "lint:goto-concat" | "lint:regex-invalid" | "lint:echo-assert" | "lint:api-call-file-body" | "lint:lint-ok-missing-reason" | "lint:flow-returns-value" | "lint:legacy-layout" | "lint:external-variable-undeclared" | "lint:env-host-from-base" | "lint:one-test-per-file" | "lint:shadows-dsl-function" | "lint:skip-outside-test" | "lint:set-test-timeout-outside-test" | "validator:unknown-function" | "validator:arity" | "validator:arg-kind" | "validator:step-coverage" | "validator:step-shape" | "validator:meta-shape" | "validator:function-shape" | "validator:for-shape" | "validator:if-shape" | "validator:var-shape" | "validator:unsupported-statement" | "validator:unsupported-expression" | "validator:string-concat" | "validator:semantic-loss" | "validator:list-arg" | "validator:wrapped-format", "off" | "warn" | "error">>;
|
|
@@ -925,39 +925,38 @@ declare const UnotestConfigSchema: z.ZodEffects<z.ZodObject<{
|
|
|
925
925
|
uploadDir?: string | undefined;
|
|
926
926
|
readRoots?: string[] | undefined;
|
|
927
927
|
};
|
|
928
|
+
locale?: string | undefined;
|
|
929
|
+
timezone?: string | undefined;
|
|
930
|
+
testTimeoutMs?: number | undefined;
|
|
928
931
|
baseUrl?: string | undefined;
|
|
929
932
|
webServer?: {
|
|
930
|
-
command: string;
|
|
931
933
|
url: string;
|
|
932
|
-
reuseExistingServer: boolean;
|
|
933
934
|
timeoutMs: number;
|
|
935
|
+
command: string;
|
|
936
|
+
reuseExistingServer: boolean;
|
|
934
937
|
}[] | undefined;
|
|
935
|
-
channel?: "
|
|
938
|
+
channel?: "chrome" | "msedge" | "chrome-beta" | "chromium" | null | undefined;
|
|
936
939
|
viewport?: {
|
|
937
940
|
width?: number | undefined;
|
|
938
941
|
height?: number | undefined;
|
|
939
942
|
deviceScaleFactor?: number | undefined;
|
|
940
943
|
} | null | undefined;
|
|
941
944
|
device?: string | undefined;
|
|
942
|
-
timezone?: string | undefined;
|
|
943
|
-
locale?: string | undefined;
|
|
944
945
|
maxContexts?: number | undefined;
|
|
945
946
|
launch?: {
|
|
947
|
+
args?: string[] | undefined;
|
|
946
948
|
userDataDir?: string | undefined;
|
|
947
949
|
profile?: "per-test" | undefined;
|
|
948
|
-
args?: string[] | undefined;
|
|
949
950
|
} | undefined;
|
|
950
951
|
storageState?: string | undefined;
|
|
951
952
|
teardownTimeoutMs?: number | undefined;
|
|
952
|
-
testTimeoutMs?: number | undefined;
|
|
953
953
|
}, {
|
|
954
|
-
|
|
955
|
-
|
|
956
|
-
};
|
|
954
|
+
defaultTimeoutMs: number;
|
|
955
|
+
defaultNavigationTimeoutMs: number;
|
|
957
956
|
browsers: ("chromium" | "firefox" | "webkit")[];
|
|
958
957
|
retry: {
|
|
959
958
|
count: number;
|
|
960
|
-
on: ("
|
|
959
|
+
on: ("network" | "transient" | "crash")[];
|
|
961
960
|
};
|
|
962
961
|
failureBundle: {
|
|
963
962
|
tier2: boolean;
|
|
@@ -976,8 +975,9 @@ declare const UnotestConfigSchema: z.ZodEffects<z.ZodObject<{
|
|
|
976
975
|
dialogPolicy: "accept" | "dismiss" | "manual";
|
|
977
976
|
testDir: string;
|
|
978
977
|
helpersDir: string;
|
|
979
|
-
|
|
980
|
-
|
|
978
|
+
env: {
|
|
979
|
+
shared?: string[] | undefined;
|
|
980
|
+
};
|
|
981
981
|
linter: {
|
|
982
982
|
enabled: boolean;
|
|
983
983
|
rules: Partial<Record<"lint:deep-css" | "lint:xpath" | "lint:obfuscated-class" | "lint:pause-explicit" | "lint:disambig-by-index" | "lint:evaluate-discouraged" | "lint:scenario-in-root" | "lint:mustache-in-dsl" | "lint:goto-concat" | "lint:regex-invalid" | "lint:echo-assert" | "lint:api-call-file-body" | "lint:lint-ok-missing-reason" | "lint:flow-returns-value" | "lint:legacy-layout" | "lint:external-variable-undeclared" | "lint:env-host-from-base" | "lint:one-test-per-file" | "lint:shadows-dsl-function" | "lint:skip-outside-test" | "lint:set-test-timeout-outside-test" | "validator:unknown-function" | "validator:arity" | "validator:arg-kind" | "validator:step-coverage" | "validator:step-shape" | "validator:meta-shape" | "validator:function-shape" | "validator:for-shape" | "validator:if-shape" | "validator:var-shape" | "validator:unsupported-statement" | "validator:unsupported-expression" | "validator:string-concat" | "validator:semantic-loss" | "validator:list-arg" | "validator:wrapped-format", "off" | "warn" | "error">>;
|
|
@@ -998,36 +998,36 @@ declare const UnotestConfigSchema: z.ZodEffects<z.ZodObject<{
|
|
|
998
998
|
uploadDir?: string | undefined;
|
|
999
999
|
readRoots?: string[] | undefined;
|
|
1000
1000
|
};
|
|
1001
|
+
locale?: string | undefined;
|
|
1002
|
+
timezone?: string | undefined;
|
|
1003
|
+
testTimeoutMs?: number | undefined;
|
|
1001
1004
|
baseUrl?: string | undefined;
|
|
1002
1005
|
webServer?: {
|
|
1003
|
-
command: string;
|
|
1004
1006
|
url: string;
|
|
1005
|
-
|
|
1007
|
+
command: string;
|
|
1006
1008
|
timeoutMs?: number | undefined;
|
|
1009
|
+
reuseExistingServer?: boolean | undefined;
|
|
1007
1010
|
} | {
|
|
1008
|
-
command: string;
|
|
1009
1011
|
url: string;
|
|
1010
|
-
|
|
1012
|
+
command: string;
|
|
1011
1013
|
timeoutMs?: number | undefined;
|
|
1014
|
+
reuseExistingServer?: boolean | undefined;
|
|
1012
1015
|
}[] | undefined;
|
|
1013
|
-
channel?: "
|
|
1016
|
+
channel?: "chrome" | "msedge" | "chrome-beta" | "chromium" | "bundled" | null | undefined;
|
|
1014
1017
|
viewport?: {
|
|
1015
1018
|
width?: number | undefined;
|
|
1016
1019
|
height?: number | undefined;
|
|
1017
1020
|
deviceScaleFactor?: number | undefined;
|
|
1018
1021
|
} | null | undefined;
|
|
1019
1022
|
device?: string | undefined;
|
|
1020
|
-
timezone?: string | undefined;
|
|
1021
|
-
locale?: string | undefined;
|
|
1022
1023
|
maxContexts?: number | undefined;
|
|
1023
1024
|
launch?: {
|
|
1025
|
+
args?: string[] | undefined;
|
|
1024
1026
|
userDataDir?: string | undefined;
|
|
1025
1027
|
profile?: "per-test" | undefined;
|
|
1026
|
-
args?: string[] | undefined;
|
|
1027
1028
|
} | undefined;
|
|
1028
1029
|
storageState?: string | undefined;
|
|
1029
1030
|
teardownTimeoutMs?: number | undefined;
|
|
1030
|
-
testTimeoutMs?: number | undefined;
|
|
1031
1031
|
schedules?: {
|
|
1032
1032
|
collection: string;
|
|
1033
1033
|
cron: string;
|