UNPKG

@islands/hydration

Version:

Hydration utilities for îles

27 lines (26 loc) 974 B
import { onDispose } from "./hydration.js"; import { createApp, createSSRApp, createStaticVNode, h } from "vue"; //#region vue.ts const createVueApp = import.meta.env.SSR ? createSSRApp : createApp; function createVueIsland(component, id, el, props, slots) { const slotFns = slots && Object.fromEntries(Object.entries(slots).map(([slotName, content]) => { return [slotName, () => createStaticVNode(content)]; })); const appDefinition = { render: () => h(component, props, slotFns) }; if (import.meta.env.DEV) appDefinition.name = `Island: ${nameFromFile(component.__file)}`; const app = createVueApp(appDefinition); app.mount(el, Boolean(slots)); if (import.meta.env.DISPOSE_ISLANDS) onDispose(id, app.unmount); if (import.meta.env.DEV) window.__ILE_DEVTOOLS__?.onHydration({ id, el, props, slots, component }); } function nameFromFile(file) { return file?.match(/(\w+?)(?:\.vue)?$/)?.[1] || file; } //#endregion export { createVueIsland as default };