vike
Version:
The Framework *You* Control - Next.js & Nuxt alternative for unprecedented flexibility and dependability.
94 lines (93 loc) • 4.46 kB
JavaScript
;
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;
}