@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 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
- npx @unotest/web bundle push --run --env ENVIRONMENT
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
- npx @unotest/web box access larch
1537
- npx @unotest/web bundle push --run --env ENVIRONMENT
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
@@ -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: ("transient" | "network" | "crash")[];
45
+ on: ("network" | "transient" | "crash")[];
46
46
  }, {
47
47
  count: number;
48
- on: ("transient" | "network" | "crash")[];
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
- reuseExistingServer?: boolean | undefined;
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
- reuseExistingServer?: boolean | undefined;
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
- reuseExistingServer?: boolean | undefined;
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
- reuseExistingServer?: boolean | undefined;
318
+ command: string;
320
319
  timeoutMs?: number | undefined;
320
+ reuseExistingServer?: boolean | undefined;
321
321
  } | {
322
- command: string;
323
322
  url: string;
324
- reuseExistingServer?: boolean | undefined;
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
- reuseExistingServer?: boolean | undefined;
333
+ command: string;
335
334
  timeoutMs?: number | undefined;
335
+ reuseExistingServer?: boolean | undefined;
336
336
  } | {
337
- command: string;
338
337
  url: string;
339
- reuseExistingServer?: boolean | undefined;
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
- reuseExistingServer?: boolean | undefined;
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
- reuseExistingServer?: boolean | undefined;
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
- reuseExistingServer?: boolean | undefined;
418
+ command: string;
420
419
  timeoutMs?: number | undefined;
420
+ reuseExistingServer?: boolean | undefined;
421
421
  } | {
422
- command: string;
423
422
  url: string;
424
- reuseExistingServer?: boolean | undefined;
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
- reuseExistingServer?: boolean | undefined;
433
+ command: string;
435
434
  timeoutMs?: number | undefined;
435
+ reuseExistingServer?: boolean | undefined;
436
436
  } | {
437
- command: string;
438
437
  url: string;
439
- reuseExistingServer?: boolean | undefined;
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: ("transient" | "network" | "crash")[];
498
+ on: ("network" | "transient" | "crash")[];
499
499
  }, {
500
500
  count: number;
501
- on: ("transient" | "network" | "crash")[];
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
- env: {
713
- shared: string[];
714
- };
712
+ defaultTimeoutMs: number;
713
+ defaultNavigationTimeoutMs: number;
715
714
  browsers: ("chromium" | "firefox" | "webkit")[];
716
715
  retry: {
717
716
  count: number;
718
- on: ("transient" | "network" | "crash")[];
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
- defaultTimeoutMs: number;
738
- defaultNavigationTimeoutMs: number;
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?: "chromium" | "chrome" | "msedge" | "chrome-beta" | null | undefined;
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
- env: {
792
- shared?: string[] | undefined;
793
- };
791
+ defaultTimeoutMs: number;
792
+ defaultNavigationTimeoutMs: number;
794
793
  browsers: ("chromium" | "firefox" | "webkit")[];
795
794
  retry: {
796
795
  count: number;
797
- on: ("transient" | "network" | "crash")[];
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
- defaultTimeoutMs: number;
817
- defaultNavigationTimeoutMs: number;
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
- reuseExistingServer?: boolean | undefined;
844
+ command: string;
843
845
  timeoutMs?: number | undefined;
846
+ reuseExistingServer?: boolean | undefined;
844
847
  } | {
845
- command: string;
846
848
  url: string;
847
- reuseExistingServer?: boolean | undefined;
849
+ command: string;
848
850
  timeoutMs?: number | undefined;
851
+ reuseExistingServer?: boolean | undefined;
849
852
  }[] | undefined;
850
- channel?: "chromium" | "chrome" | "msedge" | "chrome-beta" | "bundled" | null | undefined;
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
- env: {
876
- shared: string[];
877
- };
875
+ defaultTimeoutMs: number;
876
+ defaultNavigationTimeoutMs: number;
878
877
  browsers: ("chromium" | "firefox" | "webkit")[];
879
878
  retry: {
880
879
  count: number;
881
- on: ("transient" | "network" | "crash")[];
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
- defaultTimeoutMs: number;
901
- defaultNavigationTimeoutMs: number;
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?: "chromium" | "chrome" | "msedge" | "chrome-beta" | null | undefined;
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
- env: {
955
- shared?: string[] | undefined;
956
- };
954
+ defaultTimeoutMs: number;
955
+ defaultNavigationTimeoutMs: number;
957
956
  browsers: ("chromium" | "firefox" | "webkit")[];
958
957
  retry: {
959
958
  count: number;
960
- on: ("transient" | "network" | "crash")[];
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
- defaultTimeoutMs: number;
980
- defaultNavigationTimeoutMs: number;
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
- reuseExistingServer?: boolean | undefined;
1007
+ command: string;
1006
1008
  timeoutMs?: number | undefined;
1009
+ reuseExistingServer?: boolean | undefined;
1007
1010
  } | {
1008
- command: string;
1009
1011
  url: string;
1010
- reuseExistingServer?: boolean | undefined;
1012
+ command: string;
1011
1013
  timeoutMs?: number | undefined;
1014
+ reuseExistingServer?: boolean | undefined;
1012
1015
  }[] | undefined;
1013
- channel?: "chromium" | "chrome" | "msedge" | "chrome-beta" | "bundled" | null | undefined;
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;