@vitest/browser 3.2.4 → 3.2.6

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-D_ryMEPs.js"></script>
27
- <link rel="stylesheet" href="./assets/index-X8b7Z_4p.css">
26
+ <script type="module" src="./assets/index-B2adRzgr.js"></script>
27
+ <link rel="stylesheet" href="./assets/index-B0yz5e_c.css">
28
28
  </head>
29
29
  <body>
30
30
  <div id="app"></div>
package/dist/index.js CHANGED
@@ -13,13 +13,13 @@ import { fileURLToPath } from 'node:url';
13
13
  import crypto from 'node:crypto';
14
14
  import { mkdir, rm, readFile as readFile$1 } from 'node:fs/promises';
15
15
  import { parseErrorStacktrace, parseStacktrace } from '@vitest/utils/source-map';
16
- import { P as PlaywrightBrowserProvider, W as WebdriverBrowserProvider } from './webdriver-KA1WiV0q.js';
16
+ import { P as PlaywrightBrowserProvider, W as WebdriverBrowserProvider } from './webdriver-BStCVush.js';
17
17
  import { resolve as resolve$1, basename as basename$1, dirname as dirname$1, normalize as normalize$1 } from 'node:path';
18
18
  import { WebSocketServer } from 'ws';
19
19
  import * as nodeos from 'node:os';
20
20
  import { performance } from 'node:perf_hooks';
21
21
 
22
- var version = "3.2.4";
22
+ var version = "3.2.6";
23
23
 
24
24
  const _DRIVE_LETTER_START_RE = /^[A-Za-z]:\//;
