vite-plugin-react-server
Version:
Vite plugin for React Server Components (RSC)
45 lines (42 loc) • 6.24 kB
JavaScript
/**
* vite-plugin-react-server
* Copyright (c) Nico Brinkkemper
* MIT License
*/
import { createElementWithReact } from './createElementWithReact.js';
import { React } from '../vendor/vendor.server.js';
import { createHeadlessReusePageComponent } from './headlessStreamReuseHandler.js';
function createReactElement(options, context) {
const isHeadless = options.htmlPath === "";
let finalOptions = options;
if (!isHeadless && context.reuseHeadlessStreamId) {
const reusePageComponent = createHeadlessReusePageComponent({
reuseHeadlessStreamId: context.reuseHeadlessStreamId,
headlessStreamElements: context.headlessStreamElements || /* @__PURE__ */ new Map(),
headlessStreamErrors: context.headlessStreamErrors || /* @__PURE__ */ new Map(),
route: context.route,
verbose: context.verbose,
logger: context.logger
});
if (reusePageComponent !== void 0) {
finalOptions = {
...options,
PageComponent: reusePageComponent
};
}
}
return createElementWithReact(React, {
...finalOptions,
// A headless (page-level) stream must drop the Html wrapper so its .rsc has
// no <html>/<head>/<body> — that's what the browser client mounts into
// #root (a full document there nests <html> inside a <div> and wedges it).
// createElementWithReact reads `HtmlComponent`, NOT `Html`, so the previous
// `Html: Fragment` was silently ignored: the Fragment override never took
// effect and the headless stream kept emitting the full document. Set the
// key the helper actually reads. (The dev server already does this.)
HtmlComponent: isHeadless ? React.Fragment : finalOptions.HtmlComponent,
as: isHeadless ? React.Fragment : "div"
});
}
export { createReactElement };
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlUnNjUmVuZGVySGVscGVycy5zZXJ2ZXIuanMiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3BsdWdpbi9oZWxwZXJzL2NyZWF0ZVJzY1JlbmRlckhlbHBlcnMuc2VydmVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgQ3JlYXRlSGFuZGxlck9wdGlvbnMgfSBmcm9tIFwiLi4vdHlwZXMuanNcIjtcbmltcG9ydCB0eXBlIHsgUnNjUmVuZGVyQ29udGV4dCB9IGZyb20gXCIuLi9zdHJlYW0vcmVuZGVyUnNjU3RyZWFtLnR5cGVzLmpzXCI7XG5pbXBvcnQgeyBjcmVhdGVFbGVtZW50V2l0aFJlYWN0IH0gZnJvbSBcIi4vY3JlYXRlRWxlbWVudFdpdGhSZWFjdC5qc1wiO1xuaW1wb3J0IHsgUmVhY3QgfSBmcm9tIFwiLi4vdmVuZG9yL3ZlbmRvci5zZXJ2ZXIuanNcIjtcbmltcG9ydCB7IGNyZWF0ZUhlYWRsZXNzUmV1c2VQYWdlQ29tcG9uZW50IH0gZnJvbSBcIi4vaGVhZGxlc3NTdHJlYW1SZXVzZUhhbmRsZXIuanNcIjtcblxuLyoqXG4gKiBQdXJlIGZ1bmN0aW9uIGZvciBjcmVhdGluZyBSZWFjdCBlbGVtZW50XG4gKiBUaGlzIGlzIGVudmlyb25tZW50LWFnbm9zdGljIGFuZCBjYW4gYmUgdXNlZCBpbiBib3RoIGNsaWVudCBhbmQgc2VydmVyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVSZWFjdEVsZW1lbnQoXG4gIG9wdGlvbnM6IENyZWF0ZUhhbmRsZXJPcHRpb25zLFxuICBjb250ZXh0OiBSc2NSZW5kZXJDb250ZXh0LFxuKSB7XG4gIC8vIERldGVybWluZSBpZiB0aGlzIGlzIGEgaGVhZGxlc3Mgc3RyZWFtIGJ5IGNoZWNraW5nIGlmIGh0bWxQYXRoIGlzIGVtcHR5XG4gIC8vIFRoaXMgaXMgbW9yZSByZWxpYWJsZSB0aGFuIGNoZWNraW5nIHRoZSBJRFxuICBjb25zdCBpc0hlYWRsZXNzID0gb3B0aW9ucy5odG1sUGF0aCA9PT0gXCJcIjtcblxuICAvLyBIYW5kbGUgaGVhZGxlc3Mgc3RyZWFtIHJldXNlIGZvciBmdWxsIHN0cmVhbXNcbiAgbGV0IGZpbmFsT3B0aW9ucyA9IG9wdGlvbnM7XG4gIGlmICghaXNIZWFkbGVzcyAmJiBjb250ZXh0LnJldXNlSGVhZGxlc3NTdHJlYW1JZCkge1xuICAgIGNvbnN0IHJldXNlUGFnZUNvbXBvbmVudCA9IGNyZWF0ZUhlYWRsZXNzUmV1c2VQYWdlQ29tcG9uZW50KHtcbiAgICAgIHJldXNlSGVhZGxlc3NTdHJlYW1JZDogY29udGV4dC5yZXVzZUhlYWRsZXNzU3RyZWFtSWQsXG4gICAgICBoZWFkbGVzc1N0cmVhbUVsZW1lbnRzOiBjb250ZXh0LmhlYWRsZXNzU3RyZWFtRWxlbWVudHMgfHwgbmV3IE1hcDxzdHJpbmcsIGFueT4oKSxcbiAgICAgIGhlYWRsZXNzU3RyZWFtRXJyb3JzOiBjb250ZXh0LmhlYWRsZXNzU3RyZWFtRXJyb3JzIHx8IG5ldyBNYXA8c3RyaW5nLCBhbnk+KCksXG4gICAgICByb3V0ZTogY29udGV4dC5yb3V0ZSxcbiAgICAgIHZlcmJvc2U6IGNvbnRleHQudmVyYm9zZSxcbiAgICAgIGxvZ2dlcjogY29udGV4dC5sb2dnZXIsXG4gICAgfSk7XG4gICAgXG4gICAgaWYgKHJldXNlUGFnZUNvbXBvbmVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBmaW5hbE9wdGlvbnMgPSB7XG4gICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgIFBhZ2VDb21wb25lbnQ6IHJldXNlUGFnZUNvbXBvbmVudCxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGNyZWF0ZUVsZW1lbnRXaXRoUmVhY3QoUmVhY3QsIHtcbiAgICAuLi5maW5hbE9wdGlvbnMsXG4gICAgLy8gQSBoZWFkbGVzcyAocGFnZS1sZXZlbCkgc3RyZWFtIG11c3QgZHJvcCB0aGUgSHRtbCB3cmFwcGVyIHNvIGl0cyAucnNjIGhhc1xuICAgIC8vIG5vIDxodG1sPi88aGVhZD4vPGJvZHk+IOKAlCB0aGF0J3Mgd2hhdCB0aGUgYnJvd3NlciBjbGllbnQgbW91bnRzIGludG9cbiAgICAvLyAjcm9vdCAoYSBmdWxsIGRvY3VtZW50IHRoZXJlIG5lc3RzIDxodG1sPiBpbnNpZGUgYSA8ZGl2PiBhbmQgd2VkZ2VzIGl0KS5cbiAgICAvLyBjcmVhdGVFbGVtZW50V2l0aFJlYWN0IHJlYWRzIGBIdG1sQ29tcG9uZW50YCwgTk9UIGBIdG1sYCwgc28gdGhlIHByZXZpb3VzXG4gICAgLy8gYEh0bWw6IEZyYWdtZW50YCB3YXMgc2lsZW50bHkgaWdub3JlZDogdGhlIEZyYWdtZW50IG92ZXJyaWRlIG5ldmVyIHRvb2tcbiAgICAvLyBlZmZlY3QgYW5kIHRoZSBoZWFkbGVzcyBzdHJlYW0ga2VwdCBlbWl0dGluZyB0aGUgZnVsbCBkb2N1bWVudC4gU2V0IHRoZVxuICAgIC8vIGtleSB0aGUgaGVscGVyIGFjdHVhbGx5IHJlYWRzLiAoVGhlIGRldiBzZXJ2ZXIgYWxyZWFkeSBkb2VzIHRoaXMuKVxuICAgIEh0bWxDb21wb25lbnQ6IGlzSGVhZGxlc3MgPyBSZWFjdC5GcmFnbWVudCA6IGZpbmFsT3B0aW9ucy5IdG1sQ29tcG9uZW50LFxuICAgIGFzOiBpc0hlYWRsZXNzID8gUmVhY3QuRnJhZ21lbnQgOiBcImRpdlwiLFxuICB9KTtcbn1cblxuLyoqXG4gKiBQdXJlIGZ1bmN0aW9uIGZvciBzdG9yaW5nIGhlYWRsZXNzIHN0cmVhbSBkYXRhXG4gKi9cbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFVTyxTQUFTLGtCQUFBLENBQ2QsU0FDQSxPQUNBLEVBQUE7QUFHQSxFQUFNLE1BQUEsVUFBQSxHQUFhLFFBQVEsUUFBYSxLQUFBLEVBQUE7QUFHeEMsRUFBQSxJQUFJLFlBQWUsR0FBQSxPQUFBO0FBQ25CLEVBQUksSUFBQSxDQUFDLFVBQWMsSUFBQSxPQUFBLENBQVEscUJBQXVCLEVBQUE7QUFDaEQsSUFBQSxNQUFNLHFCQUFxQixnQ0FBaUMsQ0FBQTtBQUFBLE1BQzFELHVCQUF1QixPQUFRLENBQUEscUJBQUE7QUFBQSxNQUMvQixzQkFBd0IsRUFBQSxPQUFBLENBQVEsc0JBQTBCLG9CQUFBLElBQUksR0FBaUIsRUFBQTtBQUFBLE1BQy9FLG9CQUFzQixFQUFBLE9BQUEsQ0FBUSxvQkFBd0Isb0JBQUEsSUFBSSxHQUFpQixFQUFBO0FBQUEsTUFDM0UsT0FBTyxPQUFRLENBQUEsS0FBQTtBQUFBLE1BQ2YsU0FBUyxPQUFRLENBQUEsT0FBQTtBQUFBLE1BQ2pCLFFBQVEsT0FBUSxDQUFBO0FBQUEsS0FDakIsQ0FBQTtBQUVELElBQUEsSUFBSSx1QkFBdUIsTUFBVyxFQUFBO0FBQ3BDLE1BQWUsWUFBQSxHQUFBO0FBQUEsUUFDYixHQUFHLE9BQUE7QUFBQSxRQUNILGFBQWUsRUFBQTtBQUFBLE9BQ2pCO0FBQUE7QUFDRjtBQUdGLEVBQUEsT0FBTyx1QkFBdUIsS0FBTyxFQUFBO0FBQUEsSUFDbkMsR0FBRyxZQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQVFILGFBQWUsRUFBQSxVQUFBLEdBQWEsS0FBTSxDQUFBLFFBQUEsR0FBVyxZQUFhLENBQUEsYUFBQTtBQUFBLElBQzFELEVBQUEsRUFBSSxVQUFhLEdBQUEsS0FBQSxDQUFNLFFBQVcsR0FBQTtBQUFBLEdBQ25DLENBQUE7QUFDSDs7OzsifQ==