« get me outta code hell

hsmusic-wiki - HSMusic - static wiki software cataloguing collaborative creation
about summary refs log tree commit diff
path: root/src/write/build-modes/static-build.js
diff options
context:
space:
mode:
Diffstat (limited to 'src/write/build-modes/static-build.js')
-rw-r--r--src/write/build-modes/static-build.js58
1 files changed, 58 insertions, 0 deletions
diff --git a/src/write/build-modes/static-build.js b/src/write/build-modes/static-build.js
index 2baed816..3b69b066 100644
--- a/src/write/build-modes/static-build.js
+++ b/src/write/build-modes/static-build.js
@@ -4,6 +4,7 @@ import {
   copyFile,
   cp,
   mkdir,
+  readFile,
   stat,
   symlink,
   writeFile,
@@ -95,6 +96,11 @@ export function getCLIOptions() {
       type: 'value',
     },
 
+    'paths': {
+      help: `Skip rest and build only pages matching paths in this text file`,
+      type: 'value',
+    },
+
     // NOT for neatly ena8ling or disa8ling specific features of the site!
     // This is only in charge of what general groups of files to write.
     // They're here to make development quicker when you're only working
@@ -128,6 +134,7 @@ export async function go({
   const outputPath = cliOptions['out-path'] || process.env.HSMUSIC_OUT;
   const appendIndexHTML = cliOptions['append-index-html'] ?? false;
   const writeOneLanguage = cliOptions['lang'] ?? null;
+  const pathsFromFile = cliOptions['paths'] ?? null;
 
   if (!outputPath) {
     logError`Expected ${'--out-path'} option or ${'HSMUSIC_OUT'} to be set`;
@@ -147,6 +154,36 @@ export async function go({
     logInfo`Writing all languages.`;
   }
 
+  let filterPaths = null;
+  if (pathsFromFile) {
+    let pathsText;
+    try {
+      pathsText = await readFile(pathsFromFile, 'utf8');
+    } catch (error) {
+      logError`Failed to read file specified in ${'--paths'}:`;
+      logError`${error.code}: ${pathsFromFile}`;
+      return false;
+    }
+
+    filterPaths = pathsText.split('\n').filter(Boolean);
+
+    if (empty(filterPaths)) {
+      logWarn`Specified to build only paths in file ${'--paths'}:`;
+      logWarn`${pathsFromFile}`;
+      logWarn`But this file is totally empty...`;
+    }
+
+    if (filterPaths.some(path => !path.startsWith('/'))) {
+      logError`All lines in ${'--paths'} file should start with slash ('${'/'}')`;
+      logError`These lines don't:`;
+      console.error(filterPaths.filter(path => !path.startsWith('/')).join('\n'));
+      logError`Please check file contents, or specified path, and try again.`;
+      return false;
+    }
+
+    logInfo`Writing ${filterPaths.length} paths specified in: ${pathsFromFile} (${'--paths'})`;
+  }
+
   const selectedPageFlags = Object.keys(cliOptions)
     .filter(key => pageFlags.includes(key));
 
@@ -225,6 +262,27 @@ export async function go({
           // TODO: Validate each pathsForTargets entry
         }
 
+        if (!empty(filterPaths)) {
+          paths =
+            paths.filter(path =>
+              filterPaths.includes(
+                (path.type === 'page'
+                  ? '/' +
+                    getPagePathname({
+                      baseDirectory: '',
+                      pagePath: path.path,
+                      urls,
+                    })
+               : path.type === 'redirect'
+                  ? '/' +
+                    getPagePathname({
+                      baseDirectory: '',
+                      pagePath: path.fromPath,
+                      urls,
+                    })
+                  : null)));
+        }
+
         paths =
           paths.filter(path => path.condition?.() ?? true);