@vitest/browser 5.0.0-beta.4 → 5.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.
@@ -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-B44yH1M4.js"></script>
30
- <link rel="modulepreload" crossorigin href="/__vitest_browser__/defineProperty-C3k2g8Sk.js">
29
+ <script type="module" crossorigin src="/__vitest_browser__/orchestrator-bDJB3Bid.js"></script>
30
+ <link rel="modulepreload" crossorigin href="/__vitest_browser__/defineProperty-WHpdAQXR.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-kAU8uxhk.js"></script>
9
- <link rel="modulepreload" crossorigin href="/__vitest_browser__/defineProperty-C3k2g8Sk.js">
8
+ <script type="module" crossorigin src="/__vitest_browser__/tester-C1kIlbPd.js"></script>
9
+ <link rel="modulepreload" crossorigin href="/__vitest_browser__/defineProperty-WHpdAQXR.js">
10
10
  </head>
11
11
  <body>
12
12
  </body>
@@ -1,4 +1,4 @@
1
- import type { Task } from "@vitest/runner";
1
+ import type { RunnerTask as Task } from "vitest";
2
2
  import type { BrowserTraceEntryKind } from "vitest/browser";
3
3
  import type { SerializedLocator } from "./locators.js";
4
4
  export interface BrowserTraceData {
package/dist/index.js CHANGED
@@ -5,6 +5,7 @@ import { isValidApiRequest, isFileServingAllowed, distDir, rolldownVersion, reso
5
5
  import { fileURLToPath } from 'node:url';
6
6
  import fs, { readFileSync, createReadStream, promises, existsSync } from 'node:fs';
7
7
  import { createRequire } from 'node:module';
8
+ import { distClientRoot } from '@vitest/ui';
8
9
  import { slash as slash$1, toArray, deepMerge } from '@vitest/utils/helpers';
9
10
  import MagicString from 'magic-string';
10
11
  import sirv from 'sirv';
@@ -18,7 +19,7 @@ import { PNG } from 'pngjs';
18
19
  import { diff } from '@blazediff/core';
19
20
  import { WebSocketServer } from 'ws';
20
21
 
21
- var version = "5.0.0-beta.4";
22
+ var version = "5.0.0-beta.5";
22
23
 
23
24
  const _DRIVE_LETTER_START_RE = /^[A-Za-z]:\//;
24
25
  function normalizeWindowsPath(input = "") {
@@ -676,21 +677,13 @@ function slash(path) {
676
677
  }
677
678
 
678
679
  async function resolveOrchestrator(globalServer, url, res) {
679
- let sessionId = url.searchParams.get("sessionId");
680
- // it's possible to open the page without a context
681
- if (!sessionId) {
682
- const contexts = [...globalServer.children].flatMap((p) => [...p.state.orchestrators.keys()]);
683
- sessionId = contexts.at(-1) ?? "none";
684
- }
685
- // it's ok to not have a session here, especially in the preview provider
686
- // because the user could refresh the page which would remove the session id from the url
687
- const session = globalServer.vitest._browserSessions.getSession(sessionId);
688
- const browserProject = session?.project.browser || [...globalServer.children][0];
689
- if (!browserProject) {
680
+ const sessionId = url.searchParams.get("sessionId");
681
+ const session = sessionId && globalServer.vitest._browserSessions.getSession(sessionId);
682
+ if (!session) {
690
683
  return;
691
684
  }
692
- // ignore unknown pages
693
- if (sessionId && sessionId !== "none" && !globalServer.vitest._browserSessions.sessionIds.has(sessionId)) {
685
+ const browserProject = session.project.browser;
686
+ if (!browserProject) {
694
687
  return;
695
688
  }
696
689
  const injectorJs = typeof globalServer.injectorJs === "string" ? globalServer.injectorJs : await globalServer.injectorJs;
@@ -768,7 +761,10 @@ function createOrchestratorMiddleware(parentServer) {
768
761
  allowIframes(res);
769
762
  res.write(html, "utf-8");
770
763
  res.end();
764
+ return;
771
765
  }
766
+ res.statusCode = 404;
767
+ res.end("Not found");
772
768
  };
773
769
  }
774
770
 
@@ -779,8 +775,8 @@ async function resolveTester(globalServer, url, res, next) {
779
775
  // but keep the rest of the CSP
780
776
  res.setHeader("Content-Security-Policy", csp.replace(/frame-ancestors [^;]+/, "frame-ancestors *"));
781
777
  }
782
- const sessionId = url.searchParams.get("sessionId") || "none";
783
- const session = globalServer.vitest._browserSessions.getSession(sessionId);
778
+ const sessionId = url.searchParams.get("sessionId");
779
+ const session = sessionId && globalServer.vitest._browserSessions.getSession(sessionId);
784
780
  if (!session) {
785
781
  res.statusCode = 400;
786
782
  res.end("Invalid session ID");
@@ -1063,7 +1059,6 @@ var BrowserPlugin = (parentServer, base = "/") => {
1063
1059
  "@vitest/browser/client",
1064
1060
  "@vitest/utils",
1065
1061
  "@vitest/utils/source-map",
1066
- "@vitest/runner",
1067
1062
  "@vitest/spy",
1068
1063
  "@vitest/utils/error",
1069
1064
  "std-env",
@@ -1162,7 +1157,7 @@ var BrowserPlugin = (parentServer, base = "/") => {
1162
1157
  {
1163
1158
  name: "vitest:browser:assets",
1164
1159
  configureServer(server) {
1165
- server.middlewares.use("/__vitest__", sirv(resolve(distRoot, "client/__vitest__")));
1160
+ server.middlewares.use("/__vitest__", sirv(distClientRoot));
1166
1161
  },
1167
1162
  resolveId(id) {
1168
1163
  if (id.startsWith("/__vitest_browser__/")) {
@@ -2780,7 +2775,7 @@ class ParentBrowserProject {
2780
2775
  this.manifest = (async () => {
2781
2776
  return JSON.parse(await readFile$1(`${distRoot}/client/.vite/manifest.json`, "utf8"));
2782
2777
  })().then((manifest) => this.manifest = manifest);
2783
- this.orchestratorHtml = (project.config.browser.ui ? readFile$1(resolve(distRoot, "client/__vitest__/index.html"), "utf8") : readFile$1(resolve(distRoot, "client/orchestrator.html"), "utf8")).then((html) => this.orchestratorHtml = html);
2778
+ this.orchestratorHtml = (project.config.browser.ui ? readFile$1(resolve(distClientRoot, "index.html"), "utf8") : readFile$1(resolve(distRoot, "client/orchestrator.html"), "utf8")).then((html) => this.orchestratorHtml = html);
2784
2779
  this.injectorJs = readFile$1(resolve(distRoot, "client/esm-client-injector.js"), "utf8").then((js) => this.injectorJs = js);
2785
2780
  this.errorCatcherUrl = join("/@fs/", resolve(distRoot, "client/error-catcher.js"));
2786
2781
  this.matchersUrl = join("/@fs/", distRoot, "expect-element.js");
@@ -3119,7 +3114,8 @@ function setupBrowserRpc(globalServer, defaultMockerRegistry) {
3119
3114
  }
3120
3115
  if (type === "orchestrator") {
3121
3116
  const session = sessions.getSession(sessionId);
3122
- // it's possible the session was already resolved by the preview provider
3117
+ // it's possible the session was already resolved by the preview provider,
3118
+ // but we still mark the websocket connection when the page reconnects
3123
3119
  session?.connected();
3124
3120
  }
3125
3121
  const project = vitest.getProjectByName(projectName);
@@ -3128,7 +3124,7 @@ function setupBrowserRpc(globalServer, defaultMockerRegistry) {
3128
3124
  }
3129
3125
  wss.handleUpgrade(request, socket, head, (ws) => {
3130
3126
  wss.emit("connection", ws, request);
3131
- const { rpc, offCancel } = setupClient(project, rpcId, ws);
3127
+ const { rpc, offCancel } = setupClient(project, rpcId, ws, { sessionId });
3132
3128
  const state = project.browser.state;
3133
3129
  const clients = type === "tester" ? state.testers : state.orchestrators;
3134
3130
  clients.set(rpcId, rpc);
@@ -3167,10 +3163,14 @@ function setupBrowserRpc(globalServer, defaultMockerRegistry) {
3167
3163
  throw new Error(`Cannot use CDP because browser API write or exec operations are disabled. See https://vitest.dev/config/browser/api.`);
3168
3164
  }
3169
3165
  }
3170
- function setupClient(project, rpcId, ws) {
3166
+ function setupClient(project, rpcId, ws, options) {
3171
3167
  const mockResolver = new ServerMockResolver(globalServer.vite, { moduleDirectories: project.config?.deps?.moduleDirectories });
3172
3168
  const mocker = project.browser?.provider.mocker;
3173
3169
  const rpc = createBirpc({
3170
+ onOrchestratorReady() {
3171
+ const sessions = vitest._browserSessions;
3172
+ sessions.getSession(options.sessionId)?.ready();
3173
+ },
3174
3174
  async onUnhandledError(error, type) {
3175
3175
  if (error && typeof error === "object") {
3176
3176
  const _error = error;
package/dist/state.js CHANGED
@@ -233,6 +233,7 @@ export async function resolve(specifier, context, nextResolve) {
233
233
  rpc: null,
234
234
  pool: "browser",
235
235
  workerId: 1,
236
+ concurrencyId: 1,
236
237
  config,
237
238
  projectName: config.name || "",
238
239
  files: [],
package/dist/types.d.ts CHANGED
@@ -1,7 +1,6 @@
1
1
  import type { MockedModuleSerialized, ServerIdResolution, ServerMockResolution } from "@vitest/mocker";
2
- import type { BaselineData, TaskEventPack, TaskResultPack, TestArtifact } from "@vitest/runner";
3
2
  import type { BirpcReturn } from "birpc";
4
- import type { AfterSuiteRunMeta, BrowserTesterOptions, CancelReason, RunnerTestFile, SerializedTestSpecification, SnapshotResult, TestBenchmark, TestExecutionMethod, UserConsoleLog } from "vitest";
3
+ import type { AfterSuiteRunMeta, BaselineData, BrowserTesterOptions, CancelReason, RunnerTestFile, SerializedTestSpecification, SnapshotResult, RunnerTaskEventPack as TaskEventPack, RunnerTaskResultPack as TaskResultPack, TestArtifact, TestBenchmark, TestExecutionMethod, UserConsoleLog } from "vitest";
5
4
  import type { MarkOptions } from "vitest/browser";
6
5
  export interface WebSocketBrowserHandlers {
7
6
  resolveSnapshotPath: (testPath: string) => string;
@@ -15,6 +14,7 @@ export interface WebSocketBrowserHandlers {
15
14
  readBenchmarkResult: (relativePath: string) => Promise<BaselineData | null>;
16
15
  writeBenchmarkResult: (relativePath: string, data: BaselineData) => Promise<void>;
17
16
  onAfterSuiteRun: (meta: AfterSuiteRunMeta) => void;
17
+ onOrchestratorReady: () => void;
18
18
  cancelCurrentRun: (reason: CancelReason) => void;
19
19
  getCountOfFailedTests: () => number;
20
20
  readSnapshotFile: (id: string) => Promise<string | null>;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@vitest/browser",
3
3
  "type": "module",
4
- "version": "5.0.0-beta.4",
4
+ "version": "5.0.0-beta.5",
5
5
  "description": "Browser running for Vitest",
6
6
  "license": "MIT",
7
7
  "funding": "https://opencollective.com/vitest",
@@ -63,7 +63,7 @@
63
63
  "providers"
64
64
  ],
65
65
  "peerDependencies": {
66
- "vitest": "5.0.0-beta.4"
66
+ "vitest": "5.0.0-beta.5"
67
67
  },
68
68
  "dependencies": {
69
69
  "@blazediff/core": "1.9.1",
@@ -72,8 +72,9 @@
72
72
  "sirv": "^3.0.2",
73
73
  "tinyrainbow": "^3.1.0",
74
74
  "ws": "^8.19.0",
75
- "@vitest/mocker": "5.0.0-beta.4",
76
- "@vitest/utils": "5.0.0-beta.4"
75
+ "@vitest/mocker": "5.0.0-beta.5",
76
+ "@vitest/ui": "5.0.0-beta.5",
77
+ "@vitest/utils": "5.0.0-beta.5"
77
78
  },
78
79
  "devDependencies": {
79
80
  "@opentelemetry/api": "^1.9.0",
@@ -87,8 +88,7 @@
87
88
  "mime": "^4.1.0",
88
89
  "pathe": "^2.0.3",
89
90
  "rrweb-snapshot": "2.0.0-alpha.20",
90
- "@vitest/runner": "5.0.0-beta.4",
91
- "vitest": "5.0.0-beta.4"
91
+ "vitest": "5.0.0-beta.5"
92
92
  },
93
93
  "scripts": {
94
94
  "typecheck": "tsc -p ./src/client/tsconfig.json --noEmit",