aboutsummaryrefslogtreecommitdiffstats
path: root/app
diff options
context:
space:
mode:
authorLeonardo Bishop <me@leonardobishop.com>2023-08-29 19:22:01 +0100
committerLeonardo Bishop <me@leonardobishop.com>2023-08-29 19:22:01 +0100
commit2620b9c21761759b6b57a3b29e58c0fbb739a413 (patch)
tree322188abbe4a1ef8a8a77f6413f671a95753a5dd /app
parentd5802a34218a56357a7ae88eff1d3cfa86d41bc7 (diff)
Add full rebuild feature, and remove incremental build
Diffstat (limited to 'app')
-rw-r--r--app/builder/buildProject.ts19
-rw-r--r--app/index.ts13
-rw-r--r--app/webserver/fileWatcher.ts42
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...`);