vite-plugin-react-server
Version:
Vite plugin for React Server Components (RSC)
112 lines (109 loc) • 2.79 kB
JavaScript
/**
* vite-plugin-react-server
* Copyright (c) Nico Brinkkemper
* MIT License
*/
import { resolvePage } from '../resolvePage.js';
import { resolveProps } from '../resolveProps.js';
import { createRscStream } from './createRscStream.js';
async function createHandler({
getCss,
root,
cssFiles = [],
cssModules = /* @__PURE__ */ new Map(),
onCssFile,
logger,
loader,
Html,
CssCollector,
pagePath,
propsPath,
pageExportName,
propsExportName,
inlineCss,
moduleBase,
preserveModulesRoot: _preserveModulesRoot,
moduleBasePath,
moduleRootPath,
moduleBaseURL,
route,
pipableStreamOptions
}) {
const controller = new AbortController();
const loadWithCss = async (id) => {
try {
const mod = await loader(id);
const pageCss = await Promise.resolve(getCss(id));
Array.from(pageCss.entries()).forEach(([css, linkOrContent]) => {
cssModules.set(css, linkOrContent);
if (typeof onCssFile === "function") {
onCssFile(css, id);
}
});
return mod;
} catch (e) {
if (e.message?.includes("module runner has been closed")) {
return { type: "skip" };
} else {
return { type: "error", error: e };
}
}
};
const PropsModule = await resolveProps({
propsModule: propsPath ? await loadWithCss(propsPath) : { [propsExportName]: (url2) => ({ url: url2 }) },
path: String(propsPath),
exportName: propsExportName,
url: route
});
if (PropsModule.type !== "success") {
return PropsModule;
}
const PageModule = await resolvePage({
pageModule: pagePath ? await loadWithCss(pagePath) : { [pageExportName]: () => null },
path: String(pagePath),
exportName: pageExportName,
url: route
});
if (PageModule.type !== "success") {
return PageModule;
}
if (cssFiles) {
cssFiles.forEach((css) => cssModules.set(typeof css === "string" ? css : css.path, css));
cssFiles = Array.from(cssModules.values());
}
const url = typeof moduleBaseURL === "string" && moduleBaseURL !== "" ? new URL(route, moduleBaseURL).href : route;
const stream = createRscStream({
Html,
CssCollector,
Page: PageModule[pageExportName],
props: PropsModule[propsExportName],
moduleRootPath,
moduleBasePath,
moduleBaseURL,
logger,
cssFiles: Array.from(cssModules.values()),
route,
url,
pipableStreamOptions,
htmlProps: {},
root,
loader,
inlineCss
});
if (!stream) {
return { type: "skip" };
}
const assets = {
css: cssFiles,
bootstrapModules: pipableStreamOptions?.bootstrapModules ?? []
};
return {
type: "success",
controller,
stream,
assets,
route
};
}
export { createHandler };
//# sourceMappingURL=createHandler.js.map