@vitest/browser 4.0.0-beta.3 → 4.0.0-beta.5

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.
@@ -23,7 +23,7 @@
23
23
  })();
24
24
  </script>
25
25
  <!-- !LOAD_METADATA! -->
26
- <script type="module" src="./assets/index-DYFYwZ2-.js"></script>
26
+ <script type="module" src="./assets/index-Co-EY0lY.js"></script>
27
27
  <link rel="stylesheet" href="./assets/index-KbpJLW--.css">
28
28
  </head>
29
29
  <body>
@@ -1,8 +1,52 @@
1
1
  var __defProp = Object.defineProperty;
2
2
  var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
3
3
  var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
4
- import { g as getDefaultExportFromCjs, a as getBrowserState, b as getConfig, r as relative } from "./utils-BNwnRrZR.js";
4
+ import { g as getDefaultExportFromCjs, a as getBrowserState, b as getConfig, r as relative } from "./utils-FY_Qin7d.js";
5
5
  import { channel, globalChannel, client } from "@vitest/browser/client";
6
+ function toArray(array) {
7
+ if (array === null || array === void 0) {
8
+ array = [];
9
+ }
10
+ if (Array.isArray(array)) {
11
+ return array;
12
+ }
13
+ return [array];
14
+ }
15
+ function isObject(item) {
16
+ return item != null && typeof item === "object" && !Array.isArray(item);
17
+ }
18
+ function objectAttr(source, path, defaultValue = void 0) {
19
+ const paths = path.replace(/\[(\d+)\]/g, ".$1").split(".");
20
+ let result = source;
21
+ for (const p2 of paths) {
22
+ result = new Object(result)[p2];
23
+ if (result === void 0) {
24
+ return defaultValue;
25
+ }
26
+ }
27
+ return result;
28
+ }
29
+ function createDefer() {
30
+ let resolve2 = null;
31
+ let reject = null;
32
+ const p2 = new Promise((_resolve, _reject) => {
33
+ resolve2 = _resolve;
34
+ reject = _reject;
35
+ });
36
+ p2.resolve = resolve2;
37
+ p2.reject = reject;
38
+ return p2;
39
+ }
40
+ function isNegativeNaN(val) {
41
+ if (!Number.isNaN(val)) {
42
+ return false;
43
+ }
44
+ const f64 = new Float64Array(1);
45
+ f64[0] = val;
46
+ const u32 = new Uint32Array(f64.buffer);
47
+ const isNegative = u32[1] >>> 31 === 1;
48
+ return isNegative;
49
+ }
6
50
  var f = {
7
51
  reset: [0, 0],
8
52
  bold: [1, 22, "\x1B[22m\x1B[1m"],
@@ -730,50 +774,6 @@ function objDisplay(obj, options = {}) {
730
774
  }
731
775
  return str;
732
776
  }
733
- function toArray(array) {
734
- if (array === null || array === void 0) {
735
- array = [];
736
- }
737
- if (Array.isArray(array)) {
738
- return array;
739
- }
740
- return [array];
741
- }
742
- function isObject(item) {
743
- return item != null && typeof item === "object" && !Array.isArray(item);
744
- }
745
- function objectAttr(source, path, defaultValue = void 0) {
746
- const paths = path.replace(/\[(\d+)\]/g, ".$1").split(".");
747
- let result = source;
748
- for (const p2 of paths) {
749
- result = new Object(result)[p2];
750
- if (result === void 0) {
751
- return defaultValue;
752
- }
753
- }
754
- return result;
755
- }
756
- function createDefer() {
757
- let resolve2 = null;
758
- let reject = null;
759
- const p2 = new Promise((_resolve, _reject) => {
760
- resolve2 = _resolve;
761
- reject = _reject;
762
- });
763
- p2.resolve = resolve2;
764
- p2.reject = reject;
765
- return p2;
766
- }
767
- function isNegativeNaN(val) {
768
- if (!Number.isNaN(val)) {
769
- return false;
770
- }
771
- const f64 = new Float64Array(1);
772
- f64[0] = val;
773
- const u32 = new Uint32Array(f64.buffer);
774
- const isNegative = u32[1] >>> 31 === 1;
775
- return isNegative;
776
- }
777
777
  var jsTokens_1$1;
778
778
  var hasRequiredJsTokens$1;
