diff options
Diffstat (limited to 'src/data/language.js')
-rw-r--r-- | src/data/language.js | 24 |
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; } |