"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.renderPage = void 0; const path_1 = __importDefault(require("path")); const fs_extra_1 = __importDefault(require("fs-extra")); const config_1 = require("../config"); const escape = require('escape-html'); async function renderPage(config, page, // foo.md result, appChunk, cssChunk, pageToHashMap, hashMapStirng) { const { createApp } = require(path_1.default.join(config.tempDir, `_assets/app.js`)); const { app, router } = createApp(); const routePath = `/${page.replace(/\.md$/, '')}`; const siteData = config_1.resolveSiteDataByRoute(config.site, routePath); router.go(routePath); // lazy require server-renderer for production build const content = await require('@vue/server-renderer').renderToString(app); const pageName = page.replace(/\//g, '_'); // server build doesn't need hash const pageServerJsFileName = pageName + '.js'; // for any initial page load, we only need the lean version of the page js // since the static content is already on the page! const pageHash = pageToHashMap[pageName]; const pageClientJsFileName = pageName + `.` + pageHash + '.lean.js'; // resolve page data so we can render head tags const { __pageData } = require(path_1.default.join(config.tempDir, `_assets`, pageServerJsFileName)); const pageData = JSON.parse(__pageData); const assetPath = `${siteData.base}_assets/`; const preloadLinks = [ // resolve imports for index.js + page.md.js and inject script tags for // them as well so we fetch everything as early as possible without having // to wait for entry chunks to parse ...resolvePageImports(config, page, result, appChunk), pageClientJsFileName, appChunk.fileName ] .map((file) => { return ``; }) .join('\n '); const html = ` ${pageData.title ? pageData.title + ` | ` : ``}${siteData.title} ${preloadLinks} ${renderHead(siteData.head)} ${renderHead(pageData.frontmatter.head)}
${content}
`.trim(); const htmlFileName = path_1.default.join(config.outDir, page.replace(/\.md$/, '.html')); await fs_extra_1.default.ensureDir(path_1.default.dirname(htmlFileName)); await fs_extra_1.default.writeFile(htmlFileName, html); } exports.renderPage = renderPage; function resolvePageImports(config, page, result, indexChunk) { // find the page's js chunk and inject script tags for its imports so that // they are start fetching as early as possible const srcPath = path_1.default.resolve(config.root, page); const pageChunk = result.assets.find((chunk) => chunk.type === 'chunk' && chunk.facadeModuleId === srcPath); return Array.from(new Set([...indexChunk.imports, ...pageChunk.imports])); } function renderHead(head) { if (!head || !head.length) { return ''; } return head .map(([tag, attrs = {}, innerHTML = '']) => { const openTag = `<${tag}${renderAttrs(attrs)}>`; if (tag !== 'link' && tag !== 'meta') { return `${openTag}${innerHTML}`; } else { return openTag; } }) .join('\n '); } function renderAttrs(attrs) { return Object.keys(attrs) .map((key) => { return ` ${key}="${escape(attrs[key])}"`; }) .join(''); } //# sourceMappingURL=render.js.map