25
25
  function normalizeWindowsPath(input = "") {
@@ -836,7 +836,7 @@ var BrowserPlugin = (parentServer, base = "/") => {
836
836
  viteConfig.esbuild.legalComments = "inline";
837
837
  }
838
838
  const defaultPort = parentServer.vitest._browserLastPort++;
839
- const api = resolveApiServerConfig(viteConfig.test?.browser || {}, defaultPort);
839
+ const api = resolveApiServerConfig(viteConfig.test?.browser || {}, defaultPort, parentServer.vitest.config.api, parentServer.vitest.logger);
840
840
  viteConfig.server = {
841
841
  ...viteConfig.server,
842
842
  port: defaultPort,
@@ -1143,6 +1143,19 @@ const tripleClick = async (context, selector, options = {}) => {
1143
1143
  }
1144
1144
  };
1145
1145
 
1146
+ const _startV8Coverage = async (context) => {
1147
+ const session = await context.__ensureCDPHandler();
1148
+ await session.send("Profiler.enable");
1149
+ await session.send("Profiler.startPreciseCoverage", {
1150
+ callCount: true,
1151
+ detailed: true
1152
+ });
1153
+ };
1154
+ const _takeV8Coverage = async (context) => {
1155
+ const session = await context.__ensureCDPHandler();
1156
+ return session.send("Profiler.takePreciseCoverage");
1157
+ };
1158
+
1146
1159
  const dragAndDrop = async (context, source, target, options_) => {
1147
1160
  if (context.provider instanceof PlaywrightBrowserProvider) {
1148
1161
  const frame = await context.frame();
@@ -1654,9 +1667,14 @@ function assertFileAccess(path, project) {
1654
1667
  throw new Error(`Access denied to "${path}". See Vite config documentation for "server.fs": https://vitejs.dev/config/server-options.html#server-fs-strict.`);
1655
1668
  }
1656
1669
  }
1670
+ function assertWrite(path, project) {
1671
+ if (!project.config.browser.api.allowWrite || !project.vitest.config.api.allowWrite) {
1672
+ throw new Error(`Cannot modify file "${path}". File writing is disabled because server is exposed to the internet, see https://vitest.dev/config/browser/api.`);
1673
+ }
1674
+ }
1657
1675
  const readFile = async ({ project }, path, options = {}) => {
1658
1676
  const filepath = resolve$1(project.config.root, path);
1659
- assertFileAccess(filepath, project);
1677
+ assertFileAccess(slash(filepath), project);
1660
1678
  // never return a Buffer
1661
1679
  if (typeof options === "object" && !options.encoding) {
1662
1680
  options.encoding = "utf-8";
@@ -1664,8 +1682,9 @@ const readFile = async ({ project }, path, options = {}) => {
1664
1682
  return promises.readFile(filepath, options);
1665
1683
  };
1666
1684
  const writeFile = async ({ project }, path, data, options) => {
1685
+ assertWrite(path, project);
1667
1686
  const filepath = resolve$1(project.config.root, path);
1668
- assertFileAccess(filepath, project);
1687
+ assertFileAccess(slash(filepath), project);
1669
1688
  const dir = dirname$1(filepath);
1670
1689
  if (!fs.existsSync(dir)) {
1671
1690
  await promises.mkdir(dir, { recursive: true });
@@ -1673,13 +1692,14 @@ const writeFile = async ({ project }, path, data, options) => {
1673
1692
  await promises.writeFile(filepath, data, options);
1674
1693
  };
1675
1694
  const removeFile = async ({ project }, path) => {
1695
+ assertWrite(path, project);
1676
1696
  const filepath = resolve$1(project.config.root, path);
1677
- assertFileAccess(filepath, project);
1697
+ assertFileAccess(slash(filepath), project);
1678
1698
  await promises.rm(filepath);
1679
1699
  };
1680
1700
  const _fileInfo = async ({ project }, path, encoding) => {
1681
1701
  const filepath = resolve$1(project.config.root, path);
1682
- assertFileAccess(filepath, project);
1702
+ assertFileAccess(slash(filepath), project);
1683
1703
  const content = await promises.readFile(filepath, encoding || "base64");
1684
1704
  return {
1685
1705
  content,
@@ -2537,6 +2557,8 @@ var builtinCommands = {
2537
2557
  removeFile,
2538
2558
  writeFile,
2539
2559
  __vitest_fileInfo: _fileInfo,
2560
+ __vitest_startV8Coverage: _startV8Coverage,
2561
+ __vitest_takeV8Coverage: _takeV8Coverage,
2540
2562
  __vitest_upload: upload,
2541
2563
  __vitest_click: click,
2542
2564
  __vitest_dblClick: dblClick,
@@ -3056,10 +3078,21 @@ function setupBrowserRpc(globalServer, defaultMockerRegistry) {
3056
3078
  vitest.state.catchError(err, "RPC Error");
3057
3079
  }
3058
3080
  function checkFileAccess(path) {
3059
- if (!isFileServingAllowed(path, vite)) {
3081
+ if (!isFileServingAllowed(slash(path), vite)) {
3060
3082
  throw new Error(`Access denied to "${path}". See Vite config documentation for "server.fs": https://vitejs.dev/config/server-options.html#server-fs-strict.`);
3061
3083
  }
3062
3084
  }
3085
+ function canWrite(project) {
3086
+ return project.config.browser.api.allowWrite && project.vitest.config.browser.api.allowWrite && project.config.api.allowWrite && project.vitest.config.api.allowWrite;
3087
+ }
3088
+ function isCdpAllowed(project) {
3089
+ return project.config.api.allowExec && project.config.browser.api.allowExec && project.vitest.config.api.allowExec && project.vitest.config.browser.api.allowExec && project.config.api.allowWrite && project.config.browser.api.allowWrite && project.vitest.config.api.allowWrite && project.vitest.config.browser.api.allowWrite;
3090
+ }
3091
+ function assertCdpAllowed(project) {
3092
+ if (!isCdpAllowed(project)) {
3093
+ throw new Error(`Cannot use CDP because browser API write or exec operations are disabled. See https://vitest.dev/config/browser/api.`);
3094
+ }
3095
+ }
3063
3096
  function setupClient(project, rpcId, ws) {
3064
3097
  const mockResolver = new ServerMockResolver(globalServer.vite, { moduleDirectories: project.config.server?.deps?.moduleDirectories });
3065
3098
  const mocker = project.browser?.provider.mocker;
@@ -3123,11 +3156,19 @@ function setupBrowserRpc(globalServer, defaultMockerRegistry) {
3123
3156
  },
3124
3157
  async saveSnapshotFile(id, content) {
3125
3158
  checkFileAccess(id);
3159
+ if (!canWrite(project)) {
3160
+ vitest.logger.error(`[vitest] Cannot save snapshot file "${id}". File writing is disabled because server is exposed to the internet, see https://vitest.dev/config/browser/api.`);
3161
+ return;
3162
+ }
3126
3163
  await promises.mkdir(dirname(id), { recursive: true });
3127
3164
  return promises.writeFile(id, content, "utf-8");
3128
3165
  },
3129
3166
  async removeSnapshotFile(id) {
3130
3167
  checkFileAccess(id);
3168
+ if (!canWrite(project)) {
3169
+ vitest.logger.error(`[vitest] Cannot remove snapshot file "${id}". File writing is disabled because server is exposed to the internet, see https://vitest.dev/config/browser/api.`);
3170
+ return;
3171
+ }
3131
3172
  if (!existsSync(id)) {
3132
3173
  throw new Error(`Snapshot file "${id}" does not exist.`);
3133
3174
  }
@@ -3178,7 +3219,8 @@ function setupBrowserRpc(globalServer, defaultMockerRegistry) {
3178
3219
  project,
3179
3220
  provider,
3180
3221
  contextId: sessionId,
3181
- sessionId
3222
+ sessionId,
3223
+ __ensureCDPHandler: () => globalServer.ensureCDPHandler(sessionId, rpcId)
3182
3224
  }, provider.getCommandsContext(sessionId));
3183
3225
  return await commands[command](context, ...payload);
3184
3226
  },
@@ -3240,10 +3282,12 @@ function setupBrowserRpc(globalServer, defaultMockerRegistry) {
3240
3282
  return mocker.delete(sessionId, id);
3241
3283
  },
3242
3284
  async sendCdpEvent(sessionId, event, payload) {
3285
+ assertCdpAllowed(project);
3243
3286
  const cdp = await globalServer.ensureCDPHandler(sessionId, rpcId);
3244
3287
  return cdp.send(event, payload);
3245
3288
  },
3246
3289
  async trackCdpEvent(sessionId, type, event, listenerId) {
3290
+ assertCdpAllowed(project);
3247
3291
  const cdp = await globalServer.ensureCDPHandler(sessionId, rpcId);
3248
3292
  cdp[type](event, listenerId);
3249
3293
  }
package/dist/providers.js CHANGED
@@ -1,4 +1,4 @@
1
- import { W as WebdriverBrowserProvider, P as PlaywrightBrowserProvider } from './webdriver-KA1WiV0q.js';
1
+ import { W as WebdriverBrowserProvider, P as PlaywrightBrowserProvider } from './webdriver-BStCVush.js';
2
2
  import '@vitest/mocker/node';
3
3
  import 'tinyrainbow';
4
4
  import 'vitest/node';
@@ -298,19 +298,10 @@ class PlaywrightBrowserProvider {
298
298
  const page = this.getPage(sessionid);
299
299
  const cdp = await page.context().newCDPSession(page);
300
300
  return {
301
- async send(method, params) {
302
- const result = await cdp.send(method, params);
303
- return result;
304
- },
305
- on(event, listener) {
306
- cdp.on(event, listener);
307
- },
308
- off(event, listener) {
309
- cdp.off(event, listener);
310
- },
311
- once(event, listener) {
312
- cdp.once(event, listener);
313
- }
301
+ send: cdp.send.bind(cdp),
302
+ on: cdp.on.bind(cdp),
303
+ off: cdp.off.bind(cdp),
304
+ once: cdp.once.bind(cdp)
314
305
  };
315
306
  }
316
307
  async close() {
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@vitest/browser",
3
3
  "type": "module",
4
- "version": "3.2.4",
4
+ "version": "3.2.6",
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": "3.2.4"
69
+ "vitest": "3.2.6"
70
70
  },
71
71
  "peerDependenciesMeta": {
72
72
  "playwright": {
@@ -86,8 +86,8 @@
86
86
  "sirv": "^3.0.1",
87
87
  "tinyrainbow": "^2.0.0",
88
88
  "ws": "^8.18.2",
89
- "@vitest/mocker": "3.2.4",
90
- "@vitest/utils": "3.2.4"
89
+ "@vitest/mocker": "3.2.6",
90
+ "@vitest/utils": "3.2.6"
91
91
  },
92
92
  "devDependencies": {
93
93
  "@types/ws": "^8.18.1",
@@ -103,10 +103,10 @@
103
103
  "playwright-core": "^1.53.0",
104
104
  "safaridriver": "^1.0.0",
105
105
  "webdriverio": "^9.15.0",
106
- "@vitest/ui": "3.2.4",
107
- "@vitest/ws-client": "3.2.4",
108
- "vitest": "3.2.4",
109
- "@vitest/runner": "3.2.4"
106
+ "@vitest/runner": "3.2.6",
107
+ "@vitest/ui": "3.2.6",
108
+ "vitest": "3.2.6",
109
+ "@vitest/ws-client": "3.2.6"
110
110
  },
111
111
  "scripts": {
112
112
  "build": "rimraf dist && pnpm build:node && pnpm build:client",