« get me outta code hell

aggregate: treat translucent aggregate cause as direct sub-errors - hsmusic-wiki - HSMusic - static wiki software cataloguing collaborative creation
about summary refs log tree commit diff
path: root/src/aggregate.js
diff options
context:
space:
mode:
author(quasar) nebula <qznebula@protonmail.com>2025-03-31 10:25:09 -0300
committer(quasar) nebula <qznebula@protonmail.com>2025-04-10 16:02:34 -0300
commit3c277846ea46282f1fdad91c201940d3685693d4 (patch)
treed68d67a889a1c05f1f4aed7a086d05338c0b60a1 /src/aggregate.js
parentdc2fe4b2aa1e319a540b4b45045b25679359207b (diff)
aggregate: treat translucent aggregate cause as direct sub-errors
This is "wrong" because it obscures the placement of those sub-
errors as under a cause... but because the cause itself is
translucent, ca n'a pas exactement l'air d'un mensonge.
Diffstat (limited to 'src/aggregate.js')
-rw-r--r--src/aggregate.js46
1 files changed, 35 insertions, 11 deletions
diff --git a/src/aggregate.js b/src/aggregate.js
index 92c66b73..cb806e89 100644
--- a/src/aggregate.js
+++ b/src/aggregate.js
@@ -440,7 +440,15 @@ export function showAggregate(topError, {
       }
     }
 
-    return determineCauseHelper(cause.cause);
+    if (cause.cause) {
+      return determineCauseHelper(cause.cause);
+    }
+
+    if (cause.errors) {
+      return determineErrorsHelper(cause);
+    }
+
+    return cause;
   };
 
   const determineCause = error =>
@@ -478,7 +486,7 @@ export function showAggregate(topError, {
       : error.errors?.flatMap(determineErrorsHelper) ?? null);
 
   const flattenErrorStructure = (error, level = 0) => {
-    const cause = determineCause(error);
+    const cause = determineCause(error); // may be an array!
     const errors = determineErrors(error);
 
     return {
@@ -493,7 +501,9 @@ export function showAggregate(topError, {
           : error.stack),
 
       cause:
-        (cause
+        (Array.isArray(cause)
+          ? cause.map(cause => flattenErrorStructure(cause, level + 1))
+       : cause
           ? flattenErrorStructure(cause, level + 1)
           : null),
 
@@ -528,15 +538,29 @@ export function showAggregate(topError, {
       unhelpfulTraceLines: ownUnhelpfulTraceLines,
     },
   }, index, apparentSiblings) => {
+    const causeSingle = Array.isArray(cause) ? null : cause;
+    const causeArray = Array.isArray(cause) ? cause : null;
+
     const subApparentSiblings =
-      (cause && errors
-        ? [cause, ...errors]
-     : cause
-        ? [cause]
+      (causeSingle && errors
+        ? [causeSingle, ...errors]
+     : causeSingle
+        ? [causeSingle]
+     : causeArray && errors
+        ? [...causeArray, ...errors]
+     : causeArray
+        ? causeArray
      : errors
         ? errors
         : []);
 
+    const presentedAsErrors =
+      (causeArray && errors
+        ? [...causeArray, ...errors]
+     : causeArray
+        ? causeArray
+        : errors);
+
     const anythingHasErrorsThisLayer =
       apparentSiblings.some(({errors}) => !empty(errors));
 
@@ -584,8 +608,8 @@ export function showAggregate(topError, {
     const bar1 = ' ';
 
     const causePart =
-      (cause
-        ? recursive(cause, 0, subApparentSiblings)
+      (causeSingle
+        ? recursive(causeSingle, 0, subApparentSiblings)
             .split('\n')
             .map((line, i) => i === 0 ? ` ${head1} ${line}` : ` ${bar1} ${line}`)
             .join('\n')
@@ -595,8 +619,8 @@ export function showAggregate(topError, {
     const bar2 = level % 2 === 0 ? '\u2502' : colors.dim('\u254e');
 
     const errorsPart =
-      (errors
-        ? errors
+      (presentedAsErrors
+        ? presentedAsErrors
             .map((error, index) => recursive(error, index + 1, subApparentSiblings))
             .flatMap(str => str.split('\n'))
             .map((line, i) => i === 0 ? ` ${head2} ${line}` : ` ${bar2} ${line}`)