vitest-browser-vue 2.0.1 → 2.1.0

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/README.md CHANGED
@@ -9,7 +9,7 @@ import { render } from 'vitest-browser-vue'
9
9
  import { expect, test } from 'vitest'
10
10
 
11
11
  test('counter button increments the count', async () => {
12
- const screen = render(Component, {
12
+ const screen = await render(Component, {
13
13
  props: {
14
14
  initialCount: 1,
15
15
  }
@@ -44,7 +44,7 @@ export default defineConfig({
44
44
  import { page } from 'vitest/browser'
45
45
 
46
46
  test('counter button increments the count', async () => {
47
- const screen = page.render(Component, {
47
+ const screen = await page.render(Component, {
48
48
  props: {
49
49
  initialCount: 1,
50
50
  }
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { a as render, i as config, n as RenderResult, r as cleanup, t as ComponentRenderOptions } from "./pure-Dp75WA7l.js";
1
+ import { a as render, i as config, n as RenderResult, r as cleanup, t as ComponentRenderOptions } from "./pure-B6xBGwMp.js";
2
2
 
3
3
  //#region src/index.d.ts
4
4
  declare module "vitest/browser" {
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import { n as config, r as render, t as cleanup } from "./pure-DYF3m9PV.js";
1
+ import { n as config, r as render, t as cleanup } from "./pure-epEwB8Ps.js";
2
2
  import { page } from "vitest/browser";
3
3
  import { beforeEach } from "vitest";
4
4
 
@@ -3,7 +3,7 @@ import { ComponentMountingOptions, config } from "@vue/test-utils";
3
3
  import { DefineComponent } from "vue";
4
4
 
5
5
  //#region src/pure.d.ts
6
- type ComponentProps<T$1> = T$1 extends (new (...angs: any) => {
6
+ type ComponentProps<T$1> = T$1 extends (new (...args: any) => {
7
7
  $props: infer P;
8
8
  }) ? NonNullable<P> : T$1 extends ((props: infer P, ...args: any) => any) ? P : {};
9
9
  interface RenderResult<Props$1> extends LocatorSelectors {
@@ -11,22 +11,41 @@ interface RenderResult<Props$1> extends LocatorSelectors {
11
11
  baseElement: HTMLElement;
12
12
  locator: Locator;
13
13
  debug(el?: HTMLElement | HTMLElement[] | Locator | Locator[], maxLength?: number, options?: PrettyDOMOptions): void;
14
- unmount(): void;
14
+ /**
15
+ * Unmount the component. Also records a `vue.unmount` trace mark.
16
+ *
17
+ * Synchronous usage is deprecated and will be removed in the next major version.
18
+ * Please use `await unmount()` instead of `unmount()`.
19
+ */
20
+ unmount(): Promise<void>;
15
21
  emitted<T = unknown>(): Record<string, T[]>;
16
22
  emitted<T = unknown[]>(eventName: string): undefined | T[];
17
- rerender(props: Partial<Props$1>): void;
23
+ /**
24
+ * Update the component props. Also records a `vue.rerender` trace mark.
25
+ *
26
+ * Synchronous usage is deprecated and will be removed in the next major version.
27
+ * Please use `await rerender(props)` instead of `rerender(props)`.
28
+ */
29
+ rerender(props: Partial<Props$1>): Promise<void>;
18
30
  }
19
31
  interface ComponentRenderOptions<C, P$1 extends ComponentProps<C>> extends ComponentMountingOptions<C, P$1> {
20
32
  container?: HTMLElement;
21
33
  baseElement?: HTMLElement;
22
34
  }
35
+ /**
36
+ * Render a Vue component into the document.
37
+ * Also records a `vue.render` trace mark.
38
+ *
39
+ * Synchronous usage is deprecated and will be removed in the next major version.
40
+ * Please use `await render(Component)` instead of `render(Component)`.
41
+ */
23
42
  declare function render<T$1, C = (T$1 extends ((...args: any) => any) | (new (...args: any) => any) ? T$1 : T$1 extends {
24
43
  props?: infer Props;
25
44
  } ? DefineComponent<Props extends Readonly<(infer PropNames)[]> | (infer PropNames)[] ? { [key in PropNames extends string ? PropNames : string]?: any } : Props> : DefineComponent), P$1 extends ComponentProps<C> = ComponentProps<C>>(Component: T$1, {
26
45
  container: customContainer,
27
46
  baseElement: customBaseElement,
28
47
  ...mountOptions
29
- }?: ComponentRenderOptions<C, P$1>): RenderResult<P$1>;
48
+ }?: ComponentRenderOptions<C, P$1>): RenderResult<P$1> & PromiseLike<RenderResult<P$1>>;
30
49
  declare function cleanup(): void;
31
50
  //#endregion
32
51
  export { render as a, config as i, RenderResult as n, cleanup as r, ComponentRenderOptions as t };
@@ -0,0 +1,77 @@
1
+ import { page, server, utils } from "vitest/browser";
2
+ import { config, mount } from "@vue/test-utils";
3
+
4
+ //#region src/pure.ts
5
+ const { debug, getElementLocatorSelectors } = utils;
6
+ const mountedWrappers = /* @__PURE__ */ new Set();
7
+ let idx = 0;
8
+ function ensureTestIdAttribute(element) {
9
+ const attributeId = server.config.browser.locators.testIdAttribute;
10
+ if (!element.hasAttribute(attributeId)) element.setAttribute(attributeId, `__vitest_${idx++}__`);
11
+ }
12
+ /**
13
+ * Render a Vue component into the document.
14
+ * Also records a `vue.render` trace mark.
15
+ *
16
+ * Synchronous usage is deprecated and will be removed in the next major version.
17
+ * Please use `await render(Component)` instead of `render(Component)`.
18
+ */
19
+ function render(Component, { container: customContainer, baseElement: customBaseElement,...mountOptions } = {}) {
20
+ const baseElement = customBaseElement || customContainer || document.body;
21
+ const container = customContainer || baseElement.appendChild(document.createElement("div"));
22
+ ensureTestIdAttribute(baseElement);
23
+ ensureTestIdAttribute(container);
24
+ if (mountOptions.attachTo) throw new Error("`attachTo` is not supported, use `container` instead");
25
+ const wrapper = mount(Component, {
26
+ ...mountOptions,
27
+ attachTo: container
28
+ });
29
+ unwrapNode(wrapper.parentElement);
30
+ mountedWrappers.add(wrapper);
31
+ const renderResult = {
32
+ container,
33
+ baseElement,
34
+ locator: page.elementLocator(container),
35
+ debug: (el = baseElement, maxLength, options) => debug(el, maxLength, options),
36
+ unmount: () => {
37
+ wrapper.unmount();
38
+ return markThenable(renderResult.locator, "vue.unmount", renderResult.unmount, void 0);
39
+ },
40
+ emitted: ((name) => wrapper.emitted(name)),
41
+ rerender: async (props) => {
42
+ await wrapper.setProps(props);
43
+ return markThenable(renderResult.locator, "vue.rerender", renderResult.rerender, void 0);
44
+ },
45
+ ...getElementLocatorSelectors(baseElement)
46
+ };
47
+ return {
48
+ ...renderResult,
49
+ ...markThenable(renderResult.locator, "vue.render", render, renderResult)
50
+ };
51
+ }
52
+ function markThenable(locator, name, fn, value) {
53
+ if (!locator.mark) return Promise.resolve(value);
54
+ const error = new Error(name);
55
+ if ("captureStackTrace" in Error) Error.captureStackTrace(error, fn);
56
+ return { async then(onfulfilled, onrejected) {
57
+ try {
58
+ await locator.mark(name, error);
59
+ return Promise.resolve(value).then(onfulfilled, onrejected);
60
+ } catch (e) {
61
+ return Promise.reject(e).then(onfulfilled, onrejected);
62
+ }
63
+ } };
64
+ }
65
+ function cleanup() {
66
+ mountedWrappers.forEach((wrapper) => {
67
+ if (wrapper.element?.parentNode?.parentNode === document.body) document.body.removeChild(wrapper.element.parentNode);
68
+ wrapper.unmount();
69
+ mountedWrappers.delete(wrapper);
70
+ });
71
+ }
72
+ function unwrapNode(node) {
73
+ node.replaceWith(...node.childNodes);
74
+ }
75
+
76
+ //#endregion
77
+ export { config as n, render as r, cleanup as t };
package/dist/pure.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- import { a as render, i as config, n as RenderResult, r as cleanup, t as ComponentRenderOptions } from "./pure-Dp75WA7l.js";
1
+ import { a as render, i as config, n as RenderResult, r as cleanup, t as ComponentRenderOptions } from "./pure-B6xBGwMp.js";
2
2
  export { ComponentRenderOptions, RenderResult, cleanup, config, render };
package/dist/pure.js CHANGED
@@ -1,3 +1,3 @@
1
- import { n as config, r as render, t as cleanup } from "./pure-DYF3m9PV.js";
1
+ import { n as config, r as render, t as cleanup } from "./pure-epEwB8Ps.js";
2
2
 
3
3
  export { cleanup, config, render };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "vitest-browser-vue",
3
3
  "type": "module",
4
- "version": "2.0.1",
4
+ "version": "2.1.0",
5
5
  "description": "Render Vue components in Vitest Browser Mode",
6
6
  "author": "Vitest Community",
7
7
  "license": "MIT",
@@ -48,16 +48,17 @@
48
48
  },
49
49
  "devDependencies": {
50
50
  "@antfu/eslint-config": "^2.24.1",
51
+ "@playwright/test": "^1.58.2",
51
52
  "@vitejs/plugin-vue": "^6.0.1",
52
- "@vitest/browser-playwright": "^4.0.2",
53
+ "@vitest/browser-playwright": "4.1.0-beta.6",
53
54
  "bumpp": "^9.4.2",
54
55
  "changelogithub": "^0.13.9",
55
56
  "eslint": "^9.8.0",
56
- "playwright": "^1.55.1",
57
+ "playwright": "^1.58.2",
57
58
  "tsdown": "^0.15.9",
58
59
  "tsx": "^4.16.5",
59
60
  "typescript": "^5.5.4",
60
- "vitest": "^4.0.2",
61
+ "vitest": "4.1.0-beta.6",
61
62
  "vue": "^3.4.35",
62
63
  "zx": "^8.1.4"
63
64
  },
@@ -1,41 +0,0 @@
1
- import { page, utils } from "vitest/browser";
2
- import { config, mount } from "@vue/test-utils";
3
-
4
- //#region src/pure.ts
5
- const { debug, getElementLocatorSelectors } = utils;
6
- const mountedWrappers = /* @__PURE__ */ new Set();
7
- function render(Component, { container: customContainer, baseElement: customBaseElement,...mountOptions } = {}) {
8
- const div = document.createElement("div");
9
- const baseElement = customBaseElement || customContainer || document.body;
10
- const container = customContainer || baseElement.appendChild(div);
11
- if (mountOptions.attachTo) throw new Error("`attachTo` is not supported, use `container` instead");
12
- const wrapper = mount(Component, {
13
- ...mountOptions,
14
- attachTo: container
15
- });
16
- unwrapNode(wrapper.parentElement);
17
- mountedWrappers.add(wrapper);
18
- return {
19
- container,
20
- baseElement,
21
- locator: page.elementLocator(container),
22
- debug: (el = baseElement, maxLength, options) => debug(el, maxLength, options),
23
- unmount: () => wrapper.unmount(),
24
- emitted: ((name) => wrapper.emitted(name)),
25
- rerender: (props) => wrapper.setProps(props),
26
- ...getElementLocatorSelectors(baseElement)
27
- };
28
- }
29
- function cleanup() {
30
- mountedWrappers.forEach((wrapper) => {
31
- if (wrapper.element?.parentNode?.parentNode === document.body) document.body.removeChild(wrapper.element.parentNode);
32
- wrapper.unmount();
33
- mountedWrappers.delete(wrapper);
34
- });
35
- }
36
- function unwrapNode(node) {
37
- node.replaceWith(...node.childNodes);
38
- }
39
-
40
- //#endregion
41
- export { config as n, render as r, cleanup as t };