-import { createVaporApp } from '../src'
-import type { App } from '@vue/runtime-dom'
+import { createVaporApp, vaporInteropPlugin } from '../src'
+import { type App, type Component, createApp } from '@vue/runtime-dom'
import type { VaporComponent, VaporComponentInstance } from '../src/component'
import type { RawProps } from '../src/componentProps'
return define
}
+
+export interface InteropRenderContext {
+ mount: (container?: string | ParentNode) => InteropRenderContext
+ render: (
+ props?: RawProps,
+ container?: string | ParentNode,
+ ) => InteropRenderContext
+ host: HTMLElement
+ html: () => string
+}
+
+export function makeInteropRender(): (comp: Component) => InteropRenderContext {
+ let host: HTMLElement
+ beforeEach(() => {
+ host = document.createElement('div')
+ })
+ afterEach(() => {
+ host.remove()
+ })
+
+ function define(comp: Component) {
+ let app: App
+ function render(
+ props: RawProps | undefined = undefined,
+ container: string | ParentNode = host,
+ ) {
+ app?.unmount()
+ app = createApp(comp, props)
+ app.use(vaporInteropPlugin)
+ return mount(container)
+ }
+
+ function mount(container: string | ParentNode = host) {
+ app.mount(container)
+ return res()
+ }
+
+ function html() {
+ return host.innerHTML
+ }
+
+ const res = () => ({
+ host,
+ mount,
+ render,
+ html,
+ })
+
+ return res()
+ }
+
+ return define
+}
-import {
- type Ref,
- createApp,
- defineComponent,
- h,
- nextTick,
- ref,
-} from '@vue/runtime-dom'
+import { type Ref, nextTick, ref } from '@vue/runtime-dom'
import {
createComponent,
createDynamicComponent,
setProp,
setStyle,
template,
- vaporInteropPlugin,
} from '../src'
import { makeRender } from './_utils'
import { stringifyStyle } from '@vue/shared'
const el = host.children[0]
expect(el.classList.length).toBe(0)
})
-
- it('should not fallthrough emit handlers to vdom child', () => {
- const VDomChild = defineComponent({
- emits: ['click'],
- setup(_, { emit }) {
- return () => h('button', { onClick: () => emit('click') }, 'click me')
- },
- })
-
- const fn = vi.fn()
- const VaporChild = defineVaporComponent({
- emits: ['click'],
- setup() {
- return createComponent(
- VDomChild as any,
- { onClick: () => fn },
- null,
- true,
- )
- },
- })
-
- const App = {
- setup() {
- return () => h(VaporChild as any)
- },
- }
-
- const root = document.createElement('div')
- createApp(App).use(vaporInteropPlugin).mount(root)
-
- expect(root.innerHTML).toBe('<button>click me</button>')
- const button = root.querySelector('button')!
- button.dispatchEvent(new Event('click'))
-
- // fn should be called once
- expect(fn).toHaveBeenCalledTimes(1)
- })
})
--- /dev/null
+import { defineComponent, h } from '@vue/runtime-dom'
+import { makeInteropRender } from './_utils'
+import { createComponent, defineVaporComponent } from '../src'
+
+const define = makeInteropRender()
+
+describe('vdomInterop', () => {
+ describe.todo('props', () => {})
+
+ describe.todo('emit', () => {})
+
+ describe.todo('slots', () => {})
+
+ describe.todo('provide', () => {})
+
+ describe.todo('inject', () => {})
+
+ describe.todo('template ref', () => {})
+
+ describe.todo('dynamic component', () => {})
+
+ describe('attribute fallthrough', () => {
+ it('should not fallthrough emit handlers to vdom child', () => {
+ const VDomChild = defineComponent({
+ emits: ['click'],
+ setup(_, { emit }) {
+ return () => h('button', { onClick: () => emit('click') }, 'click me')
+ },
+ })
+
+ const fn = vi.fn()
+ const VaporChild = defineVaporComponent({
+ emits: ['click'],
+ setup() {
+ return createComponent(
+ VDomChild as any,
+ { onClick: () => fn },
+ null,
+ true,
+ )
+ },
+ })
+
+ const { host, html } = define({
+ setup() {
+ return () => h(VaporChild as any)
+ },
+ }).render()
+
+ expect(html()).toBe('<button>click me</button>')
+ const button = host.querySelector('button')!
+ button.dispatchEvent(new Event('click'))
+
+ // fn should be called once
+ expect(fn).toHaveBeenCalledTimes(1)
+ })
+ })
+})