« get me outta code hell

[preview] write: static-build: --paths <paths.txt> - hsmusic-wiki - HSMusic - static wiki software cataloguing collaborative creation
about summary refs log tree commit diff
path: root/src/write
diff options
context:
space:
mode:
author(quasar) nebula <qznebula@protonmail.com>2025-10-01 14:26:20 -0300
committer(quasar) nebula <qznebula@protonmail.com>2025-10-01 14:27:51 -0300
commit7f41ad04a1e4967a772f12afca63fc26a5a8af10 (patch)
treee3ebb9f0b80afc4d2d0163dd76142594bc88ce31 /src/write
parent92d891d58d98fbd49febc6568272e20406e730b2 (diff)
[preview] write: static-build: --paths <paths.txt>
Diffstat (limited to 'src/write')
-rw-r--r--src/write/build-modes/static-build.js69
1 files changed, 68 insertions, 1 deletions
diff --git a/src/write/build-modes/static-build.js b/src/write/build-modes/static-build.js
index b5ded04c..c0df2d35 100644
--- a/src/write/build-modes/static-build.js
+++ b/src/write/build-modes/static-build.js
@@ -1,6 +1,16 @@
-import {cp, mkdir, stat, symlink, writeFile, unlink} from 'node:fs/promises';
 import * as path from 'node:path';
 
+import {
+  copyFile,
+  cp,
+  mkdir,
+  readFile,
+  stat,
+  symlink,
+  writeFile,
+  unlink,
+} from 'node:fs/promises';
+
 import {rimraf} from 'rimraf';
 
 import {quickLoadContentDependencies} from '#content-dependencies';
@@ -86,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
@@ -117,6 +132,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`;
@@ -136,6 +152,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));
 
@@ -209,6 +255,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);