« get me outta code hell

hsmusic-wiki - HSMusic - static wiki software cataloguing collaborative creation
about summary refs log tree commit diff
path: root/src/data/language.js
diff options
context:
space:
mode:
Diffstat (limited to 'src/data/language.js')
-rw-r--r--src/data/language.js24
1 files changed, 17 insertions, 7 deletions
diff --git a/src/data/language.js b/src/data/language.js
index a149e19f..3edf7e51 100644
--- a/src/data/language.js
+++ b/src/data/language.js
@@ -11,7 +11,7 @@ import {annotateError, annotateErrorWithFile, showAggregate, withAggregate}
   from '#aggregate';
 import {externalLinkSpec} from '#external-links';
 import {colors, logWarn} from '#cli';
-import {splitKeys, withEntries} from '#sugar';
+import {empty, splitKeys, withEntries} from '#sugar';
 import T from '#things';
 
 const {Language} = T;
@@ -72,7 +72,11 @@ export function unflattenLanguageSpec(flat, reference) {
   const setNestedProp = (obj, key, value) => {
     const recursive = (o, k) => {
       if (k.length === 1) {
-        o[k[0]] = value;
+        if (typeof o[k[0]] === 'object') {
+          o[k[0]] = {...o[k[0]], _: value};
+        } else {
+          o[k[0]] = value;
+        }
         return;
       }
 
@@ -97,7 +101,7 @@ export function unflattenLanguageSpec(flat, reference) {
       }
 
       const result =
-        (refKeys.length === 1
+        (empty(restKeys)
           ? walkEntry(ownNode[firstKey], refNode)
           : recursive(restKeys, ownNode[firstKey], refNode));
 
@@ -106,7 +110,13 @@ export function unflattenLanguageSpec(flat, reference) {
       }
 
       if (typeof result === 'string') {
-        delete ownNode[firstKey];
+        // When an algorithm faces a corner case, don't rethink the algorithm;
+        // hard-code the right thing to do.
+        if (typeof ownNode[firstKey] === 'object' && empty(restKeys) && ownNode[firstKey]._) {
+          delete ownNode[firstKey]._;
+        } else {
+          delete ownNode[firstKey];
+        }
         return {[firstKey]: result};
       }
 
@@ -121,7 +131,7 @@ export function unflattenLanguageSpec(flat, reference) {
     let mapped;
 
     for (const [key, value] of Object.entries(refNode)) {
-      const result = recursive(splitKeys(key), ownNode, refNode[key]);
+      const result = recursive(splitKeys(key), ownNode, value);
       if (!result) continue;
       if (!mapped) mapped = {};
       Object.assign(mapped, result);
@@ -143,7 +153,7 @@ export function unflattenLanguageSpec(flat, reference) {
       typeof refNode === 'object' &&
       typeof refNode._ === 'string'
     ) {
-      return {_: ownNode};
+      return ownNode;
     }
 
     if (
@@ -170,7 +180,7 @@ export function unflattenLanguageSpec(flat, reference) {
     }
 
     const entries = Object.entries(node);
-    if (entries.length === 0) {
+    if (empty(entries)) {
       return undefined;
     }