UNPKG

vike

Version:

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

86 lines (85 loc) 5.1 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 loadPageConfigsLazyServerSide_js_1 = require("./loadPageConfigsLazyServerSide.js"); const execHookOnRenderHtml_js_1 = require("./execHookOnRenderHtml.js"); const execHookDataAndOnBeforeRender_js_1 = require("./execHookDataAndOnBeforeRender.js"); const loggerRuntime_js_1 = require("../loggerRuntime.js"); const isNewError_js_1 = require("./isNewError.js"); const preparePageContextForPublicUsageServer_js_1 = require("./preparePageContextForPublicUsageServer.js"); const execHookGuard_js_1 = require("../../../shared/route/execHookGuard.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._globalContext._pageFilesAll, pageContext._globalContext._pageConfigs))); (0, utils_js_1.augmentType)(pageContext, await (0, loadPageConfigsLazyServerSide_js_1.loadPageConfigsLazyServerSideAndExecHook)(pageContext)); if (!isError) { await (0, execHookGuard_js_1.execHookGuard)(pageContext, (pageContext) => (0, preparePageContextForPublicUsageServer_js_1.preparePageContextForPublicUsageServer)(pageContext)); } if (!isError) { await (0, execHookDataAndOnBeforeRender_js_1.execHookDataAndOnBeforeRender)(pageContext); } else { try { await (0, execHookDataAndOnBeforeRender_js_1.execHookDataAndOnBeforeRender)(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, execHookOnRenderHtml_js_1.execHookOnRenderHtml)(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 execHookGuard(pageContext, (pageContext) => preparePageContextForPublicUsageServer(pageContext)) */ await (0, execHookDataAndOnBeforeRender_js_1.execHookDataAndOnBeforeRender)(pageContext); const { htmlRender, renderHook } = await (0, execHookOnRenderHtml_js_1.execHookOnRenderHtml)(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 }; } }