aboutsummaryrefslogtreecommitdiffstats
path: root/app/builder/build.ts
diff options
context:
space:
mode:
authorLeonardo Bishop <me@leonardobishop.com>2023-08-20 11:12:25 +0100
committerLeonardo Bishop <me@leonardobishop.com>2023-08-20 11:22:58 +0100
commit19614388ea6298775d08fe19e67fb22bf90a01da (patch)
tree119d7cd65e731983d8cfcd1b996a68987baf9740 /app/builder/build.ts
Replace web server with static site generator
Diffstat (limited to 'app/builder/build.ts')
-rw-r--r--app/builder/build.ts85
1 files changed, 85 insertions, 0 deletions
diff --git a/app/builder/build.ts b/app/builder/build.ts
new file mode 100644
index 0000000..d0ed5a9
--- /dev/null
+++ b/app/builder/build.ts
@@ -0,0 +1,85 @@
+import { render } from './render.js';
+import { Page, PageDirectory } from './pages.js';
+import fs from 'fs';
+import path from 'path';
+import { logger } from '../logger.js';
+
+export async function buildPages(): Promise<{ success: boolean, errors: number, pageDirectory: PageDirectory}> {
+ // Recreate output directory
+ try {
+ if (fs.existsSync(process.env.OUTPUT_DIR)) {
+ fs.rmSync(process.env.OUTPUT_DIR, { recursive: true });
+ }
+ fs.mkdirSync(process.env.OUTPUT_DIR);
+ } catch (e) {
+ logger.error(`Failed to create output directory: ${e.message}`);
+ return { success: false, errors: 0, pageDirectory: null };
+ }
+
+
+ // Load pages
+ logger.info(`Reading pages from disk...`);
+ const pageDirectory = new PageDirectory(process.env.PAGES_DIR);
+
+ let pagesCount = Object.keys(pageDirectory.getPages()).length;
+ logger.info(`Found ${pagesCount} pages.`);
+
+
+ // Render pages
+ logger.info(`Rendering pages...`);
+ let pagesRendered = 0;
+ let pagesFailed = 0;
+ for (const page of pageDirectory.getPages()) {
+ if (await renderPage(page, pageDirectory)) {
+ pagesRendered++;
+ } else {
+ pagesFailed++;
+ }
+ }
+
+ logger.info(`Rendered ${pagesRendered} of ${pagesCount} pages.`);
+
+
+ // Copy static files
+ logger.info(`Copying static files...`);
+ try {
+ fs.cpSync(`${process.env.STATIC_DIR}`, `${process.env.OUTPUT_DIR}/static`, { recursive: true });
+ logger.info(`Done.`);
+ } catch (e) {
+ logger.error(`Failed to copy static files: ${e.message}`);
+ }
+
+ return { success: true, errors: pagesFailed, pageDirectory: pageDirectory};
+}
+
+async function renderPage(page: Page, pageDirectory: PageDirectory): Promise<boolean> {
+ let html;
+ try {
+ html = await render(page, pageDirectory);
+ } catch (e) {
+ logger.error(`Failed to render page ${page.originalPath}: ${e.message}`);
+ return false;
+ }
+
+ try {
+ const file = page.buildPath;
+ const dir = path.dirname(file);
+ if (!fs.existsSync(dir)) {
+ fs.mkdirSync(dir, { recursive: true });
+ }
+ fs.writeFileSync(file, html);
+ } catch (e) {
+ logger.error(`Failed to write page ${page.buildPath}: ${e.message}`);
+ return false;
+ }
+ return true;
+}
+
+export async function rebuildSinglePage(path: string, pageDirectory: PageDirectory): Promise<boolean> {
+ const page = pageDirectory.loadPage(path);
+ if (!page) {
+ return false;
+ }
+
+ return await renderPage(page, pageDirectory);
+}