aboutsummaryrefslogtreecommitdiffstats
path: root/app/builder/buildProject.ts
diff options
context:
space:
mode:
Diffstat (limited to 'app/builder/buildProject.ts')
-rw-r--r--app/builder/buildProject.ts88
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);
+}