@vitest/browser 2.0.4 → 2.0.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.
@@ -22,7 +22,7 @@
22
22
  })();
23
23
  </script>
24
24
  <!-- !LOAD_METADATA! -->
25
- <script type="module" crossorigin src="./assets/index--tE7Z8jQ.js"></script>
25
+ <script type="module" crossorigin src="./assets/index--EAEh9Ei.js"></script>
26
26
  <link rel="stylesheet" crossorigin href="./assets/index-C0SwoDYm.css">
27
27
  </head>
28
28
  <body>
@@ -436,13 +436,19 @@ class VitestBrowserClientMocker {
436
436
  );
437
437
  }
438
438
  const ext = extname(resolved.id);
439
- const url2 = new URL(`/@id/${resolved.id}`, location.href);
440
- const query = `_vitest_original&ext.${ext}`;
439
+ const url2 = new URL(resolved.url, location.href);
440
+ const query = `_vitest_original&ext${ext}`;
441
441
  const actualUrl = `${url2.pathname}${url2.search ? `${url2.search}&${query}` : `?${query}`}${url2.hash}`;
442
442
  return getBrowserState().wrapModule(() => import(
443
443
  /* @vite-ignore */
444
444
  actualUrl
445
- ));
445
+ )).then((mod) => {
446
+ if (!resolved.optimized || typeof mod.default === "undefined") {
447
+ return mod;
448
+ }
449
+ const m = mod.default;
450
+ return (m == null ? void 0 : m.__esModule) ? m : { ...typeof m === "object" && !Array.isArray(m) || typeof m === "function" ? m : {}, default: m };
451
+ });
446
452
  }
447
453
  async importMock(rawId, importer) {
448
454
  await this.prepare();
@@ -20,7 +20,7 @@
20
20
  <script>{__VITEST_STATE__}</script>
21
21
  {__VITEST_ERROR_CATCHER__}
22
22
  {__VITEST_SCRIPTS__}
23
- <script type="module" crossorigin src="/__vitest_browser__/tester-BSSDPE9E.js"></script>
23
+ <script type="module" crossorigin src="/__vitest_browser__/tester-l8kjusoM.js"></script>
24
24
  <link rel="modulepreload" crossorigin href="/__vitest_browser__/preload-helper-Btt6SgIy.js">
25
25
  </head>
26
26
  <body
package/dist/context.js CHANGED
@@ -18,6 +18,22 @@ function convertElementToCssSelector(element) {
18
18
  }
19
19
  return getUniqueCssSelector(element);
20
20
  }
21
+ function escapeIdForCSSSelector(id) {
22
+ return id.split("").map((char) => {
23
+ const code = char.charCodeAt(0);
24
+ if (char === " " || char === "#" || char === "." || char === ":" || char === "[" || char === "]" || char === ">" || char === "+" || char === "~" || char === "\\") {
25
+ return `\\${char}`;
26
+ } else if (code >= 65536) {
27
+ return `\\${code.toString(16).toUpperCase().padStart(6, "0")} `;
28
+ } else if (code < 32 || code === 127) {
29
+ return `\\${code.toString(16).toUpperCase().padStart(2, "0")} `;
30
+ } else if (code >= 128) {
31
+ return `\\${code.toString(16).toUpperCase().padStart(2, "0")} `;
32
+ } else {
33
+ return char;
34
+ }
35
+ }).join("");
36
+ }
21
37
  function getUniqueCssSelector(el) {
22
38
  const path = [];
23
39
  let parent;
@@ -28,9 +44,9 @@ function getUniqueCssSelector(el) {
28
44
  }
29
45
  const tag = el.tagName;
30
46
  if (el.id) {
31
- path.push(`#${el.id}`);
47
+ path.push(`#${escapeIdForCSSSelector(el.id)}`);
32
48
  } else if (!el.nextElementSibling && !el.previousElementSibling) {
33
- path.push(tag);
49
+ path.push(tag.toLowerCase());
34
50
  } else {
35
51
  let index = 0;
36
52
  let sameTagSiblings = 0;
@@ -45,14 +61,14 @@ function getUniqueCssSelector(el) {
45
61
  }
46
62
  }
47
63
  if (sameTagSiblings > 1) {
48
- path.push(`${tag}:nth-child(${elementIndex})`);
64
+ path.push(`${tag.toLowerCase()}:nth-child(${elementIndex})`);
49
65
  } else {
50
- path.push(tag);
66
+ path.push(tag.toLowerCase());
51
67
  }
52
68
  }
