@vitejs/plugin-rsc
Version:
React Server Components (RSC) support for Vite.
89 lines (87 loc) • 3.26 kB
JavaScript
import "../dist-DEF94lDJ.js";
import "../shared-CEyKoKAb.js";
import "../browser-QWbIPyhO.js";
import { createFromFetch, createFromReadableStream, createTemporaryReferenceSet, encodeReply, setServerCallback } from "../browser-D8OPzpF5.js";
import "../browser-C1Q4O7AS.js";
import { rscStream } from "../client-C1J4FCf5.js";
import React from "react";
import ReactDomClient from "react-dom/client";
import { jsx } from "react/jsx-runtime";
//#region src/extra/browser.tsx
/**
* @deprecated Use `@vitejs/plugin-rsc/browser` API instead.
*/
async function hydrate() {
const callServer = async (id, args) => {
const url = new URL(window.location.href);
const temporaryReferences = createTemporaryReferenceSet();
const payload = await createFromFetch(fetch(url, {
method: "POST",
body: await encodeReply(args, { temporaryReferences }),
headers: { "x-rsc-action": id }
}), { temporaryReferences });
setPayload(payload);
return payload.returnValue;
};
setServerCallback(callServer);
async function onNavigation() {
const url = new URL(window.location.href);
const payload = await createFromFetch(fetch(url));
setPayload(payload);
}
const initialPayload = await createFromReadableStream(rscStream);
let setPayload;
function BrowserRoot() {
const [payload, setPayload_] = React.useState(initialPayload);
React.useEffect(() => {
setPayload = (v) => React.startTransition(() => setPayload_(v));
}, [setPayload_]);
React.useEffect(() => {
return listenNavigation(() => onNavigation());
}, []);
return payload.root;
}
const browserRoot = /* @__PURE__ */ jsx(React.StrictMode, { children: /* @__PURE__ */ jsx(BrowserRoot, {}) });
ReactDomClient.hydrateRoot(document, browserRoot, { formState: initialPayload.formState });
if (import.meta.hot) import.meta.hot.on("rsc:update", () => {
window.history.replaceState({}, "", window.location.href);
});
}
/**
* @deprecated Use `@vitejs/plugin-rsc/browser` API instead.
*/
async function fetchRSC(request) {
const payload = await createFromFetch(fetch(request));
return payload.root;
}
function listenNavigation(onNavigation) {
window.addEventListener("popstate", onNavigation);
const oldPushState = window.history.pushState;
window.history.pushState = function(...args) {
const res = oldPushState.apply(this, args);
onNavigation();
return res;
};
const oldReplaceState = window.history.replaceState;
window.history.replaceState = function(...args) {
const res = oldReplaceState.apply(this, args);
onNavigation();
return res;
};
function onClick(e) {
let link = e.target.closest("a");
if (link && link instanceof HTMLAnchorElement && link.href && (!link.target || link.target === "_self") && link.origin === location.origin && !link.hasAttribute("download") && e.button === 0 && !e.metaKey && !e.ctrlKey && !e.altKey && !e.shiftKey && !e.defaultPrevented) {
e.preventDefault();
history.pushState(null, "", link.href);
}
}
document.addEventListener("click", onClick);
return () => {
document.removeEventListener("click", onClick);
window.removeEventListener("popstate", onNavigation);
window.history.pushState = oldPushState;
window.history.replaceState = oldReplaceState;
};
}
//#endregion
export { fetchRSC, hydrate };