@vitest/browser 4.0.6 → 4.0.8

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.
package/dist/index.js CHANGED
@@ -18,7 +18,7 @@ import { PNG } from 'pngjs';
18
18
  import pm from 'pixelmatch';
19
19
  import { WebSocketServer } from 'ws';
20
20
 
21
- var version = "4.0.6";
21
+ var version = "4.0.8";
22
22
 
23
23
  const _DRIVE_LETTER_START_RE = /^[A-Za-z]:\//;
24
24
  function normalizeWindowsPath(input = "") {
@@ -950,6 +950,12 @@ var BrowserPlugin = (parentServer, base = "/") => {
950
950
  single: true,
951
951
  dev: true,
952
952
  setHeaders: (res) => {
953
+ const csp = res.getHeader("Content-Security-Policy");
954
+ if (typeof csp === "string") {
955
+ // add frame-ancestors to allow the iframe to be loaded by Vitest,
956
+ // but keep the rest of the CSP
957
+ res.setHeader("Content-Security-Policy", csp.replace(/frame-ancestors [^;]+/, "frame-ancestors *"));
958
+ }
953
959
  res.setHeader("Cache-Control", "public,max-age=0,must-revalidate");
954
960
  }
955
961
  }));
@@ -2681,7 +2687,7 @@ function createBirpc(functions, options) {
2681
2687
  timeout = DEFAULT_TIMEOUT
2682
2688
  } = options;
2683
2689
  const rpcPromiseMap = /* @__PURE__ */ new Map();
2684
- let _promise;
2690
+ let _promiseInit;
2685
2691
  let closed = false;
