UNPKG

vike

Version:

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

94 lines (93 loc) 4.46 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.injectHtmlTagsToString = injectHtmlTagsToString; exports.injectHtmlTagsToStream = injectHtmlTagsToStream; const utils_js_1 = require("../utils.js"); const assertPageContextProvidedByUser_js_1 = require("../../../shared/assertPageContextProvidedByUser.js"); const injectHtmlTags_js_1 = require("./injectAssets/injectHtmlTags.js"); const getHtmlTags_js_1 = require("./injectAssets/getHtmlTags.js"); const getViteDevScript_js_1 = require("./injectAssets/getViteDevScript.js"); async function injectHtmlTagsToString(htmlParts, pageContext, injectFilter) { const pageAssets = await pageContext.__getPageAssets(); const viteDevScript = await (0, getViteDevScript_js_1.getViteDevScript)(pageContext); const htmlTags = await (0, getHtmlTags_js_1.getHtmlTags)(pageContext, null, injectFilter, pageAssets, viteDevScript, false); let htmlString = htmlPartsToString(htmlParts, pageAssets); htmlString = injectToHtmlBegin(htmlString, htmlTags); htmlString = injectToHtmlEnd(htmlString, htmlTags); (0, utils_js_1.assert)(htmlTags.filter((snippet) => snippet.position === 'HTML_STREAM').length === 0); return htmlString; } function injectHtmlTagsToStream(pageContext, streamFromReactStreamingPackage, injectFilter) { let htmlTags; return { injectAtStreamBegin, injectAtStreamAfterFirstChunk, injectAtStreamEnd, }; async function injectAtStreamBegin(htmlPartsBegin) { const pageAssets = await pageContext.__getPageAssets(); const viteDevScript = await (0, getViteDevScript_js_1.getViteDevScript)(pageContext); htmlTags = await (0, getHtmlTags_js_1.getHtmlTags)(pageContext, streamFromReactStreamingPackage, injectFilter, pageAssets, viteDevScript, true); let htmlBegin = htmlPartsToString(htmlPartsBegin, pageAssets); htmlBegin = injectToHtmlBegin(htmlBegin, htmlTags); if (streamFromReactStreamingPackage) { (0, injectHtmlTags_js_1.injectHtmlTagsUsingStream)(htmlTags, streamFromReactStreamingPackage); } return htmlBegin; } // Is it worth it? Should we remove this? https://github.com/vikejs/vike/pull/1740#issuecomment-2230540892 function injectAtStreamAfterFirstChunk() { // React has its own stream injection mechanism, see injectHtmlTagsUsingStream() if (streamFromReactStreamingPackage) return null; (0, utils_js_1.assert)(htmlTags); const tags = htmlTags.filter((h) => h.position === 'HTML_STREAM'); if (tags.length === 0) return null; const htmlFragment = (0, injectHtmlTags_js_1.joinHtmlTags)(tags); return htmlFragment; } async function injectAtStreamEnd(htmlPartsEnd) { (0, utils_js_1.assert)(htmlTags); await resolvePageContextPromise(pageContext); const pageAssets = await pageContext.__getPageAssets(); let htmlEnd = htmlPartsToString(htmlPartsEnd, pageAssets); htmlEnd = injectToHtmlEnd(htmlEnd, htmlTags); return htmlEnd; } } function injectToHtmlBegin(htmlBegin, htmlTags) { // Ensure existence of `<head>` htmlBegin = (0, injectHtmlTags_js_1.createHtmlHeadIfMissing)(htmlBegin); htmlBegin = (0, injectHtmlTags_js_1.injectHtmlTags)(htmlBegin, htmlTags, 'HTML_BEGIN'); return htmlBegin; } function injectToHtmlEnd(htmlEnd, htmlTags) { htmlEnd = (0, injectHtmlTags_js_1.injectHtmlTags)(htmlEnd, htmlTags, 'HTML_END'); return htmlEnd; } async function resolvePageContextPromise(pageContext) { const pageContextPromise = pageContext._pageContextPromise; if (!pageContextPromise) { return; } let pageContextProvidedByUser; if ((0, utils_js_1.isCallable)(pageContextPromise)) { pageContextProvidedByUser = await pageContextPromise(); } else if ((0, utils_js_1.isPromise)(pageContextPromise)) { pageContextProvidedByUser = await pageContextPromise; } else { (0, utils_js_1.assert)(false); } (0, assertPageContextProvidedByUser_js_1.assertPageContextProvidedByUser)(pageContextProvidedByUser, pageContext._renderHook); Object.assign(pageContext, pageContextProvidedByUser); } function htmlPartsToString(htmlParts, pageAssets) { let htmlString = ''; htmlParts.forEach((p) => { htmlString += typeof p === 'string' ? p : p(pageAssets); }); return htmlString; }