@unotest/web 0.45.0 → 0.47.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -42,10 +42,10 @@ declare const RetryConfigSchema: z.ZodObject<{
42
42
  on: z.ZodArray<z.ZodEnum<["transient", "network", "crash"]>, "many">;
43
43
  }, "strict", z.ZodTypeAny, {
44
44
  count: number;
45
- on: ("transient" | "network" | "crash")[];
45
+ on: ("network" | "transient" | "crash")[];
46
46
  }, {
47
47
  count: number;
48
- on: ("transient" | "network" | "crash")[];
48
+ on: ("network" | "transient" | "crash")[];
49
49
  }>;
50
50
  type RetryConfig = z.infer<typeof RetryConfigSchema>;
51
51
  declare const FailureBundleConfigSchema: z.ZodObject<{
@@ -109,19 +109,19 @@ declare const FailureBundleConfigSchema: z.ZodObject<{
109
109
  type FailureBundleConfig = z.infer<typeof FailureBundleConfigSchema>;
110
110
  declare const DialogPolicySchema: z.ZodEnum<["accept", "dismiss", "manual"]>;
111
111
  type DialogPolicy = z.infer<typeof DialogPolicySchema>;
112
- 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", "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"]>;
112
+ 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", "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"]>;
113
113
  type LinterRuleId = z.infer<typeof LinterRuleIdSchema>;
114
114
  declare const LinterSeveritySchema: z.ZodEnum<["off", "warn", "error"]>;
115
115
  type LinterSeverity = z.infer<typeof LinterSeveritySchema>;
116
116
  declare const LinterConfigSchema: z.ZodObject<{
117
117
  enabled: z.ZodBoolean;
118
- 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", "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"]>>;
118
+ 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", "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"]>>;
119
119
  }, "strict", z.ZodTypeAny, {
120
120
  enabled: boolean;
121
- 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">>;
121
+ rules: Partial<Record<"lint:deep-css" | "lint:xpath" | "lint:obfuscated-class" | "lint:pause-explicit" | "lint:disambig-by-index" | "lint:evaluate-discouraged" | "lint:scenario-in-root" | "lint:mustache-in-dsl" | "lint:goto-concat" | "lint:regex-invalid" | "lint:echo-assert" | "lint:api-call-file-body" | "lint:lint-ok-missing-reason" | "lint:flow-returns-value" | "lint:legacy-layout" | "lint:external-variable-undeclared" | "lint:env-host-from-base" | "lint:one-test-per-file" | "lint:shadows-dsl-function" | "lint:skip-outside-test" | "lint:set-test-timeout-outside-test" | "validator:unknown-function" | "validator:arity" | "validator:arg-kind" | "validator:step-coverage" | "validator:step-shape" | "validator:meta-shape" | "validator:function-shape" | "validator:for-shape" | "validator:if-shape" | "validator:var-shape" | "validator:unsupported-statement" | "validator:unsupported-expression" | "validator:string-concat" | "validator:semantic-loss" | "validator:list-arg" | "validator:wrapped-format", "off" | "warn" | "error">>;
122
122
  }, {
123
123
  enabled: boolean;
124
- 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">>;
124
+ rules: Partial<Record<"lint:deep-css" | "lint:xpath" | "lint:obfuscated-class" | "lint:pause-explicit" | "lint:disambig-by-index" | "lint:evaluate-discouraged" | "lint:scenario-in-root" | "lint:mustache-in-dsl" | "lint:goto-concat" | "lint:regex-invalid" | "lint:echo-assert" | "lint:api-call-file-body" | "lint:lint-ok-missing-reason" | "lint:flow-returns-value" | "lint:legacy-layout" | "lint:external-variable-undeclared" | "lint:env-host-from-base" | "lint:one-test-per-file" | "lint:shadows-dsl-function" | "lint:skip-outside-test" | "lint:set-test-timeout-outside-test" | "validator:unknown-function" | "validator:arity" | "validator:arg-kind" | "validator:step-coverage" | "validator:step-shape" | "validator:meta-shape" | "validator:function-shape" | "validator:for-shape" | "validator:if-shape" | "validator:var-shape" | "validator:unsupported-statement" | "validator:unsupported-expression" | "validator:string-concat" | "validator:semantic-loss" | "validator:list-arg" | "validator:wrapped-format", "off" | "warn" | "error">>;
125
125
  }>;
126
126
  type LinterConfig = z.infer<typeof LinterConfigSchema>;
127
127
  declare const QueueConfigSchema: z.ZodObject<{
@@ -201,6 +201,11 @@ declare const SandboxConfigSchema: z.ZodObject<{
201
201
  * against it and may not escape it. Defaults to the project root
202
202
  * (the runner's cwd). */
203
203
  uploadDir: z.ZodOptional<z.ZodString>;
204
+ /** More directories a scenario may read files from, beside the project
205
+ * and the run's downloads: `readFile`, `waitForFile` and the other file
206
+ * oracles. For a file a background process writes outside the project.
207
+ * Relative entries resolve against `shellCwd`. */
208
+ readRoots: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
204
209
  }, "strict", z.ZodTypeAny, {
205
210
  shellCwd?: string | undefined;
206
211
  shellTimeoutMs?: number | undefined;
@@ -208,6 +213,7 @@ declare const SandboxConfigSchema: z.ZodObject<{
208
213
  database?: string | undefined;
209
214
  apiBaseUrl?: string | undefined;
210
215
  uploadDir?: string | undefined;
216
+ readRoots?: string[] | undefined;
211
217
  }, {
212
218
  shellCwd?: string | undefined;
213
219
  shellTimeoutMs?: number | undefined;
@@ -215,6 +221,7 @@ declare const SandboxConfigSchema: z.ZodObject<{
215
221
  database?: string | undefined;
216
222
  apiBaseUrl?: string | undefined;
217
223
  uploadDir?: string | undefined;
224
+ readRoots?: string[] | undefined;
218
225
  }>;
219
226
  type SandboxConfig = z.infer<typeof SandboxConfigSchema>;
220
227
  declare const WebServerConfigSchema: z.ZodObject<{
@@ -234,17 +241,104 @@ declare const WebServerConfigSchema: z.ZodObject<{
234
241
  /** How long to wait for the URL to come up after spawning. */
235
242
  timeoutMs: z.ZodDefault<z.ZodNumber>;
236
243
  }, "strict", z.ZodTypeAny, {
244
+ url: string;
245
+ timeoutMs: number;
237
246
  command: string;
247
+ reuseExistingServer: boolean;
248
+ }, {
238
249
  url: string;
250
+ command: string;
251
+ timeoutMs?: number | undefined;
252
+ reuseExistingServer?: boolean | undefined;
253
+ }>;
254
+ type WebServerConfig = z.infer<typeof WebServerConfigSchema>;
255
+ /** `webServer`: one server, or several (a front and its fake backends),
256
+ * each with its own readiness URL. Always a list once parsed, so no
257
+ * consumer asks which form it got. Two entries on one URL would probe
258
+ * the same server twice and start neither for sure — refused. */
259
+ declare const WebServersConfigSchema: z.ZodEffects<z.ZodEffects<z.ZodUnion<[z.ZodObject<{
260
+ /** Shell command that starts the app under test (`npm run dev`,
261
+ * `python manage.py runserver`, …). Runs in the user's shell from the
262
+ * project root. */
263
+ command: z.ZodString;
264
+ /** URL probed for readiness — any HTTP response counts as up. Usually
265
+ * equals `baseUrl`; declared explicitly because a dev server may
266
+ * answer on a different path/port than the tests navigate to. */
267
+ url: z.ZodString;
268
+ /** When the URL is already up, reuse that server instead of spawning a
269
+ * second one (default true — covers a dev server the user or the
270
+ * viewer already started). `false` makes an occupied URL an error,
271
+ * Playwright-style for CI strictness. */
272
+ reuseExistingServer: z.ZodDefault<z.ZodBoolean>;
273
+ /** How long to wait for the URL to come up after spawning. */
274
+ timeoutMs: z.ZodDefault<z.ZodNumber>;
275
+ }, "strict", z.ZodTypeAny, {
276
+ url: string;
277
+ timeoutMs: number;
278
+ command: string;
239
279
  reuseExistingServer: boolean;
280
+ }, {
281
+ url: string;
282
+ command: string;
283
+ timeoutMs?: number | undefined;
284
+ reuseExistingServer?: boolean | undefined;
285
+ }>, z.ZodArray<z.ZodObject<{
286
+ /** Shell command that starts the app under test (`npm run dev`,
287
+ * `python manage.py runserver`, …). Runs in the user's shell from the
288
+ * project root. */
289
+ command: z.ZodString;
290
+ /** URL probed for readiness — any HTTP response counts as up. Usually
291
+ * equals `baseUrl`; declared explicitly because a dev server may
292
+ * answer on a different path/port than the tests navigate to. */
293
+ url: z.ZodString;
294
+ /** When the URL is already up, reuse that server instead of spawning a
295
+ * second one (default true — covers a dev server the user or the
296
+ * viewer already started). `false` makes an occupied URL an error,
297
+ * Playwright-style for CI strictness. */
298
+ reuseExistingServer: z.ZodDefault<z.ZodBoolean>;
299
+ /** How long to wait for the URL to come up after spawning. */
300
+ timeoutMs: z.ZodDefault<z.ZodNumber>;
301
+ }, "strict", z.ZodTypeAny, {
302
+ url: string;
240
303
  timeoutMs: number;
304
+ command: string;
305
+ reuseExistingServer: boolean;
241
306
  }, {
307
+ url: string;
242
308
  command: string;
309
+ timeoutMs?: number | undefined;
310
+ reuseExistingServer?: boolean | undefined;
311
+ }>, "many">]>, {
243
312
  url: string;
313
+ timeoutMs: number;
314
+ command: string;
315
+ reuseExistingServer: boolean;
316
+ }[], {
317
+ url: string;
318
+ command: string;
319
+ timeoutMs?: number | undefined;
244
320
  reuseExistingServer?: boolean | undefined;
321
+ } | {
322
+ url: string;
323
+ command: string;
245
324
  timeoutMs?: number | undefined;
246
- }>;
247
- type WebServerConfig = z.infer<typeof WebServerConfigSchema>;
325
+ reuseExistingServer?: boolean | undefined;
326
+ }[]>, {
327
+ url: string;
328
+ timeoutMs: number;
329
+ command: string;
330
+ reuseExistingServer: boolean;
331
+ }[], {
332
+ url: string;
333
+ command: string;
334
+ timeoutMs?: number | undefined;
335
+ reuseExistingServer?: boolean | undefined;
336
+ } | {
337
+ url: string;
338
+ command: string;
339
+ timeoutMs?: number | undefined;
340
+ reuseExistingServer?: boolean | undefined;
341
+ }[]>;
248
342
  declare const EnvConfigSchema: z.ZodObject<{
249
343
  /** Variable names whose base `.env` value is deliberately shared by
250
344
  * every environment. Only names that become a HOST are checked, so
@@ -262,7 +356,7 @@ declare const UnotestConfigSchema: z.ZodEffects<z.ZodObject<{
262
356
  * is expected to be running already (current behaviour). When set, the
263
357
  * CLI ensures it per run; `npx @unotest/web app-server` / the viewer
264
358
  * hold a long-lived instance and runs then reuse it. */
265
- webServer: z.ZodOptional<z.ZodObject<{
359
+ webServer: z.ZodOptional<z.ZodEffects<z.ZodEffects<z.ZodUnion<[z.ZodObject<{
266
360
  /** Shell command that starts the app under test (`npm run dev`,
267
361
  * `python manage.py runserver`, …). Runs in the user's shell from the
268
362
  * project root. */
@@ -279,16 +373,72 @@ declare const UnotestConfigSchema: z.ZodEffects<z.ZodObject<{
279
373
  /** How long to wait for the URL to come up after spawning. */
280
374
  timeoutMs: z.ZodDefault<z.ZodNumber>;
281
375
  }, "strict", z.ZodTypeAny, {
282
- command: string;
283
376
  url: string;
377
+ timeoutMs: number;
378
+ command: string;
284
379
  reuseExistingServer: boolean;
380
+ }, {
381
+ url: string;
382
+ command: string;
383
+ timeoutMs?: number | undefined;
384
+ reuseExistingServer?: boolean | undefined;
385
+ }>, z.ZodArray<z.ZodObject<{
386
+ /** Shell command that starts the app under test (`npm run dev`,
387
+ * `python manage.py runserver`, …). Runs in the user's shell from the
388
+ * project root. */
389
+ command: z.ZodString;
390
+ /** URL probed for readiness — any HTTP response counts as up. Usually
391
+ * equals `baseUrl`; declared explicitly because a dev server may
392
+ * answer on a different path/port than the tests navigate to. */
393
+ url: z.ZodString;
394
+ /** When the URL is already up, reuse that server instead of spawning a
395
+ * second one (default true — covers a dev server the user or the
396
+ * viewer already started). `false` makes an occupied URL an error,
397
+ * Playwright-style for CI strictness. */
398
+ reuseExistingServer: z.ZodDefault<z.ZodBoolean>;
399
+ /** How long to wait for the URL to come up after spawning. */
400
+ timeoutMs: z.ZodDefault<z.ZodNumber>;
401
+ }, "strict", z.ZodTypeAny, {
402
+ url: string;
285
403
  timeoutMs: number;
404
+ command: string;
405
+ reuseExistingServer: boolean;
286
406
  }, {
407
+ url: string;
408
+ command: string;
409
+ timeoutMs?: number | undefined;
410
+ reuseExistingServer?: boolean | undefined;
411
+ }>, "many">]>, {
412
+ url: string;
413
+ timeoutMs: number;
414
+ command: string;
415
+ reuseExistingServer: boolean;
416
+ }[], {
417
+ url: string;
287
418
  command: string;
419
+ timeoutMs?: number | undefined;
420
+ reuseExistingServer?: boolean | undefined;
421
+ } | {
288
422
  url: string;
423
+ command: string;
424
+ timeoutMs?: number | undefined;
289
425
  reuseExistingServer?: boolean | undefined;
426
+ }[]>, {
427
+ url: string;
428
+ timeoutMs: number;
429
+ command: string;
430
+ reuseExistingServer: boolean;
431
+ }[], {
432
+ url: string;
433
+ command: string;
290
434
  timeoutMs?: number | undefined;
291
- }>>;
435
+ reuseExistingServer?: boolean | undefined;
436
+ } | {
437
+ url: string;
438
+ command: string;
439
+ timeoutMs?: number | undefined;
440
+ reuseExistingServer?: boolean | undefined;
441
+ }[]>>;
292
442
  browsers: z.ZodArray<z.ZodEnum<["chromium", "firefox", "webkit"]>, "many">;
293
443
  channel: z.ZodOptional<z.ZodUnion<[z.ZodEnum<["chrome", "msedge", "chrome-beta", "chromium"]>, z.ZodEffects<z.ZodLiteral<"bundled">, null, "bundled">, z.ZodNull]>>;
294
444
  viewport: z.ZodOptional<z.ZodNullable<z.ZodObject<{
@@ -329,23 +479,26 @@ declare const UnotestConfigSchema: z.ZodEffects<z.ZodObject<{
329
479
  * context per scenario. */
330
480
  launch: z.ZodOptional<z.ZodObject<{
331
481
  userDataDir: z.ZodOptional<z.ZodString>;
482
+ profile: z.ZodOptional<z.ZodLiteral<"per-test">>;
332
483
  args: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
333
484
  }, "strict", z.ZodTypeAny, {
334
- userDataDir?: string | undefined;
335
485
  args?: string[] | undefined;
336
- }, {
337
486
  userDataDir?: string | undefined;
487
+ profile?: "per-test" | undefined;
488
+ }, {
338
489
  args?: string[] | undefined;
490
+ userDataDir?: string | undefined;
491
+ profile?: "per-test" | undefined;
339
492
  }>>;
340
493
  retry: z.ZodObject<{
341
494
  count: z.ZodNumber;
342
495
  on: z.ZodArray<z.ZodEnum<["transient", "network", "crash"]>, "many">;
343
496
  }, "strict", z.ZodTypeAny, {
344
497
  count: number;
345
- on: ("transient" | "network" | "crash")[];
498
+ on: ("network" | "transient" | "crash")[];
346
499
  }, {
347
500
  count: number;
348
- on: ("transient" | "network" | "crash")[];
501
+ on: ("network" | "transient" | "crash")[];
349
502
  }>;
350
503
  failureBundle: z.ZodObject<{
351
504
  /** Tier 1 is always on by D-16. Schema lock — not user-toggleable. */
@@ -432,6 +585,11 @@ declare const UnotestConfigSchema: z.ZodEffects<z.ZodObject<{
432
585
  * Unset → 60000. A pass cut by it leaves the rest of the stand as the
433
586
  * test set it, and the run result says which blocks did not finish. */
434
587
  teardownTimeoutMs: z.ZodOptional<z.ZodNumber>;
588
+ /** Wall-clock budget of one test, a deadline: an action still running
589
+ * when it runs out is cut there and the test fails, its teardown blocks
590
+ * still play. Unset → 300000. `UNOTEST_MAX_DURATION_MS` overrides it for
591
+ * a run; `setTestTimeout(ms)` inside a test overrides both for that test. */
592
+ testTimeoutMs: z.ZodOptional<z.ZodNumber>;
435
593
  /** Cross-environment declarations (`.env.<name>` overlays). */
436
594
  env: z.ZodObject<{
437
595
  /** Variable names whose base `.env` value is deliberately shared by
@@ -445,13 +603,13 @@ declare const UnotestConfigSchema: z.ZodEffects<z.ZodObject<{
445
603
  }>;
446
604
  linter: z.ZodObject<{
447
605
  enabled: z.ZodBoolean;
448
- 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", "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"]>>;
606
+ 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", "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"]>>;
449
607
  }, "strict", z.ZodTypeAny, {
450
608
  enabled: boolean;
451
- 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">>;
609
+ rules: Partial<Record<"lint:deep-css" | "lint:xpath" | "lint:obfuscated-class" | "lint:pause-explicit" | "lint:disambig-by-index" | "lint:evaluate-discouraged" | "lint:scenario-in-root" | "lint:mustache-in-dsl" | "lint:goto-concat" | "lint:regex-invalid" | "lint:echo-assert" | "lint:api-call-file-body" | "lint:lint-ok-missing-reason" | "lint:flow-returns-value" | "lint:legacy-layout" | "lint:external-variable-undeclared" | "lint:env-host-from-base" | "lint:one-test-per-file" | "lint:shadows-dsl-function" | "lint:skip-outside-test" | "lint:set-test-timeout-outside-test" | "validator:unknown-function" | "validator:arity" | "validator:arg-kind" | "validator:step-coverage" | "validator:step-shape" | "validator:meta-shape" | "validator:function-shape" | "validator:for-shape" | "validator:if-shape" | "validator:var-shape" | "validator:unsupported-statement" | "validator:unsupported-expression" | "validator:string-concat" | "validator:semantic-loss" | "validator:list-arg" | "validator:wrapped-format", "off" | "warn" | "error">>;
452
610
  }, {
453
611
  enabled: boolean;
454
- 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">>;
612
+ rules: Partial<Record<"lint:deep-css" | "lint:xpath" | "lint:obfuscated-class" | "lint:pause-explicit" | "lint:disambig-by-index" | "lint:evaluate-discouraged" | "lint:scenario-in-root" | "lint:mustache-in-dsl" | "lint:goto-concat" | "lint:regex-invalid" | "lint:echo-assert" | "lint:api-call-file-body" | "lint:lint-ok-missing-reason" | "lint:flow-returns-value" | "lint:legacy-layout" | "lint:external-variable-undeclared" | "lint:env-host-from-base" | "lint:one-test-per-file" | "lint:shadows-dsl-function" | "lint:skip-outside-test" | "lint:set-test-timeout-outside-test" | "validator:unknown-function" | "validator:arity" | "validator:arg-kind" | "validator:step-coverage" | "validator:step-shape" | "validator:meta-shape" | "validator:function-shape" | "validator:for-shape" | "validator:if-shape" | "validator:var-shape" | "validator:unsupported-statement" | "validator:unsupported-expression" | "validator:string-concat" | "validator:semantic-loss" | "validator:list-arg" | "validator:wrapped-format", "off" | "warn" | "error">>;
455
613
  }>;
456
614
  mcp: z.ZodObject<{
457
615
  transport: z.ZodLiteral<"stdio">;
@@ -528,6 +686,11 @@ declare const UnotestConfigSchema: z.ZodEffects<z.ZodObject<{
528
686
  * against it and may not escape it. Defaults to the project root
529
687
  * (the runner's cwd). */
530
688
  uploadDir: z.ZodOptional<z.ZodString>;
689
+ /** More directories a scenario may read files from, beside the project
690
+ * and the run's downloads: `readFile`, `waitForFile` and the other file
691
+ * oracles. For a file a background process writes outside the project.
692
+ * Relative entries resolve against `shellCwd`. */
693
+ readRoots: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
531
694
  }, "strict", z.ZodTypeAny, {
532
695
  shellCwd?: string | undefined;
533
696
  shellTimeoutMs?: number | undefined;
@@ -535,6 +698,7 @@ declare const UnotestConfigSchema: z.ZodEffects<z.ZodObject<{
535
698
  database?: string | undefined;
536
699
  apiBaseUrl?: string | undefined;
537
700
  uploadDir?: string | undefined;
701
+ readRoots?: string[] | undefined;
538
702
  }, {
539
703
  shellCwd?: string | undefined;
540
704
  shellTimeoutMs?: number | undefined;
@@ -542,15 +706,15 @@ declare const UnotestConfigSchema: z.ZodEffects<z.ZodObject<{
542
706
  database?: string | undefined;
543
707
  apiBaseUrl?: string | undefined;
544
708
  uploadDir?: string | undefined;
709
+ readRoots?: string[] | undefined;
545
710
  }>;
546
711
  }, "strict", z.ZodTypeAny, {
547
- env: {
548
- shared: string[];
549
- };
712
+ defaultTimeoutMs: number;
713
+ defaultNavigationTimeoutMs: number;
550
714
  browsers: ("chromium" | "firefox" | "webkit")[];
551
715
  retry: {
552
716
  count: number;
553
- on: ("transient" | "network" | "crash")[];
717
+ on: ("network" | "transient" | "crash")[];
554
718
  };
555
719
  failureBundle: {
556
720
  tier1: true;
@@ -569,11 +733,12 @@ declare const UnotestConfigSchema: z.ZodEffects<z.ZodObject<{
569
733
  dialogPolicy: "accept" | "dismiss" | "manual";
570
734
  testDir: string;
571
735
  helpersDir: string;
572
- defaultTimeoutMs: number;
573
- defaultNavigationTimeoutMs: number;
736
+ env: {
737
+ shared: string[];
738
+ };
574
739
  linter: {
575
740
  enabled: boolean;
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">>;
741
+ rules: Partial<Record<"lint:deep-css" | "lint:xpath" | "lint:obfuscated-class" | "lint:pause-explicit" | "lint:disambig-by-index" | "lint:evaluate-discouraged" | "lint:scenario-in-root" | "lint:mustache-in-dsl" | "lint:goto-concat" | "lint:regex-invalid" | "lint:echo-assert" | "lint:api-call-file-body" | "lint:lint-ok-missing-reason" | "lint:flow-returns-value" | "lint:legacy-layout" | "lint:external-variable-undeclared" | "lint:env-host-from-base" | "lint:one-test-per-file" | "lint:shadows-dsl-function" | "lint:skip-outside-test" | "lint:set-test-timeout-outside-test" | "validator:unknown-function" | "validator:arity" | "validator:arg-kind" | "validator:step-coverage" | "validator:step-shape" | "validator:meta-shape" | "validator:function-shape" | "validator:for-shape" | "validator:if-shape" | "validator:var-shape" | "validator:unsupported-statement" | "validator:unsupported-expression" | "validator:string-concat" | "validator:semantic-loss" | "validator:list-arg" | "validator:wrapped-format", "off" | "warn" | "error">>;
577
742
  };
578
743
  mcp: {
579
744
  transport: "stdio";
@@ -595,38 +760,40 @@ declare const UnotestConfigSchema: z.ZodEffects<z.ZodObject<{
595
760
  database?: string | undefined;
596
761
  apiBaseUrl?: string | undefined;
597
762
  uploadDir?: string | undefined;
763
+ readRoots?: string[] | undefined;
598
764
  };
765
+ locale?: string | undefined;
766
+ timezone?: string | undefined;
767
+ testTimeoutMs?: number | undefined;
599
768
  baseUrl?: string | undefined;
600
769
  webServer?: {
601
- command: string;
602
770
  url: string;
603
- reuseExistingServer: boolean;
604
771
  timeoutMs: number;
605
- } | undefined;
606
- channel?: "chromium" | "chrome" | "msedge" | "chrome-beta" | null | undefined;
772
+ command: string;
773
+ reuseExistingServer: boolean;
774
+ }[] | undefined;
775
+ channel?: "chrome" | "msedge" | "chrome-beta" | "chromium" | null | undefined;
607
776
  viewport?: {
608
777
  width?: number | undefined;
609
778
  height?: number | undefined;
610
779
  deviceScaleFactor?: number | undefined;
611
780
  } | null | undefined;
612
781
  device?: string | undefined;
613
- timezone?: string | undefined;
614
- locale?: string | undefined;
615
782
  maxContexts?: number | undefined;
616
783
  launch?: {
617
- userDataDir?: string | undefined;
618
784
  args?: string[] | undefined;
785
+ userDataDir?: string | undefined;
786
+ profile?: "per-test" | undefined;
619
787
  } | undefined;
620
788
  storageState?: string | undefined;
621
789
  teardownTimeoutMs?: number | undefined;
622
790
  }, {
623
- env: {
624
- shared?: string[] | undefined;
625
- };
791
+ defaultTimeoutMs: number;
792
+ defaultNavigationTimeoutMs: number;
626
793
  browsers: ("chromium" | "firefox" | "webkit")[];
627
794
  retry: {
628
795
  count: number;
629
- on: ("transient" | "network" | "crash")[];
796
+ on: ("network" | "transient" | "crash")[];
630
797
  };
631
798
  failureBundle: {
632
799
  tier2: boolean;
@@ -645,11 +812,12 @@ declare const UnotestConfigSchema: z.ZodEffects<z.ZodObject<{
645
812
  dialogPolicy: "accept" | "dismiss" | "manual";
646
813
  testDir: string;
647
814
  helpersDir: string;
648
- defaultTimeoutMs: number;
649
- defaultNavigationTimeoutMs: number;
815
+ env: {
816
+ shared?: string[] | undefined;
817
+ };
650
818
  linter: {
651
819
  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">>;
820
+ rules: Partial<Record<"lint:deep-css" | "lint:xpath" | "lint:obfuscated-class" | "lint:pause-explicit" | "lint:disambig-by-index" | "lint:evaluate-discouraged" | "lint:scenario-in-root" | "lint:mustache-in-dsl" | "lint:goto-concat" | "lint:regex-invalid" | "lint:echo-assert" | "lint:api-call-file-body" | "lint:lint-ok-missing-reason" | "lint:flow-returns-value" | "lint:legacy-layout" | "lint:external-variable-undeclared" | "lint:env-host-from-base" | "lint:one-test-per-file" | "lint:shadows-dsl-function" | "lint:skip-outside-test" | "lint:set-test-timeout-outside-test" | "validator:unknown-function" | "validator:arity" | "validator:arg-kind" | "validator:step-coverage" | "validator:step-shape" | "validator:meta-shape" | "validator:function-shape" | "validator:for-shape" | "validator:if-shape" | "validator:var-shape" | "validator:unsupported-statement" | "validator:unsupported-expression" | "validator:string-concat" | "validator:semantic-loss" | "validator:list-arg" | "validator:wrapped-format", "off" | "warn" | "error">>;
653
821
  };
654
822
  mcp: {
655
823
  transport: "stdio";
@@ -665,27 +833,35 @@ declare const UnotestConfigSchema: z.ZodEffects<z.ZodObject<{
665
833
  database?: string | undefined;
666
834
  apiBaseUrl?: string | undefined;
667
835
  uploadDir?: string | undefined;
836
+ readRoots?: string[] | undefined;
668
837
  };
838
+ locale?: string | undefined;
839
+ timezone?: string | undefined;
840
+ testTimeoutMs?: number | undefined;
669
841
  baseUrl?: string | undefined;
670
842
  webServer?: {
671
- command: string;
672
843
  url: string;
844
+ command: string;
845
+ timeoutMs?: number | undefined;
673
846
  reuseExistingServer?: boolean | undefined;
847
+ } | {
848
+ url: string;
849
+ command: string;
674
850
  timeoutMs?: number | undefined;
675
- } | undefined;
676
- channel?: "chromium" | "chrome" | "msedge" | "chrome-beta" | "bundled" | null | undefined;
851
+ reuseExistingServer?: boolean | undefined;
852
+ }[] | undefined;
853
+ channel?: "chrome" | "msedge" | "chrome-beta" | "chromium" | "bundled" | null | undefined;
677
854
  viewport?: {
678
855
  width?: number | undefined;
679
856
  height?: number | undefined;
680
857
  deviceScaleFactor?: number | undefined;
681
858
  } | null | undefined;
682
859
  device?: string | undefined;
683
- timezone?: string | undefined;
684
- locale?: string | undefined;
685
860
  maxContexts?: number | undefined;
686
861
  launch?: {
687
- userDataDir?: string | undefined;
688
862
  args?: string[] | undefined;
863
+ userDataDir?: string | undefined;
864
+ profile?: "per-test" | undefined;
689
865
  } | undefined;
690
866
  storageState?: string | undefined;
691
867
  teardownTimeoutMs?: number | undefined;
@@ -696,13 +872,12 @@ declare const UnotestConfigSchema: z.ZodEffects<z.ZodObject<{
696
872
  prepare?: string | undefined;
697
873
  }[] | undefined;
698
874
  }>, {
699
- env: {
700
- shared: string[];
701
- };
875
+ defaultTimeoutMs: number;
876
+ defaultNavigationTimeoutMs: number;
702
877
  browsers: ("chromium" | "firefox" | "webkit")[];
703
878
  retry: {
704
879
  count: number;
705
- on: ("transient" | "network" | "crash")[];
880
+ on: ("network" | "transient" | "crash")[];
706
881
  };
707
882
  failureBundle: {
708
883
  tier1: true;
@@ -721,11 +896,12 @@ declare const UnotestConfigSchema: z.ZodEffects<z.ZodObject<{
721
896
  dialogPolicy: "accept" | "dismiss" | "manual";
722
897
  testDir: string;
723
898
  helpersDir: string;
724
- defaultTimeoutMs: number;
725
- defaultNavigationTimeoutMs: number;
899
+ env: {
900
+ shared: string[];
901
+ };
726
902
  linter: {
727
903
  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">>;
904
+ rules: Partial<Record<"lint:deep-css" | "lint:xpath" | "lint:obfuscated-class" | "lint:pause-explicit" | "lint:disambig-by-index" | "lint:evaluate-discouraged" | "lint:scenario-in-root" | "lint:mustache-in-dsl" | "lint:goto-concat" | "lint:regex-invalid" | "lint:echo-assert" | "lint:api-call-file-body" | "lint:lint-ok-missing-reason" | "lint:flow-returns-value" | "lint:legacy-layout" | "lint:external-variable-undeclared" | "lint:env-host-from-base" | "lint:one-test-per-file" | "lint:shadows-dsl-function" | "lint:skip-outside-test" | "lint:set-test-timeout-outside-test" | "validator:unknown-function" | "validator:arity" | "validator:arg-kind" | "validator:step-coverage" | "validator:step-shape" | "validator:meta-shape" | "validator:function-shape" | "validator:for-shape" | "validator:if-shape" | "validator:var-shape" | "validator:unsupported-statement" | "validator:unsupported-expression" | "validator:string-concat" | "validator:semantic-loss" | "validator:list-arg" | "validator:wrapped-format", "off" | "warn" | "error">>;
729
905
  };
730
906
  mcp: {
731
907
  transport: "stdio";
@@ -747,38 +923,40 @@ declare const UnotestConfigSchema: z.ZodEffects<z.ZodObject<{
747
923
  database?: string | undefined;
748
924
  apiBaseUrl?: string | undefined;
749
925
  uploadDir?: string | undefined;
926
+ readRoots?: string[] | undefined;
750
927
  };
928
+ locale?: string | undefined;
929
+ timezone?: string | undefined;
930
+ testTimeoutMs?: number | undefined;
751
931
  baseUrl?: string | undefined;
752
932
  webServer?: {
753
- command: string;
754
933
  url: string;
755
- reuseExistingServer: boolean;
756
934
  timeoutMs: number;
757
- } | undefined;
758
- channel?: "chromium" | "chrome" | "msedge" | "chrome-beta" | null | undefined;
935
+ command: string;
936
+ reuseExistingServer: boolean;
937
+ }[] | undefined;
938
+ channel?: "chrome" | "msedge" | "chrome-beta" | "chromium" | null | undefined;
759
939
  viewport?: {
760
940
  width?: number | undefined;
761
941
  height?: number | undefined;
762
942
  deviceScaleFactor?: number | undefined;
763
943
  } | null | undefined;
764
944
  device?: string | undefined;
765
- timezone?: string | undefined;
766
- locale?: string | undefined;
767
945
  maxContexts?: number | undefined;
768
946
  launch?: {
769
- userDataDir?: string | undefined;
770
947
  args?: string[] | undefined;
948
+ userDataDir?: string | undefined;
949
+ profile?: "per-test" | undefined;
771
950
  } | undefined;
772
951
  storageState?: string | undefined;
773
952
  teardownTimeoutMs?: number | undefined;
774
953
  }, {
775
- env: {
776
- shared?: string[] | undefined;
777
- };
954
+ defaultTimeoutMs: number;
955
+ defaultNavigationTimeoutMs: number;
778
956
  browsers: ("chromium" | "firefox" | "webkit")[];
779
957
  retry: {
780
958
  count: number;
781
- on: ("transient" | "network" | "crash")[];
959
+ on: ("network" | "transient" | "crash")[];
782
960
  };
783
961
  failureBundle: {
784
962
  tier2: boolean;
@@ -797,11 +975,12 @@ declare const UnotestConfigSchema: z.ZodEffects<z.ZodObject<{
797
975
  dialogPolicy: "accept" | "dismiss" | "manual";
798
976
  testDir: string;
799
977
  helpersDir: string;
800
- defaultTimeoutMs: number;
801
- defaultNavigationTimeoutMs: number;
978
+ env: {
979
+ shared?: string[] | undefined;
980
+ };
802
981
  linter: {
803
982
  enabled: boolean;
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">>;
983
+ rules: Partial<Record<"lint:deep-css" | "lint:xpath" | "lint:obfuscated-class" | "lint:pause-explicit" | "lint:disambig-by-index" | "lint:evaluate-discouraged" | "lint:scenario-in-root" | "lint:mustache-in-dsl" | "lint:goto-concat" | "lint:regex-invalid" | "lint:echo-assert" | "lint:api-call-file-body" | "lint:lint-ok-missing-reason" | "lint:flow-returns-value" | "lint:legacy-layout" | "lint:external-variable-undeclared" | "lint:env-host-from-base" | "lint:one-test-per-file" | "lint:shadows-dsl-function" | "lint:skip-outside-test" | "lint:set-test-timeout-outside-test" | "validator:unknown-function" | "validator:arity" | "validator:arg-kind" | "validator:step-coverage" | "validator:step-shape" | "validator:meta-shape" | "validator:function-shape" | "validator:for-shape" | "validator:if-shape" | "validator:var-shape" | "validator:unsupported-statement" | "validator:unsupported-expression" | "validator:string-concat" | "validator:semantic-loss" | "validator:list-arg" | "validator:wrapped-format", "off" | "warn" | "error">>;
805
984
  };
806
985
  mcp: {
807
986
  transport: "stdio";
@@ -817,27 +996,35 @@ declare const UnotestConfigSchema: z.ZodEffects<z.ZodObject<{
817
996
  database?: string | undefined;
818
997
  apiBaseUrl?: string | undefined;
819
998
  uploadDir?: string | undefined;
999
+ readRoots?: string[] | undefined;
820
1000
  };
1001
+ locale?: string | undefined;
1002
+ timezone?: string | undefined;
1003
+ testTimeoutMs?: number | undefined;
821
1004
  baseUrl?: string | undefined;
822
1005
  webServer?: {
823
- command: string;
824
1006
  url: string;
1007
+ command: string;
1008
+ timeoutMs?: number | undefined;
825
1009
  reuseExistingServer?: boolean | undefined;
1010
+ } | {
1011
+ url: string;
1012
+ command: string;
826
1013
  timeoutMs?: number | undefined;
827
- } | undefined;
828
- channel?: "chromium" | "chrome" | "msedge" | "chrome-beta" | "bundled" | null | undefined;
1014
+ reuseExistingServer?: boolean | undefined;
1015
+ }[] | undefined;
1016
+ channel?: "chrome" | "msedge" | "chrome-beta" | "chromium" | "bundled" | null | undefined;
829
1017
  viewport?: {
830
1018
  width?: number | undefined;
831
1019
  height?: number | undefined;
832
1020
  deviceScaleFactor?: number | undefined;
833
1021
  } | null | undefined;
834
1022
  device?: string | undefined;
835
- timezone?: string | undefined;
836
- locale?: string | undefined;
837
1023
  maxContexts?: number | undefined;
838
1024
  launch?: {
839
- userDataDir?: string | undefined;
840
1025
  args?: string[] | undefined;
1026
+ userDataDir?: string | undefined;
1027
+ profile?: "per-test" | undefined;
841
1028
  } | undefined;
842
1029
  storageState?: string | undefined;
843
1030
  teardownTimeoutMs?: number | undefined;
@@ -852,4 +1039,4 @@ type UnotestConfig = z.infer<typeof UnotestConfigSchema>;
852
1039
  type UnotestConfigInput = z.input<typeof UnotestConfigSchema>;
853
1040
  declare const DEFAULT_CONFIG: UnotestConfig;
854
1041
 
855
- export { BROWSER_CHANNEL_WORDS, type Browser, type BrowserChannel, BrowserChannelSchema, BrowserSchema, DEFAULT_CONFIG, type DialogPolicy, DialogPolicySchema, type EnvConfig, EnvConfigSchema, type FailureBundleConfig, FailureBundleConfigSchema, type LinterConfig, LinterConfigSchema, type LinterRuleId, LinterRuleIdSchema, type LinterSeverity, LinterSeveritySchema, type McpConfig, McpConfigSchema, type QueueConfig, QueueConfigSchema, type RetryConfig, RetryConfigSchema, type RetryReason, RetryReasonSchema, SYSTEM_BROWSER_CHANNELS, type SandboxConfig, SandboxConfigSchema, type ScheduleConfig, ScheduleSchema, type UnotestConfig, type UnotestConfigInput, UnotestConfigSchema, type Viewport, ViewportSchema, type WebServerConfig, WebServerConfigSchema };
1042
+ export { BROWSER_CHANNEL_WORDS, type Browser, type BrowserChannel, BrowserChannelSchema, BrowserSchema, DEFAULT_CONFIG, type DialogPolicy, DialogPolicySchema, type EnvConfig, EnvConfigSchema, type FailureBundleConfig, FailureBundleConfigSchema, type LinterConfig, LinterConfigSchema, type LinterRuleId, LinterRuleIdSchema, type LinterSeverity, LinterSeveritySchema, type McpConfig, McpConfigSchema, type QueueConfig, QueueConfigSchema, type RetryConfig, RetryConfigSchema, type RetryReason, RetryReasonSchema, SYSTEM_BROWSER_CHANNELS, type SandboxConfig, SandboxConfigSchema, type ScheduleConfig, ScheduleSchema, type UnotestConfig, type UnotestConfigInput, UnotestConfigSchema, type Viewport, ViewportSchema, type WebServerConfig, WebServerConfigSchema, WebServersConfigSchema };