« get me outta code hell

infra: log content function spec errors more cleanly - hsmusic-wiki - HSMusic - static wiki software cataloguing collaborative creation
about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
author(quasar) nebula <qznebula@protonmail.com>2023-06-23 18:22:13 -0300
committer(quasar) nebula <qznebula@protonmail.com>2023-06-23 18:22:13 -0300
commit25a8a5f1c0145c88401da8930aace1feedee0cf1 (patch)
tree7793a6c8ab66508d806d329579d87e1453075c0b /src
parent53395fa815cdf6f912e78f80bef8908005186270 (diff)
infra: log content function spec errors more cleanly
Diffstat (limited to 'src')
-rw-r--r--src/content-function.js10
-rw-r--r--src/content/dependencies/index.js18
2 files changed, 12 insertions, 16 deletions
diff --git a/src/content-function.js b/src/content-function.js
index 1809270..70e7be3 100644
--- a/src/content-function.js
+++ b/src/content-function.js
@@ -4,6 +4,8 @@ import {
   setIntersection,
 } from './util/sugar.js';
 
+export class ContentFunctionSpecError extends Error {}
+
 export default function contentFunction({
   contentDependencies = [],
   extraDependencies = [],
@@ -25,19 +27,19 @@ export default function contentFunction({
     setIntersection(expectedContentDependencyKeys, expectedExtraDependencyKeys);
 
   if (!empty(overlappingContentExtraDependencyKeys)) {
-    throw new Error(`Overlap in content and extra dependency keys: ${[...overlappingContentExtraDependencyKeys].join(', ')}`);
+    throw new ContentFunctionSpecError(`Overlap in content and extra dependency keys: ${[...overlappingContentExtraDependencyKeys].join(', ')}`);
   }
 
   if (!generate) {
-    throw new Error(`Expected generate function`);
+    throw new ContentFunctionSpecError(`Expected generate function`);
   }
 
   if (sprawl && !expectedExtraDependencyKeys.has('wikiData')) {
-    throw new Error(`Content functions which sprawl must specify wikiData in extraDependencies`);
+    throw new ContentFunctionSpecError(`Content functions which sprawl must specify wikiData in extraDependencies`);
   }
 
   if (slots && !expectedExtraDependencyKeys.has('html')) {
-    throw new Error(`Content functions with slots must specify html in extraDependencies`);
+    throw new ContentFunctionSpecError(`Content functions with slots must specify html in extraDependencies`);
   }
 
   // Pass all the details to expectDependencies, which will recursively build
diff --git a/src/content/dependencies/index.js b/src/content/dependencies/index.js
index e78bc94..f7a0a65 100644
--- a/src/content/dependencies/index.js
+++ b/src/content/dependencies/index.js
@@ -6,7 +6,7 @@ import {readdir} from 'node:fs/promises';
 import * as path from 'node:path';
 import {fileURLToPath} from 'node:url';
 
-import contentFunction from '../../content-function.js';
+import contentFunction, {ContentFunctionSpecError} from '../../content-function.js';
 import {color, logWarn} from '../../util/cli.js';
 import {annotateFunction} from '../../util/sugar.js';
 
@@ -205,6 +205,8 @@ export function watchContentDependencies({
 
       if (typeof error === 'string') {
         console.error(color.yellow(error));
+      } else if (error instanceof ContentFunctionSpecError) {
+        console.error(color.yellow(error.message));
       } else {
         console.error(error);
       }
@@ -214,23 +216,15 @@ export function watchContentDependencies({
   }
 
   function processFunctionSpec(functionName, spec) {
-    if (typeof spec.data === 'function') {
+    if (typeof spec?.data === 'function') {
       annotateFunction(spec.data, {name: functionName, description: 'data'});
     }
 
-    if (typeof spec.generate === 'function') {
+    if (typeof spec?.generate === 'function') {
       annotateFunction(spec.generate, {name: functionName});
     }
 
-    let fn;
-    try {
-      fn = contentFunction(spec);
-    } catch (error) {
-      error.message = `Error loading spec: ${error.message}`;
-      throw error;
-    }
-
-    return fn;
+    return contentFunction(spec);
   }
 }