diff options
| author | Leonardo Bishop <me@leonardobishop.com> | 2023-08-29 19:22:01 +0100 |
|---|---|---|
| committer | Leonardo Bishop <me@leonardobishop.com> | 2023-08-29 19:22:01 +0100 |
| commit | 2620b9c21761759b6b57a3b29e58c0fbb739a413 (patch) | |
| tree | 322188abbe4a1ef8a8a77f6413f671a95753a5dd /app | |
| parent | d5802a34218a56357a7ae88eff1d3cfa86d41bc7 (diff) | |
Add full rebuild feature, and remove incremental build
Diffstat (limited to 'app')
| -rw-r--r-- | app/builder/buildProject.ts | 19 | ||||
| -rw-r--r-- | app/index.ts | 13 | ||||
| -rw-r--r-- | app/webserver/fileWatcher.ts | 42 |
3 files changed, 55 insertions, 19 deletions
diff --git a/app/builder/buildProject.ts b/app/builder/buildProject.ts index 03cc58e..700e0ec 100644 --- a/app/builder/buildProject.ts +++ b/app/builder/buildProject.ts @@ -6,7 +6,7 @@ import { logger } from '../logger.js'; import glob from 'glob'; import { process as processCss } from './processCss.js'; -export async function buildPages(): Promise<{ success: boolean, errors: number, pageDirectory: PageDirectory}> { +export async function buildPages(verbose: boolean = true): Promise<{ success: boolean, errors: number, pageDirectory: PageDirectory}> { // Recreate output directory if (process.env.SKIP_OUTPUT_DIR_CREATION !== 'true') { try { @@ -22,16 +22,16 @@ export async function buildPages(): Promise<{ success: boolean, errors: number, // Load pages - logger.info(`Reading pages from disk...`); + if (verbose) 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.`); + if (verbose) logger.info(`Found ${pagesCount} pages.`); // Render pages - logger.info(`Rendering pages...`); + if (verbose) logger.info(`Rendering pages...`); let pagesRendered = 0; let pagesFailed = 0; for (const page of pageDirectory.getPages()) { @@ -42,7 +42,7 @@ export async function buildPages(): Promise<{ success: boolean, errors: number, } } - logger.info(`Rendered ${pagesRendered} of ${pagesCount} pages.`); + if (verbose) logger.info(`Rendered ${pagesRendered} of ${pagesCount} pages.`); //TODO move to util const ensureParentDirExists = (file: string) => { @@ -55,7 +55,7 @@ export async function buildPages(): Promise<{ success: boolean, errors: number, }; // Copy static files - logger.info(`Copying static files...`); + if (verbose) logger.info(`Copying static files...`); try { const files = glob.sync(`**/*`, { cwd: process.env.STATIC_DIR, @@ -69,9 +69,10 @@ export async function buildPages(): Promise<{ success: boolean, errors: number, fs.copyFileSync(joinedPath, outputPath); } - logger.info(`Done.`); + if (verbose) logger.info(`Done.`); } catch (e) { logger.error(`Failed to copy static files: ${e.message}`); + logger.error(e); } // Process CSS files @@ -80,7 +81,7 @@ export async function buildPages(): Promise<{ success: boolean, errors: number, nodir: true, }); if (cssFiles.length > 0) { - logger.info(`Processing CSS files...`); + if (verbose) logger.info(`Processing CSS files...`); for (const file of cssFiles) { const outputPath = ensureParentDirExists(file); @@ -97,7 +98,7 @@ export async function buildPages(): Promise<{ success: boolean, errors: number, fs.writeFileSync(newOutputPath, processedCss); } - logger.info(`Done.`); + if (verbose) logger.info(`Done.`); } diff --git a/app/index.ts b/app/index.ts index e801fa3..bdd5f00 100644 --- a/app/index.ts +++ b/app/index.ts @@ -9,12 +9,13 @@ logger.info(''); logger.info(`panulat v${buildInfo.panulat.version}, a static site generator`); logger.info(buildInfo.date); logger.info(''); -logger.info(`Static directory: ${process.env.STATIC_DIR}`); -logger.info(` Pages directory: ${process.env.PAGES_DIR}`); -logger.info(` Views directory: ${process.env.VIEWS_DIR}`); -logger.info(`Output directory: ${process.env.OUTPUT_DIR}`); -logger.info(` Webserver: ${process.env.WEBSERVER_ENABLED === 'true' ? 'enabled' : 'disabled'}`); -logger.info(` Autorebuild: ${process.env.WEBSERVER_AUTOREBUILD === 'true' ? 'enabled' : 'disabled'}`); +logger.info(` Static directory: ${process.env.STATIC_DIR}`); +logger.info(` Pages directory: ${process.env.PAGES_DIR}`); +logger.info(` Views directory: ${process.env.VIEWS_DIR}`); +logger.info(` Output directory: ${process.env.OUTPUT_DIR}`); +logger.info(` Webserver: ${process.env.WEBSERVER_ENABLED === 'true' ? 'enabled' : 'disabled'}`); +logger.info(` Auto rebuild: ${process.env.WEBSERVER_AUTOREBUILD === 'true' ? 'enabled' : 'disabled'}`); +logger.info(`Incremental rebuild: disabled`); //TODO logger.info(''); const {success, errors, pageDirectory} = await buildPages(); diff --git a/app/webserver/fileWatcher.ts b/app/webserver/fileWatcher.ts index 772ac1b..f9a4f6c 100644 --- a/app/webserver/fileWatcher.ts +++ b/app/webserver/fileWatcher.ts @@ -1,7 +1,7 @@ import chokidar, { FSWatcher } from 'chokidar'; import { logger } from '../logger.js'; import { PageDirectory } from '../builder/pageDirectory.js'; -import { rebuildSinglePage } from '../builder/buildProject.js'; +import { buildPages, rebuildSinglePage } from '../builder/buildProject.js'; import path from 'path'; import fs from 'fs'; @@ -92,6 +92,36 @@ function attachViewEvents(watcher: FSWatcher, pages: PageDirectory) { watcher.on('unlink', onViewRemoval); } +let buildInProgress = false; + +function attachFullRebuildEvents(watcher: FSWatcher) { + + const onFullRebuild = async (file: string) => { + if (buildInProgress) { + logger.info(`File ${file} has been modified, but a build is already in progress. Skipping...`); + return; + } + buildInProgress = true; + + logger.info(`File ${file} has been modified, starting full rebuild...`); + const startDate = new Date(); + const {success, errors, pageDirectory} = await buildPages(false); + const endDate = new Date(); + const finishString = `...done${errors > 0 ? `, with ${errors} errors` : ''}, after ${endDate.getTime() - startDate.getTime()}ms.`; + if (!success) { + logger.error(finishString); + } else { + logger.info(finishString); + } + logger.info(``); + buildInProgress = false; + } + + watcher.on('add', onFullRebuild); + watcher.on('change', onFullRebuild); + watcher.on('unlink', onFullRebuild); +} + export const start = (pages: PageDirectory) => { const pagesWatcher = chokidar.watch('.', { persistent: true, @@ -109,9 +139,13 @@ export const start = (pages: PageDirectory) => { ignoreInitial: true, }); - attachPageEvents(pagesWatcher, pages); - attachStaticEvents(staticWatcher); - attachViewEvents(viewsWatcher, pages); + // attachPageEvents(pagesWatcher, pages); + // attachStaticEvents(staticWatcher); + // attachViewEvents(viewsWatcher, pages); + // + attachFullRebuildEvents(pagesWatcher); + attachFullRebuildEvents(staticWatcher); + attachFullRebuildEvents(viewsWatcher); const exitHandler = () => { logger.info(`Stopping file watcher...`); |
