diff options
Diffstat (limited to 'app/builder/buildProject.ts')
| -rw-r--r-- | app/builder/buildProject.ts | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/app/builder/buildProject.ts b/app/builder/buildProject.ts new file mode 100644 index 0000000..71fdf73 --- /dev/null +++ b/app/builder/buildProject.ts @@ -0,0 +1,88 @@ +import { render } from './renderPage.js'; +import { Page, PageDirectory } from './pageDirectory.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 + if (process.env.SKIP_OUTPUT_DIR_CREATION !== 'true') { + 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); + await pageDirectory.init(); + + 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: pagesFailed == 0, 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 = await pageDirectory.loadPage(path); + if (!page) { + return false; + } + + return await renderPage(page, pageDirectory); +} |
