@vitest/browser 4.0.0-beta.4 → 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-YGltZS-e.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/index.js CHANGED
@@ -22,7 +22,7 @@ import pm from 'pixelmatch';
22
22
  import { WebSocketServer } from 'ws';
23
23
  import { performance } from 'node:perf_hooks';
24
24
 
25
- var version = "4.0.0-beta.4";
25
+ var version = "4.0.0-beta.5";
26
26
 
27
27
  const _DRIVE_LETTER_START_RE = /^[A-Za-z]:\//;
28
28
  function normalizeWindowsPath(input = "") {
@@ -367,7 +367,7 @@ async function resolveOrchestrator(globalServer, url, res) {
367
367
  if (!browserProject) {
368
368
  return;
369
369
  }
370
- // ignore uknown pages
370
+ // ignore unknown pages
371
371
  if (sessionId && sessionId !== "none" && !globalServer.vitest._browserSessions.sessionIds.has(sessionId)) {
372
372
  return;
373
373
  }
@@ -3530,7 +3530,7 @@ function setupBrowserRpc(globalServer, defaultMockerRegistry) {
3530
3530
  }
3531
3531
  }
3532
3532
  function setupClient(project, rpcId, ws) {
3533
- const mockResolver = new ServerMockResolver(globalServer.vite, { moduleDirectories: project.config.server?.deps?.moduleDirectories });
3533
+ const mockResolver = new ServerMockResolver(globalServer.vite, { moduleDirectories: project.config?.deps?.moduleDirectories });
3534
3534
  const mocker = project.browser?.provider.mocker;
3535
3535
  const rpc = createBirpc({
3536
3536
  async onUnhandledError(error, type) {
@@ -3982,7 +3982,7 @@ class BrowserPool {
3982
3982
  debug?.("[%s] test %s finished running", sessionId, file);
3983
3983
  this.runNextTest(method, sessionId);
3984
3984
  }).catch((error) => {
3985
- // if user cancells the test run manually, ignore the error and exit gracefully
3985
+ // if user cancels the test run manually, ignore the error and exit gracefully
3986
3986
  if (this.project.vitest.isCancelling && error instanceof Error && error.message.startsWith("Browser connection was closed while running tests")) {
3987
3987
  this.cancel();
3988
3988
  this._promise?.resolve();
@@ -1 +1 @@
1
- import{page,server}from"@vitest/browser/context";import{g as getByTitleSelector,a as getByTextSelector,b as getByPlaceholderSelector,c as getByAltTextSelector,d as getByTestIdSelector,e as getByRoleSelector,f as getByLabelSelector,h as getElementError}from"../public-utils-Kx5DUGWa.js";import{s as selectorEngine,L as Locator,c as convertElementToCssSelector,a as getBrowserState,g as getIframeScale}from"../index-D_g_FMM5.js";import"vitest/internal/browser";page.extend({getByLabelText(e,g){return new WebdriverIOLocator(getByLabelSelector(e,g))},getByRole(e,g){return new WebdriverIOLocator(getByRoleSelector(e,g))},getByTestId(e){return new WebdriverIOLocator(getByTestIdSelector(server.config.browser.locators.testIdAttribute,e))},getByAltText(e,g){return new WebdriverIOLocator(getByAltTextSelector(e,g))},getByPlaceholder(e,g){return new WebdriverIOLocator(getByPlaceholderSelector(e,g))},getByText(e,g){return new WebdriverIOLocator(getByTextSelector(e,g))},getByTitle(e,g){return new WebdriverIOLocator(getByTitleSelector(e,g))},_createLocator(e){return new WebdriverIOLocator(e)},elementLocator(e){return new WebdriverIOLocator(selectorEngine.generateSelectorSimple(e))}});class WebdriverIOLocator extends Locator{constructor(e,g){super(),this._pwSelector=e,this._container=g}get selector(){let e=this.elements().map(e=>convertElementToCssSelector(e));if(!e.length)throw getElementError(this._pwSelector,this._container||document.body);return e.join(`, `)}click(e){return super.click(processClickOptions(e))}dblClick(e){return super.dblClick(processClickOptions(e))}tripleClick(e){return super.tripleClick(processClickOptions(e))}selectOptions(e,g){let _=getWebdriverioSelectOptions(this.element(),e);return this.triggerCommand(`__vitest_selectOptions`,this.selector,_,g)}hover(e){return super.hover(processHoverOptions(e))}dropTo(e,g){return super.dropTo(e,processDragAndDropOptions(g))}locator(e){return new WebdriverIOLocator(`${this._pwSelector} >> ${e}`,this._container)}elementLocator(e){return new WebdriverIOLocator(selectorEngine.generateSelectorSimple(e),e)}}function getWebdriverioSelectOptions(e,g){let _=[...e.querySelectorAll(`option`)],v=Array.isArray(g)?g:[g];if(!v.length)return[];if(v.length>1)throw Error(`Provider "webdriverio" doesn't support selecting multiple values at once`);let y=v[0];if(typeof y!=`string`){let e=`element`in y?y.element():y,g=_.indexOf(e);if(g===-1)throw Error(`The element ${selectorEngine.previewNode(e)} was not found in the "select" options.`);return[{index:g}]}let b=_.findIndex(e=>e.value===y);if(b!==-1)return[{index:b}];let x=_.findIndex(e=>e.textContent?.trim()===y||e.ariaLabel===y);if(x===-1)throw Error(`The option "${y}" was not found in the "select" options.`);return[{index:x}]}function processClickOptions(e){if(!e||!getBrowserState().config.browser.ui)return e;let g=e;if(g.x!=null||g.y!=null){let e={};g.x!=null&&(g.x=scaleCoordinate(g.x,e)),g.y!=null&&(g.y=scaleCoordinate(g.y,e))}return e}function processHoverOptions(e){if(!e||!getBrowserState().config.browser.ui)return e;let g=e,_={};return g.xOffset!=null&&(g.xOffset=scaleCoordinate(g.xOffset,_)),g.yOffset!=null&&(g.yOffset=scaleCoordinate(g.yOffset,_)),e}function processDragAndDropOptions(e){if(!e||!getBrowserState().config.browser.ui)return e;let g={},_=e;return _.sourceX!=null&&(_.sourceX=scaleCoordinate(_.sourceX,g)),_.sourceY!=null&&(_.sourceY=scaleCoordinate(_.sourceY,g)),_.targetX!=null&&(_.targetX=scaleCoordinate(_.targetX,g)),_.targetY!=null&&(_.targetY=scaleCoordinate(_.targetY,g)),e}function scaleCoordinate(e,g){return Math.round(e*getCachedScale(g))}function getCachedScale(e){return e.scale??=getIframeScale()}
1
+ import{page,server}from"@vitest/browser/context";import{g as getByTitleSelector,a as getByTextSelector,b as getByPlaceholderSelector,c as getByAltTextSelector,d as getByTestIdSelector,e as getByRoleSelector,f as getByLabelSelector,h as getElementError}from"../public-utils-Kx5DUGWa.js";import{s as selectorEngine,L as Locator,c as convertElementToCssSelector,a as getBrowserState,g as getIframeScale}from"../index-D_g_FMM5.js";import"vitest/internal/browser";page.extend({getByLabelText(e,g){return new WebdriverIOLocator(getByLabelSelector(e,g))},getByRole(e,g){return new WebdriverIOLocator(getByRoleSelector(e,g))},getByTestId(e){return new WebdriverIOLocator(getByTestIdSelector(server.config.browser.locators.testIdAttribute,e))},getByAltText(e,g){return new WebdriverIOLocator(getByAltTextSelector(e,g))},getByPlaceholder(e,g){return new WebdriverIOLocator(getByPlaceholderSelector(e,g))},getByText(e,g){return new WebdriverIOLocator(getByTextSelector(e,g))},getByTitle(e,g){return new WebdriverIOLocator(getByTitleSelector(e,g))},_createLocator(e){return new WebdriverIOLocator(e)},elementLocator(e){return new WebdriverIOLocator(selectorEngine.generateSelectorSimple(e))}});class WebdriverIOLocator extends Locator{constructor(e,g){super(),this._pwSelector=e,this._container=g}get selector(){let e=this.elements().map(e=>convertElementToCssSelector(e));if(!e.length)throw getElementError(this._pwSelector,this._container||document.body);let g=!1,_=e.map(e=>e.startsWith(`>>>`)?(g=!0,e.slice(3)):e);return(g?`>>>`:``)+_.join(`, `)}click(e){return super.click(processClickOptions(e))}dblClick(e){return super.dblClick(processClickOptions(e))}tripleClick(e){return super.tripleClick(processClickOptions(e))}selectOptions(e,g){let _=getWebdriverioSelectOptions(this.element(),e);return this.triggerCommand(`__vitest_selectOptions`,this.selector,_,g)}hover(e){return super.hover(processHoverOptions(e))}dropTo(e,g){return super.dropTo(e,processDragAndDropOptions(g))}locator(e){return new WebdriverIOLocator(`${this._pwSelector} >> ${e}`,this._container)}elementLocator(e){return new WebdriverIOLocator(selectorEngine.generateSelectorSimple(e),e)}}function getWebdriverioSelectOptions(e,g){let _=[...e.querySelectorAll(`option`)],v=Array.isArray(g)?g:[g];if(!v.length)return[];if(v.length>1)throw Error(`Provider "webdriverio" doesn't support selecting multiple values at once`);let y=v[0];if(typeof y!=`string`){let e=`element`in y?y.element():y,g=_.indexOf(e);if(g===-1)throw Error(`The element ${selectorEngine.previewNode(e)} was not found in the "select" options.`);return[{index:g}]}let b=_.findIndex(e=>e.value===y);if(b!==-1)return[{index:b}];let x=_.findIndex(e=>e.textContent?.trim()===y||e.ariaLabel===y);if(x===-1)throw Error(`The option "${y}" was not found in the "select" options.`);return[{index:x}]}function processClickOptions(e){if(!e||!getBrowserState().config.browser.ui)return e;let g=e;if(g.x!=null||g.y!=null){let e={};g.x!=null&&(g.x=scaleCoordinate(g.x,e)),g.y!=null&&(g.y=scaleCoordinate(g.y,e))}return e}function processHoverOptions(e){if(!e||!getBrowserState().config.browser.ui)return e;let g=e,_={};return g.xOffset!=null&&(g.xOffset=scaleCoordinate(g.xOffset,_)),g.yOffset!=null&&(g.yOffset=scaleCoordinate(g.yOffset,_)),e}function processDragAndDropOptions(e){if(!e||!getBrowserState().config.browser.ui)return e;let g={},_=e;return _.sourceX!=null&&(_.sourceX=scaleCoordinate(_.sourceX,g)),_.sourceY!=null&&(_.sourceY=scaleCoordinate(_.sourceY,g)),_.targetX!=null&&(_.targetX=scaleCoordinate(_.targetX,g)),_.targetY!=null&&(_.targetY=scaleCoordinate(_.targetY,g)),e}function scaleCoordinate(e,g){return Math.round(e*getCachedScale(g))}function getCachedScale(e){return e.scale??=getIframeScale()}
package/dist/state.js CHANGED
@@ -28,14 +28,16 @@
28
28
  config,
29
29
  environment: {
30
30
  name: "browser",
31
- transformMode: "web",
31
+ viteEnvironment: "client",
32
32
  setup() {
33
33
  throw new Error("Not called in the browser");
34
34
  }
35
35
  },
36
36
  onCleanup: (fn) => getBrowserState().cleanups.push(fn),
37
- moduleCache: getBrowserState().moduleCache,
37
+ evaluatedModules: getBrowserState().evaluatedModules,
38
+ resolvingModules: getBrowserState().resolvingModules,
38
39
  moduleExecutionInfo: new Map(),
40
+ metaEnv: null,
39
41
  rpc: null,
40
42
  durations: {
41
43
  environment: 0,
package/jest-dom.d.ts CHANGED
@@ -627,7 +627,7 @@ export interface TestingLibraryMatchers<E, R> {
627
627
  * other element that contains text, such as a paragraph, span, div etc.
628
628
  *
629
629
  * NOTE: the expected selection is a string, it does not allow to check for
630
- * selection range indeces.
630
+ * selection range indices.
631
631
  *
632
632
  * @example
633
633
  * <div>
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@vitest/browser",
3
3
  "type": "module",
4
- "version": "4.0.0-beta.4",
4
+ "version": "4.0.0-beta.5",
5
5
  "description": "Browser running for Vitest",
6
6
  "license": "MIT",
7
7
  "funding": "https://opencollective.com/vitest",
@@ -66,7 +66,7 @@
66
66
  "peerDependencies": {
67
67
  "playwright": "*",
68
68
  "webdriverio": "^7.0.0 || ^8.0.0 || ^9.0.0",
69
- "vitest": "4.0.0-beta.4"
69
+ "vitest": "4.0.0-beta.5"
70
70
  },
71
71
  "peerDependenciesMeta": {
72
72
  "playwright": {
@@ -88,8 +88,8 @@
88
88
  "sirv": "^3.0.1",
89
89
  "tinyrainbow": "^2.0.0",
90
90
  "ws": "^8.18.3",
91
- "@vitest/mocker": "4.0.0-beta.4",
92
- "@vitest/utils": "4.0.0-beta.4"
91
+ "@vitest/mocker": "4.0.0-beta.5",
92
+ "@vitest/utils": "4.0.0-beta.5"
93
93
  },
94
94
  "devDependencies": {
95
95
  "@types/pngjs": "^6.0.5",
@@ -106,10 +106,10 @@
106
106
  "playwright-core": "^1.54.1",
107
107
  "safaridriver": "^1.0.0",
108
108
  "webdriverio": "^9.18.1",
109
- "@vitest/runner": "4.0.0-beta.4",
110
- "@vitest/ui": "4.0.0-beta.4",
111
- "@vitest/ws-client": "4.0.0-beta.4",
112
- "vitest": "4.0.0-beta.4"
109
+ "@vitest/runner": "4.0.0-beta.5",
110
+ "@vitest/ui": "4.0.0-beta.5",
111
+ "@vitest/ws-client": "4.0.0-beta.5",
112
+ "vitest": "4.0.0-beta.5"
113
113
  },
114
114
  "scripts": {
115
115
  "typecheck": "tsc -p ./src/client/tsconfig.json --noEmit",
package/utils.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  // should be in sync with tester/public-utils.ts
2
- // we cannot bundle it because vitest depend on the @vitest/browser and vise versa
2
+ // we cannot bundle it because vitest depend on the @vitest/browser and vice versa
3
3
  // fortunately, the file is quite small
4
4
 
5
5
  import { LocatorSelectors, Locator } from '@vitest/browser/context'