2686
2692
  const rpc = new Proxy({}, {
2687
2693
  get(_, method) {
@@ -2696,8 +2702,8 @@ function createBirpc(functions, options) {
2696
2702
  return closed;
2697
2703
  if (method === "then" && !eventNames.includes("then") && !("then" in functions))
2698
2704
  return void 0;
2699
- const sendEvent = (...args) => {
2700
- post(serialize({ m: method, a: args, t: TYPE_REQUEST }));
2705
+ const sendEvent = async (...args) => {
2706
+ await post(serialize({ m: method, a: args, t: TYPE_REQUEST }));
2701
2707
  };
2702
2708
  if (eventNames.includes(method)) {
2703
2709
  sendEvent.asEvent = sendEvent;
@@ -2706,16 +2712,18 @@ function createBirpc(functions, options) {
2706
2712
  const sendCall = async (...args) => {
2707
2713
  if (closed)
2708
2714
  throw new Error(`[birpc] rpc is closed, cannot call "${method}"`);
2709
- if (_promise) {
2715
+ if (_promiseInit) {
2710
2716
  try {
2711
- await _promise;
2717
+ await _promiseInit;
2712
2718
  } finally {
2713
- _promise = void 0;
2719
+ _promiseInit = void 0;
2714
2720
  }
2715
2721
  }
2716
- return new Promise((resolve, reject) => {
2717
- const id = nanoid();
2718
- let timeoutId;
2722
+ let { promise, resolve, reject } = createPromiseWithResolvers();
2723
+ const id = nanoid();
2724
+ let timeoutId;
2725
+ const _req = { m: method, a: args, i: id, t: TYPE_REQUEST };
2726
+ async function handler(req = _req) {
2719
2727
  if (timeout >= 0) {
2720
2728
  timeoutId = setTimeout$1(() => {
2721
2729
  try {
@@ -2731,8 +2739,22 @@ function createBirpc(functions, options) {
2731
2739
  timeoutId = timeoutId.unref?.();
2732
2740
  }
2733
2741
  rpcPromiseMap.set(id, { resolve, reject, timeoutId, method });
2734
- post(serialize({ m: method, a: args, i: id, t: "q" }));
2735
- });
2742
+ await post(serialize(req));
2743
+ return promise;
2744
+ }
2745
+ try {
2746
+ if (options.onRequest)
2747
+ await options.onRequest(_req, handler, resolve);
2748
+ else
2749
+ await handler();
2750
+ } catch (e) {
2751
+ clearTimeout(timeoutId);
2752
+ rpcPromiseMap.delete(id);
2753
+ if (options.onGeneralError?.(e) !== true)
2754
+ throw e;
2755
+ return;
2756
+ }
2757
+ return promise;
2736
2758
  };
2737
2759
  sendCall.asEvent = sendEvent;
2738
2760
  return sendCall;
@@ -2774,7 +2796,7 @@ function createBirpc(functions, options) {
2774
2796
  if (msg.t === TYPE_REQUEST) {
2775
2797
  const { m: method, a: args } = msg;
2776
2798
  let result, error;
2777
- const fn = resolver ? resolver(method, functions[method]) : functions[method];
2799
+ const fn = await (resolver ? resolver(method, functions[method]) : functions[method]);
2778
2800
  if (!fn) {
2779
2801
  error = new Error(`[birpc] function "${method}" not found`);
2780
2802
  } else {
@@ -2793,7 +2815,7 @@ function createBirpc(functions, options) {
2793
2815
  }
2794
2816
  if (!error) {
2795
2817
  try {
2796
- post(serialize({ t: TYPE_RESPONSE, i: msg.i, r: result }), ...extra);
2818
+ await post(serialize({ t: TYPE_RESPONSE, i: msg.i, r: result }), ...extra);
2797
2819
  return;
2798
2820
  } catch (e) {
2799
2821
  error = e;
@@ -2802,7 +2824,7 @@ function createBirpc(functions, options) {
2802
2824
  }
2803
2825
  }
2804
2826
  try {
2805
- post(serialize({ t: TYPE_RESPONSE, i: msg.i, e: error }), ...extra);
2827
+ await post(serialize({ t: TYPE_RESPONSE, i: msg.i, e: error }), ...extra);
2806
2828
  } catch (e) {
2807
2829
  if (options.onGeneralError?.(e, method, args) !== true)
2808
2830
  throw e;
@@ -2821,9 +2843,18 @@ function createBirpc(functions, options) {
2821
2843
  rpcPromiseMap.delete(ack);
2822
2844
  }
2823
2845
  }
2824
- _promise = on(onMessage);
2846
+ _promiseInit = on(onMessage);
2825
2847
  return rpc;
2826
2848
  }
2849
+ function createPromiseWithResolvers() {
2850
+ let resolve;
2851
+ let reject;
2852
+ const promise = new Promise((res, rej) => {
2853
+ resolve = res;
2854
+ reject = rej;
2855
+ });
2856
+ return { promise, resolve, reject };
2857
+ }
2827
2858
  const urlAlphabet = "useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict";
2828
2859
  function nanoid(size = 21) {
2829
2860
  let id = "";
package/dist/locators.js CHANGED
@@ -1 +1 @@
1
- export{L as Locator,o as convertElementToCssSelector,r as getByAltTextSelector,t as getByLabelSelector,u as getByPlaceholderSelector,v as getByRoleSelector,w as getByTestIdSelector,x as getByTextSelector,y as getByTitleSelector,q as getIframeScale,p as processTimeoutOptions,s as selectorEngine}from"./index-BnLTaCRv.js";import"vitest/browser";import"vitest/internal/browser";
1
+ export{L as Locator,o as convertElementToCssSelector,r as getByAltTextSelector,t as getByLabelSelector,u as getByPlaceholderSelector,v as getByRoleSelector,w as getByTestIdSelector,x as getByTextSelector,y as getByTitleSelector,q as getIframeScale,p as processTimeoutOptions,s as selectorEngine}from"./index-hFpxawnd.js";import"vitest/browser";import"vitest/internal/browser";
package/dist/state.js CHANGED
@@ -179,6 +179,7 @@ export async function resolve(specifier, context, nextResolve) {
179
179
  const sessionId = getBrowserState().sessionId;
180
180
  const state = {
181
181
  ctx: {
182
+ rpc: null,
182
183
  pool: "browser",
183
184
  workerId: 1,
184
185
  config,
package/jest-dom.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  // Disable automatic exports.
2
2
 
3
3
  import { ARIARole } from './aria-role.ts'
4
- import { ScreenshotComparatorRegistry, ScreenshotMatcherOptions } from './context.js'
4
+ import { Locator, ScreenshotComparatorRegistry, ScreenshotMatcherOptions } from './context.js'
5
5
 
6
6
  export interface TestingLibraryMatchers<E, R> {
7
7
  /**
@@ -12,7 +12,7 @@ export interface TestingLibraryMatchers<E, R> {
12
12
  *
13
13
  * await expect.element(page.getByTestId('svg-element')).toBeInTheDocument()
14
14
  * await expect.element(page.getByTestId('does-not-exist')).not.toBeInTheDocument()
15
- * @see https://vitest.dev/guide/browser/assertion-api#tobeinthedocument
15
+ * @see https://vitest.dev/api/browser/assertions#tobeinthedocument
16
16
  */
17
17
  toBeInTheDocument(): R
18
18
  /**
@@ -58,7 +58,7 @@ export interface TestingLibraryMatchers<E, R> {
58
58
  *
59
59
  * // Check if element is completely visible
60
60
  * await expect.element(page.getByTestId('visible-element')).toBeInViewport({ ratio: 1 })
61
- * @see https://vitest.dev/guide/browser/assertion-api#tobeinviewport
61
+ * @see https://vitest.dev/api/browser/assertions#tobeinviewport
62
62
  */
63
63
  toBeInViewport(options?: { ratio?: number }): R
64
64
  /**
@@ -84,7 +84,7 @@ export interface TestingLibraryMatchers<E, R> {
84
84
  *
85
85
  * await expect.element(page.getByTestId('zero-opacity')).not.toBeVisible()
86
86
  * await expect.element(page.getByTestId('visible')).toBeVisible()
87
- * @see https://vitest.dev/guide/browser/assertion-api#tobevisible
87
+ * @see https://vitest.dev/api/browser/assertions#tobevisible
88
88
  */
89
89
  toBeVisible(): R
90
90
  /**
@@ -97,7 +97,7 @@ export interface TestingLibraryMatchers<E, R> {
97
97
  *
98
98
  * await expect.element(page.getByTestId('empty')).toBeEmptyDOMElement()
99
99
  * await expect.element(page.getByTestId('not-empty')).not.toBeEmptyDOMElement()
100
- * @see https://vitest.dev/guide/browser/assertion-api#tobeemptydomelement
100
+ * @see https://vitest.dev/api/browser/assertions#tobeemptydomelement
101
101
  */
102
102
  toBeEmptyDOMElement(): R
103
103
  /**
@@ -116,7 +116,7 @@ export interface TestingLibraryMatchers<E, R> {
116
116
  * </button>
117
117
  *
118
118
  * await expect.element(page.getByTestId('button')).toBeDisabled()
119
- * @see https://vitest.dev/guide/browser/assertion-api#tobedisabled
119
+ * @see https://vitest.dev/api/browser/assertions#tobedisabled
120
120
  */
121
121
  toBeDisabled(): R
122
122
  /**
@@ -135,7 +135,7 @@ export interface TestingLibraryMatchers<E, R> {
135
135
  * </button>
136
136
  *
137
137
  * await expect.element(page.getByTestId('button')).toBeEnabled()
138
- * @see https://vitest.dev/guide/browser/assertion-api#tobeenabled
138
+ * @see https://vitest.dev/api/browser/assertions#tobeenabled
139
139
  */
140
140
  toBeEnabled(): R
141
141
  /**
@@ -153,7 +153,7 @@ export interface TestingLibraryMatchers<E, R> {
153
153
  *
154
154
  * await expect(page.getByTestId('no-aria-invalid')).not.toBeInvalid()
155
155
  * await expect(page.getByTestId('invalid-form')).toBeInvalid()
156
- * @see https://vitest.dev/guide/browser/assertion-api#tobeinvalid
156
+ * @see https://vitest.dev/api/browser/assertions#tobeinvalid
157
157
  */
158
158
  toBeInvalid(): R
159
159
  /**
@@ -170,7 +170,7 @@ export interface TestingLibraryMatchers<E, R> {
170
170
  *
171
171
  * await expect.element(page.getByTestId('required-input')).toBeRequired()
172
172
  * await expect.element(page.getByTestId('supported-role')).not.toBeRequired()
173
- * @see https://vitest.dev/guide/browser/assertion-api#toberequired
173
+ * @see https://vitest.dev/api/browser/assertions#toberequired
174
174
  */
175
175
  toBeRequired(): R
176
176
  /**
@@ -188,7 +188,7 @@ export interface TestingLibraryMatchers<E, R> {
188
188
  *
189
189
  * await expect.element(page.getByTestId('no-aria-invalid')).not.toBeValid()
190
190
  * await expect.element(page.getByTestId('invalid-form')).toBeInvalid()
191
- * @see https://vitest.dev/guide/browser/assertion-api#tobevalid
191
+ * @see https://vitest.dev/api/browser/assertions#tobevalid
192
192
  */
193
193
  toBeValid(): R
194
194
  /**
@@ -205,9 +205,9 @@ export interface TestingLibraryMatchers<E, R> {
205
205
  * await expect.element(ancestor).toContainElement(descendant)
206
206
  * await expect.element(descendant).not.toContainElement(ancestor)
207
207
  * await expect.element(ancestor).not.toContainElement(nonExistentElement)
208
- * @see https://vitest.dev/guide/browser/assertion-api#tocontainelement
208
+ * @see https://vitest.dev/api/browser/assertions#tocontainelement
209
209
  */
210
- toContainElement(element: HTMLElement | SVGElement | null): R
210
+ toContainElement(element: HTMLElement | SVGElement | Locator | null): R
211
211
  /**
212
212
  * @description
213
213
  * Assert whether a string representing a HTML element is contained in another element.
@@ -216,7 +216,7 @@ export interface TestingLibraryMatchers<E, R> {
216
216
  *
217
217
  * const parent = page.getByTestId('parent')
218
218
  * await expect.element(parent).toContainHTML('<span data-testid="child"></span>')
219
- * @see https://vitest.dev/guide/browser/assertion-api#tocontainhtml
219
+ * @see https://vitest.dev/api/browser/assertions#tocontainhtml
220
220
  */
221
221
  toContainHTML(htmlText: string): R
222
222
  /**
@@ -238,7 +238,7 @@ export interface TestingLibraryMatchers<E, R> {
238
238
  * await expect.element(button).toHaveAttribute('disabled')
239
239
  * await expect.element(button).toHaveAttribute('type', 'submit')
240
240
  * await expect.element(button).not.toHaveAttribute('type', 'button')
241
- * @see https://vitest.dev/guide/browser/assertion-api#tohaveattribute
241
+ * @see https://vitest.dev/api/browser/assertions#tohaveattribute
242
242
  */
243
243
  toHaveAttribute(attr: string, value?: unknown): R
244
244
  /**
@@ -264,7 +264,7 @@ export interface TestingLibraryMatchers<E, R> {
264
264
  * await expect.element(deleteButton).toHaveClass('btn xs btn-danger', {exact: true})
265
265
  * await expect.element(deleteButton).not.toHaveClass('btn xs btn-danger', {exact: true})
266
266
  * await expect.element(noClasses).not.toHaveClass()
267
- * @see https://vitest.dev/guide/browser/assertion-api#tohaveclass
267
+ * @see https://vitest.dev/api/browser/assertions#tohaveclass
268
268
  */
269
269
  toHaveClass(...classNames:
270
270
  | (string | RegExp)[]
@@ -316,7 +316,7 @@ export interface TestingLibraryMatchers<E, R> {
316
316
  * await expect.element(selectSingle).toHaveDisplayValue('Select a fruit...')
317
317
  * await expect.element(selectMultiple).toHaveDisplayValue(['Banana', 'Avocado'])
318
318
  *
319
- * @see https://vitest.dev/guide/browser/assertion-api#tohavedisplayvalue
319
+ * @see https://vitest.dev/api/browser/assertions#tohavedisplayvalue
320
320
  */
321
321
  toHaveDisplayValue(value: string | number | RegExp | Array<string | RegExp | number>): R
322
322
  /**
@@ -332,7 +332,7 @@ export interface TestingLibraryMatchers<E, R> {
332
332
  * await expect.element(input).toHaveFocus()
333
333
  * input.element().blur()
334
334
  * await expect.element(input).not.toHaveFocus()
335
- * @see https://vitest.dev/guide/browser/assertion-api#tohavefocus
335
+ * @see https://vitest.dev/api/browser/assertions#tohavefocus
336
336
  */
337
337
  toHaveFocus(): R
338
338
  /**
@@ -352,7 +352,7 @@ export interface TestingLibraryMatchers<E, R> {
352
352
  * username: 'jane.doe',
353
353
  * rememberMe: true,
354
354
  * })
355
- * @see https://vitest.dev/guide/browser/assertion-api#tohaveformvalues
355
+ * @see https://vitest.dev/api/browser/assertions#tohaveformvalues
356
356
  */
357
357
  toHaveFormValues(expectedValues: Record<string, unknown>): R
358
358
  /**
@@ -374,7 +374,7 @@ export interface TestingLibraryMatchers<E, R> {
374
374
  * 'background-color': 'green',
375
375
  * display: 'none'
376
376
  * })
377
- * @see https://vitest.dev/guide/browser/assertion-api#tohavestyle
377
+ * @see https://vitest.dev/api/browser/assertions#tohavestyle
378
378
  */
379
379
  toHaveStyle(css: string | Partial<CSSStyleDeclaration>): R
380
380
  /**
@@ -397,7 +397,7 @@ export interface TestingLibraryMatchers<E, R> {
397
397
  * // to use case-insensitive match
398
398
  * await expect.element(element).toHaveTextContent(/content$/i)
399
399
  * await expect.element(element).not.toHaveTextContent('content')
400
- * @see https://vitest.dev/guide/browser/assertion-api#tohavetextcontent
400
+ * @see https://vitest.dev/api/browser/assertions#tohavetextcontent
401
401
  */
402
402
  toHaveTextContent(
403
403
  text: string | number | RegExp,
@@ -409,8 +409,8 @@ export interface TestingLibraryMatchers<E, R> {
409
409
  *
410
410
  * Accepts `<input>`, `<select>`, and `<textarea>` elements with the exception of `<input type="checkbox">` and
411
411
  * `<input type="radiobox">`, which can be matched only using
412
- * [toBeChecked](https://vitest.dev/guide/browser/assertion-api#tobechecked) or
413
- * [toHaveFormValues](https://vitest.dev/guide/browser/assertion-api#tohaveformvalues).
412
+ * [toBeChecked](https://vitest.dev/api/browser/assertions#tobechecked) or
413
+ * [toHaveFormValues](https://vitest.dev/api/browser/assertions#tohaveformvalues).
414
414
  * @example
415
415
  * <input
416
416
  * type="number"
@@ -419,7 +419,7 @@ export interface TestingLibraryMatchers<E, R> {
419
419
  *
420
420
  * const numberInput = page.getByTestId('input-number')
421
421
  * await expect.element(numberInput).toHaveValue(5)
422
- * @see https://vitest.dev/guide/browser/assertion-api#tohavevalue
422
+ * @see https://vitest.dev/api/browser/assertions#tohavevalue
423
423
  */
424
424
  toHaveValue(value?: string | string[] | number | null): R
425
425
  /**
@@ -442,7 +442,7 @@ export interface TestingLibraryMatchers<E, R> {
442
442
  * const inputRadio = page.getByTestId('input-radio')
443
443
  * await expect.element(inputCheckbox).toBeChecked()
444
444
  * await expect.element(inputRadio).not.toBeChecked()
445
- * @see https://vitest.dev/guide/browser/assertion-api#tobechecked
445
+ * @see https://vitest.dev/api/browser/assertions#tobechecked
446
446
  */
447
447
  toBeChecked(): R
448
448
  /**
@@ -467,7 +467,7 @@ export interface TestingLibraryMatchers<E, R> {
467
467
  * await expect.element(page.getByTestId('avatar')).not.toHaveAccessibleDescription()
468
468
  * await expect.element(page.getByTestId('logo')).not.toHaveAccessibleDescription('Company logo')
469
469
  * await expect.element(page.getByTestId('logo')).toHaveAccessibleDescription('The logo of Our Company')
470
- * @see https://vitest.dev/guide/browser/assertion-api#tohaveaccessibledescription
470
+ * @see https://vitest.dev/api/browser/assertions#tohaveaccessibledescription
471
471
  */
472
472
  toHaveAccessibleDescription(text?: string | RegExp | E): R
473
473
 
@@ -506,7 +506,7 @@ export interface TestingLibraryMatchers<E, R> {
506
506
  * page.getByRole('textbox', {name: 'Not Invalid'}),
507
507
  * ).not.toHaveAccessibleErrorMessage()
508
508
  *
509
- * @see https://vitest.dev/guide/browser/assertion-api#tohaveaccessibleerrormessage
509
+ * @see https://vitest.dev/api/browser/assertions#tohaveaccessibleerrormessage
510
510
  */
511
511
  toHaveAccessibleErrorMessage(text?: string | RegExp | E): R
512
512
 
@@ -537,7 +537,7 @@ export interface TestingLibraryMatchers<E, R> {
537
537
  * await expect.element(page.getByTestId('svg-button')).toHaveAccessibleName()
538
538
  * await expect.element(page.getByTestId('svg-without-title')).not.toHaveAccessibleName()
539
539
  * await expect.element(page.getByTestId('input-title')).toHaveAccessibleName()
540
- * @see https://vitest.dev/guide/browser/assertion-api#tohaveaccessiblename
540
+ * @see https://vitest.dev/api/browser/assertions#tohaveaccessiblename
541
541
  */
542
542
  toHaveAccessibleName(text?: string | RegExp | E): R
543
543
  /**
@@ -573,7 +573,7 @@ export interface TestingLibraryMatchers<E, R> {
573
573
  * await expect.element(page.getByTestId('link-invalid')).not.toHaveRole('link')
574
574
  * await expect.element(page.getByTestId('link-invalid')).toHaveRole('generic')
575
575
  *
576
- * @see https://vitest.dev/guide/browser/assertion-api#tohaverole
576
+ * @see https://vitest.dev/api/browser/assertions#tohaverole
577
577
  */
578
578
  toHaveRole(
579
579
  // Get autocomplete for ARIARole union types, while still supporting another string
@@ -614,7 +614,7 @@ export interface TestingLibraryMatchers<E, R> {
614
614
  *
615
615
  * inputCheckboxIndeterminate.indeterminate = true
616
616
  * await expect.element(inputCheckboxIndeterminate).toBePartiallyChecked()
617
- * @see https://vitest.dev/guide/browser/assertion-api#tobepartiallychecked
617
+ * @see https://vitest.dev/api/browser/assertions#tobepartiallychecked
618
618
  */
619
619
  toBePartiallyChecked(): R
620
620
  /**
@@ -671,7 +671,7 @@ export interface TestingLibraryMatchers<E, R> {
671
671
  * await expect.element(page.queryByTestId('prev')).not.toHaveSelection()
672
672
  * await expect.element(page.queryByTestId('next')).toHaveSelection('ne')
673
673
  *
674
- * @see https://vitest.dev/guide/browser/assertion-api#tohaveselection
674
+ * @see https://vitest.dev/api/browser/assertions#tohaveselection
675
675
  */
676
676
  toHaveSelection(selection?: string): R
677
677
 
@@ -712,7 +712,7 @@ export interface TestingLibraryMatchers<E, R> {
712
712
  * },
713
713
  * })
714
714
  *
715
- * @see https://vitest.dev/guide/browser/assertion-api#tomatchscreenshot
715
+ * @see https://vitest.dev/api/browser/assertions#tomatchscreenshot
716
716
  */
717
717
  toMatchScreenshot<ComparatorName extends keyof ScreenshotComparatorRegistry>(
718
718
  options?: ScreenshotMatcherOptions<ComparatorName>,
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@vitest/browser",
3
3
  "type": "module",
4
- "version": "4.0.6",
4
+ "version": "4.0.8",
5
5
  "description": "Browser running for Vitest",
6
6
  "license": "MIT",
7
7
  "funding": "https://opencollective.com/vitest",
@@ -51,29 +51,29 @@
51
51
  "providers"
52
52
  ],
53
53
  "peerDependencies": {
54
- "vitest": "4.0.6"
54
+ "vitest": "4.0.8"
55
55
  },
56
56
  "dependencies": {
57
- "magic-string": "^0.30.19",
57
+ "magic-string": "^0.30.21",
58
58
  "pixelmatch": "7.1.0",
59
59
  "pngjs": "^7.0.0",
60
60
  "sirv": "^3.0.2",
61
61
  "tinyrainbow": "^3.0.3",
62
62
  "ws": "^8.18.3",
63
- "@vitest/mocker": "4.0.6",
64
- "@vitest/utils": "4.0.6"
63
+ "@vitest/mocker": "4.0.8",
64
+ "@vitest/utils": "4.0.8"
65
65
  },
66
66
  "devDependencies": {
67
67
  "@testing-library/user-event": "^14.6.1",
68
68
  "@types/pngjs": "^6.0.5",
69
69
  "@types/ws": "^8.18.1",
70
- "birpc": "^2.5.0",
70
+ "birpc": "^2.7.0",
71
71
  "flatted": "^3.3.3",
72
72
  "ivya": "^1.7.0",
73
73
  "mime": "^4.1.0",
74
74
  "pathe": "^2.0.3",
75
- "@vitest/runner": "4.0.6",
76
- "vitest": "4.0.6"
75
+ "@vitest/runner": "4.0.8",
76
+ "vitest": "4.0.8"
77
77
  },
78
78
  "scripts": {
79
79
  "typecheck": "tsc -p ./src/client/tsconfig.json --noEmit",