@unotest/web 0.49.1 → 0.49.2

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,57 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.49.2] - 2026-10-12
4
+
5
+ ### Patch Changes
6
+
7
+ - 29fc1f3: A test that fails on a page whose main thread is busy no longer spends a long wait collecting its failure bundle. The runner first asks the page a question that costs it nothing, with a short budget; a page that does not answer is not read at all. Each part of the bundle that was not read now holds the reason where it would be (`screenshot-error.txt`, `page-html-error.txt`, `outline-error.txt`) instead of being missing without a word. Assertions keep their own `timeout` on such a page: the page's reads count against it, so `assertText(loc, x, {timeout: 400})` fails after about 400 ms and says the page gave no answer, instead of waiting out the action timeout. `assertNeverAppears` no longer passes on a page that stops answering: absence is proven only by reads that answered for the whole window, so it fails and says the page gave no answer.
8
+ - 5c29258: A failure bundle no longer holds an empty `console.json` when the browser console was not recorded. The console is recorded only with `UNOTEST_CONSOLE=1`; without it, the file is left out, `get_failure_console` answers `entries: null` with a message naming the variable, and the `prepare-fix` prompt says the console was not recorded instead of "no console entries captured".
9
+ - 50a9980: `env(name, fallback)` returns `fallback` when the variable is not set, a default in one line: `api = env('API_URL', 'http://localhost:3000')`. Before, it took an `if` / `else`: the DSL has no `??`, and `env('X') || 'default'` gives `true`, not the value. Without a fallback `env(name)` still returns `null` for an unset name. A secret is refused as before, with a fallback or without.
10
+ - 4df2165: `evaluate(js)` on a page whose main thread is busy, a script loop or a long task, now fails the step after the action timeout with "the page gave no answer" instead of holding the test forever. `evaluateOnLocator` already did. A script that has started still runs as long as it needs.
11
+
12
+ Inside an entered frame, the function form of `evaluate`, `evaluate('function(n) { … }', 21)`, now receives its argument. Before, it received the frame's root element.
13
+
14
+ - 5df0f20: A lambda passed to `evaluate` or `evaluateOnLocator` is now answered with what to write: the JavaScript goes in as a string, so quote the lambda — `evaluate('() => new Date().toISOString()')`. `lint` and a run say the same. Before, both said to call a helper function by name, which pointed the wrong way. For targets built on `@unotest/dsl`: the contract registry and the dispatcher take an optional `suggestForLambdaArgument(name)` hook for this answer.
15
+ - fa28983: A failed test in the CLI now prints where its failure bundle is, as an absolute path on stdout (`failure bundle: /…/.unotest/failures/<runId>/<test>`), so it opens from any working directory. The run journal keeps `bundlePath` and `screenshotPath` relative to the project root (the directory holding `.unotest/` and `unotest/`), and the agent integration guide now says so.
16
+ - eed900d: `getByRole(role, options)` now reads Playwright's state options: `checked`, `disabled`, `expanded`, `pressed`, `selected`, `level` and `includeHidden`, next to `name` and `exact`. Before, every key but `name` and `exact` was dropped without a word, so `count(getByRole('button', {name: 'Save', disabled: false}))` also counted a disabled Save button and the check went green. Any other key is now refused, at lint time (new rule `lint:role-unknown-option`, an error by default) and at run time, with the list of keys it reads.
17
+
18
+ The MCP locator input takes the same options on a `getByRole` step and refuses any other key instead of stripping it. A recorded step keeps them, and the generated test writes them out.
19
+
20
+ - 26d31d7: `lint:env-host-from-base` now finds the host variable of a `goto` inside a ternary and in a longer sum: `goto(ready ? APP_URL : '/x')` and `goto(APP_URL + '/a' + '/b')` were not checked before. A variable used only as the ternary's condition is not taken for the host.
21
+ - 29fc1f3: `unotest-web init --help` prints its usage once. It used to print it twice, while every other command printed its help once.
22
+ - 9dcc571: A test run no longer creates `unotest/jsconfig.json`. `e2e`, `lint` and MCP `run_test` used to write it into your tree when it was missing; now only `init` and `types` write it, and `init` adds `unotest/jsconfig.json` to `.gitignore`. A run still refreshes the gitignored `.unotest/types/env.d.ts` with your variable names.
23
+
24
+ Migration: a checkout without the file (a new clone, a teammate's machine) gets editor typings back with `npx @unotest/web types`. A `jsconfig.json` you already commit stays as it is; remove the new `.gitignore` line if you want to keep committing it.
25
+
26
+ - 22a848b: `locator(selector, options)` now reads its options: `hasText`, `hasNotText`, `has` and `hasNot` narrow the matches exactly as `filter()` does, and any other key is refused at lint time and at run time. Before, the second argument was dropped without a word, so `count(locator('option', {hasText: 'Beta'}))` counted every option.
27
+
28
+ New `isChecked(loc)` reads the checked state of a checkbox, radio or switch, native or ARIA role. An element with no checked state fails the step instead of reading `false`.
29
+
30
+ `check` / `uncheck` now click and wait until the element reads checked (unchecked) within the action timeout. A controlled switch the app flips a moment after the click, once the server confirms, no longer fails with "did not change its state". An element already in the target state is not clicked, as before. A switch that never flips fails, naming the state it wanted and the last one it saw. `check` / `uncheck` on an element that is not a checkbox, radio or switch is refused; use `click` for it.
31
+
32
+ A `<label>`, or anything inside one, stands for the checkbox it names, as in Playwright: `check`, `uncheck` and `isChecked` on `getByText('Remember me')` act on and read the labelled checkbox. `assertValue(label, "true")` on such a label now asserts the checkbox's checked state too, instead of comparing against its submitted value `"on"`.
33
+
34
+ - abd74f5: `locator(selector, options)` and `filter(loc, options)` now refuse options that are not an object, naming the function: `locator('option', 5)` and `filter(loc, null)` used to build a filter with no conditions and match everything, and `locator('option', null)` failed with a bare `TypeError`. `filter(loc)` with no options is unchanged. `getByRole(role, {exact})` now takes only `true` or `false`, like its state flags; `{exact: 'yes'}` used to count as `true`.
35
+ - 6a6712c: MCP locator input now refuses a regex `source` that does not compile, with "regex source does not compile" and the engine's reason, instead of failing later when the locator runs. A recorded regex is written into the generated test with `/` and line breaks escaped, so a source holding `/` can no longer close the literal and add code to the test.
36
+ - 98aeab8: `e2e --notes` and `collection --notes` print every `note()` of every test under its line, a passing test's too, as `note <label>: <value> — step "<step>"`. A failed test lists them in place of the failing step's own notes, so none prints twice. Without the flag the output is unchanged.
37
+ - 51f06c9: Notes printed under a test line (`--notes`, and the notes of a failing step) now show line breaks and terminal escape sequences escaped, as `\n` and `\x1b`. A note's value often comes from the page under test, and an escape sequence in it used to reach the terminal as an instruction, and a line break could forge a line of the report.
38
+ - 0447cec: A `__proto__` key in an object literal is now an ordinary key of that object, as in JSON, instead of setting its prototype. `getByRole('button', {__proto__: {name: 'Save'}})` was refused by the lint, but the run read `name` through the prototype and matched on it. The run now refuses `__proto__` as an unknown option too, with the lint's message.
39
+ - 92242d3: A run on a browser profile (`launch.userDataDir` or `UNOTEST_USER_DATA_DIR`) no longer prints a line about it on every run. The run journal records it instead: the `run:started` event in `steps.jsonl` carries `browserProfile`, the profile directory the run played on. Its presence means every scenario shared one browser context, with no isolation between them. Runs with a fresh context per test have no such field.
40
+ - a1e8482: Scenarios can use the ternary `cond ? a : b`, as in JS: the lowest precedence, nested to the right, and allowed wherever a value goes — a variable, a call argument, an object field, a `return`, a lambda body. Only the branch the condition picks runs, so `x == null ? '' : x.name` is a safe guard. `lint` accepts a ternary in a slot when both branches fit it. `?.` and `??` are still refused, and the parse error now points to the ternary or `if` / `else`.
41
+ - 6b9ceee: New `texts(loc)` returns the `textContent` of every element the locator matches, in page order, and `[]` when nothing matches. It is one read with no wait: the list to branch on, where `assertTexts` is the waiting check. Before, the only way to get that list was `count` plus `nth(i)` in a loop, since `textContent` on several matches is a strict-mode error.
42
+ - 65a81be: The viewer no longer paints a test marked `@expect-fail` as failed on purpose when it errored. The tile, the tree dot, the scenario header and the history strips now read the marker the runner recorded for each run, not the marker in the source today: a marked test that failed is purple, the same test erroring on a script error is red and counts as failing. The run index records that reading per run and is rebuilt once on the first start after the update. The scenario header of a one-test file now shows `expected` in the same purple as the tree, instead of `failed`.
43
+ - Updated dependencies [5df0f20]
44
+ - Updated dependencies [98aeab8]
45
+ - Updated dependencies [0447cec]
46
+ - Updated dependencies [92242d3]
47
+ - Updated dependencies [a1e8482]
48
+ - Updated dependencies [65a81be]
49
+ - @unotest/dsl@0.49.2
50
+ - @unotest/core@0.49.2
51
+ - @unotest/protocol@0.49.2
52
+ - @unotest/viewer@0.49.2
53
+ - @unotest/grounder-client@0.49.2
54
+
3
55
  ## [0.49.1] - 2026-10-11
4
56
 
5
57
  ### Patch Changes
@@ -1813,7 +1865,7 @@ picker on` fetches this project's own access and writes the three grounder
1813
1865
 
1814
1866
  That screen named one command:
1815
1867
 
1816
- npx @unotest/web bundle push --run --env ENVIRONMENT
1868
+ npx @unotest/web bundle push --run --env ENVIRONMENT
1817
1869
 
1818
1870
  In a project that has just been created, the command refuses with `no box
1819
1871
  address` before it does anything: the project holds neither the box's address
@@ -1822,8 +1874,8 @@ address` before it does anything: the project holds neither the box's address
1822
1874
 
1823
1875
  The screen now names both steps, in the order they have to happen:
1824
1876
 
1825
- npx @unotest/web box access larch
1826
- npx @unotest/web bundle push --run --env ENVIRONMENT
1877
+ npx @unotest/web box access larch
1878
+ npx @unotest/web bundle push --run --env ENVIRONMENT
1827
1879
 
1828
1880
  The box's own name is filled in when its licence carries one. `box access`
1829
1881
  with no name refuses, and its refusal offers to create a box — to somebody who
package/README.md CHANGED
@@ -29,15 +29,16 @@ overwrites your edits.
29
29
 
30
30
  It also wires editor typings (`unotest/jsconfig.json` + generated `.d.ts`
31
31
  files), so scenarios get autocomplete, hover docs and signature help in
32
- VS Code / WebStorm instead of red squiggles. On an existing project this
33
- self-installs on the first `lint` / `e2e` run after upgrading; refresh by
34
- hand with `npx @unotest/web types`. Details: the "Editor setup" section of
32
+ VS Code / WebStorm instead of red squiggles. On an existing project or a
33
+ fresh checkout, `npx @unotest/web types` writes them; a test run does not.
34
+ Details: the "Editor setup" section of
35
35
  `node_modules/@unotest/web/guides/dsl-reference.md`.
36
36
 
37
37
  Testing a browser extension? `launch` in `unotest.config` starts the browser
38
38
  with a profile (`userDataDir`) and extra arguments (`args`, e.g.
39
39
  `--load-extension=./ext`; Chromium only). On a profile every scenario shares
40
- one browser context — no isolation between them, and the run log says so.
40
+ one browser context — no isolation between them, and the run journal records
41
+ the profile.
41
42
  `profile: 'per-test'` instead gives every test a new browser on a new,
42
43
  empty profile: a suite of N files runs on N profiles.
43
44
 
@@ -52,6 +52,8 @@ const asksForHelp = args.some((a) => a === "--help" || a === "-h");
52
52
  // under src/. In published packages dist/ exists (built by prepublishOnly);
53
53
  // in a fresh clone we fall back to running TS sources via tsx so that
54
54
  // `unotest-web --help` works without an explicit `pnpm build` first.
55
+ const INIT_DIST = "dist/runner/init.js";
56
+
55
57
  /** The cli dispatcher's route. It stops when this wrapper is gone, through
56
58
  * an IPC channel (see the spawn below); the other entries are not told. */
57
59
  function cliRoute(forwardArgs) {
@@ -74,11 +76,12 @@ function dispatch(sub) {
74
76
  case "e2e":
75
77
  return cliRoute(args);
76
78
  case "init":
77
- return {
78
- dist: "dist/runner/init.js",
79
- src: "src/runner/init.ts",
80
- forwardArgs: args.slice(1),
81
- };
79
+ // Built: imported and called in this process (see below). Without
80
+ // dist/ the cli dispatches it under tsx — init.ts runs nothing on
81
+ // import, so it is never an entry of its own.
82
+ return existsSync(resolve(root, INIT_DIST))
83
+ ? { dist: INIT_DIST, src: "src/runner/init.ts", forwardArgs: args.slice(1) }
84
+ : cliRoute(args);
82
85
  case "install-chromium":
83
86
  return {
84
87
  dist: "dist/runner/install-chromium.js",
@@ -122,10 +125,8 @@ const distPath = resolve(root, dist);
122
125
  // npx loses the prompt suffix mid-flush on some shells (Claude Code's
123
126
  // REPL, nvm shim variants). Direct import keeps stdio attached to the
124
127
  // real TTY without a spawn hop. We import the compiled module and call
125
- // `runInit` directly so we can await its promise — the module's own
126
- // self-invoke `if (invokedDirectly)` block fires only when bin spawns
127
- // a child, which we explicitly skip here.
128
- if (sub === "init" && !asksForHelp && existsSync(distPath)) {
128
+ // `runInit` directly so we can await its promise.
129
+ if (dist === INIT_DIST) {
129
130
  const initModule = await import(pathToFileURL(distPath).href);
130
131
  try {
131
132
  const { exitCode } = await initModule.runInit(forwardArgs);
@@ -116,19 +116,19 @@ declare const FailureBundleConfigSchema: z.ZodObject<{
116
116
  type FailureBundleConfig = z.infer<typeof FailureBundleConfigSchema>;
117
117
  declare const DialogPolicySchema: z.ZodEnum<["accept", "dismiss", "manual"]>;
118
118
  type DialogPolicy = z.infer<typeof DialogPolicySchema>;
119
- declare const LinterRuleIdSchema: z.ZodEnum<["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", "lint:filter-unknown-option", "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"]>;
119
+ declare const LinterRuleIdSchema: z.ZodEnum<["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", "lint:filter-unknown-option", "lint:role-unknown-option", "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"]>;
120
120
  type LinterRuleId = z.infer<typeof LinterRuleIdSchema>;
121
121
  declare const LinterSeveritySchema: z.ZodEnum<["off", "warn", "error"]>;
122
122
  type LinterSeverity = z.infer<typeof LinterSeveritySchema>;
123
123
  declare const LinterConfigSchema: z.ZodObject<{
124
124
  enabled: z.ZodBoolean;
125
- rules: z.ZodRecord<z.ZodEnum<["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", "lint:filter-unknown-option", "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"]>, z.ZodEnum<["off", "warn", "error"]>>;
125
+ rules: z.ZodRecord<z.ZodEnum<["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", "lint:filter-unknown-option", "lint:role-unknown-option", "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"]>, z.ZodEnum<["off", "warn", "error"]>>;
126
126
  }, "strict", z.ZodTypeAny, {
127
127
  enabled: boolean;
128
- 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" | "lint:filter-unknown-option" | "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">>;
128
+ 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" | "lint:filter-unknown-option" | "lint:role-unknown-option" | "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">>;
129
129
  }, {
130
130
  enabled: boolean;
131
- 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" | "lint:filter-unknown-option" | "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">>;
131
+ 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" | "lint:filter-unknown-option" | "lint:role-unknown-option" | "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">>;
132
132
  }>;
133
133
  type LinterConfig = z.infer<typeof LinterConfigSchema>;
134
134
  declare const QueueConfigSchema: z.ZodObject<{
@@ -620,13 +620,13 @@ declare const UnotestConfigSchema: z.ZodEffects<z.ZodObject<{
620
620
  }>;
621
621
  linter: z.ZodObject<{
622
622
  enabled: z.ZodBoolean;
623
- rules: z.ZodRecord<z.ZodEnum<["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", "lint:filter-unknown-option", "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"]>, z.ZodEnum<["off", "warn", "error"]>>;
623
+ rules: z.ZodRecord<z.ZodEnum<["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", "lint:filter-unknown-option", "lint:role-unknown-option", "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"]>, z.ZodEnum<["off", "warn", "error"]>>;
624
624
  }, "strict", z.ZodTypeAny, {
625
625
  enabled: boolean;
626
- 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" | "lint:filter-unknown-option" | "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">>;
626
+ 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" | "lint:filter-unknown-option" | "lint:role-unknown-option" | "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">>;
627
627
  }, {
628
628
  enabled: boolean;
629
- 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" | "lint:filter-unknown-option" | "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">>;
629
+ 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" | "lint:filter-unknown-option" | "lint:role-unknown-option" | "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">>;
630
630
  }>;
631
631
  mcp: z.ZodObject<{
632
632
  transport: z.ZodLiteral<"stdio">;
@@ -755,7 +755,7 @@ declare const UnotestConfigSchema: z.ZodEffects<z.ZodObject<{
755
755
  defaultNavigationTimeoutMs: number;
756
756
  linter: {
757
757
  enabled: boolean;
758
- 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" | "lint:filter-unknown-option" | "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">>;
758
+ 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" | "lint:filter-unknown-option" | "lint:role-unknown-option" | "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">>;
759
759
  };
760
760
  mcp: {
761
761
  transport: "stdio";
@@ -835,7 +835,7 @@ declare const UnotestConfigSchema: z.ZodEffects<z.ZodObject<{
835
835
  defaultNavigationTimeoutMs: number;
836
836
  linter: {
837
837
  enabled: boolean;
838
- 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" | "lint:filter-unknown-option" | "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">>;
838
+ 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" | "lint:filter-unknown-option" | "lint:role-unknown-option" | "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">>;
839
839
  };
840
840
  mcp: {
841
841
  transport: "stdio";
@@ -920,7 +920,7 @@ declare const UnotestConfigSchema: z.ZodEffects<z.ZodObject<{
920
920
  defaultNavigationTimeoutMs: number;
921
921
  linter: {
922
922
  enabled: boolean;
923
- 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" | "lint:filter-unknown-option" | "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">>;
923
+ 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" | "lint:filter-unknown-option" | "lint:role-unknown-option" | "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">>;
924
924
  };
925
925
  mcp: {
926
926
  transport: "stdio";
@@ -1000,7 +1000,7 @@ declare const UnotestConfigSchema: z.ZodEffects<z.ZodObject<{
1000
1000
  defaultNavigationTimeoutMs: number;
1001
1001
  linter: {
1002
1002
  enabled: boolean;
1003
- 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" | "lint:filter-unknown-option" | "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">>;
1003
+ 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" | "lint:filter-unknown-option" | "lint:role-unknown-option" | "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">>;
1004
1004
  };
1005
1005
  mcp: {
1006
1006
  transport: "stdio";
@@ -1 +1 @@
1
- var _0x328995=_0x3b38;(function(_0x17508c,_0x5578d0){var _0x118a28={_0x2ae2dc:0xed,_0x3df906:0xc6,_0x53e72c:0xe7,_0x479566:0xb0,_0x57d714:0xea},_0x6e890d=_0x3b38,_0x4ea66a=_0x17508c();while(!![]){try{var _0x4212b7=parseInt(_0x6e890d(_0x118a28._0x2ae2dc))/0x1+-parseInt(_0x6e890d(0xe0))/0x2+parseInt(_0x6e890d(0xb2))/0x3*(-parseInt(_0x6e890d(0xda))/0x4)+parseInt(_0x6e890d(_0x118a28._0x3df906))/0x5*(parseInt(_0x6e890d(0xa4))/0x6)+parseInt(_0x6e890d(0xde))/0x7*(parseInt(_0x6e890d(_0x118a28._0x53e72c))/0x8)+parseInt(_0x6e890d(_0x118a28._0x479566))/0x9*(-parseInt(_0x6e890d(0xc9))/0xa)+parseInt(_0x6e890d(_0x118a28._0x57d714))/0xb;if(_0x4212b7===_0x5578d0)break;else _0x4ea66a['push'](_0x4ea66a['shift']());}catch(_0x485d4d){_0x4ea66a['push'](_0x4ea66a['shift']());}}}(_0x9579,0x63ff9));var __defProp=Object[_0x328995(0xc5)],__name=(_0x42e225,_0x1c43f6)=>__defProp(_0x42e225,'name',{'value':_0x1c43f6,'configurable':!![]});import{z as _0x6719d3}from'zod';import{z}from'zod';import{levenshteinDistance}from'@unotest/core';var MAX_EDITS=0x2;function closestKey(_0x577072,_0xa332df){var _0x438773=_0x328995;let _0x1fa843;for(const _0x2e755e of _0xa332df){const _0x5e1bba=levenshteinDistance(_0x577072[_0x438773(0xb1)](),_0x2e755e[_0x438773(0xb1)]());if(_0x5e1bba>MAX_EDITS)continue;if(_0x1fa843===void 0x0||_0x5e1bba<_0x1fa843[_0x438773(0xac)])_0x1fa843={'key':_0x2e755e,'distance':_0x5e1bba};}return _0x1fa843?.[_0x438773(0xaa)];}__name(closestKey,_0x328995(0x9f));function unknownKeyMessage(_0x2417be,_0x34fd58){var _0x363226=_0x328995;return _0x2417be[_0x363226(0xdd)](_0x163a37=>{var _0x32cf85=_0x363226;const _0x3ca6af=closestKey(_0x163a37,_0x34fd58);return _0x3ca6af===void 0x0?'unknown\x20key\x20\x22'+_0x163a37+_0x32cf85(0xc8):'unknown\x20key\x20\x22'+_0x163a37+_0x32cf85(0xe4)+_0x3ca6af+'\x22?';})[_0x363226(0xe6)](';\x20');}__name(unknownKeyMessage,_0x328995(0xb3));function strictObject(_0x9e2911){var _0x1a2119={_0x366d7f:0xc2,_0x12f37d:0xdf},_0x204b4e=_0x328995;const _0x1cc4b0=Object[_0x204b4e(_0x1a2119._0x366d7f)](_0x9e2911);return z['object'](_0x9e2911,{'errorMap':__name((_0x31278a,_0xef323)=>_0x31278a[_0x204b4e(0xd7)]===z[_0x204b4e(0xd4)]['unrecognized_keys']?{'message':unknownKeyMessage(_0x31278a[_0x204b4e(0xc2)],_0x1cc4b0)}:{'message':_0xef323['defaultError']},_0x204b4e(0xc3))})[_0x204b4e(_0x1a2119._0x12f37d)]();}function _0x9579(){var _0x4df104=['rgf0zvrPBwvgB3jTyxq','BgLUDdPLDMfSDwf0zs1KAxnJB3vYywDLza','DxjS','iIdIGjqGzxHWzwn0zwqGyw4GsufoqsbUyw1Lihn1y2GGyxmGiKv1CM9Wzs9nywrYAwqI','DhjHBNnMB3jT','BgL0zxjHBa','BgLUDdPSzwDHy3KTBgf5B3v0','BMv0D29YAW','zMLYzwzVEa','Dw5RBM93BIb0Aw1LihPVBMuGiG','BNvSBa','A2v5CW','zxjYB3jnyxa','DMfSAwrHDg9YoNn0zxaTC2HHCgu','zgvMAw5LuhjVCgvYDhK','nwLjCxL2rW','DMfSAwrHDg9YoMz1BMn0Aw9UlxnOyxbL','iIdIGjqGBM90igeGy29UzMLNigTLEtSGy2HLy2SGEw91CIbaDw5VDgvZDc93zwiGDMvYC2LVBIbPzIbPDcbJB21LCYbMCM9TigeGBMv3zxiGCMvSzwfZzq','ndiWnZeXmeXZBNvSEq','D2fYBG','DMfSAwrHDg9YoMfYzY1RAw5K','CMvKywn0zwq','ywrKsxnZDwu','lNvUB3rLC3qVzMfPBhvYzxm','CMvMAw5L','DMfSAwrHDg9YoMXPC3qTyxjN','zNvSBa','Aw52ywXPzcbSB2nHBguGiG','ywnJzxb0','wM9KsxnZDwvdB2rL','z2v0q2fUB25Py2fStg9JywXLCW','C3vWzxjszwzPBMu','y29Kzq','BgLUDdPZy2vUyxjPBY1PBI1YB290','C3rYAwn0t2jQzwn0','odC2nZC2u2rlwMvk','BgLUDdPWyxvZzs1LEhbSAwnPDa','yM9VBgvHBG','BwfW','mZaXnZiXsM96C0zv','C3rYAwn0','mte2nZaWnMz0u0njsq','AgfZ','ywrK','D2vIA2L0','iIdIGjqGzgLKihLVDsbTzwfUici','DMfSAwrHDg9YoMzVCI1ZAgfWzq','AM9PBG','og5qD0D6EG','DMfSAwrHDg9YoNn0CMLUzY1JB25Jyxq','CMvJB3jK','mteYntKWmdz1qLbsEhy','Aw50','Dw5VDgvZDc9LmMu','mtCZnJC0rMrXr2T6','iIbZzxrZigL0CYbVD24GC2L6zsbHBMqGC2nHBguG4OcuigrYB3aGB25Lig9MihrOzw0U','igLZigfSCMvHzhKGyw5VDgHLCIbZzxj2zxiNCYdIGjqGzwfJAcbZzxj2zxiGBMvLzhmGAxrZig93BIbYzwfKAw5LC3mGvvjmlG','BwLU','DMLLD3bVCNq','BgLUDdPMBg93lxjLDhvYBNmTDMfSDwu','DMfSAwrHDg9YoNnLBwfUDgLJlwXVC3m','zgv2AwnL','igTLzxbZihrOzsbYzwfSigjYB3DZzxiGD2LUzg93lcbHBMqGzgv2AwnLici','BgLUDdPLEhrLCM5HBc12yxjPywjSzs11BMrLy2XHCMvK','Bwf4','B3b0Aw9UywW','DMfSAwrHDg9YoM1LDgeTC2HHCgu','B2zM','C3rYAw5N','DMLLD3bVCNq6ig51BgW','Dw5PB24','zxjYB3i','BgLUDdPZAgfKB3DZlwrZBc1MDw5JDgLVBG','zgvMyxvSDa','BgLUDdPSAw50lw9Rlw1PC3nPBMCTCMvHC29U','BgLUDdPKAxnHBwjPzY1IEs1PBMrLEa','C3rKAw8','zw4Tvvm','BgLUDdPLBNyTAg9ZDc1MCM9TlwjHC2u','D2vIu2vYDMvYwW','BgvUz3rO','Cg9ZAxrPDMu','y2XVC2vZDeTLEq','AxnbCNjHEq','BgLUDdPNB3rVlwnVBMnHDa','BgLUDdPLy2HVlwfZC2vYDa','DMfSAwrHDg9YoNn0zxaTy292zxjHz2u','mZy3mtiZmNDoy0zysq','DMfSAwrHDg9YoMLMlxnOyxbL','zw51Bq','DhjHBNnPzw50','yxjYyxK','BwfUDwfS','A2v5','y3vZDg9T','zgLZDgfUy2u','BNvTyMvY','xs51CMWG','y3jHC2G','ouH2u2novq','Dg9mB3DLCKnHC2u','nNbvt3nnrW','Dw5RBM93BKTLEu1LC3nHz2u','y2HYB21LlwjLDge','BNvSBgfIBgu','BxnLzgDL'];_0x9579=function(){return _0x4df104;};return _0x9579();}__name(strictObject,_0x328995(0xd9));import{BUNDLED_BROWSER_CHANNEL}from'@unotest/protocol';import{z as _0x3f2e51}from'zod';import{UnotestError}from'@unotest/core';var LaunchConfigSchema=_0x3f2e51['object']({'userDataDir':_0x3f2e51[_0x328995(0xfb)]()[_0x328995(0xf0)](0x1)[_0x328995(0xf8)](),'profile':_0x3f2e51['literal']('per-test')[_0x328995(0xf8)](),'args':_0x3f2e51[_0x328995(0xa8)](_0x3f2e51[_0x328995(0xfb)]()['min'](0x1))[_0x328995(0xf8)]()})[_0x328995(0xdf)](),BrowserSchema=_0x6719d3[_0x328995(0xa6)](['chromium',_0x328995(0xbf),_0x328995(0xe3)]),SYSTEM_BROWSER_CHANNELS=['chrome',_0x328995(0xb6),_0x328995(0xb4),'chromium'],BROWSER_CHANNEL_WORDS=[...SYSTEM_BROWSER_CHANNELS,BUNDLED_BROWSER_CHANNEL],BrowserChannelSchema=_0x6719d3[_0x328995(0xfd)]([_0x6719d3[_0x328995(0xa6)](SYSTEM_BROWSER_CHANNELS),_0x6719d3[_0x328995(0xbc)](BUNDLED_BROWSER_CHANNEL)[_0x328995(0xbb)](()=>null),_0x6719d3[_0x328995(0xc1)]()])[_0x328995(0xf8)](),ViewportSchema=strictObject({'width':_0x6719d3[_0x328995(0xad)]()[_0x328995(0xeb)]()[_0x328995(0x9e)]()[_0x328995(0xf8)](),'height':_0x6719d3[_0x328995(0xad)]()['int']()[_0x328995(0x9e)]()[_0x328995(0xf8)](),'deviceScaleFactor':_0x6719d3[_0x328995(0xad)]()[_0x328995(0x9e)]()[_0x328995(0xf8)]()}),ConfigViewportSchema=ViewportSchema[_0x328995(0xb5)]();function viewportDeviceConflict(_0x1e2b3e,_0x12ebaf,_0x2a9565=_0x328995(0xfc)){var _0x14c125={_0xb9f81f:0xee},_0x16ebcd=_0x328995;if(_0x1e2b3e!==null||_0x12ebaf===void 0x0)return void 0x0;return _0x2a9565+_0x16ebcd(0xf5)+_0x12ebaf+_0x16ebcd(_0x14c125._0xb9f81f);}function _0x3b38(_0x2212ed,_0x433953){_0x2212ed=_0x2212ed-0x9a;var _0x957986=_0x9579();var _0x3b38fe=_0x957986[_0x2212ed];if(_0x3b38['NXbhIa']===undefined){var _0x3e9978=function(_0x4060c2){var _0x3f2f9d='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';var _0x6719d3='',_0x3f2e51='';for(var _0x42e225=0x0,_0x1c43f6,_0x577072,_0xa332df=0x0;_0x577072=_0x4060c2['charAt'](_0xa332df++);~_0x577072&&(_0x1c43f6=_0x42e225%0x4?_0x1c43f6*0x40+_0x577072:_0x577072,_0x42e225++%0x4)?_0x6719d3+=String['fromCharCode'](0xff&_0x1c43f6>>(-0x2*_0x42e225&0x6)):0x0){_0x577072=_0x3f2f9d['indexOf'](_0x577072);}for(var _0x1fa843=0x0,_0x2e755e=_0x6719d3['length'];_0x1fa843<_0x2e755e;_0x1fa843++){_0x3f2e51+='%'+('00'+_0x6719d3['charCodeAt'](_0x1fa843)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x3f2e51);};_0x3b38['yuWtEG']=_0x3e9978,_0x3b38['OYlcmI']={},_0x3b38['NXbhIa']=!![];}var _0x50298d=_0x957986[0x0],_0x2a1017=_0x2212ed+_0x50298d,_0x1838c0=_0x3b38['OYlcmI'][_0x2a1017];return!_0x1838c0?(_0x3b38fe=_0x3b38['yuWtEG'](_0x3b38fe),_0x3b38['OYlcmI'][_0x2a1017]=_0x3b38fe):_0x3b38fe=_0x1838c0,_0x3b38fe;}__name(viewportDeviceConflict,'viewportDeviceConflict');var RetryReasonSchema=_0x6719d3['enum']([_0x328995(0xa7),_0x328995(0xbe),_0x328995(0xaf)]),RetryConfigSchema=strictObject({'count':_0x6719d3['number']()['int']()[_0x328995(0xf0)](0x0)[_0x328995(0xf7)](0xa),'on':_0x6719d3[_0x328995(0xa8)](RetryReasonSchema)}),FailureBundleConfigSchema=strictObject({'tier1':_0x6719d3[_0x328995(0xbc)](!![])[_0x328995(0x100)](!![]),'tier2':_0x6719d3[_0x328995(0xdc)](),'tier3':strictObject({'network':_0x6719d3['boolean'](),'video':_0x6719d3[_0x328995(0xdc)]()}),'retention':strictObject({'runs':_0x6719d3[_0x328995(0xad)]()[_0x328995(0xeb)]()[_0x328995(0x9e)](),'days':_0x6719d3[_0x328995(0xad)]()[_0x328995(0xeb)]()[_0x328995(0x9e)]()}),'storageDir':_0x6719d3[_0x328995(0xfb)]()[_0x328995(0xf0)](0x1),'pageHtml':_0x6719d3['enum'](['redacted',_0x328995(0xd1)])}),DialogPolicySchema=_0x6719d3[_0x328995(0xa6)]([_0x328995(0xd3),'dismiss',_0x328995(0xa9)]),LinterRuleIdSchema=_0x6719d3[_0x328995(0xa6)](['lint:deep-css','lint:xpath','lint:obfuscated-class',_0x328995(0xdb),_0x328995(0x102),_0x328995(0xb8),_0x328995(0xd8),'lint:mustache-in-dsl',_0x328995(0xa1),'lint:regex-invalid',_0x328995(0xa2),'lint:api-call-file-body',_0x328995(0x101),_0x328995(0xf2),_0x328995(0xbd),_0x328995(0xf6),_0x328995(0x9b),'lint:one-test-per-file',_0x328995(0xff),'lint:skip-outside-test','lint:set-test-timeout-outside-test','lint:filter-unknown-option','validator:unknown-function','validator:arity',_0x328995(0xcb),_0x328995(0xa3),_0x328995(0xc4),_0x328995(0xf9),_0x328995(0xc7),_0x328995(0xe5),_0x328995(0xa5),'validator:var-shape','validator:unsupported-statement','validator:unsupported-expression',_0x328995(0xe8),_0x328995(0xf3),_0x328995(0xd0),'validator:wrapped-format']),LinterSeveritySchema=_0x6719d3[_0x328995(0xa6)](['off',_0x328995(0xca),_0x328995(0xfe)]),LinterConfigSchema=strictObject({'enabled':_0x6719d3[_0x328995(0xdc)](),'rules':_0x6719d3[_0x328995(0xe9)](LinterRuleIdSchema,LinterSeveritySchema)}),QueueConfigSchema=strictObject({'enabled':_0x6719d3['boolean']()[_0x328995(0x100)](!![]),'concurrency':_0x6719d3[_0x328995(0xad)]()[_0x328995(0xeb)]()[_0x328995(0x9e)]()[_0x328995(0x100)](0x1)}),ScheduleSchema=strictObject({'collection':_0x6719d3[_0x328995(0xfb)]()[_0x328995(0xf0)](0x1),'cron':_0x6719d3[_0x328995(0xfb)]()[_0x328995(0xf0)](0x1),'env':_0x6719d3[_0x328995(0xfb)]()[_0x328995(0xf0)](0x1)[_0x328995(0xf8)](),'prepare':_0x6719d3[_0x328995(0xfb)]()[_0x328995(0xf0)](0x1)['optional']()}),McpConfigSchema=strictObject({'transport':_0x6719d3['literal'](_0x328995(0x103))}),SandboxConfigSchema=strictObject({'shellCwd':_0x6719d3[_0x328995(0xfb)]()[_0x328995(0xf8)](),'shellTimeoutMs':_0x6719d3[_0x328995(0xad)]()[_0x328995(0xeb)]()[_0x328995(0x9e)]()[_0x328995(0xf8)](),'exportSecrets':_0x6719d3[_0x328995(0xa8)](_0x6719d3[_0x328995(0xfb)]())[_0x328995(0xf8)](),'database':_0x6719d3[_0x328995(0xfb)]()['optional'](),'apiBaseUrl':_0x6719d3[_0x328995(0xfb)]()[_0x328995(0xb9)]()['optional'](),'uploadDir':_0x6719d3[_0x328995(0xfb)]()[_0x328995(0xf8)](),'readRoots':_0x6719d3['array'](_0x6719d3[_0x328995(0xfb)]()[_0x328995(0xf0)](0x1))[_0x328995(0xf8)]()}),WebServerConfigSchema=strictObject({'command':_0x6719d3['string']()['min'](0x1),'url':_0x6719d3[_0x328995(0xfb)]()['url'](),'reuseExistingServer':_0x6719d3[_0x328995(0xdc)]()[_0x328995(0x100)](!![]),'timeoutMs':_0x6719d3[_0x328995(0xad)]()[_0x328995(0xeb)]()[_0x328995(0x9e)]()['default'](0xea60)}),WebServersConfigSchema=_0x6719d3[_0x328995(0xfd)]([WebServerConfigSchema,_0x6719d3[_0x328995(0xa8)](WebServerConfigSchema)[_0x328995(0xf0)](0x1)])['transform'](_0x4f057c=>Array[_0x328995(0xa0)](_0x4f057c)?_0x4f057c:[_0x4f057c])[_0x328995(0xd6)]((_0x502e42,_0x226710)=>{var _0x19861f={_0x2eee3c:0xe1,_0x20a514:0xab,_0x215b76:0xb9};const _0x179a21=new Set();_0x502e42['forEach']((_0x2da4f9,_0x2d864c)=>{var _0x5cf211=_0x3b38;_0x179a21[_0x5cf211(_0x19861f._0x2eee3c)](_0x2da4f9[_0x5cf211(0xb9)])&&_0x226710[_0x5cf211(0xcd)]({'code':_0x6719d3['ZodIssueCode'][_0x5cf211(_0x19861f._0x20a514)],'path':[_0x2d864c,_0x5cf211(_0x19861f._0x215b76)],'message':_0x5cf211(0x9c)+_0x2d864c+_0x5cf211(0xae)+_0x2da4f9[_0x5cf211(0xb9)]+_0x5cf211(0xef)}),_0x179a21[_0x5cf211(0xe2)](_0x2da4f9[_0x5cf211(0xb9)]);});}),EnvConfigSchema=strictObject({'shared':_0x6719d3[_0x328995(0xa8)](_0x6719d3[_0x328995(0xfb)]())[_0x328995(0x100)]([])}),UnotestConfigSchema=strictObject({'baseUrl':_0x6719d3['string']()[_0x328995(0xb9)]()['optional'](),'webServer':WebServersConfigSchema[_0x328995(0xf8)](),'generate':_0x6719d3[_0x328995(0xfb)]()[_0x328995(0xf0)](0x1)[_0x328995(0xf8)](),'browsers':_0x6719d3[_0x328995(0xa8)](BrowserSchema)[_0x328995(0xf0)](0x1),'channel':BrowserChannelSchema,'viewport':ConfigViewportSchema[_0x328995(0xf8)](),'device':_0x6719d3[_0x328995(0xfb)]()[_0x328995(0xf0)](0x1)[_0x328995(0xf8)](),'timezone':_0x6719d3[_0x328995(0xfb)]()[_0x328995(0xcf)](isTimeZone,_0x4add3d=>({'message':_0x328995(0xc0)+_0x4add3d+_0x328995(0xba)}))[_0x328995(0xf8)](),'locale':_0x6719d3[_0x328995(0xfb)]()[_0x328995(0xcf)](isLocale,_0x1aa8cf=>({'message':_0x328995(0xd2)+_0x1aa8cf+'\x22\x20—\x20expected\x20a\x20BCP\x2047\x20tag\x20such\x20as\x20\x22es-ES\x22'}))[_0x328995(0xf8)](),'maxContexts':_0x6719d3['number']()['int']()[_0x328995(0x9e)]()['optional'](),'launch':LaunchConfigSchema[_0x328995(0xf8)](),'retry':RetryConfigSchema,'failureBundle':FailureBundleConfigSchema,'dialogPolicy':DialogPolicySchema,'storageState':_0x6719d3[_0x328995(0xfb)]()[_0x328995(0xf8)](),'testDir':_0x6719d3[_0x328995(0xfb)]()[_0x328995(0xf0)](0x1),'helpersDir':_0x6719d3[_0x328995(0xfb)]()[_0x328995(0xf0)](0x1),'defaultTimeoutMs':_0x6719d3[_0x328995(0xad)]()[_0x328995(0xeb)]()[_0x328995(0x9e)](),'defaultNavigationTimeoutMs':_0x6719d3[_0x328995(0xad)]()[_0x328995(0xeb)]()['positive'](),'teardownTimeoutMs':_0x6719d3[_0x328995(0xad)]()[_0x328995(0xeb)]()[_0x328995(0x9e)]()['optional'](),'testTimeoutMs':_0x6719d3[_0x328995(0xad)]()[_0x328995(0xeb)]()[_0x328995(0x9e)]()[_0x328995(0xf8)](),'env':EnvConfigSchema,'linter':LinterConfigSchema,'mcp':McpConfigSchema,'queue':QueueConfigSchema,'schedules':_0x6719d3[_0x328995(0xa8)](ScheduleSchema)[_0x328995(0x100)]([]),'sandbox':SandboxConfigSchema})['superRefine']((_0x16d36d,_0x2d904b)=>{var _0xabbca9={_0x44187c:0xf1,_0x51cf7c:0xf4,_0x133ac3:0xcd,_0x2df6f4:0xd4},_0x17d272=_0x328995;const _0x1c5fc8=viewportDeviceConflict(_0x16d36d[_0x17d272(_0xabbca9._0x44187c)],_0x16d36d[_0x17d272(_0xabbca9._0x51cf7c)]);_0x1c5fc8!==void 0x0&&_0x2d904b[_0x17d272(_0xabbca9._0x133ac3)]({'code':_0x6719d3[_0x17d272(_0xabbca9._0x2df6f4)][_0x17d272(0xab)],'path':['viewport'],'message':_0x1c5fc8});});function isTimeZone(_0x5d213f){var _0x455f37={_0xf6902a:0x9a,_0x375bb6:0x9d},_0x26f7de=_0x328995;try{return new Intl[(_0x26f7de(0xb7))](_0x26f7de(_0x455f37._0xf6902a),{'timeZone':_0x5d213f}),_0x5d213f[_0x26f7de(_0x455f37._0x375bb6)]>0x0;}catch{return![];}}__name(isTimeZone,'isTimeZone');function isLocale(_0x3f7338){var _0x16b0d6=_0x328995;try{return Intl[_0x16b0d6(0xd5)](_0x3f7338)['length']===0x1;}catch{return![];}}__name(isLocale,'isLocale');var DEFAULT_CONFIG={'browsers':['chromium'],'retry':{'count':0x0,'on':[_0x328995(0xa7)]},'failureBundle':{'tier1':!![],'tier2':!![],'tier3':{'network':![],'video':![]},'retention':{'runs':0x14,'days':0x7},'storageDir':_0x328995(0xce),'pageHtml':_0x328995(0xcc)},'dialogPolicy':_0x328995(0xd3),'testDir':_0x328995(0xec),'helpersDir':'unotest/e2e/_helpers','defaultTimeoutMs':0xbb8,'defaultNavigationTimeoutMs':0x7530,'linter':{'enabled':!![],'rules':{'lint:deep-css':_0x328995(0xca),'lint:xpath':_0x328995(0xca),'lint:obfuscated-class':_0x328995(0xca),'lint:pause-explicit':_0x328995(0xca),'lint:disambig-by-index':_0x328995(0xfa),'lint:evaluate-discouraged':_0x328995(0xca),'lint:scenario-in-root':'error','lint:mustache-in-dsl':'error','lint:goto-concat':_0x328995(0xca),'lint:regex-invalid':_0x328995(0xfe),'lint:echo-assert':'warn','lint:lint-ok-missing-reason':_0x328995(0xca),'lint:flow-returns-value':_0x328995(0xca),'lint:legacy-layout':_0x328995(0xca),'lint:external-variable-undeclared':'error','lint:env-host-from-base':_0x328995(0xfe),'lint:one-test-per-file':_0x328995(0xca),'lint:shadows-dsl-function':'warn','lint:skip-outside-test':_0x328995(0xfe),'lint:set-test-timeout-outside-test':'error','lint:filter-unknown-option':_0x328995(0xfe),'validator:unknown-function':_0x328995(0xfe)}},'env':{'shared':[]},'mcp':{'transport':_0x328995(0x103)},'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,WebServersConfigSchema,viewportDeviceConflict};
1
+ var _0x4b2829=_0x181a;(function(_0x282d14,_0x3fe266){var _0x3e1421={_0x80dd09:0x133,_0x4cddfe:0x130,_0x752b99:0x121,_0x468bea:0x134,_0x4a3353:0x150},_0x2eaac5=_0x181a,_0x41e487=_0x282d14();while(!![]){try{var _0x1c02ac=parseInt(_0x2eaac5(_0x3e1421._0x80dd09))/0x1*(-parseInt(_0x2eaac5(0x13b))/0x2)+parseInt(_0x2eaac5(0x11e))/0x3+parseInt(_0x2eaac5(_0x3e1421._0x4cddfe))/0x4*(-parseInt(_0x2eaac5(0x14c))/0x5)+-parseInt(_0x2eaac5(0x117))/0x6*(parseInt(_0x2eaac5(_0x3e1421._0x752b99))/0x7)+-parseInt(_0x2eaac5(0x143))/0x8+parseInt(_0x2eaac5(_0x3e1421._0x468bea))/0x9+parseInt(_0x2eaac5(_0x3e1421._0x4a3353))/0xa;if(_0x1c02ac===_0x3fe266)break;else _0x41e487['push'](_0x41e487['shift']());}catch(_0x59f838){_0x41e487['push'](_0x41e487['shift']());}}}(_0x1737,0x7cdd8));var __defProp=Object[_0x4b2829(0x16b)],__name=(_0x3b52db,_0x46ae7d)=>__defProp(_0x3b52db,_0x4b2829(0x12a),{'value':_0x46ae7d,'configurable':!![]});import{z as _0x3a0701}from'zod';import{z}from'zod';import{levenshteinDistance}from'@unotest/core';var MAX_EDITS=0x2;function closestKey(_0x353e51,_0x1d3c5a){var _0x4b920e={_0x1f8338:0x124,_0x4ddd9c:0x14b},_0x1f2edf=_0x4b2829;let _0x46dc63;for(const _0x2a4370 of _0x1d3c5a){const _0x5c9ba1=levenshteinDistance(_0x353e51['toLowerCase'](),_0x2a4370['toLowerCase']());if(_0x5c9ba1>MAX_EDITS)continue;if(_0x46dc63===void 0x0||_0x5c9ba1<_0x46dc63[_0x1f2edf(_0x4b920e._0x1f8338)])_0x46dc63={'key':_0x2a4370,'distance':_0x5c9ba1};}return _0x46dc63?.[_0x1f2edf(_0x4b920e._0x4ddd9c)];}__name(closestKey,_0x4b2829(0x12b));function unknownKeyMessage(_0xa27254,_0x594b9a){var _0x77a463={_0x175e3f:0x120},_0x51c03f={_0x4de527:0x10c},_0x3f9221=_0x4b2829;return _0xa27254[_0x3f9221(0x11d)](_0x3d10b8=>{var _0x71c61=_0x3f9221;const _0x20e06e=closestKey(_0x3d10b8,_0x594b9a);return _0x20e06e===void 0x0?'unknown\x20key\x20\x22'+_0x3d10b8+_0x71c61(0x15f):_0x71c61(_0x51c03f._0x4de527)+_0x3d10b8+_0x71c61(0x168)+_0x20e06e+'\x22?';})[_0x3f9221(_0x77a463._0x175e3f)](';\x20');}__name(unknownKeyMessage,_0x4b2829(0x160));function strictObject(_0x57437e){var _0x59ca41={_0x14114c:0x11c},_0x24637b=_0x4b2829;const _0x1ddfac=Object[_0x24637b(0x127)](_0x57437e);return z['object'](_0x57437e,{'errorMap':__name((_0x482870,_0x3171b3)=>_0x482870['code']===z[_0x24637b(0x13f)][_0x24637b(0x166)]?{'message':unknownKeyMessage(_0x482870['keys'],_0x1ddfac)}:{'message':_0x3171b3[_0x24637b(0x162)]},'errorMap')})[_0x24637b(_0x59ca41._0x14114c)]();}__name(strictObject,_0x4b2829(0xfe));import{BUNDLED_BROWSER_CHANNEL}from'@unotest/protocol';function _0x181a(_0x601664,_0x1d53ae){_0x601664=_0x601664-0xfe;var _0x17374e=_0x1737();var _0x181acd=_0x17374e[_0x601664];if(_0x181a['hSriEP']===undefined){var _0x21db07=function(_0x4788fc){var _0x32150a='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';var _0x3a0701='',_0x30fe35='';for(var _0x3b52db=0x0,_0x46ae7d,_0x353e51,_0x1d3c5a=0x0;_0x353e51=_0x4788fc['charAt'](_0x1d3c5a++);~_0x353e51&&(_0x46ae7d=_0x3b52db%0x4?_0x46ae7d*0x40+_0x353e51:_0x353e51,_0x3b52db++%0x4)?_0x3a0701+=String['fromCharCode'](0xff&_0x46ae7d>>(-0x2*_0x3b52db&0x6)):0x0){_0x353e51=_0x32150a['indexOf'](_0x353e51);}for(var _0x46dc63=0x0,_0x2a4370=_0x3a0701['length'];_0x46dc63<_0x2a4370;_0x46dc63++){_0x30fe35+='%'+('00'+_0x3a0701['charCodeAt'](_0x46dc63)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x30fe35);};_0x181a['TkzsMM']=_0x21db07,_0x181a['dXnifj']={},_0x181a['hSriEP']=!![];}var _0x2d2957=_0x17374e[0x0],_0x2cd111=_0x601664+_0x2d2957,_0x1ad96d=_0x181a['dXnifj'][_0x2cd111];return!_0x1ad96d?(_0x181acd=_0x181a['TkzsMM'](_0x181acd),_0x181a['dXnifj'][_0x2cd111]=_0x181acd):_0x181acd=_0x1ad96d,_0x181acd;}import{z as _0x30fe35}from'zod';function _0x1737(){var _0x31a7f0=['igLZigfSCMvHzhKGyw5VDgHLCIbZzxj2zxiNCYdIGjqGzwfJAcbZzxj2zxiGBMvLzhmGAxrZig93BIbYzwfKAw5LC3mGvvjmlG','BgLUDdPSzwDHy3KTBgf5B3v0','C3rYAw5N','zM9YrwfJAa','Dw5RBM93BIbRzxKGiG','BgLUDdPZy2vUyxjPBY1PBI1YB290','CMvKywn0zwq','DxjS','C3rKAw8','Cg9ZAxrPDMu','BgLUDdPVyMz1C2nHDgvKlwnSyxnZ','yxjYyxK','BgLUDdPNB3rVlwnVBMnHDa','BNvSBa','BgLUDdPZzxqTDgvZDc10Aw1LB3v0lw91DhnPzguTDgvZDa','ntiYndm4ELjly1nn','DMfSAwrHDg9YoM1LDgeTC2HHCgu','BNvTyMvY','BgLUDdPYzwDLEc1PBNzHBgLK','y2HYB21L','C3rYAwn0','BwfW','mtqZnZKWowPjDufcra','zgLZBwLZCW','AM9PBG','nZDxvvv4sxq','yM9VBgvHBG','DMfSAwrHDg9YoMLMlxnOyxbL','zgLZDgfUy2u','DMfSAwrHDg9YoNnLBwfUDgLJlwXVC3m','zMLYzwzVEa','A2v5CW','lNvUB3rLC3qVzMfPBhvYzxm','D2fYBG','BMfTzq','y2XVC2vZDeTLEq','BgLUDdPLBNyTAg9ZDc1MCM9TlwjHC2u','D2vIu2vYDMvYwW','zw4Tvvm','DhjHBNnPzw50','mZK3ntCYD2PQCNPr','Dw5VDgvZDc9LmMu','DMfSAwrHDg9YoNn0zxaTC2HHCgu','ody3ndnJwhjWwLm','nZi5mdm2qvHuywLL','CgvYlxrLC3q','ywrK','y3jHC2G','DMfSAwrHDg9YoNn0CMLUzY1JB25Jyxq','zxjYB3i','y2HYB21LlwjLDge','mtrTq2XbrNC','DMfSAwrHDg9YoNvUC3vWCg9YDgvKlwv4ChjLC3nPB24','BgLUDdP4Cgf0Aa','zw51Bq','wM9KsxnZDwvdB2rL','B3b0Aw9UywW','Bwf4','DhjHBNnMB3jT','mtK3mJmYmg5Tq2Drva','zgvMyxvSDa','BwfUDwfS','AxnbCNjHEq','DMLLD3bVCNq','Dw5RBM93BIb0Aw1LihPVBMuGiG','CMvJB3jK','DMfSAwrHDg9YoNDYyxbWzwqTzM9YBwf0','A2v5','nuz2yNDotG','BgLUDdPTDxn0ywnOzs1PBI1KC2W','y2HYB21PDw0','BgLUDdPWyxvZzs1LEhbSAwnPDa','mtG2mJa3odblyxzcwfe','BgLUDdPSAw50lw9Rlw1PC3nPBMCTCMvHC29U','BgLUDdPKAxnHBwjPzY1IEs1PBMrLEa','y3vZDg9T','BgvUz3rO','zNvSBa','BgLUDdPYB2XLlxvUA25VD24TB3b0Aw9U','DMfSAwrHDg9YoMfYzY1RAw5K','C3vWzxjszwzPBMu','DMfSAwrHDg9YoMzVCI1ZAgfWzq','AxnuAw1LwM9Uzq','z2v0q2fUB25Py2fStg9JywXLCW','ywnJzxb0','rgf0zvrPBwvgB3jTyxq','BMv0D29YAW','iIdIGjqGBM90igeGy29UzMLNigTLEtSGy2HLy2SGEw91CIbaDw5VDgvZDc93zwiGDMvYC2LVBIbPzIbPDcbJB21LCYbMCM9TigeGBMv3zxiGCMvSzwfZzq','Dw5RBM93BKTLEu1LC3nHz2u','AgfZ','zgvMyxvSDevYCM9Y','BgLUDdPKzwvWlwnZCW','BgL0zxjHBa','BxnLzgDL','Dw5YzwnVz25PEMvKx2TLExm','igTLzxbZihrOzsbYzwfSigjYB3DZzxiGD2LUzg93lcbHBMqGzgv2AwnLici','iIdIGjqGzgLKihLVDsbTzwfUici','BgLUDdPMBg93lxjLDhvYBNmTDMfSDwu','DMfSAwrHDg9YoMXPC3qTyxjN','zgvMAw5LuhjVCgvYDhK','BNvSBgfIBgu','DMfSAwrHDg9YoNvUC3vWCg9YDgvKlxn0yxrLBwvUDa','Aw50','BgLUDdPZA2LWlw91DhnPzguTDgvZDa','B2zM','DMLLD3bVCNq6ig51BgW','BwLU','Dw5PB24','C3rYAwn0t2jQzwn0','DMfSAwrHDg9YoMfYAxr5','zgv2AwnL','DMfSAwrHDg9YoMz1BMn0Aw9UlxnOyxbL','D2vIA2L0','iIbZzxrZigL0CYbVD24GC2L6zsbHBMqGC2nHBguG4OcuigrYB3aGB25Lig9MihrOzw0U','AxnmB2nHBgu','CMvMAw5L','DMfSAwrHDg9YoNn0zxaTy292zxjHz2u','BgLUDdPHCgKTy2fSBc1MAwXLlwjVzhK'];_0x1737=function(){return _0x31a7f0;};return _0x1737();}import{UnotestError}from'@unotest/core';var LaunchConfigSchema=_0x30fe35['object']({'userDataDir':_0x30fe35[_0x4b2829(0x10a)]()[_0x4b2829(0x172)](0x1)['optional'](),'profile':_0x30fe35[_0x4b2829(0x164)](_0x4b2829(0x135))[_0x4b2829(0x140)](),'args':_0x30fe35[_0x4b2829(0x113)](_0x30fe35[_0x4b2829(0x10a)]()[_0x4b2829(0x172)](0x1))[_0x4b2829(0x140)]()})['strict'](),BrowserSchema=_0x3a0701[_0x4b2829(0x13e)]([_0x4b2829(0x14e),_0x4b2829(0x126),_0x4b2829(0x102)]),SYSTEM_BROWSER_CHANNELS=[_0x4b2829(0x11b),_0x4b2829(0x165),_0x4b2829(0x13a),'chromium'],BROWSER_CHANNEL_WORDS=[...SYSTEM_BROWSER_CHANNELS,BUNDLED_BROWSER_CHANNEL],BrowserChannelSchema=_0x3a0701['union']([_0x3a0701['enum'](SYSTEM_BROWSER_CHANNELS),_0x3a0701[_0x4b2829(0x164)](BUNDLED_BROWSER_CHANNEL)['transform'](()=>null),_0x3a0701[_0x4b2829(0x115)]()])['optional'](),ViewportSchema=strictObject({'width':_0x3a0701['number']()['int']()[_0x4b2829(0x111)]()[_0x4b2829(0x140)](),'height':_0x3a0701[_0x4b2829(0x119)]()['int']()['positive']()[_0x4b2829(0x140)](),'deviceScaleFactor':_0x3a0701['number']()[_0x4b2829(0x111)]()[_0x4b2829(0x140)]()}),ConfigViewportSchema=ViewportSchema[_0x4b2829(0x16c)]();function viewportDeviceConflict(_0x2539dd,_0x2ed50c,_0x476cdc=_0x4b2829(0x171)){var _0x31661f={_0x1688b0:0x167,_0x331759:0x103},_0x2ae083=_0x4b2829;if(_0x2539dd!==null||_0x2ed50c===void 0x0)return void 0x0;return _0x476cdc+_0x2ae083(_0x31661f._0x1688b0)+_0x2ed50c+_0x2ae083(_0x31661f._0x331759);}__name(viewportDeviceConflict,'viewportDeviceConflict');var RetryReasonSchema=_0x3a0701[_0x4b2829(0x13e)]([_0x4b2829(0x12f),_0x4b2829(0x15e),_0x4b2829(0x137)]),RetryConfigSchema=strictObject({'count':_0x3a0701[_0x4b2829(0x119)]()[_0x4b2829(0x16e)]()['min'](0x0)[_0x4b2829(0x141)](0xa),'on':_0x3a0701[_0x4b2829(0x113)](RetryReasonSchema)}),FailureBundleConfigSchema=strictObject({'tier1':_0x3a0701[_0x4b2829(0x164)](!![])[_0x4b2829(0x144)](!![]),'tier2':_0x3a0701['boolean'](),'tier3':strictObject({'network':_0x3a0701['boolean'](),'video':_0x3a0701[_0x4b2829(0x122)]()}),'retention':strictObject({'runs':_0x3a0701['number']()[_0x4b2829(0x16e)]()[_0x4b2829(0x111)](),'days':_0x3a0701['number']()[_0x4b2829(0x16e)]()[_0x4b2829(0x111)]()}),'storageDir':_0x3a0701['string']()[_0x4b2829(0x172)](0x1),'pageHtml':_0x3a0701[_0x4b2829(0x13e)]([_0x4b2829(0x10e),_0x4b2829(0x155)])}),DialogPolicySchema=_0x3a0701[_0x4b2829(0x13e)]([_0x4b2829(0x15c),_0x4b2829(0x11f),_0x4b2829(0x145)]),LinterRuleIdSchema=_0x3a0701[_0x4b2829(0x13e)]([_0x4b2829(0x163),_0x4b2829(0x13d),_0x4b2829(0x112),_0x4b2829(0x14f),_0x4b2829(0x152),'lint:evaluate-discouraged',_0x4b2829(0x10d),_0x4b2829(0x14d),_0x4b2829(0x114),_0x4b2829(0x11a),'lint:echo-assert',_0x4b2829(0x107),_0x4b2829(0x151),_0x4b2829(0x169),_0x4b2829(0x109),'lint:external-variable-undeclared',_0x4b2829(0x12c),'lint:one-test-per-file','lint:shadows-dsl-function',_0x4b2829(0x16f),_0x4b2829(0x116),'lint:filter-unknown-option',_0x4b2829(0x156),'validator:unknown-function',_0x4b2829(0xff),_0x4b2829(0x157),_0x4b2829(0x106),_0x4b2829(0x132),_0x4b2829(0x118),_0x4b2829(0x101),_0x4b2829(0x159),_0x4b2829(0x123),'validator:var-shape',_0x4b2829(0x16d),_0x4b2829(0x13c),_0x4b2829(0x138),_0x4b2829(0x125),_0x4b2829(0x16a),_0x4b2829(0x14a)]),LinterSeveritySchema=_0x3a0701[_0x4b2829(0x13e)](['off',_0x4b2829(0x129),_0x4b2829(0x139)]),LinterConfigSchema=strictObject({'enabled':_0x3a0701['boolean'](),'rules':_0x3a0701[_0x4b2829(0x149)](LinterRuleIdSchema,LinterSeveritySchema)}),QueueConfigSchema=strictObject({'enabled':_0x3a0701[_0x4b2829(0x122)]()[_0x4b2829(0x144)](!![]),'concurrency':_0x3a0701['number']()[_0x4b2829(0x16e)]()[_0x4b2829(0x111)]()[_0x4b2829(0x144)](0x1)}),ScheduleSchema=strictObject({'collection':_0x3a0701[_0x4b2829(0x10a)]()['min'](0x1),'cron':_0x3a0701[_0x4b2829(0x10a)]()[_0x4b2829(0x172)](0x1),'env':_0x3a0701['string']()[_0x4b2829(0x172)](0x1)['optional'](),'prepare':_0x3a0701[_0x4b2829(0x10a)]()[_0x4b2829(0x172)](0x1)[_0x4b2829(0x140)]()}),McpConfigSchema=strictObject({'transport':_0x3a0701['literal'](_0x4b2829(0x110))}),SandboxConfigSchema=strictObject({'shellCwd':_0x3a0701['string']()['optional'](),'shellTimeoutMs':_0x3a0701['number']()['int']()[_0x4b2829(0x111)]()['optional'](),'exportSecrets':_0x3a0701['array'](_0x3a0701['string']())['optional'](),'database':_0x3a0701['string']()[_0x4b2829(0x140)](),'apiBaseUrl':_0x3a0701['string']()[_0x4b2829(0x10f)]()[_0x4b2829(0x140)](),'uploadDir':_0x3a0701['string']()[_0x4b2829(0x140)](),'readRoots':_0x3a0701[_0x4b2829(0x113)](_0x3a0701[_0x4b2829(0x10a)]()[_0x4b2829(0x172)](0x1))[_0x4b2829(0x140)]()}),WebServerConfigSchema=strictObject({'command':_0x3a0701[_0x4b2829(0x10a)]()[_0x4b2829(0x172)](0x1),'url':_0x3a0701[_0x4b2829(0x10a)]()[_0x4b2829(0x10f)](),'reuseExistingServer':_0x3a0701[_0x4b2829(0x122)]()[_0x4b2829(0x144)](!![]),'timeoutMs':_0x3a0701['number']()[_0x4b2829(0x16e)]()[_0x4b2829(0x111)]()[_0x4b2829(0x144)](0xea60)}),WebServersConfigSchema=_0x3a0701[_0x4b2829(0x173)]([WebServerConfigSchema,_0x3a0701[_0x4b2829(0x113)](WebServerConfigSchema)[_0x4b2829(0x172)](0x1)])[_0x4b2829(0x142)](_0x260f05=>Array[_0x4b2829(0x146)](_0x260f05)?_0x260f05:[_0x260f05])['superRefine']((_0x2c84b2,_0x263d55)=>{var _0x2449d5={_0x19ea64:0x10b},_0x2f1afb={_0x50f79c:0x161,_0x430889:0x13f,_0xf2de18:0x10f,_0x17b590:0x10f},_0x380746=_0x4b2829;const _0x42cf7f=new Set();_0x2c84b2[_0x380746(_0x2449d5._0x19ea64)]((_0x35af51,_0x4fdecf)=>{var _0x50cacc=_0x380746;_0x42cf7f[_0x50cacc(_0x2f1afb._0x50f79c)](_0x35af51[_0x50cacc(0x10f)])&&_0x263d55['addIssue']({'code':_0x3a0701[_0x50cacc(_0x2f1afb._0x430889)][_0x50cacc(0x153)],'path':[_0x4fdecf,_0x50cacc(_0x2f1afb._0xf2de18)],'message':_0x50cacc(0x12d)+_0x4fdecf+'].url\x20'+_0x35af51[_0x50cacc(_0x2f1afb._0x17b590)]+_0x50cacc(0x108)}),_0x42cf7f[_0x50cacc(0x136)](_0x35af51[_0x50cacc(0x10f)]);});}),EnvConfigSchema=strictObject({'shared':_0x3a0701[_0x4b2829(0x113)](_0x3a0701['string']())[_0x4b2829(0x144)]([])}),UnotestConfigSchema=strictObject({'baseUrl':_0x3a0701['string']()['url']()[_0x4b2829(0x140)](),'webServer':WebServersConfigSchema[_0x4b2829(0x140)](),'generate':_0x3a0701[_0x4b2829(0x10a)]()[_0x4b2829(0x172)](0x1)[_0x4b2829(0x140)](),'browsers':_0x3a0701[_0x4b2829(0x113)](BrowserSchema)['min'](0x1),'channel':BrowserChannelSchema,'viewport':ConfigViewportSchema[_0x4b2829(0x140)](),'device':_0x3a0701[_0x4b2829(0x10a)]()[_0x4b2829(0x172)](0x1)[_0x4b2829(0x140)](),'timezone':_0x3a0701[_0x4b2829(0x10a)]()[_0x4b2829(0x105)](isTimeZone,_0x33e6e2=>({'message':_0x4b2829(0x148)+_0x33e6e2+'\x22\x20—\x20expected\x20an\x20IANA\x20name\x20such\x20as\x20\x22Europe/Madrid\x22'}))[_0x4b2829(0x140)](),'locale':_0x3a0701[_0x4b2829(0x10a)]()[_0x4b2829(0x105)](isLocale,_0x5dfb28=>({'message':'invalid\x20locale\x20\x22'+_0x5dfb28+'\x22\x20—\x20expected\x20a\x20BCP\x2047\x20tag\x20such\x20as\x20\x22es-ES\x22'}))[_0x4b2829(0x140)](),'maxContexts':_0x3a0701[_0x4b2829(0x119)]()[_0x4b2829(0x16e)]()['positive']()['optional'](),'launch':LaunchConfigSchema[_0x4b2829(0x140)](),'retry':RetryConfigSchema,'failureBundle':FailureBundleConfigSchema,'dialogPolicy':DialogPolicySchema,'storageState':_0x3a0701[_0x4b2829(0x10a)]()[_0x4b2829(0x140)](),'testDir':_0x3a0701['string']()[_0x4b2829(0x172)](0x1),'helpersDir':_0x3a0701[_0x4b2829(0x10a)]()[_0x4b2829(0x172)](0x1),'defaultTimeoutMs':_0x3a0701['number']()[_0x4b2829(0x16e)]()[_0x4b2829(0x111)](),'defaultNavigationTimeoutMs':_0x3a0701[_0x4b2829(0x119)]()['int']()[_0x4b2829(0x111)](),'teardownTimeoutMs':_0x3a0701[_0x4b2829(0x119)]()[_0x4b2829(0x16e)]()[_0x4b2829(0x111)]()['optional'](),'testTimeoutMs':_0x3a0701['number']()[_0x4b2829(0x16e)]()['positive']()['optional'](),'env':EnvConfigSchema,'linter':LinterConfigSchema,'mcp':McpConfigSchema,'queue':QueueConfigSchema,'schedules':_0x3a0701[_0x4b2829(0x113)](ScheduleSchema)[_0x4b2829(0x144)]([]),'sandbox':SandboxConfigSchema})[_0x4b2829(0x158)]((_0x20a25a,_0x53f946)=>{var _0x2700ff={_0x2d94b0:0x147,_0x320ebd:0x100,_0x37c6ed:0x13f,_0x549a0d:0x147},_0x577dc0=_0x4b2829;const _0x5b8163=viewportDeviceConflict(_0x20a25a[_0x577dc0(_0x2700ff._0x2d94b0)],_0x20a25a[_0x577dc0(_0x2700ff._0x320ebd)]);_0x5b8163!==void 0x0&&_0x53f946['addIssue']({'code':_0x3a0701[_0x577dc0(_0x2700ff._0x37c6ed)][_0x577dc0(0x153)],'path':[_0x577dc0(_0x2700ff._0x549a0d)],'message':_0x5b8163});});function isTimeZone(_0x450fd3){var _0x2b787c={_0x57e30e:0x154},_0x4a35f4=_0x4b2829;try{return new Intl[(_0x4a35f4(0x15d))](_0x4a35f4(0x12e),{'timeZone':_0x450fd3}),_0x450fd3[_0x4a35f4(_0x2b787c._0x57e30e)]>0x0;}catch{return![];}}__name(isTimeZone,_0x4b2829(0x15a));function isLocale(_0x4b4fa0){var _0x3e9517={_0x4b48a9:0x15b},_0x133045=_0x4b2829;try{return Intl[_0x133045(_0x3e9517._0x4b48a9)](_0x4b4fa0)[_0x133045(0x154)]===0x1;}catch{return![];}}__name(isLocale,_0x4b2829(0x104));var DEFAULT_CONFIG={'browsers':[_0x4b2829(0x14e)],'retry':{'count':0x0,'on':[_0x4b2829(0x12f)]},'failureBundle':{'tier1':!![],'tier2':!![],'tier3':{'network':![],'video':![]},'retention':{'runs':0x14,'days':0x7},'storageDir':_0x4b2829(0x128),'pageHtml':'redacted'},'dialogPolicy':_0x4b2829(0x15c),'testDir':_0x4b2829(0x131),'helpersDir':'unotest/e2e/_helpers','defaultTimeoutMs':0xbb8,'defaultNavigationTimeoutMs':0x7530,'linter':{'enabled':!![],'rules':{'lint:deep-css':_0x4b2829(0x129),'lint:xpath':_0x4b2829(0x129),'lint:obfuscated-class':'warn','lint:pause-explicit':'warn','lint:disambig-by-index':_0x4b2829(0x170),'lint:evaluate-discouraged':_0x4b2829(0x129),'lint:scenario-in-root':_0x4b2829(0x139),'lint:mustache-in-dsl':_0x4b2829(0x139),'lint:goto-concat':'warn','lint:regex-invalid':_0x4b2829(0x139),'lint:echo-assert':'warn','lint:lint-ok-missing-reason':_0x4b2829(0x129),'lint:flow-returns-value':_0x4b2829(0x129),'lint:legacy-layout':_0x4b2829(0x129),'lint:external-variable-undeclared':_0x4b2829(0x139),'lint:env-host-from-base':_0x4b2829(0x139),'lint:one-test-per-file':_0x4b2829(0x129),'lint:shadows-dsl-function':_0x4b2829(0x129),'lint:skip-outside-test':_0x4b2829(0x139),'lint:set-test-timeout-outside-test':'error','lint:filter-unknown-option':'error','lint:role-unknown-option':'error','validator:unknown-function':_0x4b2829(0x139)}},'env':{'shared':[]},'mcp':{'transport':'stdio'},'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,WebServersConfigSchema,viewportDeviceConflict};
@@ -1,5 +1,5 @@
1
- import { B as BoundingBox, I as ImageSize, E as ElementHint, S as ScreenshotOptions, L as LocatorValue, C as CaptureFrame, a as CaptureRect, P as PageConsole, N as NetworkEntry, W as WebDriver, b as LaunchOptions, c as ContextOptions, D as DriverContext, A as AttachOptions } from '../interfaces-D5ePwBX6.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, j as PressOptions, R as ReloadOptions, k as SelectOptions, V as Viewport, l as ViewportSize, m as WaitOptions, n as WaitState } from '../interfaces-D5ePwBX6.js';
1
+ import { B as BoundingBox, I as ImageSize, E as ElementHint, S as ScreenshotOptions, L as LocatorValue, C as CaptureFrame, a as CaptureRect, P as PageConsole, N as NetworkEntry, W as WebDriver, b as LaunchOptions, c as ContextOptions, D as DriverContext, A as AttachOptions } from '../interfaces-mlRtu8mL.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, j as PressOptions, R as ReloadOptions, k as SelectOptions, V as Viewport, l as ViewportSize, m as WaitOptions, n as WaitState } from '../interfaces-mlRtu8mL.js';
3
3
  import '@unotest/protocol';
4
4
  import '../config/schema.js';
5
5
  import 'zod';