53
69
  el = parent;
54
70
  }
55
- return `${provider === "webdriverio" && hasShadowRoot ? ">>>" : ""}${path.reverse().join(" > ")}`.toLowerCase();
71
+ return `${provider === "webdriverio" && hasShadowRoot ? ">>>" : ""}${path.reverse().join(" > ")}`;
56
72
  }
57
73
  function getParent(el) {
58
74
  const parent = el.parentNode;
@@ -61,61 +77,77 @@ function getParent(el) {
61
77
  }
62
78
  return parent;
63
79
  }
64
- const userEvent = {
65
- // TODO: actually setup userEvent with config options
66
- setup() {
67
- return userEvent;
68
- },
69
- click(element, options = {}) {
70
- const css = convertElementToCssSelector(element);
71
- return triggerCommand("__vitest_click", css, options);
72
- },
73
- dblClick(element, options = {}) {
74
- const css = convertElementToCssSelector(element);
75
- return triggerCommand("__vitest_dblClick", css, options);
76
- },
77
- tripleClick(element, options = {}) {
78
- const css = convertElementToCssSelector(element);
79
- return triggerCommand("__vitest_tripleClick", css, options);
80
- },
81
- selectOptions(element, value) {
82
- const values = provider === "webdriverio" ? getWebdriverioSelectOptions(element, value) : getSimpleSelectOptions(element, value);
83
- const css = convertElementToCssSelector(element);
84
- return triggerCommand("__vitest_selectOptions", css, values);
85
- },
86
- type(element, text, options = {}) {
87
- const css = convertElementToCssSelector(element);
88
- return triggerCommand("__vitest_type", css, text, options);
89
- },
90
- clear(element) {
91
- const css = convertElementToCssSelector(element);
92
- return triggerCommand("__vitest_clear", css);
93
- },
94
- tab(options = {}) {
95
- return triggerCommand("__vitest_tab", options);
96
- },
97
- keyboard(text) {
98
- return triggerCommand("__vitest_keyboard", text);
99
- },
100
- hover(element) {
101
- const css = convertElementToCssSelector(element);
102
- return triggerCommand("__vitest_hover", css);
103
- },
104
- unhover(element) {
105
- const css = convertElementToCssSelector(element.ownerDocument.body);
106
- return triggerCommand("__vitest_hover", css);
107
- },
108
- // non userEvent events, but still useful
109
- fill(element, text, options) {
110
- const css = convertElementToCssSelector(element);
111
- return triggerCommand("__vitest_fill", css, text, options);
112
- },
113
- dragAndDrop(source, target, options = {}) {
114
- const sourceCss = convertElementToCssSelector(source);
115
- const targetCss = convertElementToCssSelector(target);
116
- return triggerCommand("__vitest_dragAndDrop", sourceCss, targetCss, options);
117
- }
118
- };
80
+ function createUserEvent() {
81
+ const keyboard = {
82
+ unreleased: []
83
+ };
84
+ return {
85
+ setup() {
86
+ return createUserEvent();
87
+ },
88
+ click(element, options = {}) {
89
+ const css = convertElementToCssSelector(element);
90
+ return triggerCommand("__vitest_click", css, options);
91
+ },
92
+ dblClick(element, options = {}) {
93
+ const css = convertElementToCssSelector(element);
94
+ return triggerCommand("__vitest_dblClick", css, options);
95
+ },
96
+ tripleClick(element, options = {}) {
97
+ const css = convertElementToCssSelector(element);
98
+ return triggerCommand("__vitest_tripleClick", css, options);
99
+ },
100
+ selectOptions(element, value) {
101
+ const values = provider === "webdriverio" ? getWebdriverioSelectOptions(element, value) : getSimpleSelectOptions(element, value);
102
+ const css = convertElementToCssSelector(element);
103
+ return triggerCommand("__vitest_selectOptions", css, values);
104
+ },
105
+ async type(element, text, options = {}) {
106
+ const css = convertElementToCssSelector(element);
107
+ const { unreleased } = await triggerCommand(
108
+ "__vitest_type",
109
+ css,
110
+ text,
111
+ { ...options, unreleased: keyboard.unreleased }
112
+ );
113
+ keyboard.unreleased = unreleased;
114
+ },
115
+ clear(element) {
116
+ const css = convertElementToCssSelector(element);
117
+ return triggerCommand("__vitest_clear", css);
118
+ },
119
+ tab(options = {}) {
120
+ return triggerCommand("__vitest_tab", options);
121
+ },
122
+ async keyboard(text) {
123
+ const { unreleased } = await triggerCommand(
124
+ "__vitest_keyboard",
125
+ text,
126
+ keyboard
127
+ );
128
+ keyboard.unreleased = unreleased;
129
+ },
130
+ hover(element, options = {}) {
131
+ const css = convertElementToCssSelector(element);
132
+ return triggerCommand("__vitest_hover", css, options);
133
+ },
134
+ unhover(element, options = {}) {
135
+ const css = convertElementToCssSelector(element.ownerDocument.body);
136
+ return triggerCommand("__vitest_hover", css, options);
137
+ },
138
+ // non userEvent events, but still useful
139
+ fill(element, text, options) {
140
+ const css = convertElementToCssSelector(element);
141
+ return triggerCommand("__vitest_fill", css, text, options);
142
+ },
143
+ dragAndDrop(source, target, options = {}) {
144
+ const sourceCss = convertElementToCssSelector(source);
145
+ const targetCss = convertElementToCssSelector(target);
146
+ return triggerCommand("__vitest_dragAndDrop", sourceCss, targetCss, options);
147
+ }
148
+ };
149
+ }
150
+ const userEvent = createUserEvent();
119
151
  function getWebdriverioSelectOptions(element, value) {
120
152
  const options = [...element.querySelectorAll("option")];
121
153
  const arrayValues = Array.isArray(value) ? value : [value];
package/dist/index.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import { CDPSession, BrowserServerState as BrowserServerState$1, BrowserServerStateContext, BrowserServer as BrowserServer$1, WorkspaceProject, Vite, BrowserProvider, BrowserScript, Vitest, ProcessPool } from 'vitest/node';
2
2
  import { Plugin } from 'vitest/config';
3
3
  import * as vitest from 'vitest';
4
- import { File, TaskResultPack, AfterSuiteRunMeta, CancelReason, UserConsoleLog, SnapshotResult, ResolvedConfig } from 'vitest';
4
+ import { File, TaskResultPack, AfterSuiteRunMeta, CancelReason, UserConsoleLog, SnapshotResult, SerializedConfig } from 'vitest';
5
5
  import { ErrorWithDiff } from '@vitest/utils';
6
6
  import { StackTraceParserOptions } from '@vitest/utils/source-map';
7
7
 
@@ -38,6 +38,8 @@ interface WebSocketBrowserHandlers {
38
38
  debug: (...args: string[]) => void;
39
39
  resolveId: (id: string, importer?: string) => Promise<{
40
40
  id: string;
41
+ url: string;
42
+ optimized: boolean;
41
43
  } | null>;
42
44
  triggerCommand: <T>(contextId: string, command: string, testPath: string | undefined, payload: unknown[]) => Promise<T>;
43
45
  resolveMock: (id: string, importer: string, hasFactory: boolean) => Promise<{
@@ -111,7 +113,7 @@ declare class BrowserServer implements BrowserServer$1 {
111
113
  private stackTraceOptions;
112
114
  constructor(project: WorkspaceProject, base: string);
113
115
  setServer(server: Vite.ViteDevServer): void;
114
- getSerializableConfig(): ResolvedConfig;
116
+ getSerializableConfig(): SerializedConfig;
115
117
  resolveTesterUrl(pathname: string): {
116
118
  contextId: string;
117
119
  testFile: string;
package/dist/index.js CHANGED
@@ -525,6 +525,7 @@ function getDepsCacheDir(config) {
525
525
 
526
526
  const debug$1 = createDebugger("vitest:browser:api");
527
527
  const BROWSER_API_PATH = "/__vitest_browser_api__";
528
+ const VALID_ID_PREFIX = "/@id/";
528
529
  function setupBrowserRpc(server) {
529
530
  const project = server.project;
530
531
  const vite = server.vite;
@@ -568,7 +569,7 @@ function setupBrowserRpc(server) {
568
569
  ctx.state.catchError(error, type);
569
570
  },
570
571
  async onCollected(files) {
571
- ctx.state.collectFiles(files);
572
+ ctx.state.collectFiles(project, files);
572
573
  await ctx.report("onCollected", files);
573
574
  },
574
575
  async onTaskUpdate(packs) {
@@ -617,14 +618,34 @@ function setupBrowserRpc(server) {
617
618
  ctx.cancelCurrentRun(reason);
618
619
  },
619
620
  async resolveId(id, importer) {
620
- const result = await project.server.pluginContainer.resolveId(
621
+ const resolved = await vite.pluginContainer.resolveId(
621
622
  id,
622
623
  importer,
623
624
  {
624
625
  ssr: false
625
626
  }
626
627
  );
627
- return result;
628
+ if (!resolved) {
629
+ return null;
630
+ }
631
+ const isOptimized = resolved.id.startsWith(withTrailingSlash(vite.config.cacheDir));
632
+ let url;
633
+ const root = vite.config.root;
634
+ if (resolved.id.startsWith(withTrailingSlash(root))) {
635
+ url = resolved.id.slice(root.length);
636
+ } else if (resolved.id !== "/@react-refresh" && isAbsolute(resolved.id) && existsSync(cleanUrl(resolved.id))) {
637
+ url = join("/@fs/", resolved.id);
638
+ } else {
639
+ url = resolved.id;
640
+ }
641
+ if (url[0] !== "." && url[0] !== "/") {
642
+ url = id.startsWith(VALID_ID_PREFIX) ? id : VALID_ID_PREFIX + id.replace("\0", "__x00__");
643
+ }
644
+ return {
645
+ id: resolved.id,
646
+ url,
647
+ optimized: isOptimized
648
+ };
628
649
  },
629
650
  debug(...args) {
630
651
  ctx.logger.console.debug(...args);
@@ -727,6 +748,12 @@ function stringifyReplace(key, value) {
727
748
  return value;
728
749
  }
729
750
  }
751
+ function withTrailingSlash(path) {
752
+ if (path[path.length - 1] !== "/") {
753
+ return `${path}/`;
754
+ }
755
+ return path;
756
+ }
730
757
 
731
758
  class BrowserServerState {
732
759
  orchestrators = /* @__PURE__ */ new Map();
@@ -1050,28 +1077,6 @@ var clickableInputTypes;
1050
1077
  clickableInputTypes["radio"] = "radio";
1051
1078
  })(clickableInputTypes || (clickableInputTypes = {}));
1052
1079
 
1053
- const ClipboardStubControl = Symbol('Manage ClipboardSub');
1054
- function isClipboardStub(clipboard) {
1055
- return !!(clipboard === null || clipboard === void 0 ? void 0 : clipboard[ClipboardStubControl]);
1056
- }
1057
- function resetClipboardStubOnView(window) {
1058
- if (isClipboardStub(window.navigator.clipboard)) {
1059
- window.navigator.clipboard[ClipboardStubControl].resetClipboardStub();
1060
- }
1061
- }
1062
- function detachClipboardStubFromView(window) {
1063
- if (isClipboardStub(window.navigator.clipboard)) {
1064
- window.navigator.clipboard[ClipboardStubControl].detachClipboardStub();
1065
- }
1066
- }
1067
- const g = globalThis;
1068
- /* istanbul ignore else */ if (typeof g.afterEach === 'function') {
1069
- g.afterEach(()=>resetClipboardStubOnView(globalThis.window));
1070
- }
1071
- /* istanbul ignore else */ if (typeof g.afterAll === 'function') {
1072
- g.afterAll(()=>detachClipboardStubFromView(globalThis.window));
1073
- }
1074
-
1075
1080
  var editableInputTypes;
1076
1081
  (function(editableInputTypes) {
1077
1082
  editableInputTypes["text"] = "text";
@@ -1402,7 +1407,7 @@ var DOM_KEY_LOCATION;
1402
1407
  }
1403
1408
  ];
1404
1409
 
1405
- const keyboard = async (context, text) => {
1410
+ const keyboard = async (context, text, state) => {
1406
1411
  function focusIframe() {
1407
1412
  if (!document.activeElement || document.activeElement.ownerDocument !== document || document.activeElement === document.body) {
1408
1413
  window.focus();
@@ -1414,7 +1419,9 @@ const keyboard = async (context, text) => {
1414
1419
  } else if (context.provider instanceof WebdriverBrowserProvider) {
1415
1420
  await context.browser.execute(focusIframe);
1416
1421
  }
1422
+ const pressed = new Set(state.unreleased);
1417
1423
  await keyboardImplementation(
1424
+ pressed,
1418
1425
  context.provider,
1419
1426
  context.contextId,
1420
1427
  text,
@@ -1436,9 +1443,11 @@ const keyboard = async (context, text) => {
1436
1443
  },
1437
1444
  true
1438
1445
  );
1446
+ return {
1447
+ unreleased: Array.from(pressed)
1448
+ };
1439
1449
  };
1440
- async function keyboardImplementation(provider, contextId, text, selectAll, skipRelease) {
1441
- const pressed = /* @__PURE__ */ new Set();
1450
+ async function keyboardImplementation(pressed, provider, contextId, text, selectAll, skipRelease) {
1442
1451
  if (provider instanceof PlaywrightBrowserProvider) {
1443
1452
  const page = provider.getPage(contextId);
1444
1453
  const actions = parseKeyDef(defaultKeyMap, text);
@@ -1501,7 +1510,8 @@ async function keyboardImplementation(provider, contextId, text, selectAll, skip
1501
1510
  }
1502
1511
  }
1503
1512
  }
1504
- await keyboard2.perform(skipRelease);
1513
+ const allRelease = keyboard2.toJSON().actions.every((action) => action.type === "keyUp");
1514
+ await keyboard2.perform(allRelease ? false : skipRelease);
1505
1515
  }
1506
1516
  return {
1507
1517
  pressed
@@ -1510,6 +1520,7 @@ async function keyboardImplementation(provider, contextId, text, selectAll, skip
1510
1520
 
1511
1521
  const type = async (context, selector, text, options = {}) => {
1512
1522
  const { skipClick = false, skipAutoClose = false } = options;
1523
+ const unreleased = new Set(Reflect.get(options, "unreleased") ?? []);
1513
1524
  if (context.provider instanceof PlaywrightBrowserProvider) {
1514
1525
  const { iframe } = context;
1515
1526
  const element = iframe.locator(`css=${selector}`);
@@ -1517,6 +1528,7 @@ const type = async (context, selector, text, options = {}) => {
1517
1528
  await element.focus();
1518
1529
  }
1519
1530
  await keyboardImplementation(
1531
+ unreleased,
1520
1532
  context.provider,
1521
1533
  context.contextId,
1522
1534
  text,
@@ -1530,6 +1542,7 @@ const type = async (context, selector, text, options = {}) => {
1530
1542
  await element.click();
1531
1543
  }
1532
1544
  await keyboardImplementation(
1545
+ unreleased,
1533
1546
  context.provider,
1534
1547
  context.contextId,
1535
1548
  text,
@@ -1544,6 +1557,9 @@ const type = async (context, selector, text, options = {}) => {
1544
1557
  } else {
1545
1558
  throw new TypeError(`Provider "${context.provider.name}" does not support typing`);
1546
1559
  }
1560
+ return {
1561
+ unreleased: Array.from(unreleased)
1562
+ };
1547
1563
  };
1548
1564
 
1549
1565
  const clear = async (context, selector) => {
@@ -1842,10 +1858,17 @@ function getUserEvent(provider) {
1842
1858
  return "__userEvent_CDP__";
1843
1859
  }
1844
1860
  return `{
1845
- ...__vitest_user_event__,
1846
- fill: async (element, text) => {
1847
- await __vitest_user_event__.clear(element)
1848
- await __vitest_user_event__.type(element, text)
1861
+ ..._userEventSetup,
1862
+ setup() {
1863
+ const userEvent = __vitest_user_event__.setup()
1864
+ userEvent.setup = this.setup
1865
+ userEvent.fill = this.fill.bind(userEvent)
1866
+ userEvent.dragAndDrop = this.dragAndDrop
1867
+ return userEvent
1868
+ },
1869
+ async fill(element, text) {
1870
+ await this.clear(element)
1871
+ await this.type(element, text)
1849
1872
  },
1850
1873
  dragAndDrop: async () => {
1851
1874
  throw new Error('Provider "preview" does not support dragging elements')
@@ -1862,7 +1885,9 @@ async function getUserEventImport(provider, resolve2) {
1862
1885
  }
1863
1886
  return `import { userEvent as __vitest_user_event__ } from '${slash(
1864
1887
  `/@fs/${resolved.id}`
1865
- )}'`;
1888
+ )}'
1889
+ const _userEventSetup = __vitest_user_event__.setup()
1890
+ `;
1866
1891
  }
1867
1892
 
1868
1893
  function injectDynamicImport(code, id, parse) {
@@ -1920,11 +1945,10 @@ async function resolveOrchestrator(server, url, res) {
1920
1945
  contextId = contexts[contexts.length - 1] ?? "none";
1921
1946
  }
1922
1947
  const files = server.state.getContext(contextId)?.files ?? [];
1923
- const config = server.getSerializableConfig();
1924
1948
  const injectorJs = typeof server.injectorJs === "string" ? server.injectorJs : await server.injectorJs;
1925
1949
  const injector = replacer(injectorJs, {
1926
1950
  __VITEST_PROVIDER__: JSON.stringify(server.provider.name),
1927
- __VITEST_CONFIG__: JSON.stringify(config),
1951
+ __VITEST_CONFIG__: JSON.stringify(server.getSerializableConfig()),
1928
1952
  __VITEST_VITE_CONFIG__: JSON.stringify({
1929
1953
  root: server.vite.config.root
1930
1954
  }),
@@ -1983,10 +2007,9 @@ async function resolveTester(server, url, res) {
1983
2007
  const files = context?.files ?? [];
1984
2008
  const method = context?.method ?? "run";
1985
2009
  const injectorJs = typeof server.injectorJs === "string" ? server.injectorJs : await server.injectorJs;
1986
- const config = server.getSerializableConfig();
1987
2010
  const injector = replacer(injectorJs, {
1988
2011
  __VITEST_PROVIDER__: JSON.stringify(server.provider.name),
1989
- __VITEST_CONFIG__: JSON.stringify(config),
2012
+ __VITEST_CONFIG__: JSON.stringify(server.getSerializableConfig()),
1990
2013
  __VITEST_FILES__: JSON.stringify(files),
1991
2014
  __VITEST_VITE_CONFIG__: JSON.stringify({
1992
2015
  root: server.vite.config.root
@@ -2000,7 +2023,7 @@ async function resolveTester(server, url, res) {
2000
2023
  const testerScripts = await server.formatScripts(
2001
2024
  project.config.browser.testerScripts
2002
2025
  );
2003
- const clientScript = `<script type="module" src="${config.base || "/"}@vite/client"><\/script>`;
2026
+ const clientScript = `<script type="module" src="${server.project.config.base || "/"}@vite/client"><\/script>`;
2004
2027
  const stateJs = typeof server.stateJs === "string" ? server.stateJs : await server.stateJs;
2005
2028
  const stateScript = `<script type="module">${stateJs}<\/script>`;
2006
2029
  server.testerScripts = `${stateScript}${clientScript}${testerScripts}`;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@vitest/browser",
3
3
  "type": "module",
4
- "version": "2.0.4",
4
+ "version": "2.0.5",
5
5
  "description": "Browser running for Vitest",
6
6
  "license": "MIT",
7
7
  "funding": "https://opencollective.com/vitest",
@@ -54,7 +54,7 @@
54
54
  "peerDependencies": {
55
55
  "playwright": "*",
56
56
  "webdriverio": "*",
57
- "vitest": "2.0.4"
57
+ "vitest": "2.0.5"
58
58
  },
59
59
  "peerDependenciesMeta": {
60
60
  "playwright": {
@@ -68,30 +68,30 @@
68
68
  }
69
69
  },
70
70
  "dependencies": {
71
- "@testing-library/dom": "^10.3.1",
71
+ "@testing-library/dom": "^10.4.0",
72
72
  "@testing-library/user-event": "^14.5.2",
73
73
  "magic-string": "^0.30.10",
74
- "msw": "^2.3.1",
74
+ "msw": "^2.3.2",
75
75
  "sirv": "^2.0.4",
76
76
  "ws": "^8.18.0",
77
- "@vitest/utils": "2.0.4"
77
+ "@vitest/utils": "2.0.5"
78
78
  },
79
79
  "devDependencies": {
80
- "@testing-library/jest-dom": "^6.4.6",
80
+ "@testing-library/jest-dom": "^6.4.7",
81
81
  "@types/ws": "^8.5.11",
82
82
  "@wdio/protocols": "^8.38.0",
83
83
  "birpc": "0.2.17",
84
84
  "flatted": "^3.3.1",
85
85
  "pathe": "^1.1.2",
86
86
  "periscopic": "^4.0.2",
87
- "playwright": "^1.45.1",
88
- "playwright-core": "^1.45.1",
87
+ "playwright": "^1.45.3",
88
+ "playwright-core": "^1.45.3",
89
89
  "safaridriver": "^0.1.2",
90
90
  "webdriverio": "^8.39.1",
91
- "@vitest/ui": "2.0.4",
92
- "@vitest/runner": "2.0.4",
93
- "@vitest/ws-client": "2.0.4",
94
- "vitest": "2.0.4"
91
+ "@vitest/runner": "2.0.5",
92
+ "@vitest/ws-client": "2.0.5",
93
+ "vitest": "2.0.5",
94
+ "@vitest/ui": "2.0.5"
95
95
  },
96
96
  "scripts": {
97
97
  "build": "rimraf dist && pnpm build:node && pnpm build:client",