diff options
| author | Leonardo Bishop <me@leonardobishop.com> | 2023-08-20 11:12:25 +0100 |
|---|---|---|
| committer | Leonardo Bishop <me@leonardobishop.com> | 2023-08-20 11:22:58 +0100 |
| commit | 19614388ea6298775d08fe19e67fb22bf90a01da (patch) | |
| tree | 119d7cd65e731983d8cfcd1b996a68987baf9740 /app/builder/build.ts | |
Replace web server with static site generator
Diffstat (limited to 'app/builder/build.ts')
| -rw-r--r-- | app/builder/build.ts | 85 |
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); +} |
