@vitest/browser 4.1.0-beta.3 → 4.1.0-beta.4

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,8 +23,8 @@
23
23
  })();
24
24
  </script>
25
25
  <!-- !LOAD_METADATA! -->
26
- <script type="module" src="./assets/index-BcP0bNv8.js"></script>
27
- <link rel="stylesheet" href="./assets/index-DC7speYS.css">
26
+ <script type="module" src="./assets/index-CPanfHPD.js"></script>
27
+ <link rel="stylesheet" href="./assets/index-C71EXv4T.css">
28
28
  </head>
29
29
  <body>
30
30
  <div id="app"></div>
@@ -1,4 +1,4 @@
1
- import { g as getBrowserState, a as getConfig, r as relative, b as generateFileHash } from "./utils-uxqdqUz8.js";
1
+ import { g as getBrowserState, a as getConfig, r as relative, b as generateFileHash } from "./utils-C2ISqq1C.js";
2
2
  import { channel, globalChannel, client } from "@vitest/browser/client";
3
3
  import { Traces } from "vitest/internal/browser";
4
4
  // @__NO_SIDE_EFFECTS__
@@ -1,8 +1,8 @@
1
- import { c as resolve, m as moduleRunner, d as getWorkerState, g as getBrowserState, e as getTestName, a as getConfig } from "./utils-uxqdqUz8.js";
1
+ import { c as resolve, m as moduleRunner, d as getWorkerState, g as getBrowserState, e as getTestName, a as getConfig } from "./utils-C2ISqq1C.js";
2
2
  import { onCancel, globalChannel, channel, client } from "@vitest/browser/client";
3
3
  import { userEvent, page, server } from "vitest/browser";
4
4
  import { getSafeTimers, DecodedMap as DecodedMap$1, getOriginalPosition as getOriginalPosition$1, loadDiffConfig, loadSnapshotSerializers, takeCoverageInsideWorker, browserFormat, Traces, setupCommonEnv, startCoverageInsideWorker, stopCoverageInsideWorker, startTests, collectTests, SpyModule } from "vitest/internal/browser";
5
- import { TestRunner, BenchmarkRunner } from "vitest";
5
+ import { TestRunner, BenchmarkRunner, recordArtifact } from "vitest";
6
6
  const scriptRel = "modulepreload";
