html-render-webpack-plugin
Version:
webpack plugin for rendering static HTML in a multi-config webpack build
101 lines • 4.75 kB
JavaScript
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
;