99 lines
2.7 KiB
JavaScript
99 lines
2.7 KiB
JavaScript
#!/usr/bin/env node
|
|
import {
|
|
copyFileSync,
|
|
existsSync,
|
|
mkdirSync,
|
|
readFileSync,
|
|
writeFileSync,
|
|
} from "fs";
|
|
import XmlSitemap from "xml-sitemap";
|
|
import { JSDOM } from 'jsdom';
|
|
|
|
import { publicUrl } from "../src/config";
|
|
import { createRadar } from "./generateJson/radar";
|
|
|
|
// Do this as the first thing so that any code reading it knows the right env.
|
|
process.env.BABEL_ENV = "production";
|
|
process.env.NODE_ENV = "production";
|
|
|
|
// Makes the script crash on unhandled rejections instead of silently
|
|
// ignoring them. In the future, promise rejections that are not handled will
|
|
// terminate the Node.js process with a non-zero exit code.
|
|
process.on("unhandledRejection", (err) => {
|
|
throw err;
|
|
});
|
|
|
|
const createStaticFiles = async () => {
|
|
console.log("starting static");
|
|
const radar = await createRadar();
|
|
|
|
copyFileSync("build/index.html", "build/overview.html");
|
|
copyFileSync("build/index.html", "build/help-and-about-tech-radar.html");
|
|
const rawConf = readFileSync("build/config.json", "utf-8");
|
|
const config = JSON.parse(rawConf);
|
|
|
|
Object.keys(config.quadrants).forEach((quadrant) => {
|
|
const destFolder = `build/${quadrant}`;
|
|
copyFileSync("build/index.html", `${destFolder}.html`);
|
|
if (!existsSync(destFolder)) {
|
|
mkdirSync(destFolder);
|
|
}
|
|
});
|
|
|
|
const sitemap = new XmlSitemap();
|
|
const sitemapOptions = {
|
|
lastmod: "now",
|
|
changefreq: "weekly",
|
|
}
|
|
|
|
sitemap.add(`${publicUrl}index.html`, sitemapOptions);
|
|
|
|
radar.items.forEach((item) => {
|
|
const targetPath = `build/${item.quadrant}/${item.name}.html`
|
|
copyFileSync(
|
|
"build/index.html",
|
|
targetPath
|
|
);
|
|
|
|
JSDOM.fromFile(targetPath).then(dom => {
|
|
const document = dom.window.document;
|
|
const rootEl = document.getElementById("root")
|
|
|
|
if (rootEl) {
|
|
const textNode = document.createElement("div")
|
|
const bodyFragment = JSDOM.fragment(item.body);
|
|
textNode.appendChild(bodyFragment)
|
|
|
|
const headlineNode = document.createElement("h1")
|
|
const titleText = document.createTextNode(item.title);
|
|
headlineNode.appendChild(titleText)
|
|
|
|
rootEl.appendChild(headlineNode)
|
|
rootEl.appendChild(textNode)
|
|
} else {
|
|
console.warn('Element with ID "root" not found. Static site content will be empty.')
|
|
}
|
|
|
|
writeFileSync(
|
|
targetPath,
|
|
dom.serialize()
|
|
);
|
|
});
|
|
|
|
sitemap.add(`${publicUrl}${item.quadrant}/${item.name}.html`, sitemapOptions);
|
|
});
|
|
|
|
writeFileSync("build/sitemap.xml", sitemap.xml);
|
|
};
|
|
|
|
createStaticFiles()
|
|
.then(() => {
|
|
console.log(`created static files.`);
|
|
})
|
|
.catch((err) => {
|
|
if (err && err.message) {
|
|
console.error(err.message);
|
|
}
|
|
process.exit(1);
|
|
});
|