From 42126db1b128096f2dd73cf0d19f423ca73125c2 Mon Sep 17 00:00:00 2001 From: ehmicky Date: Sun, 13 Mar 2022 11:47:00 +0100 Subject: [PATCH] Add `childFirst` --- .../normalize/lib/wild_wild_path/iterate.js | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/src/config/normalize/lib/wild_wild_path/iterate.js b/src/config/normalize/lib/wild_wild_path/iterate.js index 01bb9c16f..526dd1b7a 100644 --- a/src/config/normalize/lib/wild_wild_path/iterate.js +++ b/src/config/normalize/lib/wild_wild_path/iterate.js @@ -7,7 +7,11 @@ import { getObjectTokenType } from './tokens/main.js' // List all values (and their associated path) matching a specific query for // on specific target value. -export const iterate = function (target, queryOrPaths) { +export const iterate = function ( + target, + queryOrPaths, + { childFirst = false } = {}, +) { const paths = parse(queryOrPaths) const entries = paths.map((path) => ({ path, @@ -15,12 +19,12 @@ export const iterate = function (target, queryOrPaths) { props: [], missing: false, })) - const entriesA = iterateLevel(entries, 0) + const entriesA = iterateLevel(entries, childFirst, 0) const entriesB = entriesA.map(normalizeEntry) return entriesB } -const iterateLevel = function (entries, index) { +const iterateLevel = function (entries, childFirst, index) { const entriesA = removeDuplicates(entries) const parentEntries = entriesA.filter(({ path }) => path.length === index) @@ -39,11 +43,14 @@ const iterateLevel = function (entries, index) { const nextIndex = index + 1 const childEntries = levelEntries.length === 1 - ? iterateLevel(levelEntries, nextIndex) + ? iterateLevel(levelEntries, childFirst, nextIndex) : Object.values(groupBy(levelEntries, getLastProp)).flatMap( - (groupedLevelEntries) => iterateLevel(groupedLevelEntries, nextIndex), + (groupedLevelEntries) => + iterateLevel(groupedLevelEntries, childFirst, nextIndex), ) - return [...childEntries, ...parentEntries] + return childFirst + ? [...childEntries, ...parentEntries] + : [...parentEntries, ...childEntries] } const removeDuplicates = function (entries) {