@islands/hydration
Version:
Hydration utilities for îles
27 lines (26 loc) • 974 B
JavaScript
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 };