@unotest/web 0.44.0 → 0.45.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,41 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.45.0] - 2026-10-01
4
+
5
+ ### Minor Changes
6
+
7
+ - f8ed64e: Browser extensions in scenarios: `waitForServiceWorker({timeoutMs?, url?})` returns the URL of an MV3 extension's service worker, `evaluateInServiceWorker(js, ...args)` runs JS in it — the way to `chrome.storage`, `chrome.tabs` and `chrome.runtime`, with the same argument and return rules as `evaluate` — and `extensionId()` gives the id for `chrome-extension://<id>/popup.html`. Every call finds the worker anew, so a worker MV3 put to sleep does not go stale. Extensions load only into a browser started with `launch.userDataDir`; without it the calls fail at once and say so. `mockRoute` also answers the worker's own requests on a freshly opened profile.
8
+ - fabfa22: Two reads of one element: `boundingBox(loc)` returns `{x, y, width, height}` in viewport CSS pixels, or `null` when the element is not rendered; `evaluateOnLocator(loc, js, ...args)` runs JS on the matched element — the body gets the element first, then the extra arguments by the same rules as `evaluate`.
9
+ - 1f5441c: Network mocks in scenarios: `mockRoute(glob, response)` gives requests matching a Playwright URL glob a fixed answer for the rest of the scenario — a response (`{status?, body?, headers?, contentType?}`, an object body goes as JSON), `{abort: true}` or `{continue: true}`. Where several masks match, the one mocked last answers, so `mockRoute('**/*', {abort: true})` followed by `mockRoute('**/localhost:*/**', {continue: true})` is a network allowlist. `unmockRoute(glob?)` takes mocks off. `waitForRequest(glob, {timeoutMs?})` returns the request with `url`, `method`, `headers`, `postData` and `postDataJson`; on a mocked mask it also finds a request sent before the call. `{abort: true, record: true}` keeps what it stopped, and `assertNoRequest(glob, {since?})` fails naming those requests. A fixed response to `**/*` is refused, and the site's own page is never aborted. Captured network entries of mocked requests carry `mocked: true`.
10
+ - eead45c: New DSL functions `newPage(url?)` and `closePage(index?)`: a scenario opens and closes its own tabs. `newPage` opens a tab in the active browser context, makes it active and returns its index; with a url the tab opens it, a relative path resolving against the base URL as in `goto`. `waitForPage` never returns a tab `newPage` opened. `closePage` closes the active tab, or tab `index`. Closing the active tab makes the tab that was active before it active again, or the tab at the index below when that one is gone. Closing another tab keeps the steps where they are. The only open tab cannot be closed: the step fails with `cannot close the only open tab`.
11
+ - 0cb5c62: Four new DSL functions for reading and comparing values inside a scenario:
12
+
13
+ - `textMatches(text, /re/)` returns `false` on a miss, or `[whole, group1, …]` for the first match. A group that took no part is `null`. A string pattern is refused with a pointer to `textContains`.
14
+ - `parseJson(text)` parses a JSON string into a value you walk with `.` and `[]`. Invalid JSON, including an empty string, fails the step and quotes the input.
15
+ - `urlParam(url, key)` returns a decoded query parameter: `null` when the key is absent, `''` when it is empty. A path without a host works too.
16
+ - `assertEqual(actual, expected)` compares two values deeply, the way JSON does: key order does not count, and a missing key differs from a `null` one. A failure names the first differing path with both values (`values differ at panel.devices[1]: expected "ipad", got "iphone"`), followed by a line diff of the two sides.
17
+
18
+ - 1b833cf: New DSL functions `readFile(path, {encoding})` and `readFileInfo(path)`. `readFile` returns a file's text, or its bytes as base64 with `{encoding: 'base64'}`. `readFileInfo` returns `{size}` and, for a PNG, `png: {width, height}` read from the header, so a test can check an exported image without reading it whole. Both take a path relative to `sandbox.shellCwd` (the project root by default), an absolute path inside it, or the `path` that `waitForDownload()` returns, so a test can check the file a page downloaded. Any other path is refused, and so is a symlink inside the project that points out of it. `readJson` and `upload` now refuse such a symlink too; before, they followed it. The docs gain a "Files" section in "From @playwright/test".
19
+ - f2cabfa: New DSL function `readJson(path)`: reads a whole JSON file once and returns the parsed value, so a scenario can walk it with `.` and `[]`. It is meant for constants your app keeps in source: a small script exports them to JSON, and the scenario reads that file instead of repeating the values by hand. The path is relative to `sandbox.shellCwd` (the project root by default), the same base `readJsonLine` uses, and must stay inside it: an absolute path or one that climbs out with `../` is refused. A missing file or a file that is not valid JSON fails the step at once. The docs gain a "From @playwright/test" section on moving helpers and constants.
20
+ - 554891a: `setPage(index, {activate: false})` switches the tab the steps act on without bringing it to front, so a scenario can drive an extension panel in the background while the site stays the visible tab. Without the option `setPage` behaves as before and brings the tab to front. New DSL function `bringToFront(index?)` shows a tab explicitly and leaves the steps on the active tab; with no index it shows the active tab. An unknown option or a non-boolean `activate` fails the step instead of being ignored.
21
+ - d25af6b: `viewport: null` in the config turns size emulation off: the page is as wide as the real browser window (headless: the size from `--window-size` in `launch.args`). A `device` next to it is refused, and so is `setViewport(null)` in a scenario — Playwright keeps a size it set on an open page, so the real window is chosen in the config.
22
+ - 3bc4c8f: New DSL function `waitForDownload(options?)`: returns the first file the page downloaded that the scenario has not taken yet, as `{path, name}`. `path` is the absolute path of the saved copy; read it with `waitForFile`. `name` is the file name the site suggested. Downloads are recorded from the moment the browser opens, so clicking first and asking afterwards loses nothing. `{timeoutMs}` defaults to the navigation timeout. `{name}` takes a substring or regex of the file name; a download that doesn't match stays for a later call. In a run the file is saved with the run and the viewer lists it under the step that took it, as a link to the file. Outside a run it is saved under `~/.cache/unotest/web/downloads/`. The run journal has a new `download` event kind.
23
+ - 155ad28: New DSL function `waitForPage(options?)`: waits for a tab the scenario has not received yet, makes it active and returns its index. Use it for a tab whose index you don't know up front: one a browser extension opens, or one that opens next to tabs already there. A tab that opened before the call still counts, even when the click was a step earlier. No tab is returned twice: a tab counts as received when it was open at the start, when `setPage` switched to it, or when an earlier `waitForPage` returned it. `{timeoutMs}` defaults to the navigation timeout. When no new tab arrives in time, the step fails with `no new tab within N ms, N tabs open`. This replaces the `pause(ms)` workaround the docs used to recommend.
24
+ - a5a3825: `waitUntil(() => condition, {timeoutMs?, intervalMs?, label?})` polls a condition until it is truthy and returns that value — Playwright's `expect.poll`. The body is an expression or a block that returns its value; calls inside it (`apiCall`, `evaluate`, `textContent`) run on every try. `timeoutMs` defaults to the run's wait timeout, `intervalMs` to 250. Only a falsy value is retried: an error in the body fails the step at once. On timeout the step fails naming the label, the number of tries and the last value.
25
+
26
+ ### Patch Changes
27
+
28
+ - a987021: Object literals in scenarios take a reserved word as a key, as in JavaScript: `mockRoute(glob, {continue: true})` used to fail to parse with `Expected property key (word or string)`, and so did any key such as `if`, `for`, `return` or `step`. Quoting the key (`{"continue": true}`) is no longer needed. Dot access by a reserved word (`a.continue`) still does not parse; use `a["continue"]`.
29
+ - f79f29b: `timeoutMs` is now accepted wherever `timeout` is: in actions (`click`, `fill`, `press`, `hover`, `selectOption`, `dragAndDrop` and the rest), navigation (`goto`, `reload`, `goBack`, `goForward`, `waitForUrl`, `waitForNavigation`), waits (`waitFor`, `waitForText`, `waitForCount`) and assertions (`assertText`, `assertVisible`, `assertHidden`, `assertValue`, `assertCount`, `assertUrl`). Before, `{timeoutMs: 5000}` there — the name the newer functions use — was ignored without a word and the call waited its default. Giving both `timeout` and `timeoutMs` in one call is refused.
30
+ - Updated dependencies [a987021]
31
+ - Updated dependencies [3bc4c8f]
32
+ - Updated dependencies [a5a3825]
33
+ - @unotest/dsl@0.45.0
34
+ - @unotest/protocol@0.45.0
35
+ - @unotest/viewer@0.45.0
36
+ - @unotest/core@0.45.0
37
+ - @unotest/grounder-client@0.45.0
38
+
3
39
  ## [0.44.0] - 2026-09-30
4
40
 
5
41
  ### Minor Changes
@@ -1454,7 +1490,7 @@ picker on` fetches this project's own access and writes the three grounder
1454
1490
 
1455
1491
  That screen named one command:
1456
1492
 
1457
- npx @unotest/web bundle push --run --env ENVIRONMENT
1493
+ npx @unotest/web bundle push --run --env ENVIRONMENT
1458
1494
 
1459
1495
  In a project that has just been created, the command refuses with `no box
1460
1496
  address` before it does anything: the project holds neither the box's address
@@ -1463,8 +1499,8 @@ address` before it does anything: the project holds neither the box's address
1463
1499
 
1464
1500
  The screen now names both steps, in the order they have to happen:
1465
1501
 
