« get me outta code hell

handle missing data files more gracefully - hsmusic-wiki - HSMusic - static wiki software cataloguing collaborative creation
about summary refs log tree commit diff
path: root/src/data
diff options
context:
space:
mode:
author(quasar) nebula <qznebula@protonmail.com>2023-02-05 08:24:10 -0400
committer(quasar) nebula <qznebula@protonmail.com>2023-02-05 09:13:04 -0400
commitf10d5559731a18097dcd6921e2bb343c36269407 (patch)
treea38d7877998072811e30b34636b14cd3ab69f2f6 /src/data
parentf0af4edfa87e9518703b7c9ab35244911f0a3ac2 (diff)
handle missing data files more gracefully
Diffstat (limited to 'src/data')
-rw-r--r--src/data/yaml.js37
1 files changed, 35 insertions, 2 deletions
diff --git a/src/data/yaml.js b/src/data/yaml.js
index b00d68ee..d6791574 100644
--- a/src/data/yaml.js
+++ b/src/data/yaml.js
@@ -4,7 +4,7 @@
 import * as path from 'path';
 import yaml from 'js-yaml';
 
-import {readFile} from 'fs/promises';
+import {readFile, stat} from 'fs/promises';
 import {inspect as nodeInspect} from 'util';
 
 import T from './things/index.js';
@@ -945,6 +945,30 @@ export async function loadAndProcessDataDocuments({dataPath}) {
               ? await callAsync(dataStep.file, dataPath)
               : dataStep.file);
 
+          const statResult = await callAsync(() =>
+            stat(file).then(
+              () => true,
+              error => {
+                if (error.code === 'ENOENT') {
+                  return false;
+                } else {
+                  throw error;
+                }
+              }));
+
+          if (statResult === false) {
+            const saveResult = call(dataStep.save, {
+              [documentModes.allInOne]: [],
+              [documentModes.oneDocumentTotal]: {},
+            }[documentMode]);
+
+            if (!saveResult) return;
+
+            Object.assign(wikiDataResult, saveResult);
+
+            return;
+          }
+
           const readResult = await callAsync(readFile, file, 'utf-8');
 
           if (!readResult) {
@@ -992,7 +1016,16 @@ export async function loadAndProcessDataDocuments({dataPath}) {
 
         let files = (
           typeof dataStep.files === 'function'
-            ? await callAsync(dataStep.files, dataPath)
+            ? await callAsync(() =>
+                dataStep.files(dataPath).then(
+                  files => files,
+                  error => {
+                    if (error.code === 'ENOENT') {
+                      return [];
+                    } else {
+                      throw error;
+                    }
+                  }))
             : dataStep.files
         );