import Cache from "graphql-react/Cache.mjs";import Loading from "graphql-react/Loading.mjs";import { createElement as h } from "react";import { hydrateRoot } from "react-dom/client";
import ClientProvider from "./ClientProvider.mjs";import createPseudoNode from "./createPseudoNode.mjs";import HeadContent from "./HeadContent.mjs";import HeadManager from "./HeadManager.mjs";
export default async function hydrate({ router, appComponent, cacheData }) { if (typeof router !== "function") { throw new TypeError("Option `router` must be a function."); }
const bodyReactRootContainer = document.getElementById("ruck-app");
if (!bodyReactRootContainer) { throw new Error("Ruck body React app DOM node missing."); }
const ruckHeadStart = document.head.querySelector('[name="ruck-head-start"]');
if (!ruckHeadStart) { throw new Error("Ruck head React app start DOM node missing."); }
const ruckHeadEnd = document.head.querySelector('[name="ruck-head-end"]');
if (!ruckHeadEnd) { throw new Error("Ruck head React app end DOM node missing."); }
const headReactRootContainer = ( createPseudoNode(ruckHeadStart, ruckHeadEnd) ); const headManager = new HeadManager(); const initialRouteUrl = new URL(location.href); const { content, cleanup } = router(initialRouteUrl, headManager, true); const initialRoute = { url: initialRouteUrl, content: await content, cleanup, };
hydrateRoot( bodyReactRootContainer, h( ClientProvider, { hydrationTimeStamp: performance.now(), headManager, cache: new Cache(cacheData), loading: new Loading(), router, initialRoute, onEffectsDone() { hydrateRoot(headReactRootContainer, h(HeadContent, { headManager })); }, }, h(appComponent), ), );}