UNPKG

html-render-webpack-plugin

Version:

webpack plugin for rendering static HTML in a multi-config webpack build

101 lines 4.75 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const path_1 = __importDefault(require("path")); const chalk_1 = __importDefault(require("chalk")); const logging_1 = require("./logging"); function safeMkdir(fileSystem, dir) { // @ts-expect-error Allow looking for invalid field mkdirp if (fileSystem.mkdirp) { logging_1.log("Found mkdirp method on fileSystem. Assuming older mock fs system."); return new Promise((resolve, reject) => { // @ts-expect-error Allow calling for invalid field mkdirp return fileSystem.mkdirp(dir, (error) => { if (error) { reject(error); return; } resolve(); }); }); } return new Promise((resolve, reject) => { fileSystem.mkdir(dir, { recursive: true }, (error) => { if (error) { // @ts-expect-error Looking for code property that shouldn't exist if (error.code === "EEXIST") { logging_1.log("Ignoring error when creating folder. Folder already existed. Assuming older mock fs systems."); resolve(); return; } reject(error); return; } resolve(); }); }); } function renderRoutes({ render: performRender, renderConcurrency, routes, renderDirectory, renderCompilation, transformFilePath, }) { return __awaiter(this, void 0, void 0, function* () { logging_1.log(`Starting render of ${routes.length} routes`); function emitFile(dir, content) { return __awaiter(this, void 0, void 0, function* () { logging_1.log("Emitting file to", dir); yield safeMkdir(renderCompilation.compiler.outputFileSystem, path_1.default.dirname(dir)); return new Promise((resolve, reject) => renderCompilation.compiler.outputFileSystem.writeFile(dir, content, (error) => { if (error) { reject(error); } resolve(); })); }); } function render(route) { return __awaiter(this, void 0, void 0, function* () { const relativeFilePath = transformFilePath(route); const includesHtmlInFilePath = relativeFilePath.substr(-5) === ".html"; if (!path_1.default.isAbsolute(renderDirectory)) { renderDirectory = path_1.default.resolve(renderDirectory); } const newFilePath = includesHtmlInFilePath ? path_1.default.join(renderDirectory, relativeFilePath) : path_1.default.join(renderDirectory, relativeFilePath, "index.html"); let renderResult; try { renderResult = yield performRender(route); } catch (error) { console.error(`🚨 ${chalk_1.default.red(`An error occurred rendering route: "${route.route}"`)}. Exiting render.`); throw error; } if (typeof renderResult !== "string") { throw new Error(`Render must return a string. Received "${typeof renderResult}".`); } yield emitFile(newFilePath, renderResult); logging_1.log(`Successfully emitted ${newFilePath}`); }); } if (renderConcurrency === "parallel") { logging_1.log("Rendering parallel"); return Promise.all(routes.map(render)); } logging_1.log("Rendering Serial"); for (const route of routes) { yield render(route); } return; }); } exports.default = renderRoutes; //# sourceMappingURL=renderRoutes.js.map