779
779
  function requireJsTokens$1() {
@@ -1712,24 +1712,6 @@ function stripLiteral(code, options) {
1712
1712
  function stripLiteralDetailed(code, options) {
1713
1713
  return stripLiteralJsTokens(code);
1714
1714
  }
1715
- const chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
1716
- const intToChar = new Uint8Array(64);
1717
- const charToInt = new Uint8Array(128);
1718
- for (let i = 0; i < chars.length; i++) {
1719
- const c = chars.charCodeAt(i);
1720
- intToChar[i] = c;
1721
- charToInt[c] = i;
1722
- }
1723
- var UrlType;
1724
- (function(UrlType2) {
1725
- UrlType2[UrlType2["Empty"] = 1] = "Empty";
1726
- UrlType2[UrlType2["Hash"] = 2] = "Hash";
1727
- UrlType2[UrlType2["Query"] = 3] = "Query";
1728
- UrlType2[UrlType2["RelativePath"] = 4] = "RelativePath";
1729
- UrlType2[UrlType2["AbsolutePath"] = 5] = "AbsolutePath";
1730
- UrlType2[UrlType2["SchemeRelative"] = 6] = "SchemeRelative";
1731
- UrlType2[UrlType2["Absolute"] = 7] = "Absolute";
1732
- })(UrlType || (UrlType = {}));
1733
1715
  const _DRIVE_LETTER_START_RE = /^[A-Za-z]:\//;
1734
1716
  function normalizeWindowsPath(input = "") {
1735
1717
  if (!input) {
@@ -1825,6 +1807,24 @@ function normalizeString(path, allowAboveRoot) {
1825
1807
  const isAbsolute = function(p2) {
1826
1808
  return _IS_ABSOLUTE_RE.test(p2);
1827
1809
  };
1810
+ const chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
1811
+ const intToChar = new Uint8Array(64);
1812
+ const charToInt = new Uint8Array(128);
1813
+ for (let i = 0; i < chars.length; i++) {
1814
+ const c = chars.charCodeAt(i);
1815
+ intToChar[i] = c;
1816
+ charToInt[c] = i;
1817
+ }
1818
+ var UrlType;
1819
+ (function(UrlType2) {
1820
+ UrlType2[UrlType2["Empty"] = 1] = "Empty";
1821
+ UrlType2[UrlType2["Hash"] = 2] = "Hash";
1822
+ UrlType2[UrlType2["Query"] = 3] = "Query";
1823
+ UrlType2[UrlType2["RelativePath"] = 4] = "RelativePath";
1824
+ UrlType2[UrlType2["AbsolutePath"] = 5] = "AbsolutePath";
1825
+ UrlType2[UrlType2["SchemeRelative"] = 6] = "SchemeRelative";
1826
+ UrlType2[UrlType2["Absolute"] = 7] = "Absolute";
1827
+ })(UrlType || (UrlType = {}));
1828
1828
  const CHROME_IE_STACK_REGEXP = /^\s*at .*(?:\S:\d+|\(native\))/m;
1829
1829
  const SAFARI_NATIVE_CODE_REGEXP = /^(?:eval@)?(?:\[native code\])?$/;
1830
1830
  function extractLocation(urlLike) {
@@ -2286,8 +2286,7 @@ function createSuiteHooks() {
2286
2286
  }
2287
2287
  function parseArguments(optionsOrFn, optionsOrTest) {
2288
2288
  let options = {};
2289
- let fn = () => {
2290
- };
2289
+ let fn;
2291
2290
  if (typeof optionsOrTest === "object") {
2292
2291
  if (typeof optionsOrFn === "object") {
2293
2292
  throw new TypeError("Cannot use two objects as arguments. Please provide options and a function callback in that order.");
@@ -2337,6 +2336,9 @@ function createSuiteCollector(name, factory = () => {
2337
2336
  annotations: []
2338
2337
  };
2339
2338
  const handler = options.handler;
2339
+ if (task2.mode === "run" && !handler) {
2340
+ task2.mode = "todo";
2341
+ }
2340
2342
  if (options.concurrent || !options.sequential && runner.config.sequence.concurrent) {
2341
2343
  task2.concurrent = true;
2342
2344
  }
@@ -2468,9 +2470,12 @@ function withAwaitAsyncAssertions(fn, task) {
2468
2470
  function createSuite() {
2469
2471
  function suiteFn(name, factoryOrOptions, optionsOrFactory) {
2470
2472
  var _currentSuite$options;
2471
- const mode = this.only ? "only" : this.skip ? "skip" : this.todo ? "todo" : "run";
2473
+ let mode = this.only ? "only" : this.skip ? "skip" : this.todo ? "todo" : "run";
2472
2474
  const currentSuite = collectorContext.currentSuite || defaultSuite;
2473
2475
  let { options, handler: factory } = parseArguments(factoryOrOptions, optionsOrFactory);
2476
+ if (mode === "run" && !factory) {
2477
+ mode = "todo";
2478
+ }
2474
2479
  const isConcurrentSpecified = options.concurrent || this.concurrent || options.sequential === false;
2475
2480
  const isSequentialSpecified = options.sequential || this.sequential || options.concurrent === false;
2476
2481
  options = {
@@ -2499,15 +2504,15 @@ function createSuite() {
2499
2504
  const items = Array.isArray(i) ? i : [i];
2500
2505
  if (fnFirst) {
2501
2506
  if (arrayOnlyCases) {
2502
- suite2(formatTitle(_name, items, idx), () => handler(...items), options);
2507
+ suite2(formatTitle(_name, items, idx), handler ? () => handler(...items) : void 0, options);
2503
2508
  } else {
2504
- suite2(formatTitle(_name, items, idx), () => handler(i), options);
2509
+ suite2(formatTitle(_name, items, idx), handler ? () => handler(i) : void 0, options);
2505
2510
  }
2506
2511
  } else {
2507
2512
  if (arrayOnlyCases) {
2508
- suite2(formatTitle(_name, items, idx), options, () => handler(...items));
2513
+ suite2(formatTitle(_name, items, idx), options, handler ? () => handler(...items) : void 0);
2509
2514
  } else {
2510
- suite2(formatTitle(_name, items, idx), options, () => handler(i));
2515
+ suite2(formatTitle(_name, items, idx), options, handler ? () => handler(i) : void 0);
2511
2516
  }
2512
2517
  }
2513
2518
  });
@@ -2522,7 +2527,7 @@ function createSuite() {
2522
2527
  const name_ = formatName(name);
2523
2528
  const { options, handler } = parseArguments(optionsOrFn, fnOrOptions);
2524
2529
  cases.forEach((item, idx) => {
2525
- suite(formatTitle(name_, toArray(item), idx), options, () => handler(item));
2530
+ suite(formatTitle(name_, toArray(item), idx), options, handler ? () => handler(item) : void 0);
2526
2531
  });
2527
2532
  };
2528
2533
  };
@@ -2554,15 +2559,15 @@ function createTaskCollector(fn, context) {
2554
2559
  const items = Array.isArray(i) ? i : [i];
2555
2560
  if (fnFirst) {
2556
2561
  if (arrayOnlyCases) {
2557
- test(formatTitle(_name, items, idx), () => handler(...items), options);
2562
+ test(formatTitle(_name, items, idx), handler ? () => handler(...items) : void 0, options);
2558
2563
  } else {
2559
- test(formatTitle(_name, items, idx), () => handler(i), options);
2564
+ test(formatTitle(_name, items, idx), handler ? () => handler(i) : void 0, options);
2560
2565
  }
2561
2566
  } else {
2562
2567
  if (arrayOnlyCases) {
2563
- test(formatTitle(_name, items, idx), options, () => handler(...items));
2568
+ test(formatTitle(_name, items, idx), options, handler ? () => handler(...items) : void 0);
2564
2569
  } else {
2565
- test(formatTitle(_name, items, idx), options, () => handler(i));
2570
+ test(formatTitle(_name, items, idx), options, handler ? () => handler(i) : void 0);
2566
2571
  }
2567
2572
  }
2568
2573
  });
@@ -2578,9 +2583,11 @@ function createTaskCollector(fn, context) {
2578
2583
  const _name = formatName(name);
2579
2584
  const { options, handler } = parseArguments(optionsOrFn, fnOrOptions);
2580
2585
  cases.forEach((item, idx) => {
2581
- const handlerWrapper = (ctx) => handler(item, ctx);
2582
- handlerWrapper.__VITEST_FIXTURE_INDEX__ = 1;
2583
- handlerWrapper.toString = () => handler.toString();
2586
+ const handlerWrapper = handler ? (ctx) => handler(item, ctx) : void 0;
2587
+ if (handlerWrapper) {
2588
+ handlerWrapper.__VITEST_FIXTURE_INDEX__ = 1;
2589
+ handlerWrapper.toString = () => handler.toString();
2590
+ }
2584
2591
  test(formatTitle(_name, toArray(item), idx), options, handlerWrapper);
2585
2592
  });
2586
2593
  };
@@ -1,7 +1,7 @@
1
1
  var __defProp = Object.defineProperty;
2
2
  var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
3
3
  var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
4
- import { g as getDefaultExportFromCjs$1, c as resolve, e as executor, d as getWorkerState, b as getConfig, a as getBrowserState } from "./utils-BNwnRrZR.js";
4
+ import { g as getDefaultExportFromCjs$1, c as resolve, m as moduleRunner, d as getWorkerState, b as getConfig, a as getBrowserState } from "./utils-FY_Qin7d.js";
5
5
  import { onCancel, globalChannel, channel, client } from "@vitest/browser/client";
6
6
  import { userEvent, page, server } from "@vitest/browser/context";
7
7
  import { getSafeTimers, TraceMap as TraceMap$1, originalPositionFor as originalPositionFor$1, loadDiffConfig, loadSnapshotSerializers, takeCoverageInsideWorker, stringify, format, setupCommonEnv, startCoverageInsideWorker, stopCoverageInsideWorker, startTests, collectTests, SpyModule } from "vitest/internal/browser";
@@ -1001,6 +1001,8 @@ const stackIgnorePatterns = [
1001
1001
  "/node_modules/chai/",
1002
1002
  "/node_modules/tinypool/",
1003
1003
  "/node_modules/tinyspy/",
1004
+ "/vite/dist/node/module-runner",
1005
+ "/rolldown-vite/dist/node/module-runner",
1004
1006
  // browser related deps
1005
1007
  "/deps/chunk-",
1006
1008
  "/deps/@vitest",
@@ -1280,7 +1282,7 @@ function createBrowserRunner(runnerClass, mocker, state, coverageModule) {
1280
1282
  await rpc$2().onAfterSuiteRun({
1281
1283
  coverage,
1282
1284
  testFiles: files.map((file) => file.name),
1283
- transformMode: "browser",
1285
+ environment: "__browser__",
1284
1286
  projectName: this.config.name
1285
1287
  });
1286
1288
  }
@@ -1366,7 +1368,7 @@ async function initiateRunner(state, mocker, config) {
1366
1368
  }
1367
1369
  const runnerClass = config.mode === "test" ? VitestTestRunner : NodeBenchmarkRunner;
1368
1370
  const BrowserRunner = createBrowserRunner(runnerClass, mocker, state, {
1369
- takeCoverage: () => takeCoverageInsideWorker(config.coverage, executor)
1371
+ takeCoverage: () => takeCoverageInsideWorker(config.coverage, moduleRunner)
1370
1372
  });
1371
1373
  if (!config.snapshotOptions.snapshotEnvironment) {
1372
1374
  config.snapshotOptions.snapshotEnvironment = new VitestBrowserSnapshotEnvironment();
@@ -1380,8 +1382,8 @@ async function initiateRunner(state, mocker, config) {
1380
1382
  (_a = runner.cancel) == null ? void 0 : _a.call(runner, reason);
1381
1383
  });
1382
1384
  const [diffOptions] = await Promise.all([
1383
- loadDiffConfig(config, executor),
1384
- loadSnapshotSerializers(config, executor)
1385
+ loadDiffConfig(config, moduleRunner),
1386
+ loadSnapshotSerializers(config, moduleRunner)
1385
1387
  ]);
1386
1388
  runner.config.diffOptions = diffOptions;
1387
1389
  getWorkerState().onFilterStackTrace = (stack) => {
@@ -1626,6 +1628,9 @@ class MockerRegistry {
1626
1628
  delete(id) {
1627
1629
  this.registryByUrl.delete(id);
1628
1630
  }
1631
+ deleteById(id) {
1632
+ this.registryById.delete(id);
1633
+ }
1629
1634
  get(id) {
1630
1635
  return this.registryByUrl.get(id);
1631
1636
  }
@@ -3082,6 +3087,7 @@ class CommandsManager {
3082
3087
  });
3083
3088
  }
3084
3089
  }
3090
+ const __vite_import_meta_env__ = { "BASE_URL": "/", "DEV": false, "MODE": "production", "PROD": true, "SSR": false, "VITE_TEST_WATCHER_DEBUG": "false" };
3085
3091
  const debugVar = getConfig().env.VITEST_BROWSER_DEBUG;
3086
3092
  const debug = debugVar && debugVar !== "false" ? (...args) => {
3087
3093
  var _a, _b;
@@ -3093,7 +3099,7 @@ channel.addEventListener("message", async (e) => {
3093
3099
  debug == null ? void 0 : debug("event from orchestrator", JSON.stringify(e.data));
3094
3100
  if (!isEvent(data)) {
3095
3101
  const error = new Error(`Unknown message: ${JSON.stringify(e.data)}`);
3096
- unhandledError(error, "Uknown Iframe Message");
3102
+ unhandledError(error, "Unknown Iframe Message");
3097
3103
  return;
3098
3104
  }
3099
3105
  if (!("iframeId" in data) || data.iframeId !== getBrowserState().iframeId) {
@@ -3128,7 +3134,7 @@ channel.addEventListener("message", async (e) => {
3128
3134
  }
3129
3135
  default: {
3130
3136
  const error = new Error(`Unknown event: ${data.event}`);
3131
- unhandledError(error, "Uknown Event");
3137
+ unhandledError(error, "Unknown Event");
3132
3138
  }
3133
3139
  }
3134
3140
  channel.postMessage({
@@ -3148,6 +3154,7 @@ async function prepareTestEnvironment(options) {
3148
3154
  const config = getConfig();
3149
3155
  const rpc2 = createSafeRpc(client);
3150
3156
  const state = getWorkerState();
3157
+ state.metaEnv = __vite_import_meta_env__;
3151
3158
  state.onCancel = onCancel;
3152
3159
  state.rpc = rpc2;
3153
3160
  const interceptor = createModuleMockerInterceptor();
@@ -3220,7 +3227,7 @@ async function prepare(options) {
3220
3227
  debug == null ? void 0 : debug("prepare time", state.durations.prepare, "ms");
3221
3228
  await Promise.all([
3222
3229
  setupCommonEnv(config),
3223
- startCoverageInsideWorker(config.coverage, executor, { isolate: config.browser.isolate }),
3230
+ startCoverageInsideWorker(config.coverage, moduleRunner, { isolate: config.browser.isolate }),
3224
3231
  (async () => {
3225
3232
  const VitestIndex = await __vitePreload(() => import("vitest"), true ? [] : void 0);
3226
3233
  Object.defineProperty(window, "__vitest_index__", {
@@ -3250,7 +3257,7 @@ async function cleanup() {
3250
3257
  await rpc2.wdioSwitchContext("parent").catch((error) => unhandledError(error, "Cleanup Error"));
3251
3258
  }
3252
3259
  state.environmentTeardownRun = true;
3253
- await stopCoverageInsideWorker(config.coverage, executor, { isolate: config.browser.isolate }).catch((error) => {
3260
+ await stopCoverageInsideWorker(config.coverage, moduleRunner, { isolate: config.browser.isolate }).catch((error) => {
3254
3261
  return unhandledError(error, "Coverage Error");
3255
3262
  });
3256
3263
  }
@@ -164,9 +164,9 @@ async function importFs(id) {
164
164
  name
165
165
  ));
166
166
  }
167
- const executor = {
167
+ const moduleRunner = {
168
168
  isBrowser: true,
169
- executeId: (id) => {
169
+ import: (id) => {
170
170
  if (id[0] === "/" || id[1] === ":") {
171
171
  return importFs(id);
172
172
  }
@@ -193,7 +193,7 @@ export {
193
193
  getConfig as b,
194
194
  resolve as c,
195
195
  getWorkerState as d,
196
- executor as e,
197
196
  getDefaultExportFromCjs as g,
197
+ moduleRunner as m,
198
198
  relative as r
199
199
  };
@@ -26,8 +26,8 @@
26
26
  {__VITEST_INJECTOR__}
27
27
  {__VITEST_ERROR_CATCHER__}
28
28
  {__VITEST_SCRIPTS__}
29
- <script type="module" crossorigin src="/__vitest_browser__/orchestrator-BXzaDpYw.js"></script>
30
- <link rel="modulepreload" crossorigin href="/__vitest_browser__/utils-BNwnRrZR.js">
29
+ <script type="module" crossorigin src="/__vitest_browser__/orchestrator-CmUsRING.js"></script>
30
+ <link rel="modulepreload" crossorigin href="/__vitest_browser__/utils-FY_Qin7d.js">
31
31
  </head>
32
32
  <body>
33
33
  <div id="vitest-tester"></div>
@@ -5,8 +5,8 @@
5
5
  <link rel="icon" href="{__VITEST_FAVICON__}" type="image/svg+xml">
6
6
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
7
7
  <title>Vitest Browser Tester</title>
8
- <script type="module" crossorigin src="/__vitest_browser__/tester-DabNvcOf.js"></script>
9
- <link rel="modulepreload" crossorigin href="/__vitest_browser__/utils-BNwnRrZR.js">
8
+ <script type="module" crossorigin src="/__vitest_browser__/tester-1ooObZUu.js"></script>
9
+ <link rel="modulepreload" crossorigin href="/__vitest_browser__/utils-FY_Qin7d.js">
10
10
  </head>
11
11
  <body>
12
12
  </body>
package/dist/client.js CHANGED
@@ -29,10 +29,13 @@ function createBirpc(functions, options) {
29
29
  return functions;
30
30
  if (method === "$close")
31
31
  return close;
32
+ if (method === "$rejectPendingCalls") {
33
+ return rejectPendingCalls;
34
+ }
32
35
  if (method === "$closed")
33
36
  return closed;
34
37
  if (method === "then" && !eventNames.includes("then") && !("then" in functions))
35
- return undefined;
38
+ return void 0;
36
39
  const sendEvent = (...args) => {
37
40
  post(serialize({ m: method, a: args, t: TYPE_REQUEST }));
38
41
  };
@@ -47,7 +50,7 @@ function createBirpc(functions, options) {
47
50
  try {
48
51
  await _promise;
49
52
  } finally {
50
- _promise = undefined;
53
+ _promise = void 0;
51
54
  }
52
55
  }
53
56
  return new Promise((resolve, reject) => {
@@ -75,14 +78,30 @@ function createBirpc(functions, options) {
75
78
  return sendCall;
76
79
  }
77
80
  });
78
- function close(error) {
81
+ function close(customError) {
79
82
  closed = true;
80
83
  rpcPromiseMap.forEach(({ reject, method }) => {
81
- reject(error || new Error(`[birpc] rpc is closed, cannot call "${method}"`));
84
+ const error = new Error(`[birpc] rpc is closed, cannot call "${method}"`);
85
+ if (customError) {
86
+ customError.cause ??= error;
87
+ return reject(customError);
88
+ }
89
+ reject(error);
82
90
  });
83
91
  rpcPromiseMap.clear();
84
92
  off(onMessage);
85
93
  }
94
+ function rejectPendingCalls(handler) {
95
+ const entries = Array.from(rpcPromiseMap.values());
96
+ const handlerResults = entries.map(({ method, reject }) => {
97
+ if (!handler) {
98
+ return reject(new Error(`[birpc]: rejected pending call "${method}".`));
99
+ }
100
+ return handler({ method, reject });
101
+ });
102
+ rpcPromiseMap.clear();
103
+ return handlerResults;
104
+ }
86
105
  async function onMessage(data, ...extra) {
87
106
  let msg;
88
107
  try {
@@ -348,7 +367,6 @@ function createClient() {
348
367
  }, {
349
368
  post: (msg) => ctx.ws.send(msg),
350
369
  on: (fn) => onMessage = fn,
351
- timeout: -1,
352
370
  serialize: (e) => stringify(e, (_, v) => {
353
371
  if (v instanceof Error) {
354
372
  return {
@@ -360,9 +378,7 @@ function createClient() {
360
378
  return v;
361
379
  }),
362
380
  deserialize: parse,
363
- onTimeoutError(functionName) {
364
- throw new Error(`[vitest-browser]: Timeout calling "${functionName}"`);
365
- }
381
+ timeout: -1
366
382
  });
367
383
  let openPromise;
368
384
  function reconnect(reset = false) {
@@ -1,4 +1,4 @@
1
- import{expect,chai}from"vitest";import{k as kAriaCheckedRoles,i as getAriaChecked,j as getAriaRole,l as getAriaDisabled,m as beginAriaCaches,n as endAriaCaches,o as isElementVisible$1,p as getElementAccessibleDescription,q as getElementAccessibleErrorMessage,r as getElementAccessibleName,s as cssEscape}from"./public-utils-Kx5DUGWa.js";import{L as Locator,p as processTimeoutOptions}from"./index-W1MM53zC.js";import{server}from"@vitest/browser/context";import"vitest/internal/browser";function getAriaCheckedRoles(){return[...kAriaCheckedRoles]}function getElementFromUserInput(_,K,q){if(_ instanceof Locator&&(_=_.element()),_ instanceof HTMLElement||_ instanceof SVGElement)return _;throw new UserInputElementTypeError(_,K,q)}function getNodeFromUserInput(_,K,q){if(_ instanceof Locator&&(_=_.element()),_ instanceof Node)return _;throw new UserInputNodeTypeError(_,K,q)}function getMessage(_,K,q,J,Y,X){return[`${K}\n`,`${q}:\n${_.utils.EXPECTED_COLOR(redent(display(_,J),2))}`,`${Y}:\n${_.utils.RECEIVED_COLOR(redent(display(_,X),2))}`].join(`
1
+ import{expect,chai}from"vitest";import{k as kAriaCheckedRoles,i as getAriaChecked,j as getAriaRole,l as getAriaDisabled,m as beginAriaCaches,n as endAriaCaches,o as isElementVisible$1,p as getElementAccessibleDescription,q as getElementAccessibleErrorMessage,r as getElementAccessibleName,s as cssEscape}from"./public-utils-Kx5DUGWa.js";import{L as Locator,b as getWorkerState,a as getBrowserState,c as convertElementToCssSelector,p as processTimeoutOptions}from"./index-D_g_FMM5.js";import{server}from"@vitest/browser/context";import"vitest/internal/browser";function getAriaCheckedRoles(){return[...kAriaCheckedRoles]}function getElementFromUserInput(_,K,q){if(_ instanceof Locator&&(_=_.element()),_ instanceof HTMLElement||_ instanceof SVGElement)return _;throw new UserInputElementTypeError(_,K,q)}function getNodeFromUserInput(_,K,q){if(_ instanceof Locator&&(_=_.element()),_ instanceof Node)return _;throw new UserInputNodeTypeError(_,K,q)}function getMessage(_,K,q,J,Y,X){return[`${K}\n`,`${q}:\n${_.utils.EXPECTED_COLOR(redent(display(_,J),2))}`,`${Y}:\n${_.utils.RECEIVED_COLOR(redent(display(_,X),2))}`].join(`
2
2
  `)}function redent(_,K){return indentString(stripIndent(_),K)}function indentString(_,K){let q=/^(?!\s*$)/gm;return _.replace(q,` `.repeat(K))}function minIndent(_){let K=_.match(/^[ \t]*(?=\S)/gm);return K?K.reduce((_,K)=>Math.min(_,K.length),1/0):0}function stripIndent(_){let K=minIndent(_);if(K===0)return _;let q=RegExp(`^[ \\t]{${K}}`,`gm`);return _.replace(q,``)}function display(_,K){return typeof K==`string`?K:_.utils.stringify(K)}function toSentence(_,{wordConnector:K=`, `,lastWordConnector:q=` and `}={}){return[_.slice(0,-1).join(K),_[_.length-1]].join(_.length>1?q:``)}class GenericTypeError extends Error{constructor(_,K,q,J){super(),Error.captureStackTrace&&Error.captureStackTrace(this,q);let Y=``;try{Y=J.utils.printWithType(`Received`,K,J.utils.printReceived)}catch{}this.message=[J.utils.matcherHint(`${J.isNot?`.not`:``}.${q.name}`,`received`,``),``,`${J.utils.RECEIVED_COLOR(`received`)} value must ${_} or a Locator that returns ${_}.`,Y].join(`
3
3
  `)}}class UserInputElementTypeError extends GenericTypeError{constructor(_,K,q){super(`an HTMLElement or an SVGElement`,_,K,q)}}class UserInputNodeTypeError extends GenericTypeError{constructor(_,K,q){super(`a Node`,_,K,q)}}function getTag(_){return _ instanceof HTMLFormElement?`FORM`:_.tagName.toUpperCase()}function isInputElement(_){return getTag(_)===`INPUT`}function getSingleElementValue(_){if(_)switch(getTag(_)){case`INPUT`:return getInputValue(_);case`SELECT`:return getSelectValue(_);default:return _.value??getAccessibleValue(_)}}function getSelectValue({multiple:_,options:K}){let q=[...K].filter(_=>_.selected);if(_)return[...q].map(_=>_.value);if(q.length!==0)return q[0].value}function getInputValue(_){switch(_.type){case`number`:return _.value===``?null:Number(_.value);case`checkbox`:return _.checked;default:return _.value}}const rolesSupportingValues=[`meter`,`progressbar`,`slider`,`spinbutton`];function getAccessibleValue(_){if(rolesSupportingValues.includes(_.getAttribute(`role`)||``))return Number(_.getAttribute(`aria-valuenow`))}function normalize(_){return _.replace(/\s+/g,` `).trim()}function matches(_,K){return K instanceof RegExp?K.test(_):_.includes(String(K))}function arrayAsSetComparison(_,K){if(Array.isArray(_)&&Array.isArray(K)){let q=new Set(K);for(let K of new Set(_))if(!q.has(K))return!1;return!0}}const supportedRoles=getAriaCheckedRoles();function toBeChecked(_){let K=getElementFromUserInput(_,toBeChecked,this),q=()=>isInputElement(K)&&[`checkbox`,`radio`].includes(K.type),X=()=>supportedRoles.includes(getAriaRole(K)||``)&&[`true`,`false`].includes(K.getAttribute(`aria-checked`)||``);if(!q()&&!X())return{pass:!1,message:()=>`only inputs with type="checkbox" or type="radio" or elements with ${supportedRolesSentence()} and a valid aria-checked attribute can be used with .toBeChecked(). Use .toHaveValue() instead`};let Z=getAriaChecked(K),Q=Z===!0;return{pass:Q,message:()=>{let _=Q?`is`:`is not`;return[this.utils.matcherHint(`${this.isNot?`.not`:``}.toBeChecked`,`element`,``),``,`Received element ${_} checked:`,` ${this.utils.printReceived(K.cloneNode(!1))}`].join(`
4
4
  `)}}}function supportedRolesSentence(){return toSentence(supportedRoles.map(_=>`role="${_}"`),{lastWordConnector:` or `})}function toBeEmptyDOMElement(_){let K=getElementFromUserInput(_,toBeEmptyDOMElement,this);return{pass:isEmptyElement(K),message:()=>[this.utils.matcherHint(`${this.isNot?`.not`:``}.toBeEmptyDOMElement`,`element`,``),``,`Received:`,` ${this.utils.printReceived(K.innerHTML)}`].join(`
@@ -23,4 +23,5 @@ import{expect,chai}from"vitest";import{k as kAriaCheckedRoles,i as getAriaChecke
23
23
  `)}}}function getMultiElementValue(_){let K=[...new Set(_.map(_=>_.type))];if(K.length!==1)throw Error(`Multiple form elements with the same name must be of the same type`);switch(K[0]){case`radio`:{let K=_.find(_=>_.checked);return K?K.value:void 0}case`checkbox`:return _.filter(_=>_.checked).map(_=>_.value);default:return _.map(_=>_.value)}}function getFormValue(_,K){let q=[..._.querySelectorAll(`[name="${cssEscape(K)}"]`)];if(q.length!==0)switch(q.length){case 1:return getSingleElementValue(q[0]);default:return getMultiElementValue(q)}}function getPureName(_){return/\[\]$/.test(_)?_.slice(0,-2):_}function getAllFormValues(_){let K={};for(let q of _.elements){if(!(`name`in q))continue;let J=q.name;K[getPureName(J)]=getFormValue(_,J)}return K}function toHaveRole(_,K){let q=getElementFromUserInput(_,toHaveRole,this);beginAriaCaches();let J=getAriaRole(q);return endAriaCaches(),{pass:J===K,message:()=>{let _=this.isNot?`not to`:`to`;return getMessage(this,this.utils.matcherHint(`${this.isNot?`.not`:``}.toHaveRole`,`element`,``),`Expected element ${_} have role`,K,`Received`,J)}}}function toHaveSelection(_,K){let q=getElementFromUserInput(_,toHaveSelection,this),J=K!==void 0;if(J&&typeof K!=`string`)throw Error(`expected selection must be a string or undefined`);let Y=getSelection(q);return{pass:J?this.equals(Y,K,[arrayAsSetComparison,...this.customTesters]):!!Y,message:()=>{let _=this.isNot?`not to`:`to`,q=this.utils.matcherHint(`${this.isNot?`.not`:``}.toHaveSelection`,`element`,K);return getMessage(this,q,`Expected the element ${_} have selection`,J?K:`(any)`,`Received`,Y)}}}function getSelection(_){let K=_.ownerDocument.getSelection();if(!K)return``;if([`INPUT`,`TEXTAREA`].includes(getTag(_))){let K=_;return[`radio`,`checkbox`].includes(K.type)||K.selectionStart==null||K.selectionEnd==null?``:K.value.toString().substring(K.selectionStart,K.selectionEnd)}if(K.anchorNode===null||K.focusNode===null)return``;let q=K.getRangeAt(0),J=_.ownerDocument.createRange();if(K.containsNode(_,!1))J.selectNodeContents(_),K.removeAllRanges(),K.addRange(J);else if(!(_.contains(K.anchorNode)&&_.contains(K.focusNode))){let Y=_===q.startContainer||_.contains(q.startContainer),X=_===q.endContainer||_.contains(q.endContainer);K.removeAllRanges(),(Y||X)&&(J.selectNodeContents(_),Y&&J.setStart(q.startContainer,q.startOffset),X&&J.setEnd(q.endContainer,q.endOffset),K.addRange(J))}let Y=K.toString();return K.removeAllRanges(),K.addRange(q),Y}const browser=server.config.browser.name,usedValuesProps=new Set(`backgroundPosition.background-position.bottom.left.right.top.height.width.margin-bottom.marginBottom.margin-left.marginLeft.margin-right.marginRight.margin-top.marginTop.min-height.minHeight.min-width.minWidth.padding-bottom.padding-left.padding-right.padding-top.text-indent.paddingBottom.paddingLeft.paddingRight.paddingTop.textIndent`.split(`.`));function toHaveStyle(_,K){let q=getElementFromUserInput(_,toHaveStyle,this),{getComputedStyle:J}=q.ownerDocument.defaultView,Y=typeof K==`object`?getStyleFromObjectCSS(K):computeCSSStyleDeclaration(K),X=J(q),Z=new Set(Array.from(q.style));return{pass:isSubset(Y,q,X,Z),message:()=>{let _=`${this.isNot?`.not`:``}.toHaveStyle`,K=new Set(Object.keys(Y)),J=Array.from(X).filter(_=>K.has(_)).reduce((_,K)=>{let J=Z.has(K)&&usedValuesProps.has(K)?q.style:X;return _[K]=J[K],_},{}),Q=printoutObjectStyles(J),$=Q===``?`Expected styles could not be parsed by the browser. Did you make a typo?`:this.utils.diff(printoutObjectStyles(Y),Q);return[this.utils.matcherHint(_,`element`,``),$].join(`
24
24
 
25
25
  `)}}}function getStyleFromObjectCSS(_){let K=browser===`chrome`||browser===`chromium`?document:document.implementation.createHTMLDocument(``),q=K.createElement(`div`);K.body.appendChild(q);let J=Object.keys(_);J.forEach(K=>{q.style[K]=_[K]});let Y={},X=window.getComputedStyle(q);return J.forEach(_=>{let K=usedValuesProps.has(_)?q.style:X,J=K[_];J!=null&&(Y[_]=J)}),q.remove(),Y}function computeCSSStyleDeclaration(_){let K=browser===`chrome`||browser===`chromium`||browser===`webkit`?document:document.implementation.createHTMLDocument(``),q=K.createElement(`div`);q.setAttribute(`style`,_.replace(/\n/g,``)),K.body.appendChild(q);let J=window.getComputedStyle(q),Y=Array.from(q.style).reduce((_,K)=>(_[K]=usedValuesProps.has(K)?q.style.getPropertyValue(K):J.getPropertyValue(K),_),{});return q.remove(),Y}function printoutObjectStyles(_){return Object.keys(_).sort().map(K=>`${K}: ${_[K]};`).join(`
26
- `)}function isSubset(_,K,q,J){let Y=Object.keys(_);return Y.length?Y.every(Y=>{let X=_[Y],Z=Y.startsWith(`--`),Q=[Y];Z||Q.push(Y.toLowerCase());let $=Q.some(_=>{let Z=J.has(Y)&&usedValuesProps.has(Y)?K.style:q;return Z[_]===X||Z.getPropertyValue(_)===X});return $}):!1}function toHaveTextContent(_,K,q={normalizeWhitespace:!0}){let J=getNodeFromUserInput(_,toHaveTextContent,this),Y=q.normalizeWhitespace?normalize(J.textContent||``):(J.textContent||``).replace(/\u00A0/g,` `),X=Y!==``&&K===``;return{pass:!X&&matches(Y,K),message:()=>{let _=this.isNot?`not to`:`to`;return getMessage(this,this.utils.matcherHint(`${this.isNot?`.not`:``}.toHaveTextContent`,`element`,``),X?`Checking with empty string will always match, use .toBeEmptyDOMElement() instead`:`Expected element ${_} have text content`,K,`Received`,Y)}}}function toHaveValue(_,K){let q=getElementFromUserInput(_,toHaveValue,this);if(isInputElement(q)&&[`checkbox`,`radio`].includes(q.type))throw Error(`input with type=checkbox or type=radio cannot be used with .toHaveValue(). Use .toBeChecked() for type=checkbox or .toHaveFormValues() instead`);let J=getSingleElementValue(q),Y=K!==void 0,X=K,Z=J;return K==J&&K!==J&&(X=`${K} (${typeof K})`,Z=`${J} (${typeof J})`),{pass:Y?this.equals(J,K,[arrayAsSetComparison,...this.customTesters]):!!J,message:()=>{let _=this.isNot?`not to`:`to`,q=this.utils.matcherHint(`${this.isNot?`.not`:``}.toHaveValue`,`element`,K);return getMessage(this,q,`Expected the element ${_} have value`,Y?X:`(any)`,`Received`,Z)}}}const matchers={toBeDisabled,toBeEnabled,toBeEmptyDOMElement,toBeInTheDocument,toBeInViewport,toBeInvalid,toBeRequired,toBeValid,toBeVisible,toContainElement,toContainHTML,toHaveAccessibleDescription,toHaveAccessibleErrorMessage,toHaveAccessibleName,toHaveAttribute,toHaveClass,toHaveFocus,toHaveFormValues,toHaveStyle,toHaveTextContent,toHaveValue,toHaveDisplayValue,toBeChecked,toBePartiallyChecked,toHaveRole,toHaveSelection};function element(q,J){if(q!=null&&!(q instanceof Element)&&!(`element`in q))throw Error(`Invalid element or locator: ${q}. Expected an instance of Element or Locator, received ${typeof q}`);return expect.poll(function(){if(q instanceof Element||q==null)return q;chai.util.flag(this,`_poll.element`,!0);let _=chai.util.flag(this,`negate`),J=chai.util.flag(this,`_name`),Y=chai.util.flag(this,`_isLastPollAttempt`);if(_&&J===`toBeInTheDocument`)return q.query();if(Y)return q.element();let X=q.query();if(!X)throw Error(`Cannot find element with locator: ${JSON.stringify(q)}`);return X},processTimeoutOptions(J))}expect.extend(matchers),Object.assign(expect,{element});
26
+ `)}function isSubset(_,K,q,J){let Y=Object.keys(_);return Y.length?Y.every(Y=>{let X=_[Y],Z=Y.startsWith(`--`),Q=[Y];Z||Q.push(Y.toLowerCase());let $=Q.some(_=>{let Z=J.has(Y)&&usedValuesProps.has(Y)?K.style:q;return Z[_]===X||Z.getPropertyValue(_)===X});return $}):!1}function toHaveTextContent(_,K,q={normalizeWhitespace:!0}){let J=getNodeFromUserInput(_,toHaveTextContent,this),Y=q.normalizeWhitespace?normalize(J.textContent||``):(J.textContent||``).replace(/\u00A0/g,` `),X=Y!==``&&K===``;return{pass:!X&&matches(Y,K),message:()=>{let _=this.isNot?`not to`:`to`;return getMessage(this,this.utils.matcherHint(`${this.isNot?`.not`:``}.toHaveTextContent`,`element`,``),X?`Checking with empty string will always match, use .toBeEmptyDOMElement() instead`:`Expected element ${_} have text content`,K,`Received`,Y)}}}function toHaveValue(_,K){let q=getElementFromUserInput(_,toHaveValue,this);if(isInputElement(q)&&[`checkbox`,`radio`].includes(q.type))throw Error(`input with type=checkbox or type=radio cannot be used with .toHaveValue(). Use .toBeChecked() for type=checkbox or .toHaveFormValues() instead`);let J=getSingleElementValue(q),Y=K!==void 0,X=K,Z=J;return K==J&&K!==J&&(X=`${K} (${typeof K})`,Z=`${J} (${typeof J})`),{pass:Y?this.equals(J,K,[arrayAsSetComparison,...this.customTesters]):!!J,message:()=>{let _=this.isNot?`not to`:`to`,q=this.utils.matcherHint(`${this.isNot?`.not`:``}.toHaveValue`,`element`,K);return getMessage(this,q,`Expected the element ${_} have value`,Y?X:`(any)`,`Received`,Z)}}}const counters=new Map([]);async function toMatchScreenshot(_,K,q=typeof K==`object`?K:{}){if(this.isNot)throw Error(`'toMatchScreenshot' cannot be used with "not"`);let J=getWorkerState().current;if(J===void 0||this.currentTestName===void 0)throw Error(`'toMatchScreenshot' cannot be used without test context`);let Y=`${J.result?.repeatCount??0}${this.testPath}${this.currentTestName}`,X=counters.get(Y);X===void 0&&(X={current:0},counters.set(Y,X)),X.current+=1;let Z=typeof K==`string`?K:`${this.currentTestName} ${X.current}`,Q=await getBrowserState().commands.triggerCommand(`__vitest_screenshotMatcher`,[Z,this.currentTestName,{element:convertElementToCssSelector(getElementFromUserInput(_,toMatchScreenshot,this)),...q}]);if(Q.pass===!1&&`context`in J){let{annotate:_}=J.context,K=[];Q.reference&&K.push(_(`Reference screenshot`,{path:Q.reference})),Q.actual&&K.push(_(`Actual screenshot`,{path:Q.actual})),Q.diff&&K.push(_(`Diff`,{path:Q.diff})),await Promise.all(K)}return{pass:Q.pass,message:()=>Q.pass?``:[this.utils.matcherHint(`toMatchScreenshot`,`element`,``),``,Q.message,Q.reference?`\nReference screenshot:\n ${this.utils.EXPECTED_COLOR(Q.reference)}`:null,Q.actual?`\nActual screenshot:\n ${this.utils.RECEIVED_COLOR(Q.actual)}`:null,Q.diff?this.utils.DIM_COLOR(`\nDiff image:\n ${Q.diff}`):null].filter(_=>_!==null).join(`
27
+ `)}}const matchers={toBeDisabled,toBeEnabled,toBeEmptyDOMElement,toBeInTheDocument,toBeInViewport,toBeInvalid,toBeRequired,toBeValid,toBeVisible,toContainElement,toContainHTML,toHaveAccessibleDescription,toHaveAccessibleErrorMessage,toHaveAccessibleName,toHaveAttribute,toHaveClass,toHaveFocus,toHaveFormValues,toHaveStyle,toHaveTextContent,toHaveValue,toHaveDisplayValue,toBeChecked,toBePartiallyChecked,toHaveRole,toHaveSelection,toMatchScreenshot};function element(q,J){if(q!=null&&!(q instanceof Element)&&!(`element`in q))throw Error(`Invalid element or locator: ${q}. Expected an instance of Element or Locator, received ${typeof q}`);return expect.poll(function(){if(q instanceof Element||q==null)return q;chai.util.flag(this,`_poll.element`,!0);let _=chai.util.flag(this,`negate`),J=chai.util.flag(this,`_name`),Y=chai.util.flag(this,`_isLastPollAttempt`);if(_&&J===`toBeInTheDocument`)return q.query();if(Y)return q.element();let X=q.query();if(!X)throw Error(`Cannot find element with locator: ${JSON.stringify(q)}`);return X},processTimeoutOptions(J))}expect.extend(matchers),Object.assign(expect,{element});
@@ -1 +1 @@
1
- import{server,page}from"@vitest/browser/context";import{I as Ivya,e as getByRoleSelector,c as getByAltTextSelector,f as getByLabelSelector,b as getByPlaceholderSelector,d as getByTestIdSelector,a as getByTextSelector,g as getByTitleSelector,h as getElementError}from"./public-utils-Kx5DUGWa.js";function ensureAwaited(e){let b=getWorkerState().current;if(!b||b.type!==`test`)return e();let x=!1,S=Error(`STACK_TRACE_ERROR`);b.onFinished??=[],b.onFinished.push(()=>{if(!x){let e=Error(`The call was not awaited. This method is asynchronous and must be awaited; otherwise, the call will not start to avoid unhandled rejections.`);throw e.stack=S.stack?.replace(S.message,e.message),e}});let C;return{then(b,w){return x=!0,(C||=e(S)).then(b,w)},catch(b){return(C||=e(S)).catch(b)},finally(b){return(C||=e(S)).finally(b)},[Symbol.toStringTag]:`Promise`}}function getBrowserState(){return window.__vitest_browser_runner__}function getWorkerState(){let e=window.__vitest_worker__;if(!e)throw Error(`Worker state is not found. This is an issue with Vitest. Please, open an issue.`);return e}const provider=getBrowserState().provider;function convertElementToCssSelector(e){if(!e||!(e instanceof Element))throw Error(`Expected DOM element to be an instance of Element, received ${typeof e}`);return getUniqueCssSelector(e)}function escapeIdForCSSSelector(e){return e.split(``).map(e=>{let b=e.charCodeAt(0);return e===` `||e===`#`||e===`.`||e===`:`||e===`[`||e===`]`||e===`>`||e===`+`||e===`~`||e===`\\`?`\\${e}`:b>=65536?`\\${b.toString(16).toUpperCase().padStart(6,`0`)} `:b<32||b===127||b>=128?`\\${b.toString(16).toUpperCase().padStart(2,`0`)} `:e}).join(``)}function getUniqueCssSelector(e){let b=[],x,S=!1;for(;x=getParent(e);){x.shadowRoot&&(S=!0);let C=e.tagName;if(e.id)b.push(`#${escapeIdForCSSSelector(e.id)}`);else if(!e.nextElementSibling&&!e.previousElementSibling)b.push(C.toLowerCase());else{let S=0,w=0,T=0;for(let b of x.children)S++,b.tagName===C&&w++,b===e&&(T=S);w>1?b.push(`${C.toLowerCase()}:nth-child(${T})`):b.push(C.toLowerCase())}e=x}return`${getBrowserState().provider===`webdriverio`&&S?`>>>`:``}${b.reverse().join(` > `)}`}function getParent(e){let b=e.parentNode;return b instanceof ShadowRoot?b.host:b}const now=Date.now;function processTimeoutOptions(e){if(e&&e.timeout!=null||provider!==`playwright`||getWorkerState().config.browser.providerOptions.actionTimeout!=null)return e;let b=getBrowserState().runner,x=b._currentTaskStartTime;if(!x)return e;let S=b._currentTaskTimeout;if(S===0||S==null||S===1/0)return e;e||={};let C=now(),w=x+S,T=w-C;return T<=0||(e.timeout=T-100),e}function getIframeScale(){let e=window.parent.document.querySelector(`iframe[data-vitest]`)?.parentElement;if(!e)throw Error(`Cannot find Tester element. This is a bug in Vitest. Please, open a new issue with reproduction.`);let b=e.getAttribute(`data-scale`),x=Number(b);if(Number.isNaN(x))throw TypeError(`Cannot parse scale value from Tester element (${b}). This is a bug in Vitest. Please, open a new issue with reproduction.`);return x}function escapeRegexForSelector(e){return e.unicode||e.unicodeSets?String(e):String(e).replace(/(^|[^\\])(\\\\)*(["'`])/g,`$1$2\\$3`).replace(/>>/g,`\\>\\>`)}function escapeForTextSelector(e,b){return typeof e==`string`?`${JSON.stringify(e)}i`:escapeRegexForSelector(e)}const selectorEngine=Ivya.create({browser:(e=>{switch(e){case`edge`:case`chrome`:return`chromium`;case`safari`:return`webkit`;default:return e}})(server.config.browser.name),testIdAttribute:server.config.browser.locators.testIdAttribute});class Locator{_parsedSelector;_container;_pwSelector;click(e={}){return this.triggerCommand(`__vitest_click`,this.selector,e)}dblClick(e={}){return this.triggerCommand(`__vitest_dblClick`,this.selector,e)}tripleClick(e={}){return this.triggerCommand(`__vitest_tripleClick`,this.selector,e)}clear(e){return this.triggerCommand(`__vitest_clear`,this.selector,e)}hover(e){return this.triggerCommand(`__vitest_hover`,this.selector,e)}unhover(e){return this.triggerCommand(`__vitest_hover`,`html > body`,e)}fill(e,b){return this.triggerCommand(`__vitest_fill`,this.selector,e,b)}async upload(e,b){let x=(Array.isArray(e)?e:[e]).map(async e=>{if(typeof e==`string`)return e;let b=await new Promise((b,x)=>{let S=new FileReader;S.onload=()=>b(S.result),S.onerror=()=>x(Error(`Failed to read file: ${e.name}`)),S.readAsDataURL(e)});return{name:e.name,mimeType:e.type,base64:b}});return this.triggerCommand(`__vitest_upload`,this.selector,await Promise.all(x),b)}dropTo(e,b={}){return this.triggerCommand(`__vitest_dragAndDrop`,this.selector,e.selector,b)}selectOptions(e,b){let x=(Array.isArray(e)?e:[e]).map(e=>{if(typeof e!=`string`){let b=`element`in e?e.selector:selectorEngine.generateSelectorSimple(e);return{element:b}}return e});return this.triggerCommand(`__vitest_selectOptions`,this.selector,x,b)}screenshot(e){return page.screenshot({...e,element:this})}getByRole(e,b){return this.locator(getByRoleSelector(e,b))}getByAltText(e,b){return this.locator(getByAltTextSelector(e,b))}getByLabelText(e,b){return this.locator(getByLabelSelector(e,b))}getByPlaceholder(e,b){return this.locator(getByPlaceholderSelector(e,b))}getByTestId(b){return this.locator(getByTestIdSelector(server.config.browser.locators.testIdAttribute,b))}getByText(e,b){return this.locator(getByTextSelector(e,b))}getByTitle(e,b){return this.locator(getByTitleSelector(e,b))}filter(e){let b=[];if(e?.hasText&&b.push(`internal:has-text=${escapeForTextSelector(e.hasText)}`),e?.hasNotText&&b.push(`internal:has-not-text=${escapeForTextSelector(e.hasNotText)}`),e?.has){let x=e.has;b.push(`internal:has=${JSON.stringify(x._pwSelector||x.selector)}`)}if(e?.hasNot){let x=e.hasNot;b.push(`internal:has-not=${JSON.stringify(x._pwSelector||x.selector)}`)}if(!b.length)throw Error(`Locator.filter expects at least one filter. None provided.`);return this.locator(b.join(` >> `))}and(e){return this.locator(`internal:and=${JSON.stringify(e._pwSelector||e.selector)}`)}or(e){return this.locator(`internal:or=${JSON.stringify(e._pwSelector||e.selector)}`)}query(){let e=this._parsedSelector||=selectorEngine.parseSelector(this._pwSelector||this.selector);return selectorEngine.querySelector(e,document.documentElement,!0)}element(){let e=this.query();if(!e)throw getElementError(this._pwSelector||this.selector,this._container||document.body);return e}elements(){let e=this._parsedSelector||=selectorEngine.parseSelector(this._pwSelector||this.selector);return selectorEngine.querySelectorAll(e,document.documentElement)}all(){return this.elements().map(e=>this.elementLocator(e))}nth(e){return this.locator(`nth=${e}`)}first(){return this.nth(0)}last(){return this.nth(-1)}toString(){return this.selector}toJSON(){return this.selector}triggerCommand(e,...b){let x=getBrowserState().commands;return ensureAwaited(S=>x.triggerCommand(e,b,S))}}export{Locator as L,getBrowserState as a,convertElementToCssSelector as c,getIframeScale as g,processTimeoutOptions as p,selectorEngine as s};
1
+ import{server,page}from"@vitest/browser/context";import{I as Ivya,e as getByRoleSelector,c as getByAltTextSelector,f as getByLabelSelector,b as getByPlaceholderSelector,d as getByTestIdSelector,a as getByTextSelector,g as getByTitleSelector,h as getElementError}from"./public-utils-Kx5DUGWa.js";function ensureAwaited(e){let b=getWorkerState().current;if(!b||b.type!==`test`)return e();let x=!1,S=Error(`STACK_TRACE_ERROR`);b.onFinished??=[],b.onFinished.push(()=>{if(!x){let e=Error(`The call was not awaited. This method is asynchronous and must be awaited; otherwise, the call will not start to avoid unhandled rejections.`);throw e.stack=S.stack?.replace(S.message,e.message),e}});let C;return{then(b,w){return x=!0,(C||=e(S)).then(b,w)},catch(b){return(C||=e(S)).catch(b)},finally(b){return(C||=e(S)).finally(b)},[Symbol.toStringTag]:`Promise`}}function getBrowserState(){return window.__vitest_browser_runner__}function getWorkerState(){let e=window.__vitest_worker__;if(!e)throw Error(`Worker state is not found. This is an issue with Vitest. Please, open an issue.`);return e}const provider=getBrowserState().provider;function convertElementToCssSelector(e){if(!e||!(e instanceof Element))throw Error(`Expected DOM element to be an instance of Element, received ${typeof e}`);return getUniqueCssSelector(e)}function escapeIdForCSSSelector(e){return e.split(``).map(e=>{let b=e.charCodeAt(0);return e===` `||e===`#`||e===`.`||e===`:`||e===`[`||e===`]`||e===`>`||e===`+`||e===`~`||e===`\\`?`\\${e}`:b>=65536?`\\${b.toString(16).toUpperCase().padStart(6,`0`)} `:b<32||b===127||b>=128?`\\${b.toString(16).toUpperCase().padStart(2,`0`)} `:e}).join(``)}function getUniqueCssSelector(e){let b=[],x,S=!1;for(;x=getParent(e);){x.shadowRoot&&(S=!0);let C=e.tagName;if(e.id)b.push(`#${escapeIdForCSSSelector(e.id)}`);else if(!e.nextElementSibling&&!e.previousElementSibling)b.push(C.toLowerCase());else{let S=0,w=0,T=0;for(let b of x.children)S++,b.tagName===C&&w++,b===e&&(T=S);w>1?b.push(`${C.toLowerCase()}:nth-child(${T})`):b.push(C.toLowerCase())}e=x}return`${getBrowserState().provider===`webdriverio`&&S?`>>>`:``}${b.reverse().join(` > `)}`}function getParent(e){let b=e.parentNode;return b instanceof ShadowRoot?b.host:b}const now=Date.now;function processTimeoutOptions(e){if(e&&e.timeout!=null||provider!==`playwright`||getWorkerState().config.browser.providerOptions.actionTimeout!=null)return e;let b=getBrowserState().runner,x=b._currentTaskStartTime;if(!x)return e;let S=b._currentTaskTimeout;if(S===0||S==null||S===1/0)return e;e||={};let C=now(),w=x+S,T=w-C;return T<=0||(e.timeout=T-100),e}function getIframeScale(){let e=window.parent.document.querySelector(`iframe[data-vitest]`)?.parentElement;if(!e)throw Error(`Cannot find Tester element. This is a bug in Vitest. Please, open a new issue with reproduction.`);let b=e.getAttribute(`data-scale`),x=Number(b);if(Number.isNaN(x))throw TypeError(`Cannot parse scale value from Tester element (${b}). This is a bug in Vitest. Please, open a new issue with reproduction.`);return x}function escapeRegexForSelector(e){return e.unicode||e.unicodeSets?String(e):String(e).replace(/(^|[^\\])(\\\\)*(["'`])/g,`$1$2\\$3`).replace(/>>/g,`\\>\\>`)}function escapeForTextSelector(e,b){return typeof e==`string`?`${JSON.stringify(e)}i`:escapeRegexForSelector(e)}const selectorEngine=Ivya.create({browser:(e=>{switch(e){case`edge`:case`chrome`:return`chromium`;case`safari`:return`webkit`;default:return e}})(server.config.browser.name),testIdAttribute:server.config.browser.locators.testIdAttribute});class Locator{_parsedSelector;_container;_pwSelector;click(e={}){return this.triggerCommand(`__vitest_click`,this.selector,e)}dblClick(e={}){return this.triggerCommand(`__vitest_dblClick`,this.selector,e)}tripleClick(e={}){return this.triggerCommand(`__vitest_tripleClick`,this.selector,e)}clear(e){return this.triggerCommand(`__vitest_clear`,this.selector,e)}hover(e){return this.triggerCommand(`__vitest_hover`,this.selector,e)}unhover(e){return this.triggerCommand(`__vitest_hover`,`html > body`,e)}fill(e,b){return this.triggerCommand(`__vitest_fill`,this.selector,e,b)}async upload(e,b){let x=(Array.isArray(e)?e:[e]).map(async e=>{if(typeof e==`string`)return e;let b=await new Promise((b,x)=>{let S=new FileReader;S.onload=()=>b(S.result),S.onerror=()=>x(Error(`Failed to read file: ${e.name}`)),S.readAsDataURL(e)});return{name:e.name,mimeType:e.type,base64:b}});return this.triggerCommand(`__vitest_upload`,this.selector,await Promise.all(x),b)}dropTo(e,b={}){return this.triggerCommand(`__vitest_dragAndDrop`,this.selector,e.selector,b)}selectOptions(e,b){let x=(Array.isArray(e)?e:[e]).map(e=>{if(typeof e!=`string`){let b=`element`in e?e.selector:selectorEngine.generateSelectorSimple(e);return{element:b}}return e});return this.triggerCommand(`__vitest_selectOptions`,this.selector,x,b)}screenshot(e){return page.screenshot({...e,element:this})}getByRole(e,b){return this.locator(getByRoleSelector(e,b))}getByAltText(e,b){return this.locator(getByAltTextSelector(e,b))}getByLabelText(e,b){return this.locator(getByLabelSelector(e,b))}getByPlaceholder(e,b){return this.locator(getByPlaceholderSelector(e,b))}getByTestId(b){return this.locator(getByTestIdSelector(server.config.browser.locators.testIdAttribute,b))}getByText(e,b){return this.locator(getByTextSelector(e,b))}getByTitle(e,b){return this.locator(getByTitleSelector(e,b))}filter(e){let b=[];if(e?.hasText&&b.push(`internal:has-text=${escapeForTextSelector(e.hasText)}`),e?.hasNotText&&b.push(`internal:has-not-text=${escapeForTextSelector(e.hasNotText)}`),e?.has){let x=e.has;b.push(`internal:has=${JSON.stringify(x._pwSelector||x.selector)}`)}if(e?.hasNot){let x=e.hasNot;b.push(`internal:has-not=${JSON.stringify(x._pwSelector||x.selector)}`)}if(!b.length)throw Error(`Locator.filter expects at least one filter. None provided.`);return this.locator(b.join(` >> `))}and(e){return this.locator(`internal:and=${JSON.stringify(e._pwSelector||e.selector)}`)}or(e){return this.locator(`internal:or=${JSON.stringify(e._pwSelector||e.selector)}`)}query(){let e=this._parsedSelector||=selectorEngine.parseSelector(this._pwSelector||this.selector);return selectorEngine.querySelector(e,document.documentElement,!0)}element(){let e=this.query();if(!e)throw getElementError(this._pwSelector||this.selector,this._container||document.body);return e}elements(){let e=this._parsedSelector||=selectorEngine.parseSelector(this._pwSelector||this.selector);return selectorEngine.querySelectorAll(e,document.documentElement)}all(){return this.elements().map(e=>this.elementLocator(e))}nth(e){return this.locator(`nth=${e}`)}first(){return this.nth(0)}last(){return this.nth(-1)}toString(){return this.selector}toJSON(){return this.selector}triggerCommand(e,...b){let x=getBrowserState().commands;return ensureAwaited(S=>x.triggerCommand(e,b,S))}}export{Locator as L,getBrowserState as a,getWorkerState as b,convertElementToCssSelector as c,getIframeScale as g,processTimeoutOptions as p,selectorEngine as s};
package/dist/index.d.ts CHANGED
@@ -21,7 +21,16 @@ type BirpcReturn<RemoteFunctions, LocalFunctions = Record<string, never>> = {
21
21
  $functions: LocalFunctions;
22
22
  $close: (error?: Error) => void;
23
23
  $closed: boolean;
24
+ $rejectPendingCalls: (handler?: PendingCallHandler) => Promise<void>[];
24
25
  };
26
+ type PendingCallHandler = (options: Pick<PromiseEntry, 'method' | 'reject'>) => void | Promise<void>;
27
+ interface PromiseEntry {
28
+ resolve: (arg: any) => void;
29
+ reject: (error: any) => void;
30
+ method: string;
31
+ timeoutId?: ReturnType<typeof setTimeout>;
32
+ }
33
+ declare const setTimeout: typeof globalThis.setTimeout;
25
34
 
26
35
  interface WebSocketBrowserHandlers {
27
36
  resolveSnapshotPath: (testPath: string) => string;