aboutsummaryrefslogtreecommitdiffstats
path: root/app/builder/build.ts
blob: d0ed5a9c160ec20dfd7dfce073378e7b082d4345 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
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);
}