1466
- npx @unotest/web box access larch
1467
- npx @unotest/web bundle push --run --env ENVIRONMENT
1502
+ npx @unotest/web box access larch
1503
+ npx @unotest/web bundle push --run --env ENVIRONMENT
1468
1504
 
1469
1505
  The box's own name is filled in when its licence carries one. `box access`
1470
1506
  with no name refuses, and its refusal offers to create a box — to somebody who
@@ -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: ("network" | "transient" | "crash")[];
45
+ on: ("transient" | "network" | "crash")[];
46
46
  }, {
47
47
  count: number;
48
- on: ("network" | "transient" | "crash")[];
48
+ on: ("transient" | "network" | "crash")[];
49
49
  }>;
50
50
  type RetryConfig = z.infer<typeof RetryConfigSchema>;
51
51
  declare const FailureBundleConfigSchema: z.ZodObject<{
@@ -234,15 +234,15 @@ declare const WebServerConfigSchema: z.ZodObject<{
234
234
  /** How long to wait for the URL to come up after spawning. */
235
235
  timeoutMs: z.ZodDefault<z.ZodNumber>;
236
236
  }, "strict", z.ZodTypeAny, {
237
- url: string;
238
- timeoutMs: number;
239
237
  command: string;
238
+ url: string;
240
239
  reuseExistingServer: boolean;
240
+ timeoutMs: number;
241
241
  }, {
242
- url: string;
243
242
  command: string;
244
- timeoutMs?: number | undefined;
243
+ url: string;
245
244
  reuseExistingServer?: boolean | undefined;
245
+ timeoutMs?: number | undefined;
246
246
  }>;
247
247
  type WebServerConfig = z.infer<typeof WebServerConfigSchema>;
248
248
  declare const EnvConfigSchema: z.ZodObject<{
@@ -256,7 +256,7 @@ declare const EnvConfigSchema: z.ZodObject<{
256
256
  shared?: string[] | undefined;
257
257
  }>;
258
258
  type EnvConfig = z.infer<typeof EnvConfigSchema>;
259
- declare const UnotestConfigSchema: z.ZodObject<{
259
+ declare const UnotestConfigSchema: z.ZodEffects<z.ZodObject<{
260
260
  baseUrl: z.ZodOptional<z.ZodString>;
261
261
  /** Dev-server lifecycle for the app under test (M-12). Unset → the app
262
262
  * is expected to be running already (current behaviour). When set, the
@@ -279,19 +279,19 @@ declare const UnotestConfigSchema: z.ZodObject<{
279
279
  /** How long to wait for the URL to come up after spawning. */
280
280
  timeoutMs: z.ZodDefault<z.ZodNumber>;
281
281
  }, "strict", z.ZodTypeAny, {
282
- url: string;
283
- timeoutMs: number;
284
282
  command: string;
283
+ url: string;
285
284
  reuseExistingServer: boolean;
285
+ timeoutMs: number;
286
286
  }, {
287
- url: string;
288
287
  command: string;
289
- timeoutMs?: number | undefined;
288
+ url: string;
290
289
  reuseExistingServer?: boolean | undefined;
290
+ timeoutMs?: number | undefined;
291
291
  }>>;
292
292
  browsers: z.ZodArray<z.ZodEnum<["chromium", "firefox", "webkit"]>, "many">;
293
293
  channel: z.ZodOptional<z.ZodUnion<[z.ZodEnum<["chrome", "msedge", "chrome-beta", "chromium"]>, z.ZodEffects<z.ZodLiteral<"bundled">, null, "bundled">, z.ZodNull]>>;
294
- viewport: z.ZodOptional<z.ZodObject<{
294
+ viewport: z.ZodOptional<z.ZodNullable<z.ZodObject<{
295
295
  width: z.ZodOptional<z.ZodNumber>;
296
296
  height: z.ZodOptional<z.ZodNumber>;
297
297
  /** CSS pixel → device pixel ratio: 2 makes a 390×844 page a 780×1688
@@ -305,7 +305,7 @@ declare const UnotestConfigSchema: z.ZodObject<{
305
305
  width?: number | undefined;
306
306
  height?: number | undefined;
307
307
  deviceScaleFactor?: number | undefined;
308
- }>>;
308
+ }>>>;
309
309
  /** A device preset by its Playwright name (`"iPhone 14"`, `"Pixel 7"`):
310
310
  * size, scale, touch, mobile mode and user agent at once. `viewport`
311
311
  * next to it overrides the preset's size. The name is checked by the
@@ -331,21 +331,21 @@ declare const UnotestConfigSchema: z.ZodObject<{
331
331
  userDataDir: z.ZodOptional<z.ZodString>;
332
332
  args: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
333
333
  }, "strict", z.ZodTypeAny, {
334
- args?: string[] | undefined;
335
334
  userDataDir?: string | undefined;
336
- }, {
337
335
  args?: string[] | undefined;
336
+ }, {
338
337
  userDataDir?: string | undefined;
338
+ args?: string[] | undefined;
339
339
  }>>;
340
340
  retry: z.ZodObject<{
341
341
  count: z.ZodNumber;
342
342
  on: z.ZodArray<z.ZodEnum<["transient", "network", "crash"]>, "many">;
343
343
  }, "strict", z.ZodTypeAny, {
344
344
  count: number;
345
- on: ("network" | "transient" | "crash")[];
345
+ on: ("transient" | "network" | "crash")[];
346
346
  }, {
347
347
  count: number;
348
- on: ("network" | "transient" | "crash")[];
348
+ on: ("transient" | "network" | "crash")[];
349
349
  }>;
350
350
  failureBundle: z.ZodObject<{
351
351
  /** Tier 1 is always on by D-16. Schema lock — not user-toggleable. */
@@ -544,12 +544,13 @@ declare const UnotestConfigSchema: z.ZodObject<{
544
544
  uploadDir?: string | undefined;
545
545
  }>;
546
546
  }, "strict", z.ZodTypeAny, {
547
- defaultTimeoutMs: number;
548
- defaultNavigationTimeoutMs: number;
547
+ env: {
548
+ shared: string[];
549
+ };
549
550
  browsers: ("chromium" | "firefox" | "webkit")[];
550
551
  retry: {
551
552
  count: number;
552
- on: ("network" | "transient" | "crash")[];
553
+ on: ("transient" | "network" | "crash")[];
553
554
  };
554
555
  failureBundle: {
555
556
  tier1: true;
@@ -568,9 +569,8 @@ declare const UnotestConfigSchema: z.ZodObject<{
568
569
  dialogPolicy: "accept" | "dismiss" | "manual";
569
570
  testDir: string;
570
571
  helpersDir: string;
571
- env: {
572
- shared: string[];
573
- };
572
+ defaultTimeoutMs: number;
573
+ defaultNavigationTimeoutMs: number;
574
574
  linter: {
575
575
  enabled: boolean;
576
576
  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" | "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">>;
@@ -596,38 +596,116 @@ declare const UnotestConfigSchema: z.ZodObject<{
596
596
  apiBaseUrl?: string | undefined;
597
597
  uploadDir?: string | undefined;
598
598
  };
599
- locale?: string | undefined;
600
- timezone?: string | undefined;
601
599
  baseUrl?: string | undefined;
602
600
  webServer?: {
603
- url: string;
604
- timeoutMs: number;
605
601
  command: string;
602
+ url: string;
606
603
  reuseExistingServer: boolean;
604
+ timeoutMs: number;
607
605
  } | undefined;
608
- channel?: "chrome" | "msedge" | "chrome-beta" | "chromium" | null | undefined;
606
+ channel?: "chromium" | "chrome" | "msedge" | "chrome-beta" | null | undefined;
609
607
  viewport?: {
610
608
  width?: number | undefined;
611
609
  height?: number | undefined;
612
610
  deviceScaleFactor?: number | undefined;
613
- } | undefined;
611
+ } | null | undefined;
614
612
  device?: string | undefined;
613
+ timezone?: string | undefined;
614
+ locale?: string | undefined;
615
615
  maxContexts?: number | undefined;
616
616
  launch?: {
617
- args?: string[] | undefined;
618
617
  userDataDir?: string | undefined;
618
+ args?: string[] | undefined;
619
619
  } | undefined;
620
620
  storageState?: string | undefined;
621
621
  teardownTimeoutMs?: number | undefined;
622
622
  }, {
623
+ env: {
624
+ shared?: string[] | undefined;
625
+ };
626
+ browsers: ("chromium" | "firefox" | "webkit")[];
627
+ retry: {
628
+ count: number;
629
+ on: ("transient" | "network" | "crash")[];
630
+ };
631
+ failureBundle: {
632
+ tier2: boolean;
633
+ tier3: {
634
+ network: boolean;
635
+ video: boolean;
636
+ };
637
+ retention: {
638
+ runs: number;
639
+ days: number;
640
+ };
641
+ storageDir: string;
642
+ pageHtml: "redacted" | "full";
643
+ tier1?: true | undefined;
644
+ };
645
+ dialogPolicy: "accept" | "dismiss" | "manual";
646
+ testDir: string;
647
+ helpersDir: string;
623
648
  defaultTimeoutMs: number;
624
649
  defaultNavigationTimeoutMs: number;
650
+ linter: {
651
+ enabled: boolean;
652
+ 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" | "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">>;
653
+ };
654
+ mcp: {
655
+ transport: "stdio";
656
+ };
657
+ queue: {
658
+ enabled?: boolean | undefined;
659
+ concurrency?: number | undefined;
660
+ };
661
+ sandbox: {
662
+ shellCwd?: string | undefined;
663
+ shellTimeoutMs?: number | undefined;
664
+ exportSecrets?: string[] | undefined;
665
+ database?: string | undefined;
666
+ apiBaseUrl?: string | undefined;
667
+ uploadDir?: string | undefined;
668
+ };
669
+ baseUrl?: string | undefined;
670
+ webServer?: {
671
+ command: string;
672
+ url: string;
673
+ reuseExistingServer?: boolean | undefined;
674
+ timeoutMs?: number | undefined;
675
+ } | undefined;
676
+ channel?: "chromium" | "chrome" | "msedge" | "chrome-beta" | "bundled" | null | undefined;
677
+ viewport?: {
678
+ width?: number | undefined;
679
+ height?: number | undefined;
680
+ deviceScaleFactor?: number | undefined;
681
+ } | null | undefined;
682
+ device?: string | undefined;
683
+ timezone?: string | undefined;
684
+ locale?: string | undefined;
685
+ maxContexts?: number | undefined;
686
+ launch?: {
687
+ userDataDir?: string | undefined;
688
+ args?: string[] | undefined;
689
+ } | undefined;
690
+ storageState?: string | undefined;
691
+ teardownTimeoutMs?: number | undefined;
692
+ schedules?: {
693
+ collection: string;
694
+ cron: string;
695
+ env?: string | undefined;
696
+ prepare?: string | undefined;
697
+ }[] | undefined;
698
+ }>, {
699
+ env: {
700
+ shared: string[];
701
+ };
625
702
  browsers: ("chromium" | "firefox" | "webkit")[];
626
703
  retry: {
627
704
  count: number;
628
- on: ("network" | "transient" | "crash")[];
705
+ on: ("transient" | "network" | "crash")[];
629
706
  };
630
707
  failureBundle: {
708
+ tier1: true;
631
709
  tier2: boolean;
632
710
  tier3: {
633
711
  network: boolean;
@@ -639,14 +717,88 @@ declare const UnotestConfigSchema: z.ZodObject<{
639
717
  };
640
718
  storageDir: string;
641
719
  pageHtml: "redacted" | "full";
642
- tier1?: true | undefined;
643
720
  };
644
721
  dialogPolicy: "accept" | "dismiss" | "manual";
645
722
  testDir: string;
646
723
  helpersDir: string;
724
+ defaultTimeoutMs: number;
725
+ defaultNavigationTimeoutMs: number;
726
+ linter: {
727
+ enabled: boolean;
728
+ 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" | "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">>;
729
+ };
730
+ mcp: {
731
+ transport: "stdio";
732
+ };
733
+ queue: {
734
+ enabled: boolean;
735
+ concurrency: number;
736
+ };
737
+ schedules: {
738
+ collection: string;
739
+ cron: string;
740
+ env?: string | undefined;
741
+ prepare?: string | undefined;
742
+ }[];
743
+ sandbox: {
744
+ shellCwd?: string | undefined;
745
+ shellTimeoutMs?: number | undefined;
746
+ exportSecrets?: string[] | undefined;
747
+ database?: string | undefined;
748
+ apiBaseUrl?: string | undefined;
749
+ uploadDir?: string | undefined;
750
+ };
751
+ baseUrl?: string | undefined;
752
+ webServer?: {
753
+ command: string;
754
+ url: string;
755
+ reuseExistingServer: boolean;
756
+ timeoutMs: number;
757
+ } | undefined;
758
+ channel?: "chromium" | "chrome" | "msedge" | "chrome-beta" | null | undefined;
759
+ viewport?: {
760
+ width?: number | undefined;
761
+ height?: number | undefined;
762
+ deviceScaleFactor?: number | undefined;
763
+ } | null | undefined;
764
+ device?: string | undefined;
765
+ timezone?: string | undefined;
766
+ locale?: string | undefined;
767
+ maxContexts?: number | undefined;
768
+ launch?: {
769
+ userDataDir?: string | undefined;
770
+ args?: string[] | undefined;
771
+ } | undefined;
772
+ storageState?: string | undefined;
773
+ teardownTimeoutMs?: number | undefined;
774
+ }, {
647
775
  env: {
648
776
  shared?: string[] | undefined;
649
777
  };
778
+ browsers: ("chromium" | "firefox" | "webkit")[];
779
+ retry: {
780
+ count: number;
781
+ on: ("transient" | "network" | "crash")[];
782
+ };
783
+ failureBundle: {
784
+ tier2: boolean;
785
+ tier3: {
786
+ network: boolean;
787
+ video: boolean;
788
+ };
789
+ retention: {
790
+ runs: number;
791
+ days: number;
792
+ };
793
+ storageDir: string;
794
+ pageHtml: "redacted" | "full";
795
+ tier1?: true | undefined;
796
+ };
797
+ dialogPolicy: "accept" | "dismiss" | "manual";
798
+ testDir: string;
799
+ helpersDir: string;
800
+ defaultTimeoutMs: number;
801
+ defaultNavigationTimeoutMs: number;
650
802
  linter: {
651
803
  enabled: boolean;
652
804
  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" | "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">>;
@@ -666,26 +818,26 @@ declare const UnotestConfigSchema: z.ZodObject<{
666
818
  apiBaseUrl?: string | undefined;
667
819
  uploadDir?: string | undefined;
668
820
  };
669
- locale?: string | undefined;
670
- timezone?: string | undefined;
671
821
  baseUrl?: string | undefined;
672
822
  webServer?: {
673
- url: string;
674
823
  command: string;
675
- timeoutMs?: number | undefined;
824
+ url: string;
676
825
  reuseExistingServer?: boolean | undefined;
826
+ timeoutMs?: number | undefined;
677
827
  } | undefined;
678
- channel?: "chrome" | "msedge" | "chrome-beta" | "chromium" | "bundled" | null | undefined;
828
+ channel?: "chromium" | "chrome" | "msedge" | "chrome-beta" | "bundled" | null | undefined;
679
829
  viewport?: {
680
830
  width?: number | undefined;
681
831
  height?: number | undefined;
682
832
  deviceScaleFactor?: number | undefined;
683
- } | undefined;
833
+ } | null | undefined;
684
834
  device?: string | undefined;
835
+ timezone?: string | undefined;
836
+ locale?: string | undefined;
685
837
  maxContexts?: number | undefined;
686
838
  launch?: {
687
- args?: string[] | undefined;
688
839
  userDataDir?: string | undefined;
840
+ args?: string[] | undefined;
689
841
  } | undefined;
690
842
  storageState?: string | undefined;
691
843
  teardownTimeoutMs?: number | undefined;
@@ -1 +1 @@
1
- var _0x32c00a=_0x43f6;function _0x4910(){var _0x3628ac=['D2fYBG','B3b0Aw9UywW','ntmYmJzKsxrmAeW','lNvUB3rLC3qVzMfPBhvYzxm','DMfSAwrHDg9YoNn0zxaTC2HHCgu','A2v5CW','CMvKywn0zwq','mtGYBvrcrMjS','zw4Tvvm','AxnuAw1LwM9Uzq','zMLYzwzVEa','DhjHBNnPzw50','DMfSAwrHDg9YoNn0zxaTy292zxjHz2u','C3rKAw8','y29Kzq','BgLUDdPLy2HVlwfZC2vYDa','y2HYB21LlwjLDge','BgLUDdPSzwDHy3KTBgf5B3v0','Dw5VDgvZDc9LmMuVx2HLBhbLCNm','z2v0q2fUB25Py2fStg9JywXLCW','BgLUDdP4Cgf0Aa','DxjS','AM9PBG','mta4mJG2ntz3rhvdB2C','BgLUDdPSAw50lw9Rlw1PC3nPBMCTCMvHC29U','DMfSAwrHDg9YoMz1BMn0Aw9UlxnOyxbL','BMfTzq','y3jHC2G','y2XVC2vZDeTLEq','Bwf4','Dw5RBM93BKTLEu1LC3nHz2u','Dg9mB3DLCKnHC2u','BgL0zxjHBa','yxjYyxK','iIdIGjqGzgLKihLVDsbTzwfUici','DMfSAwrHDg9YoNnLBwfUDgLJlwXVC3m','BgLUDdPNB3rVlwnVBMnHDa','Aw50','mJC4mdCYtKPxAxHi','CMvMAw5L','D2vIA2L0','zgLZBwLZCW','BgLUDdPKAxnHBwjPzY1IEs1PBMrLEa','DMfSAwrHDg9YoMfYAxr5','y2HYB21PDw0','B2zM','BgLUDdPWyxvZzs1LEhbSAwnPDa','DMfSAwrHDg9YoMfYzY1RAw5K','Dw5RBM93BIb0Aw1LihPVBMuGiG','BgLUDdPKzwvWlwnZCW','Aw52ywXPzcbSB2nHBguGiG','C3rYAw5N','mJaXmJCZndb0DM9KvhG','DMfSAwrHDg9YoNzHCI1ZAgfWzq','BgLUDdPMBg93lxjLDhvYBNmTDMfSDwu','iIdIGjqGBM90igeGy29UzMLNigTLEtSGy2HLy2SGEw91CIbaDw5VDgvZDc93zwiGDMvYC2LVBIbPzIbPDcbJB21LCYbMCM9TigeGBMv3zxiGCMvSzwfZzq','B2jQzwn0','BwfUDwfS','BgLUDdPLDMfSDwf0zs1KAxnJB3vYywDLza','ntD1zfHYzNu','C3rYAwn0','BgLUDdPTDxn0ywnOzs1PBI1KC2W','Dw5YzwnVz25PEMvKx2TLExm','yM9VBgvHBG','zNvSBa','zw51Bq','zxjYB3i','mJC2otuZnwDprwfbyq','Dw5RBM93BIbRzxKGiG','mZiWmtu2mufPvLbcEG','BgLUDdPZAgfKB3DZlwrZBc1MDw5JDgLVBG','y2HYB21L','BwLU','mJK4m3jgq25fva','zgvMyxvSDa','BNvTyMvY','iIdIGjqGzxHWzwn0zwqGysbcq1aGndCGDgfNihn1y2GGyxmGiMvZluvtiG','Dw5VDgvZDc9LmMu','rgf0zvrPBwvgB3jTyxq','zgvMyxvSDevYCM9Y','BMv0D29YAW','DMfSAwrHDg9YoNvUC3vWCg9YDgvKlxn0yxrLBwvUDa','Cg9ZAxrPDMu','BgLUDdPHCgKTy2fSBc1MAwXLlwjVzhK','DMfSAwrHDg9YoM1LDgeTC2HHCgu','BgvUz3rO','DMfSAwrHDg9YoNn0CMLUzY1JB25Jyxq','DMfSAwrHDg9YoMzVCI1ZAgfWzq','zxjYB3jnyxa','ywnJzxb0','Dw5PB24','BNvSBa','DhjHBNnMB3jT','ntG4u2P4DMTg','wM9KsxnZDwvdB2rL','BwfW'];_0x4910=function(){return _0x3628ac;};return _0x4910();}(function(_0x300d7d,_0x67953b){var _0x4f4178={_0x1514f2:0x1b9,_0x351651:0x1ab,_0x2981fe:0x1f6,_0x28160a:0x1b3,_0x3fc955:0x1d2,_0x4a19a2:0x1cd,_0x4096cb:0x1b5,_0x5d026d:0x1a4},_0xcd2be5=_0x43f6,_0x314730=_0x300d7d();while(!![]){try{var _0x542432=-parseInt(_0xcd2be5(_0x4f4178._0x1514f2))/0x1*(parseInt(_0xcd2be5(0x1d7))/0x2)+parseInt(_0xcd2be5(_0x4f4178._0x351651))/0x3*(-parseInt(_0xcd2be5(_0x4f4178._0x2981fe))/0x4)+parseInt(_0xcd2be5(_0x4f4178._0x28160a))/0x5+-parseInt(_0xcd2be5(_0x4f4178._0x3fc955))/0x6*(-parseInt(_0xcd2be5(_0x4f4178._0x4a19a2))/0x7)+-parseInt(_0xcd2be5(0x1e7))/0x8+parseInt(_0xcd2be5(_0x4f4178._0x4096cb))/0x9+parseInt(_0xcd2be5(_0x4f4178._0x5d026d))/0xa;if(_0x542432===_0x67953b)break;else _0x314730['push'](_0x314730['shift']());}catch(_0x554763){_0x314730['push'](_0x314730['shift']());}}}(_0x4910,0xb02f9));var __defProp=Object['defineProperty'],__name=(_0x3c45ba,_0x136f19)=>__defProp(_0x3c45ba,_0x32c00a(0x1ea),{'value':_0x136f19,'configurable':!![]});import{z as _0x33899a}from'zod';import{z}from'zod';import{levenshteinDistance}from'@unotest/core';function _0x43f6(_0x86bb5c,_0x53fb5c){_0x86bb5c=_0x86bb5c-0x19b;var _0x49106b=_0x4910();var _0x43f672=_0x49106b[_0x86bb5c];if(_0x43f6['xFzhzD']===undefined){var _0x14bca3=function(_0x220514){var _0x56dd52='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';var _0x33899a='',_0x48ce05='';for(var _0x3c45ba=0x0,_0x136f19,_0x24c1a6,_0x2b042b=0x0;_0x24c1a6=_0x220514['charAt'](_0x2b042b++);~_0x24c1a6&&(_0x136f19=_0x3c45ba%0x4?_0x136f19*0x40+_0x24c1a6:_0x24c1a6,_0x3c45ba++%0x4)?_0x33899a+=String['fromCharCode'](0xff&_0x136f19>>(-0x2*_0x3c45ba&0x6)):0x0){_0x24c1a6=_0x56dd52['indexOf'](_0x24c1a6);}for(var _0x363e62=0x0,_0x3689bc=_0x33899a['length'];_0x363e62<_0x3689bc;_0x363e62++){_0x48ce05+='%'+('00'+_0x33899a['charCodeAt'](_0x363e62)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x48ce05);};_0x43f6['blRxvG']=_0x14bca3,_0x43f6['vvICZV']={},_0x43f6['xFzhzD']=!![];}var _0x3e06bb=_0x49106b[0x0],_0xa097c4=_0x86bb5c+_0x3e06bb,_0xfe4b8e=_0x43f6['vvICZV'][_0xa097c4];return!_0xfe4b8e?(_0x43f672=_0x43f6['blRxvG'](_0x43f672),_0x43f6['vvICZV'][_0xa097c4]=_0x43f672):_0x43f672=_0xfe4b8e,_0x43f672;}var MAX_EDITS=0x2;function closestKey(_0x24c1a6,_0x2b042b){var _0x41d52c=_0x32c00a;let _0x363e62;for(const _0x3689bc of _0x2b042b){const _0x2a902d=levenshteinDistance(_0x24c1a6['toLowerCase'](),_0x3689bc[_0x41d52c(0x1ef)]());if(_0x2a902d>MAX_EDITS)continue;if(_0x363e62===void 0x0||_0x2a902d<_0x363e62['distance'])_0x363e62={'key':_0x3689bc,'distance':_0x2a902d};}return _0x363e62?.['key'];}__name(closestKey,_0x32c00a(0x1ec));function unknownKeyMessage(_0x255510,_0x3a4104){var _0x2c838a={_0x1273a1:0x1cf,_0x1daa18:0x1e6},_0x643b54={_0x144c96:0x1f2},_0xdbd611=_0x32c00a;return _0x255510[_0xdbd611(_0x2c838a._0x1273a1)](_0x9b8d36=>{var _0x519a3f=_0xdbd611;const _0x303ceb=closestKey(_0x9b8d36,_0x3a4104);return _0x303ceb===void 0x0?_0x519a3f(0x1b4)+_0x9b8d36+_0x519a3f(0x1a7):_0x519a3f(0x1b4)+_0x9b8d36+_0x519a3f(_0x643b54._0x144c96)+_0x303ceb+'\x22?';})[_0xdbd611(_0x2c838a._0x1daa18)](';\x20');}__name(unknownKeyMessage,_0x32c00a(0x1ee));function strictObject(_0x9473b0){var _0x341213={_0x5d286b:0x1ac},_0x3f9421=_0x32c00a;const _0x42a9b6=Object[_0x3f9421(0x1d5)](_0x9473b0);return z[_0x3f9421(0x1a8)](_0x9473b0,{'errorMap':__name((_0xc35d31,_0x4b1314)=>_0xc35d31[_0x3f9421(0x1de)]===z[_0x3f9421(0x1ce)][_0x3f9421(0x1ae)]?{'message':unknownKeyMessage(_0xc35d31[_0x3f9421(0x1d5)],_0x42a9b6)}:{'message':_0x4b1314[_0x3f9421(0x1bf)]},_0x3f9421(0x1c8))})[_0x3f9421(_0x341213._0x5d286b)]();}__name(strictObject,'strictObject');import{BUNDLED_BROWSER_CHANNEL}from'@unotest/protocol';import{z as _0x48ce05}from'zod';import{UnotestError}from'@unotest/core';var LaunchConfigSchema=_0x48ce05[_0x32c00a(0x1a8)]({'userDataDir':_0x48ce05[_0x32c00a(0x1a3)]()[_0x32c00a(0x1b8)](0x1)[_0x32c00a(0x1d1)](),'args':_0x48ce05[_0x32c00a(0x1f1)](_0x48ce05[_0x32c00a(0x1a3)]()[_0x32c00a(0x1b8)](0x1))['optional']()})[_0x32c00a(0x1ac)](),BrowserSchema=_0x33899a[_0x32c00a(0x1b1)](['chromium',_0x32c00a(0x1da),_0x32c00a(0x1f8)]),SYSTEM_BROWSER_CHANNELS=[_0x32c00a(0x1b7),'msedge',_0x32c00a(0x1e0),_0x32c00a(0x19c)],BROWSER_CHANNEL_WORDS=[...SYSTEM_BROWSER_CHANNELS,BUNDLED_BROWSER_CHANNEL],BrowserChannelSchema=_0x33899a[_0x32c00a(0x1ca)]([_0x33899a[_0x32c00a(0x1b1)](SYSTEM_BROWSER_CHANNELS),_0x33899a[_0x32c00a(0x1f0)](BUNDLED_BROWSER_CHANNEL)[_0x32c00a(0x1cc)](()=>null),_0x33899a[_0x32c00a(0x1cb)]()])[_0x32c00a(0x1d1)](),ViewportSchema=strictObject({'width':_0x33899a[_0x32c00a(0x1bb)]()[_0x32c00a(0x1f5)]()[_0x32c00a(0x1c2)]()[_0x32c00a(0x1d1)](),'height':_0x33899a[_0x32c00a(0x1bb)]()[_0x32c00a(0x1f5)]()[_0x32c00a(0x1c2)]()[_0x32c00a(0x1d1)](),'deviceScaleFactor':_0x33899a[_0x32c00a(0x1bb)]()[_0x32c00a(0x1c2)]()[_0x32c00a(0x1d1)]()}),RetryReasonSchema=_0x33899a[_0x32c00a(0x1b1)]([_0x32c00a(0x1db),_0x32c00a(0x1c0),_0x32c00a(0x1eb)]),RetryConfigSchema=strictObject({'count':_0x33899a[_0x32c00a(0x1bb)]()['int']()[_0x32c00a(0x1b8)](0x0)[_0x32c00a(0x1ed)](0xa),'on':_0x33899a[_0x32c00a(0x1f1)](RetryReasonSchema)}),FailureBundleConfigSchema=strictObject({'tier1':_0x33899a[_0x32c00a(0x1f0)](!![])['default'](!![]),'tier2':_0x33899a['boolean'](),'tier3':strictObject({'network':_0x33899a[_0x32c00a(0x1af)](),'video':_0x33899a[_0x32c00a(0x1af)]()}),'retention':strictObject({'runs':_0x33899a['number']()[_0x32c00a(0x1f5)]()[_0x32c00a(0x1c2)](),'days':_0x33899a[_0x32c00a(0x1bb)]()[_0x32c00a(0x1f5)]()['positive']()}),'storageDir':_0x33899a[_0x32c00a(0x1a3)]()[_0x32c00a(0x1b8)](0x1),'pageHtml':_0x33899a[_0x32c00a(0x1b1)]([_0x32c00a(0x1d6),_0x32c00a(0x1b0)])}),DialogPolicySchema=_0x33899a[_0x32c00a(0x1b1)]([_0x32c00a(0x1c9),_0x32c00a(0x1f9),_0x32c00a(0x1a9)]),LinterRuleIdSchema=_0x33899a[_0x32c00a(0x1b1)]([_0x32c00a(0x1a1),_0x32c00a(0x1e4),'lint:obfuscated-class',_0x32c00a(0x19e),_0x32c00a(0x1fa),_0x32c00a(0x1aa),'lint:scenario-in-root',_0x32c00a(0x1ad),_0x32c00a(0x1f4),'lint:regex-invalid',_0x32c00a(0x1df),_0x32c00a(0x1c3),_0x32c00a(0x1e8),_0x32c00a(0x1a6),_0x32c00a(0x1e1),'lint:external-variable-undeclared','lint:env-host-from-base','lint:one-test-per-file',_0x32c00a(0x1b6),'validator:unknown-function',_0x32c00a(0x19b),_0x32c00a(0x19f),_0x32c00a(0x1dc),_0x32c00a(0x1d4),_0x32c00a(0x1c4),_0x32c00a(0x1e9),_0x32c00a(0x1c7),'validator:if-shape',_0x32c00a(0x1a5),_0x32c00a(0x1c1),'validator:unsupported-expression',_0x32c00a(0x1c6),_0x32c00a(0x1f3),'validator:list-arg','validator:wrapped-format']),LinterSeveritySchema=_0x33899a[_0x32c00a(0x1b1)](['off',_0x32c00a(0x1d0),_0x32c00a(0x1b2)]),LinterConfigSchema=strictObject({'enabled':_0x33899a[_0x32c00a(0x1af)](),'rules':_0x33899a['record'](LinterRuleIdSchema,LinterSeveritySchema)}),QueueConfigSchema=strictObject({'enabled':_0x33899a[_0x32c00a(0x1af)]()['default'](!![]),'concurrency':_0x33899a['number']()[_0x32c00a(0x1f5)]()[_0x32c00a(0x1c2)]()[_0x32c00a(0x1ba)](0x1)}),ScheduleSchema=strictObject({'collection':_0x33899a['string']()[_0x32c00a(0x1b8)](0x1),'cron':_0x33899a[_0x32c00a(0x1a3)]()[_0x32c00a(0x1b8)](0x1),'env':_0x33899a[_0x32c00a(0x1a3)]()['min'](0x1)['optional'](),'prepare':_0x33899a[_0x32c00a(0x1a3)]()[_0x32c00a(0x1b8)](0x1)['optional']()}),McpConfigSchema=strictObject({'transport':_0x33899a['literal'](_0x32c00a(0x1dd))}),SandboxConfigSchema=strictObject({'shellCwd':_0x33899a['string']()['optional'](),'shellTimeoutMs':_0x33899a['number']()[_0x32c00a(0x1f5)]()[_0x32c00a(0x1c2)]()[_0x32c00a(0x1d1)](),'exportSecrets':_0x33899a[_0x32c00a(0x1f1)](_0x33899a['string']())['optional'](),'database':_0x33899a[_0x32c00a(0x1a3)]()[_0x32c00a(0x1d1)](),'apiBaseUrl':_0x33899a[_0x32c00a(0x1a3)]()['url']()[_0x32c00a(0x1d1)](),'uploadDir':_0x33899a[_0x32c00a(0x1a3)]()[_0x32c00a(0x1d1)]()}),WebServerConfigSchema=strictObject({'command':_0x33899a[_0x32c00a(0x1a3)]()[_0x32c00a(0x1b8)](0x1),'url':_0x33899a['string']()[_0x32c00a(0x1e5)](),'reuseExistingServer':_0x33899a[_0x32c00a(0x1af)]()[_0x32c00a(0x1ba)](!![]),'timeoutMs':_0x33899a[_0x32c00a(0x1bb)]()[_0x32c00a(0x1f5)]()[_0x32c00a(0x1c2)]()['default'](0xea60)}),EnvConfigSchema=strictObject({'shared':_0x33899a[_0x32c00a(0x1f1)](_0x33899a[_0x32c00a(0x1a3)]())[_0x32c00a(0x1ba)]([])}),UnotestConfigSchema=strictObject({'baseUrl':_0x33899a[_0x32c00a(0x1a3)]()[_0x32c00a(0x1e5)]()['optional'](),'webServer':WebServerConfigSchema[_0x32c00a(0x1d1)](),'browsers':_0x33899a[_0x32c00a(0x1f1)](BrowserSchema)['min'](0x1),'channel':BrowserChannelSchema,'viewport':ViewportSchema[_0x32c00a(0x1d1)](),'device':_0x33899a[_0x32c00a(0x1a3)]()[_0x32c00a(0x1b8)](0x1)[_0x32c00a(0x1d1)](),'timezone':_0x33899a[_0x32c00a(0x1a3)]()[_0x32c00a(0x1f7)](isTimeZone,_0x3f0f7c=>({'message':_0x32c00a(0x1a0)+_0x3f0f7c+'\x22\x20—\x20expected\x20an\x20IANA\x20name\x20such\x20as\x20\x22Europe/Madrid\x22'}))[_0x32c00a(0x1d1)](),'locale':_0x33899a[_0x32c00a(0x1a3)]()['refine'](isLocale,_0xc58387=>({'message':_0x32c00a(0x1a2)+_0xc58387+_0x32c00a(0x1bc)}))[_0x32c00a(0x1d1)](),'maxContexts':_0x33899a[_0x32c00a(0x1bb)]()[_0x32c00a(0x1f5)]()['positive']()[_0x32c00a(0x1d1)](),'launch':LaunchConfigSchema['optional'](),'retry':RetryConfigSchema,'failureBundle':FailureBundleConfigSchema,'dialogPolicy':DialogPolicySchema,'storageState':_0x33899a[_0x32c00a(0x1a3)]()[_0x32c00a(0x1d1)](),'testDir':_0x33899a[_0x32c00a(0x1a3)]()['min'](0x1),'helpersDir':_0x33899a[_0x32c00a(0x1a3)]()[_0x32c00a(0x1b8)](0x1),'defaultTimeoutMs':_0x33899a[_0x32c00a(0x1bb)]()[_0x32c00a(0x1f5)]()[_0x32c00a(0x1c2)](),'defaultNavigationTimeoutMs':_0x33899a[_0x32c00a(0x1bb)]()[_0x32c00a(0x1f5)]()[_0x32c00a(0x1c2)](),'teardownTimeoutMs':_0x33899a[_0x32c00a(0x1bb)]()[_0x32c00a(0x1f5)]()['positive']()['optional'](),'env':EnvConfigSchema,'linter':LinterConfigSchema,'mcp':McpConfigSchema,'queue':QueueConfigSchema,'schedules':_0x33899a['array'](ScheduleSchema)['default']([]),'sandbox':SandboxConfigSchema});function isTimeZone(_0x176131){var _0x13ca01={_0x4ecf53:0x1c5},_0x85de29=_0x32c00a;try{return new Intl[(_0x85de29(0x1be))](_0x85de29(0x1d8),{'timeZone':_0x176131}),_0x176131[_0x85de29(_0x13ca01._0x4ecf53)]>0x0;}catch{return![];}}__name(isTimeZone,_0x32c00a(0x1d9));function isLocale(_0x57657b){var _0x2f153c=_0x32c00a;try{return Intl[_0x2f153c(0x1e3)](_0x57657b)[_0x2f153c(0x1c5)]===0x1;}catch{return![];}}__name(isLocale,'isLocale');var DEFAULT_CONFIG={'browsers':[_0x32c00a(0x19c)],'retry':{'count':0x0,'on':['transient']},'failureBundle':{'tier1':!![],'tier2':!![],'tier3':{'network':![],'video':![]},'retention':{'runs':0x14,'days':0x7},'storageDir':_0x32c00a(0x1d3),'pageHtml':'redacted'},'dialogPolicy':_0x32c00a(0x1c9),'testDir':_0x32c00a(0x1bd),'helpersDir':_0x32c00a(0x1e2),'defaultTimeoutMs':0xbb8,'defaultNavigationTimeoutMs':0x7530,'linter':{'enabled':!![],'rules':{'lint:deep-css':'warn','lint:xpath':_0x32c00a(0x1d0),'lint:obfuscated-class':_0x32c00a(0x1d0),'lint:pause-explicit':_0x32c00a(0x1d0),'lint:disambig-by-index':_0x32c00a(0x19d),'lint:evaluate-discouraged':'warn','lint:scenario-in-root':_0x32c00a(0x1b2),'lint:mustache-in-dsl':_0x32c00a(0x1b2),'lint:goto-concat':'warn','lint:regex-invalid':_0x32c00a(0x1b2),'lint:echo-assert':_0x32c00a(0x1d0),'lint:lint-ok-missing-reason':_0x32c00a(0x1d0),'lint:flow-returns-value':'warn','lint:legacy-layout':_0x32c00a(0x1d0),'lint:external-variable-undeclared':_0x32c00a(0x1b2),'lint:env-host-from-base':_0x32c00a(0x1b2),'lint:one-test-per-file':_0x32c00a(0x1d0),'lint:shadows-dsl-function':_0x32c00a(0x1d0),'validator:unknown-function':'error'}},'env':{'shared':[]},'mcp':{'transport':_0x32c00a(0x1dd)},'queue':{'enabled':!![],'concurrency':0x1},'schedules':[],'sandbox':{}};export{BROWSER_CHANNEL_WORDS,BrowserChannelSchema,BrowserSchema,DEFAULT_CONFIG,DialogPolicySchema,EnvConfigSchema,FailureBundleConfigSchema,LinterConfigSchema,LinterRuleIdSchema,LinterSeveritySchema,McpConfigSchema,QueueConfigSchema,RetryConfigSchema,RetryReasonSchema,SYSTEM_BROWSER_CHANNELS,SandboxConfigSchema,ScheduleSchema,UnotestConfigSchema,ViewportSchema,WebServerConfigSchema};
1
+ var _0x12781d=_0x4bc7;(function(_0xdbd49f,_0x278b24){var _0x3774ee={_0x5c849a:0x1f0,_0x5c6364:0x1da,_0x54e50f:0x1f5,_0x540327:0x1d7,_0x283de6:0x1ef},_0x3fa77f=_0x4bc7,_0x500eb9=_0xdbd49f();while(!![]){try{var _0x521e04=parseInt(_0x3fa77f(_0x3774ee._0x5c849a))/0x1*(parseInt(_0x3fa77f(0x204))/0x2)+-parseInt(_0x3fa77f(0x1dd))/0x3+parseInt(_0x3fa77f(0x205))/0x4*(parseInt(_0x3fa77f(0x207))/0x5)+-parseInt(_0x3fa77f(0x221))/0x6*(parseInt(_0x3fa77f(_0x3774ee._0x5c6364))/0x7)+parseInt(_0x3fa77f(_0x3774ee._0x54e50f))/0x8*(-parseInt(_0x3fa77f(_0x3774ee._0x540327))/0x9)+parseInt(_0x3fa77f(0x1f9))/0xa+parseInt(_0x3fa77f(_0x3774ee._0x283de6))/0xb;if(_0x521e04===_0x278b24)break;else _0x500eb9['push'](_0x500eb9['shift']());}catch(_0x1f774b){_0x500eb9['push'](_0x500eb9['shift']());}}}(_0x5cef,0x2569c));var __defProp=Object[_0x12781d(0x216)],__name=(_0x22b034,_0x541f24)=>__defProp(_0x22b034,_0x12781d(0x20a),{'value':_0x541f24,'configurable':!![]});import{z as _0x3f8e0e}from'zod';import{z}from'zod';import{levenshteinDistance}from'@unotest/core';var MAX_EDITS=0x2;function closestKey(_0x1b5ff1,_0x432b5c){var _0x23fcc6={_0x5b13ba:0x1dc},_0x1261c3=_0x12781d;let _0xacd35;for(const _0x38f171 of _0x432b5c){const _0x267873=levenshteinDistance(_0x1b5ff1[_0x1261c3(_0x23fcc6._0x5b13ba)](),_0x38f171[_0x1261c3(0x1dc)]());if(_0x267873>MAX_EDITS)continue;if(_0xacd35===void 0x0||_0x267873<_0xacd35['distance'])_0xacd35={'key':_0x38f171,'distance':_0x267873};}return _0xacd35?.['key'];}function _0x5cef(){var _0x49220b=['DMfSAwrHDg9YoNvUC3vWCg9YDgvKlwv4ChjLC3nPB24','BwLU','ywnJzxb0','DMfSAwrHDg9YoMfYAxr5','BgLUDdPLBNyTAg9ZDc1MCM9TlwjHC2u','ndGWnZK0nMjyyvrNqG','nePfAwftra','iIdIGjqGzgLKihLVDsbTzwfUici','DMfSAwrHDg9YoMzVCI1ZAgfWzq','BgLUDdPVyMz1C2nHDgvKlwnSyxnZ','BgLUDdPKzwvWlwnZCW','mteZmJCYmfnWzNL0va','B2zM','CMvKywn0zwq','Dw5RBM93BKTLEu1LC3nHz2u','mJa5oduWuxL6sgz0','BNvTyMvY','D2fYBG','BgvUz3rO','rgf0zvrPBwvgB3jTyxq','DMfSAwrHDg9YoNzHCI1ZAgfWzq','lNvUB3rLC3qVzMfPBhvYzxm','BNvSBa','y2HYB21PDw0','CMvJB3jK','zw4Tvvm','nJq5ntrQzffeBvO','mtuWnJHLwu5tC3G','Dw5VDgvZDc9LmMu','mtq1D1nbvhDd','DMfSAwrHDg9YoNn0zxaTy292zxjHz2u','DhjHBNnPzw50','BMfTzq','DMfSAwrHDg9YoNnLBwfUDgLJlwXVC3m','BgLUDdPLEhrLCM5HBc12yxjPywjSzs11BMrLy2XHCMvK','DMfSAwrHDg9YoNDYyxbWzwqTzM9YBwf0','BgLUDdPMBg93lxjLDhvYBNmTDMfSDwu','DMfSAwrHDg9YoNn0zxaTC2HHCgu','zgLZBwLZCW','BgLUDdPYzwDLEc1PBNzHBgLK','BgLUDdPSAw50lw9Rlw1PC3nPBMCTCMvHC29U','BgLUDdPHCgKTy2fSBc1MAwXLlwjVzhK','BgLUDdP4Cgf0Aa','yM9VBgvHBG','zgvMAw5LuhjVCgvYDhK','C3rYAwn0t2jQzwn0','Dw5VDgvZDc9LmMuVx2HLBhbLCNm','y2XVC2vZDeTLEq','iIdIGjqGzxHWzwn0zwqGyw4GsufoqsbUyw1Lihn1y2GGyxmGiKv1CM9Wzs9nywrYAwqI','Aw50','AM9PBG','DxjS','zgvMyxvSDa','AxnuAw1LwM9Uzq','C3rKAw8','nMTLyK9YEq','BgLUDdPWyxvZzs1LEhbSAwnPDa','B3b0Aw9UywW','y3vZDg9T','B2jQzwn0','yxjYyxK','CMvMAw5L','ywrKsxnZDwu','DMfSAwrHDg9YoMz1BMn0Aw9UlxnOyxbL','A2v5CW','zxjYB3i','zgvMyxvSDevYCM9Y','DMfSAwrHDg9YoNn0CMLUzY1JB25Jyxq','zgv2AwnL','BxnLzgDL','Dw5RBM93BIbRzxKGiG','BgLUDdPVBMuTDgvZDc1WzxiTzMLSzq','DMLLD3bVCNq','zw51Bq','BgLUDdPSzwDHy3KTBgf5B3v0','y29Kzq','BgLUDdPZAgfKB3DZlwrZBc1MDw5JDgLVBG','oxjfsvHdvW','BgLUDdPKAxnHBwjPzY1IEs1PBMrLEa','DMfSAwrHDg9YoNvUC3vWCg9YDgvKlxn0yxrLBwvUDa','mtCWnZK3oxDmww5dAq','Bwf4','Dg9mB3DLCKnHC2u','ndC1mtCZy2jXALrY','DMLLD3bVCNq6ig51BgWGA2vLChmGDgHLihjLywWGyNjVD3nLCIb3Aw5KB3CSigfUzcbKzxzPy2uGiG','BgLUDdPTDxn0ywnOzs1PBI1KC2W','BgLUDdPZy2vUyxjPBY1PBI1YB290','wM9KsxnZDwvdB2rL','C3rYAw5N','BwfUDwfS','y2HYB21L','BgL0zxjHBa','BwfW','Cg9ZAxrPDMu','y2HYB21LlwjLDge','Dw5YzwnVz25PEMvKx2TLExm'];_0x5cef=function(){return _0x49220b;};return _0x5cef();}__name(closestKey,_0x12781d(0x219));function unknownKeyMessage(_0x2d0d75,_0x3618de){var _0x12d474={_0x5baa6a:0x21c},_0x7bd79f={_0x369b7f:0x1d0,_0x1d0233:0x1f1},_0x100a71=_0x12781d;return _0x2d0d75[_0x100a71(0x1e6)](_0x545dad=>{var _0x363ebe=_0x100a71;const _0x39b1f9=closestKey(_0x545dad,_0x3618de);return _0x39b1f9===void 0x0?_0x363ebe(_0x7bd79f._0x369b7f)+_0x545dad+'\x22\x20—\x20not\x20a\x20config\x20key;\x20check\x20your\x20@unotest/web\x20version\x20if\x20it\x20comes\x20from\x20a\x20newer\x20release':_0x363ebe(_0x7bd79f._0x369b7f)+_0x545dad+_0x363ebe(_0x7bd79f._0x1d0233)+_0x39b1f9+'\x22?';})[_0x100a71(_0x12d474._0x5baa6a)](';\x20');}__name(unknownKeyMessage,_0x12781d(0x1f8));function strictObject(_0x5d9e02){var _0x274583=_0x12781d;const _0x40a6cf=Object['keys'](_0x5d9e02);return z[_0x274583(0x225)](_0x5d9e02,{'errorMap':__name((_0x51ebbb,_0x292145)=>_0x51ebbb[_0x274583(0x1d5)]===z['ZodIssueCode'][_0x274583(0x1e9)]?{'message':unknownKeyMessage(_0x51ebbb[_0x274583(0x22a)],_0x40a6cf)}:{'message':_0x292145[_0x274583(0x1cc)]},'errorMap')})['strict']();}__name(strictObject,_0x12781d(0x217));import{BUNDLED_BROWSER_CHANNEL}from'@unotest/protocol';import{z as _0x48b82e}from'zod';import{UnotestError}from'@unotest/core';var LaunchConfigSchema=_0x48b82e['object']({'userDataDir':_0x48b82e[_0x12781d(0x1e2)]()[_0x12781d(0x1eb)](0x1)[_0x12781d(0x223)](),'args':_0x48b82e[_0x12781d(0x226)](_0x48b82e[_0x12781d(0x1e2)]()[_0x12781d(0x1eb)](0x1))[_0x12781d(0x223)]()})['strict'](),BrowserSchema=_0x3f8e0e[_0x12781d(0x1d3)]([_0x12781d(0x201),'firefox','webkit']),SYSTEM_BROWSER_CHANNELS=[_0x12781d(0x1e4),_0x12781d(0x1cf),_0x12781d(0x1e8),_0x12781d(0x201)],BROWSER_CHANNEL_WORDS=[...SYSTEM_BROWSER_CHANNELS,BUNDLED_BROWSER_CHANNEL],BrowserChannelSchema=_0x3f8e0e['union']([_0x3f8e0e['enum'](SYSTEM_BROWSER_CHANNELS),_0x3f8e0e[_0x12781d(0x1e5)](BUNDLED_BROWSER_CHANNEL)['transform'](()=>null),_0x3f8e0e[_0x12781d(0x200)]()])['optional'](),ViewportSchema=strictObject({'width':_0x3f8e0e[_0x12781d(0x1fa)]()[_0x12781d(0x21b)]()[_0x12781d(0x1e7)]()[_0x12781d(0x223)](),'height':_0x3f8e0e[_0x12781d(0x1fa)]()[_0x12781d(0x21b)]()[_0x12781d(0x1e7)]()[_0x12781d(0x223)](),'deviceScaleFactor':_0x3f8e0e[_0x12781d(0x1fa)]()[_0x12781d(0x1e7)]()[_0x12781d(0x223)]()}),ConfigViewportSchema=ViewportSchema['nullable'](),RetryReasonSchema=_0x3f8e0e[_0x12781d(0x1d3)]([_0x12781d(0x209),'network','crash']),RetryConfigSchema=strictObject({'count':_0x3f8e0e['number']()[_0x12781d(0x21b)]()[_0x12781d(0x1eb)](0x0)[_0x12781d(0x1db)](0xa),'on':_0x3f8e0e[_0x12781d(0x226)](RetryReasonSchema)}),FailureBundleConfigSchema=strictObject({'tier1':_0x3f8e0e['literal'](!![])[_0x12781d(0x21e)](!![]),'tier2':_0x3f8e0e[_0x12781d(0x215)](),'tier3':strictObject({'network':_0x3f8e0e[_0x12781d(0x215)](),'video':_0x3f8e0e[_0x12781d(0x215)]()}),'retention':strictObject({'runs':_0x3f8e0e['number']()[_0x12781d(0x21b)]()['positive'](),'days':_0x3f8e0e[_0x12781d(0x1fa)]()['int']()[_0x12781d(0x1e7)]()}),'storageDir':_0x3f8e0e[_0x12781d(0x1e2)]()['min'](0x1),'pageHtml':_0x3f8e0e['enum'](['redacted','full'])}),DialogPolicySchema=_0x3f8e0e[_0x12781d(0x1d3)]([_0x12781d(0x1ec),_0x12781d(0x210),_0x12781d(0x1e3)]),LinterRuleIdSchema=_0x3f8e0e['enum']([_0x12781d(0x1f4),_0x12781d(0x214),_0x12781d(0x1f3),_0x12781d(0x222),_0x12781d(0x1d8),'lint:evaluate-discouraged',_0x12781d(0x1e0),_0x12781d(0x1df),'lint:goto-concat',_0x12781d(0x211),'lint:echo-assert',_0x12781d(0x213),_0x12781d(0x212),_0x12781d(0x20e),_0x12781d(0x1d4),_0x12781d(0x20c),_0x12781d(0x1ee),_0x12781d(0x1d1),_0x12781d(0x1d6),'validator:unknown-function',_0x12781d(0x1ed),'validator:arg-kind',_0x12781d(0x208),_0x12781d(0x20f),'validator:meta-shape',_0x12781d(0x229),_0x12781d(0x1f2),'validator:if-shape',_0x12781d(0x1fe),_0x12781d(0x1d9),_0x12781d(0x1ea),_0x12781d(0x1cd),_0x12781d(0x20b),'validator:list-arg',_0x12781d(0x20d)]),LinterSeveritySchema=_0x3f8e0e[_0x12781d(0x1d3)]([_0x12781d(0x1f6),'warn',_0x12781d(0x22b)]),LinterConfigSchema=strictObject({'enabled':_0x3f8e0e[_0x12781d(0x215)](),'rules':_0x3f8e0e[_0x12781d(0x202)](LinterRuleIdSchema,LinterSeveritySchema)}),QueueConfigSchema=strictObject({'enabled':_0x3f8e0e[_0x12781d(0x215)]()[_0x12781d(0x21e)](!![]),'concurrency':_0x3f8e0e[_0x12781d(0x1fa)]()[_0x12781d(0x21b)]()[_0x12781d(0x1e7)]()['default'](0x1)}),ScheduleSchema=strictObject({'collection':_0x3f8e0e[_0x12781d(0x1e2)]()['min'](0x1),'cron':_0x3f8e0e[_0x12781d(0x1e2)]()['min'](0x1),'env':_0x3f8e0e[_0x12781d(0x1e2)]()[_0x12781d(0x1eb)](0x1)[_0x12781d(0x223)](),'prepare':_0x3f8e0e[_0x12781d(0x1e2)]()[_0x12781d(0x1eb)](0x1)[_0x12781d(0x223)]()}),McpConfigSchema=strictObject({'transport':_0x3f8e0e[_0x12781d(0x1e5)](_0x12781d(0x220))}),SandboxConfigSchema=strictObject({'shellCwd':_0x3f8e0e['string']()[_0x12781d(0x223)](),'shellTimeoutMs':_0x3f8e0e[_0x12781d(0x1fa)]()['int']()[_0x12781d(0x1e7)]()[_0x12781d(0x223)](),'exportSecrets':_0x3f8e0e[_0x12781d(0x226)](_0x3f8e0e[_0x12781d(0x1e2)]())['optional'](),'database':_0x3f8e0e['string']()[_0x12781d(0x223)](),'apiBaseUrl':_0x3f8e0e[_0x12781d(0x1e2)]()[_0x12781d(0x21d)]()['optional'](),'uploadDir':_0x3f8e0e[_0x12781d(0x1e2)]()['optional']()}),WebServerConfigSchema=strictObject({'command':_0x3f8e0e[_0x12781d(0x1e2)]()[_0x12781d(0x1eb)](0x1),'url':_0x3f8e0e['string']()[_0x12781d(0x21d)](),'reuseExistingServer':_0x3f8e0e[_0x12781d(0x215)]()[_0x12781d(0x21e)](!![]),'timeoutMs':_0x3f8e0e['number']()[_0x12781d(0x21b)]()['positive']()['default'](0xea60)}),EnvConfigSchema=strictObject({'shared':_0x3f8e0e[_0x12781d(0x226)](_0x3f8e0e[_0x12781d(0x1e2)]())['default']([])}),UnotestConfigSchema=strictObject({'baseUrl':_0x3f8e0e[_0x12781d(0x1e2)]()[_0x12781d(0x21d)]()[_0x12781d(0x223)](),'webServer':WebServerConfigSchema['optional'](),'browsers':_0x3f8e0e[_0x12781d(0x226)](BrowserSchema)[_0x12781d(0x1eb)](0x1),'channel':BrowserChannelSchema,'viewport':ConfigViewportSchema['optional'](),'device':_0x3f8e0e['string']()[_0x12781d(0x1eb)](0x1)['optional'](),'timezone':_0x3f8e0e[_0x12781d(0x1e2)]()[_0x12781d(0x227)](isTimeZone,_0x3634e0=>({'message':'unknown\x20time\x20zone\x20\x22'+_0x3634e0+_0x12781d(0x21a)}))[_0x12781d(0x223)](),'locale':_0x3f8e0e[_0x12781d(0x1e2)]()[_0x12781d(0x227)](isLocale,_0x2df1b8=>({'message':'invalid\x20locale\x20\x22'+_0x2df1b8+'\x22\x20—\x20expected\x20a\x20BCP\x2047\x20tag\x20such\x20as\x20\x22es-ES\x22'}))[_0x12781d(0x223)](),'maxContexts':_0x3f8e0e[_0x12781d(0x1fa)]()[_0x12781d(0x21b)]()[_0x12781d(0x1e7)]()[_0x12781d(0x223)](),'launch':LaunchConfigSchema[_0x12781d(0x223)](),'retry':RetryConfigSchema,'failureBundle':FailureBundleConfigSchema,'dialogPolicy':DialogPolicySchema,'storageState':_0x3f8e0e[_0x12781d(0x1e2)]()['optional'](),'testDir':_0x3f8e0e[_0x12781d(0x1e2)]()[_0x12781d(0x1eb)](0x1),'helpersDir':_0x3f8e0e[_0x12781d(0x1e2)]()[_0x12781d(0x1eb)](0x1),'defaultTimeoutMs':_0x3f8e0e[_0x12781d(0x1fa)]()['int']()[_0x12781d(0x1e7)](),'defaultNavigationTimeoutMs':_0x3f8e0e[_0x12781d(0x1fa)]()[_0x12781d(0x21b)]()[_0x12781d(0x1e7)](),'teardownTimeoutMs':_0x3f8e0e[_0x12781d(0x1fa)]()[_0x12781d(0x21b)]()[_0x12781d(0x1e7)]()[_0x12781d(0x223)](),'env':EnvConfigSchema,'linter':LinterConfigSchema,'mcp':McpConfigSchema,'queue':QueueConfigSchema,'schedules':_0x3f8e0e['array'](ScheduleSchema)['default']([]),'sandbox':SandboxConfigSchema})['superRefine']((_0x2c92a9,_0x2c848d)=>{var _0x35d3a6={_0x5d198e:0x228,_0x2fc226:0x1e1},_0x29f5e8=_0x12781d;_0x2c92a9['viewport']===null&&_0x2c92a9[_0x29f5e8(0x1ce)]!==void 0x0&&_0x2c848d[_0x29f5e8(_0x35d3a6._0x5d198e)]({'code':_0x3f8e0e[_0x29f5e8(_0x35d3a6._0x2fc226)][_0x29f5e8(0x224)],'path':[_0x29f5e8(0x1d2)],'message':_0x29f5e8(0x1de)+_0x2c92a9[_0x29f5e8(0x1ce)]+'\x22\x20sets\x20its\x20own\x20size\x20and\x20scale\x20—\x20drop\x20one\x20of\x20them.'});});function isTimeZone(_0x32c3da){var _0x544df2={_0x4b1885:0x1fd,_0x9905e3:0x1fc},_0x169910=_0x12781d;try{return new Intl[(_0x169910(_0x544df2._0x4b1885))](_0x169910(0x203),{'timeZone':_0x32c3da}),_0x32c3da[_0x169910(_0x544df2._0x9905e3)]>0x0;}catch{return![];}}function _0x4bc7(_0x588736,_0xc6f124){_0x588736=_0x588736-0x1cc;var _0x5cefe6=_0x5cef();var _0x4bc70a=_0x5cefe6[_0x588736];if(_0x4bc7['PTIemz']===undefined){var _0x57d7f6=function(_0x103f5a){var _0x4cc2ac='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';var _0x3f8e0e='',_0x48b82e='';for(var _0x22b034=0x0,_0x541f24,_0x1b5ff1,_0x432b5c=0x0;_0x1b5ff1=_0x103f5a['charAt'](_0x432b5c++);~_0x1b5ff1&&(_0x541f24=_0x22b034%0x4?_0x541f24*0x40+_0x1b5ff1:_0x1b5ff1,_0x22b034++%0x4)?_0x3f8e0e+=String['fromCharCode'](0xff&_0x541f24>>(-0x2*_0x22b034&0x6)):0x0){_0x1b5ff1=_0x4cc2ac['indexOf'](_0x1b5ff1);}for(var _0xacd35=0x0,_0x38f171=_0x3f8e0e['length'];_0xacd35<_0x38f171;_0xacd35++){_0x48b82e+='%'+('00'+_0x3f8e0e['charCodeAt'](_0xacd35)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x48b82e);};_0x4bc7['ZlpNzz']=_0x57d7f6,_0x4bc7['DcZVCo']={},_0x4bc7['PTIemz']=!![];}var _0x1a90df=_0x5cefe6[0x0],_0x3982b7=_0x588736+_0x1a90df,_0x7ce58e=_0x4bc7['DcZVCo'][_0x3982b7];return!_0x7ce58e?(_0x4bc70a=_0x4bc7['ZlpNzz'](_0x4bc70a),_0x4bc7['DcZVCo'][_0x3982b7]=_0x4bc70a):_0x4bc70a=_0x7ce58e,_0x4bc70a;}__name(isTimeZone,_0x12781d(0x21f));function isLocale(_0x1ba508){try{return Intl['getCanonicalLocales'](_0x1ba508)['length']===0x1;}catch{return![];}}__name(isLocale,'isLocale');var DEFAULT_CONFIG={'browsers':[_0x12781d(0x201)],'retry':{'count':0x0,'on':[_0x12781d(0x209)]},'failureBundle':{'tier1':!![],'tier2':!![],'tier3':{'network':![],'video':![]},'retention':{'runs':0x14,'days':0x7},'storageDir':_0x12781d(0x1ff),'pageHtml':_0x12781d(0x1f7)},'dialogPolicy':_0x12781d(0x1ec),'testDir':_0x12781d(0x206),'helpersDir':_0x12781d(0x218),'defaultTimeoutMs':0xbb8,'defaultNavigationTimeoutMs':0x7530,'linter':{'enabled':!![],'rules':{'lint:deep-css':'warn','lint:xpath':_0x12781d(0x1fb),'lint:obfuscated-class':_0x12781d(0x1fb),'lint:pause-explicit':_0x12781d(0x1fb),'lint:disambig-by-index':_0x12781d(0x1f6),'lint:evaluate-discouraged':'warn','lint:scenario-in-root':_0x12781d(0x22b),'lint:mustache-in-dsl':'error','lint:goto-concat':_0x12781d(0x1fb),'lint:regex-invalid':'error','lint:echo-assert':_0x12781d(0x1fb),'lint:lint-ok-missing-reason':'warn','lint:flow-returns-value':_0x12781d(0x1fb),'lint:legacy-layout':_0x12781d(0x1fb),'lint:external-variable-undeclared':_0x12781d(0x22b),'lint:env-host-from-base':_0x12781d(0x22b),'lint:one-test-per-file':_0x12781d(0x1fb),'lint:shadows-dsl-function':_0x12781d(0x1fb),'validator:unknown-function':_0x12781d(0x22b)}},'env':{'shared':[]},'mcp':{'transport':_0x12781d(0x220)},'queue':{'enabled':!![],'concurrency':0x1},'schedules':[],'sandbox':{}};export{BROWSER_CHANNEL_WORDS,BrowserChannelSchema,BrowserSchema,DEFAULT_CONFIG,DialogPolicySchema,EnvConfigSchema,FailureBundleConfigSchema,LinterConfigSchema,LinterRuleIdSchema,LinterSeveritySchema,McpConfigSchema,QueueConfigSchema,RetryConfigSchema,RetryReasonSchema,SYSTEM_BROWSER_CHANNELS,SandboxConfigSchema,ScheduleSchema,UnotestConfigSchema,ViewportSchema,WebServerConfigSchema};
@@ -1,5 +1,5 @@
1
- import { E as ElementHint, S as ScreenshotOptions, L as LocatorValue, C as CaptureFrame, a as CaptureRect, N as NetworkEntry, W as WebDriver, b as LaunchOptions, c as ContextOptions, D as DriverContext, A as AttachOptions } from '../interfaces-DEmGI704.js';
2
- export { d as ActionTimeout, e as CheckOptions, f as ClickOptions, g as CookieOptions, h as DriverPage, F as FillOptions, G as GotoOptions, H as HoverOptions, i as NavigationOptions, P as PressOptions, R as ReloadOptions, j as SelectOptions, V as Viewport, k as ViewportSize, l as WaitOptions, m as WaitState } from '../interfaces-DEmGI704.js';
1
+ import { B as BoundingBox, E as ElementHint, S as ScreenshotOptions, L as LocatorValue, C as CaptureFrame, a as CaptureRect, N as NetworkEntry, W as WebDriver, b as LaunchOptions, c as ContextOptions, D as DriverContext, A as AttachOptions } from '../interfaces-OvnJKELk.js';
2
+ export { d as ActionTimeout, e as CheckOptions, f as ClickOptions, g as CookieOptions, h as DriverPage, F as FillOptions, G as GotoOptions, H as HoverOptions, i as NavigationOptions, P as PressOptions, R as ReloadOptions, j as SelectOptions, V as Viewport, k as ViewportSize, l as WaitOptions, m as WaitState } from '../interfaces-OvnJKELk.js';
3
3
  import '@unotest/protocol';
4
4
  import '../config/schema.js';
5
5
  import 'zod';
@@ -30,6 +30,8 @@ interface FakeBehavior {
30
30
  inputValueByDefault?: string;
31
31
  /** Default isVisible() response. Default: true. */
32
32
  isVisibleByDefault?: boolean;
33
+ /** Default boundingBox() response. Default: a 100×20 box at the origin. */
34
+ boundingBoxByDefault?: BoundingBox | null;
33
35
  /** Default isDisabled() response. Default: false. */
34
36
  isDisabledByDefault?: boolean;
35
37
  /** Default checkedState() response — null = "not a checkable element",
@@ -75,6 +77,11 @@ interface FakeBehavior {
75
77
  * integration tests so the FakeContext's `click` becomes a tab
76
78
  * opener without touching production drivers. */
77
79
  popupOnClick?: string;
80
+ /** The context stands for a browser profile (`launch.userDataDir`) —
81
+ * the only kind where extension service workers exist. Default: false. */
82
+ profile?: boolean;
83
+ /** URLs of the service workers running when the context opens. */
84
+ serviceWorkers?: ReadonlyArray<string>;
78
85
  }
79
86
  declare class FakeWebDriver implements WebDriver {
80
87
  private readonly behavior;