UNPKG

vike

Version:

The Framework *You* Control - Next.js & Nuxt alternative for unprecedented flexibility and dependability.

84 lines (83 loc) 5.12 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.renderPageAlreadyRouted = renderPageAlreadyRouted; exports.prerenderPage = prerenderPage; const error_page_js_1 = require("../../../shared/error-page.js"); const renderHtml_js_1 = require("../html/renderHtml.js"); const utils_js_1 = require("../utils.js"); const serializeContext_js_1 = require("../html/serializeContext.js"); const createHttpResponse_js_1 = require("./createHttpResponse.js"); const loadUserFilesServerSide_js_1 = require("./loadUserFilesServerSide.js"); const executeOnRenderHtmlHook_js_1 = require("./executeOnRenderHtmlHook.js"); const executeOnBeforeRenderAndDataHooks_js_1 = require("./executeOnBeforeRenderAndDataHooks.js"); const loggerRuntime_js_1 = require("./loggerRuntime.js"); const isNewError_js_1 = require("./isNewError.js"); const preparePageContextForUserConsumptionServerSide_js_1 = require("./preparePageContextForUserConsumptionServerSide.js"); const executeGuardHook_js_1 = require("../../../shared/route/executeGuardHook.js"); const picocolors_1 = __importDefault(require("@brillout/picocolors")); const isServerSideError_js_1 = require("../../../shared/misc/isServerSideError.js"); async function renderPageAlreadyRouted(pageContext) { // pageContext.pageId can either be the: // - ID of the page matching the routing, or the // - ID of the error page `_error.page.js`. (0, utils_js_1.assert)((0, utils_js_1.hasProp)(pageContext, 'pageId', 'string')); const isError = pageContext.is404 || !!pageContext.errorWhileRendering; (0, utils_js_1.assert)(isError === (pageContext.pageId === (0, error_page_js_1.getErrorPageId)(pageContext._pageFilesAll, pageContext._pageConfigs))); (0, utils_js_1.objectAssign)(pageContext, await (0, loadUserFilesServerSide_js_1.loadUserFilesServerSide)(pageContext)); if (!isError) { await (0, executeGuardHook_js_1.executeGuardHook)(pageContext, (pageContext) => (0, preparePageContextForUserConsumptionServerSide_js_1.preparePageContextForUserConsumptionServerSide)(pageContext)); } if (!isError) { await (0, executeOnBeforeRenderAndDataHooks_js_1.executeOnBeforeRenderAndDataHooks)(pageContext); } else { try { await (0, executeOnBeforeRenderAndDataHooks_js_1.executeOnBeforeRenderAndDataHooks)(pageContext); } catch (err) { if ((0, isNewError_js_1.isNewError)(err, pageContext.errorWhileRendering)) { (0, loggerRuntime_js_1.logRuntimeError)(err, pageContext._httpRequestId); } } } if (pageContext.isClientSideNavigation) { if (isError) { (0, utils_js_1.objectAssign)(pageContext, { [isServerSideError_js_1.isServerSideError]: true }); } const pageContextSerialized = (0, serializeContext_js_1.getPageContextClientSerialized)(pageContext); const httpResponse = await (0, createHttpResponse_js_1.createHttpResponsePageContextJson)(pageContextSerialized); (0, utils_js_1.objectAssign)(pageContext, { httpResponse }); return pageContext; } const renderHookResult = await (0, executeOnRenderHtmlHook_js_1.executeOnRenderHtmlHook)(pageContext); const { htmlRender, renderHook } = renderHookResult; const httpResponse = await (0, createHttpResponse_js_1.createHttpResponsePage)(htmlRender, renderHook, pageContext); (0, utils_js_1.objectAssign)(pageContext, { httpResponse }); return pageContext; } async function prerenderPage(pageContext) { (0, utils_js_1.objectAssign)(pageContext, { isClientSideNavigation: false, _urlHandler: null }); /* Should we execute the guard() hook upon pre-rendering? Is there a use case for this? * - It isn't trivial to implement, as it requires to duplicate / factor out the isAbortError() handling await executeGuardHook(pageContext, (pageContext) => preparePageContextForUserConsumptionServerSide(pageContext)) */ await (0, executeOnBeforeRenderAndDataHooks_js_1.executeOnBeforeRenderAndDataHooks)(pageContext); const { htmlRender, renderHook } = await (0, executeOnRenderHtmlHook_js_1.executeOnRenderHtmlHook)(pageContext); (0, utils_js_1.assertUsage)(htmlRender !== null, `Cannot pre-render ${picocolors_1.default.cyan(pageContext.urlOriginal)} because the ${renderHook.hookName}() hook defined by ${renderHook.hookFilePath} didn't return an HTML string.`); (0, utils_js_1.assert)(pageContext.isClientSideNavigation === false); const documentHtml = await (0, renderHtml_js_1.getHtmlString)(htmlRender); (0, utils_js_1.assert)(typeof documentHtml === 'string'); if (!pageContext._usesClientRouter) { return { documentHtml, pageContextSerialized: null, pageContext }; } else { const pageContextSerialized = (0, serializeContext_js_1.getPageContextClientSerialized)(pageContext); return { documentHtml, pageContextSerialized, pageContext }; } }