7
7
  const assetsURL = function(dep) {
8
8
  return "/" + dep;
@@ -684,7 +684,11 @@ function createStackString(stacks) {
684
684
  }
685
685
  function parseStacktrace(stack, options = {}) {
686
686
  const { ignoreStackEntries = stackIgnorePatterns } = options;
687
- const stacks = !CHROME_IE_STACK_REGEXP.test(stack) ? parseFFOrSafariStackTrace(stack) : parseV8Stacktrace(stack);
687
+ let stacks = !CHROME_IE_STACK_REGEXP.test(stack) ? parseFFOrSafariStackTrace(stack) : parseV8Stacktrace(stack);
688
+ const helperIndex = stacks.findLastIndex((s) => s.method === "__VITEST_HELPER__" || s.method === "async*__VITEST_HELPER__");
689
+ if (helperIndex >= 0) {
690
+ stacks = stacks.slice(helperIndex + 1);
691
+ }
688
692
  return stacks.map((stack2) => {
689
693
  var _a;
690
694
  if (options.getUrlId) {
@@ -737,7 +741,7 @@ class DecodedMap {
737
741
  this._decodedMemo = memoizedState();
738
742
  this.url = from;
739
743
  this.resolvedSources = (sources || []).map(
740
- (s) => resolve(s || "", from)
744
+ (s) => resolve(from, "..", s || "")
741
745
  );
742
746
  }
743
747
  _encoded;
@@ -921,7 +925,10 @@ function createBrowserRunner(runnerClass, mocker, state, coverageModule) {
921
925
  console.error("[vitest] Failed to take a screenshot", err);
922
926
  });
923
927
  if (screenshot) {
924
- task.meta.failScreenshotPath = screenshot;
928
+ await recordArtifact(task, {
929
+ type: "internal:failureScreenshot",
930
+ attachments: [{ contentType: "image/png", path: screenshot, originalPath: screenshot }]
931
+ });
925
932
  }
926
933
  }
927
934
  };
@@ -1395,7 +1402,7 @@ class ManualMockedModule {
1395
1402
  } catch (err) {
1396
1403
  throw createHelpfulError(err);
1397
1404
  }
1398
- if (typeof exports$1 === "object" && typeof (exports$1 === null || exports$1 === void 0 ? void 0 : exports$1.then) === "function") {
1405
+ if (typeof exports$1 === "object" && typeof (exports$1 == null ? void 0 : exports$1.then) === "function") {
1399
1406
  return exports$1.then((result) => {
1400
1407
  assertValidExports(this.raw, result);
1401
1408
  return this.cache = result;
@@ -1802,7 +1809,7 @@ class ModuleMocker {
1802
1809
  return mod;
1803
1810
  }
1804
1811
  const m = mod.default;
1805
- return (m === null || m === void 0 ? void 0 : m.__esModule) ? m : {
1812
+ return (m == null ? void 0 : m.__esModule) ? m : {
1806
1813
  ...typeof m === "object" && !Array.isArray(m) || typeof m === "function" ? m : {},
1807
1814
  default: m
1808
1815
  };
@@ -1859,7 +1866,7 @@ class ModuleMocker {
1859
1866
  return { callstack: null };
1860
1867
  }
1861
1868
  queueMock(rawId, importer, factoryOrOptions) {
1862
- const promise = this.rpc.resolveMock(rawId, importer, { mock: typeof factoryOrOptions === "function" ? "factory" : (factoryOrOptions === null || factoryOrOptions === void 0 ? void 0 : factoryOrOptions.spy) ? "spy" : "auto" }).then(async ({ redirectUrl, resolvedId, resolvedUrl, needsInterop, mockType }) => {
1869
+ const promise = this.rpc.resolveMock(rawId, importer, { mock: typeof factoryOrOptions === "function" ? "factory" : (factoryOrOptions == null ? void 0 : factoryOrOptions.spy) ? "spy" : "auto" }).then(async ({ redirectUrl, resolvedId, resolvedUrl, needsInterop, mockType }) => {
1863
1870
  const mockUrl = this.resolveMockPath(cleanVersion(resolvedUrl));
1864
1871
  this.mockedIds.add(resolvedId);
1865
1872
  const factory = typeof factoryOrOptions === "function" ? async () => {
@@ -159,9 +159,9 @@ function generateFileHash(file, projectName) {
159
159
  function getNames(task) {
160
160
  const names = [task.name];
161
161
  let current = task;
162
- while (current === null || current === void 0 ? void 0 : current.suite) {
162
+ while (current == null ? void 0 : current.suite) {
163
163
  current = current.suite;
164
- if (current === null || current === void 0 ? void 0 : current.name) {
164
+ if (current == null ? void 0 : current.name) {
165
165
  names.unshift(current.name);
166
166
  }
167
167
  }
@@ -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-fh7lJzlE.js"></script>
30
- <link rel="modulepreload" crossorigin href="/__vitest_browser__/utils-uxqdqUz8.js">
29
+ <script type="module" crossorigin src="/__vitest_browser__/orchestrator-CXs6qrFe.js"></script>
30
+ <link rel="modulepreload" crossorigin href="/__vitest_browser__/utils-C2ISqq1C.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-CH-bVWK6.js"></script>
9
- <link rel="modulepreload" crossorigin href="/__vitest_browser__/utils-uxqdqUz8.js">
8
+ <script type="module" crossorigin src="/__vitest_browser__/tester-CgiVtoKi.js"></script>
9
+ <link rel="modulepreload" crossorigin href="/__vitest_browser__/utils-C2ISqq1C.js">
10
10
  </head>
11
11
  <body>
12
12
  </body>
package/dist/index.js CHANGED
@@ -3,12 +3,11 @@ import { dynamicImportPlugin, ServerMockResolver, interceptorPlugin } from '@vit
3
3
  import c from 'tinyrainbow';
4
4
  import { isValidApiRequest, isFileServingAllowed, distDir, resolveApiServerConfig, resolveFsAllow, rolldownVersion, isFileLoadingAllowed, createDebugger, createViteLogger, createViteServer } from 'vitest/node';
5
5
  import { fileURLToPath } from 'node:url';
6
- import fs, { readFileSync, lstatSync, createReadStream, promises, existsSync } from 'node:fs';
6
+ import fs, { readFileSync, createReadStream, promises, existsSync } from 'node:fs';
7
7
  import { createRequire } from 'node:module';
8
8
  import { slash as slash$1, toArray, deepMerge } from '@vitest/utils/helpers';
9
9
  import MagicString from 'magic-string';
10
10
  import sirv from 'sirv';
11
- import { coverageConfigDefaults } from 'vitest/config';
12
11
  import crypto from 'node:crypto';
13
12
  import { readFile as readFile$1, mkdir, writeFile as writeFile$1 } from 'node:fs/promises';
14
13
  import { parseErrorStacktrace, parseStacktrace } from '@vitest/utils/source-map';
@@ -18,7 +17,7 @@ import { PNG } from 'pngjs';
18
17
  import pm from 'pixelmatch';
19
18
  import { WebSocketServer } from 'ws';
20
19
 
21
- var version = "4.1.0-beta.3";
20
+ var version = "4.1.0-beta.4";
22
21
 
23
22
  const _DRIVE_LETTER_START_RE = /^[A-Za-z]:\//;
24
23
  function normalizeWindowsPath(input = "") {
@@ -942,13 +941,10 @@ var BrowserPlugin = (parentServer, base = "/") => {
942
941
  res.write(content, "utf-8");
943
942
  res.end();
944
943
  });
945
- const coverageFolder = resolveCoverageFolder(parentServer.vitest);
946
- const coveragePath = coverageFolder ? coverageFolder[1] : undefined;
947
- if (coveragePath && base === coveragePath) {
948
- throw new Error(`The ui base path and the coverage path cannot be the same: ${base}, change coverage.reportsDirectory`);
949
- }
950
- if (coverageFolder) {
951
- server.middlewares.use(coveragePath, sirv(coverageFolder[0], {
944
+ // Serve coverage HTML at ./coverage if configured
945
+ const coverageHtmlDir = parentServer.vitest.config.coverage?.htmlDir;
946
+ if (coverageHtmlDir) {
947
+ server.middlewares.use("/__vitest_test__/coverage", sirv(coverageHtmlDir, {
952
948
  single: true,
953
949
  dev: true,
954
950
  setHeaders: (res) => {
@@ -962,46 +958,6 @@ var BrowserPlugin = (parentServer, base = "/") => {
962
958
  }
963
959
  }));
964
960
  }
965
- const uiEnabled = parentServer.config.browser.ui;
966
- if (uiEnabled) {
967
- // eslint-disable-next-line prefer-arrow-callback
968
- server.middlewares.use(`${base}__screenshot-error`, function vitestBrowserScreenshotError(req, res) {
969
- if (!req.url) {
970
- res.statusCode = 404;
971
- res.end();
972
- return;
973
- }
974
- const url = new URL(req.url, "http://localhost");
975
- const id = url.searchParams.get("id");
976
- if (!id) {
977
- res.statusCode = 404;
978
- res.end();
979
- return;
980
- }
981
- const task = parentServer.vitest.state.idMap.get(id);
982
- const file = task?.meta.failScreenshotPath;
983
- if (!file) {
984
- res.statusCode = 404;
985
- res.end();
986
- return;
987
- }
988
- let stat;
989
- try {
990
- stat = lstatSync(file);
991
- } catch {}
992
- if (!stat?.isFile()) {
993
- res.statusCode = 404;
994
- res.end();
995
- return;
996
- }
997
- const ext = extname(file);
998
- const buffer = readFileSync(file);
999
- res.setHeader("Cache-Control", "public,max-age=0,must-revalidate");
1000
- res.setHeader("Content-Length", buffer.length);
1001
- res.setHeader("Content-Type", ext === "jpeg" || ext === "jpg" ? "image/jpeg" : ext === "webp" ? "image/webp" : "image/png");
1002
- res.end(buffer);
1003
- });
1004
- }
1005
961
  server.middlewares.use((req, res, next) => {
1006
962
  // 9000 mega head move
1007
963
  // Vite always caches optimized dependencies, but users might mock
@@ -1412,26 +1368,6 @@ function getRequire() {
1412
1368
  }
1413
1369
  return _require;
1414
1370
  }
1415
- function resolveCoverageFolder(vitest) {
1416
- const options = vitest.config;
1417
- const coverageOptions = vitest._coverageOptions;
1418
- const htmlReporter = coverageOptions?.enabled ? toArray(options.coverage.reporter).find((reporter) => {
1419
- if (typeof reporter === "string") {
1420
- return reporter === "html";
1421
- }
1422
- return reporter[0] === "html";
1423
- }) : undefined;
1424
- if (!htmlReporter) {
1425
- return undefined;
1426
- }
1427
- // reportsDirectory not resolved yet
1428
- const root = resolve(options.root || process.cwd(), coverageOptions.reportsDirectory || coverageConfigDefaults.reportsDirectory);
1429
- const subdir = Array.isArray(htmlReporter) && htmlReporter.length > 1 && "subdir" in htmlReporter[1] ? htmlReporter[1].subdir : undefined;
1430
- if (!subdir || typeof subdir !== "string") {
1431
- return [root, `/${basename(root)}/`];
1432
- }
1433
- return [resolve(root, subdir), `/${basename(root)}/${subdir}/`];
1434
- }
1435
1371
  const postfixRE = /[?#].*$/;
1436
1372
  function cleanUrl(url) {
1437
1373
  return url.replace(postfixRE, "");
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@vitest/browser",
3
3
  "type": "module",
4
- "version": "4.1.0-beta.3",
4
+ "version": "4.1.0-beta.4",
5
5
  "description": "Browser running for Vitest",
6
6
  "license": "MIT",
7
7
  "funding": "https://opencollective.com/vitest",
@@ -51,7 +51,7 @@
51
51
  "providers"
52
52
  ],
53
53
  "peerDependencies": {
54
- "vitest": "4.1.0-beta.3"
54
+ "vitest": "4.1.0-beta.4"
55
55
  },
56
56
  "dependencies": {
57
57
  "magic-string": "^0.30.21",
@@ -60,8 +60,8 @@
60
60
  "sirv": "^3.0.2",
61
61
  "tinyrainbow": "^3.0.3",
62
62
  "ws": "^8.19.0",
63
- "@vitest/mocker": "4.1.0-beta.3",
64
- "@vitest/utils": "4.1.0-beta.3"
63
+ "@vitest/mocker": "4.1.0-beta.4",
64
+ "@vitest/utils": "4.1.0-beta.4"
65
65
  },
66
66
  "devDependencies": {
67
67
  "@opentelemetry/api": "^1.9.0",
@@ -73,8 +73,8 @@
73
73
  "ivya": "^1.7.1",
74
74
  "mime": "^4.1.0",
75
75
  "pathe": "^2.0.3",
76
- "@vitest/runner": "4.1.0-beta.3",
77
- "vitest": "4.1.0-beta.3"
76
+ "vitest": "4.1.0-beta.4",
77
+ "@vitest/runner": "4.1.0-beta.4"
78
78
  },
79
79
  "scripts": {
80
80
  "typecheck": "tsc -p ./src/client/tsconfig.json --noEmit",