vitest-browser-vue
Version:
Render Vue components in Vitest Browser Mode
51 lines (49 loc) • 1.5 kB
JavaScript
// src/pure.ts
import { mount } from "@vue/test-utils";
import { debug, getElementLocatorSelectors } from "@vitest/browser/utils";
import { config } from "@vue/test-utils";
var mountedWrappers = /* @__PURE__ */ new Set();
function render(Component, {
container: customContainer,
baseElement: customBaseElement,
...mountOptions
} = {}) {
const div = document.createElement("div");
const baseElement = customBaseElement || customContainer || document.body;
const container = customContainer || baseElement.appendChild(div);
if (mountOptions.attachTo) {
throw new Error("`attachTo` is not supported, use `container` instead");
}
const wrapper = mount(Component, {
...mountOptions,
attachTo: container
});
unwrapNode(wrapper.parentElement);
mountedWrappers.add(wrapper);
return {
container,
baseElement,
debug: (el = baseElement, maxLength, options) => debug(el, maxLength, options),
unmount: () => wrapper.unmount(),
emitted: (name) => wrapper.emitted(name),
rerender: (props) => wrapper.setProps(props),
...getElementLocatorSelectors(baseElement)
};
}
function cleanup() {
mountedWrappers.forEach((wrapper) => {
if (wrapper.element?.parentNode?.parentNode === document.body) {
document.body.removeChild(wrapper.element.parentNode);
}
wrapper.unmount();
mountedWrappers.delete(wrapper);
});
}
function unwrapNode(node) {
node.replaceWith(...node.childNodes);
}
export {
render,
cleanup,
config
};