everything-dev
Version:
A consolidated product package for building Module Federation apps with oRPC APIs.
153 lines (151 loc) • 6.18 kB
JavaScript
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
const require_locale = require('./locale.cjs');
const require_ui_router = require('./router.cjs');
const require_ui_api = require('./api.cjs');
const require_ui_auth = require('./auth.cjs');
const require_ui_router_defaults = require('./router-defaults.cjs');
const require_ui_router_error = require('./router-error.cjs');
let react_jsx_runtime = require("react/jsx-runtime");
let _tanstack_react_router = require("@tanstack/react-router");
let _tanstack_react_query = require("@tanstack/react-query");
let _tanstack_react_router_ssr_server = require("@tanstack/react-router/ssr/server");
//#region src/ui/router-server.tsx
/**
* SSR router factory — creates request-scoped server routers and server-side
* API/auth clients per request. Mirrors the client router shape for
* hydration consistency. The app injects its generated route tree and (for
* a byte-identical child surface) its error component.
*/
function createServerRouterModule(options = {}) {
const defaultRouteTree = options.defaultRouteTree;
const createRouter = (opts) => {
const context = opts?.context;
const queryClient = context?.queryClient ?? require_ui_router_defaults.defaultQueryClient();
const history = opts?.history ?? (0, _tanstack_react_router.createMemoryHistory)();
const cspNonce = context?.cspNonce;
return {
router: (0, _tanstack_react_router.createRouter)({
routeTree: opts?.routeTree ?? defaultRouteTree,
history,
basepath: opts?.basepath,
context: {
queryClient,
runtimeConfig: context?.runtimeConfig,
apiClient: context?.apiClient,
authClient: context?.authClient ?? require_ui_auth.createAuthClient({
runtimeConfig: context?.runtimeConfig,
cspNonce: context?.cspNonce
}),
session: context?.session,
cspNonce,
locale: context?.locale,
pluginNav: context?.pluginNav
},
...cspNonce ? { ssr: { nonce: cspNonce } } : {},
defaultPreload: "intent",
scrollRestoration: true,
defaultStructuralSharing: true,
defaultPreloadStaleTime: 0,
defaultErrorComponent: require_ui_router_error.RouterError,
defaultOnCatch: (error, errorInfo) => {
console.error("[SSR] Router error boundary caught:", error, { componentStack: errorInfo.componentStack });
},
defaultNotFoundComponent: require_ui_router_defaults.defaultNotFoundComponent,
defaultPendingComponent: require_ui_router_defaults.defaultPendingComponent,
defaultPendingMinMs: 0,
dehydrate: () => {
if (typeof window === "undefined") return { queryClientState: (0, _tanstack_react_query.dehydrate)(queryClient) };
return { queryClientState: {} };
},
hydrate: (dehydrated) => {
if (typeof window !== "undefined" && dehydrated?.queryClientState) (0, _tanstack_react_query.hydrate)(queryClient, dehydrated.queryClientState);
}
}),
queryClient
};
};
const buildRouter = options.createRouter ?? createRouter;
const getRouteHead = async (pathname, context) => {
const history = (0, _tanstack_react_router.createMemoryHistory)({ initialEntries: [pathname] });
const queryClient = new _tanstack_react_query.QueryClient();
const runtimeConfig = context?.runtimeConfig;
if (!runtimeConfig?.hostUrl || !runtimeConfig.rpcBase) throw new Error("Missing runtime config for route head generation");
const router = (0, _tanstack_react_router.createRouter)({
routeTree: context?.routeTree ?? defaultRouteTree,
history,
context: {
queryClient,
runtimeConfig,
apiClient: context?.apiClient ?? require_ui_api.createApiClient({
hostUrl: runtimeConfig.hostUrl,
rpcBase: runtimeConfig.rpcBase
}),
authClient: context?.authClient ?? require_ui_auth.createAuthClient({
runtimeConfig,
cspNonce: context?.cspNonce
}),
session: context?.session,
locale: context?.locale
}
});
return require_ui_router.collectHeadData(router);
};
const renderToStream = async (request, renderOptions) => {
const url = new URL(request.url);
const history = (0, _tanstack_react_router.createMemoryHistory)({ initialEntries: [url.pathname + url.search] });
let queryClientRef = null;
const response = await (0, _tanstack_react_router_ssr_server.createRequestHandler)({
request,
createRouter: () => {
const localQueryClient = queryClientRef ?? options.createQueryClient?.() ?? require_ui_router_defaults.defaultQueryClient();
const built = buildRouter({
history,
routeTree: renderOptions.routeTree,
basepath: renderOptions.basepath,
context: {
queryClient: localQueryClient,
runtimeConfig: renderOptions.runtimeConfig,
apiClient: renderOptions.apiClient,
authClient: require_ui_auth.createAuthClient({
runtimeConfig: renderOptions.runtimeConfig,
headers: request.headers,
cspNonce: renderOptions.cspNonce
}),
session: renderOptions.session,
cspNonce: renderOptions.cspNonce,
pluginNav: renderOptions.pluginNav,
locale: options.locale ? require_locale.resolveLocale({
...options.locale,
cookie: request.headers.get("cookie") ?? "",
browserLocales: require_locale.readAcceptLanguage(request.headers.get("accept-language"))
}) : void 0
}
});
queryClientRef = built.queryClient ?? localQueryClient;
return built.router;
}
})(({ request, responseHeaders, router }) => (0, _tanstack_react_router_ssr_server.renderRouterToStream)({
request,
responseHeaders,
router,
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_tanstack_react_query.QueryClientProvider, {
client: queryClientRef,
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_tanstack_react_router_ssr_server.RouterServer, { router })
})
}));
if (options.locale) response.headers.append("Vary", "Cookie, Accept-Language");
return {
stream: response.body,
statusCode: response.status,
headers: response.headers
};
};
return {
createRouter,
getRouteHead,
renderToStream
};
}
//#endregion
exports.createServerRouterModule = createServerRouterModule;
//# sourceMappingURL=router-server.cjs.map