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);
|