Skip to content
Prev Previous commit
Next Next commit
feat: add support for specifying populates.child as a lodash path
  • Loading branch information
javamonn committed May 14, 2017
commit 17386402db5c36ca5d66c530c855b8756a818105
33 changes: 13 additions & 20 deletions src/helpers.js
Original file line number Diff line number Diff line change
Expand Up @@ -293,28 +293,24 @@ export const populatedDataToJS = (data, path, populates, notSetValue) => {
return reduce(
map(populateObjs, (p, obj) => {
// single item with iterable child
if (dataToJS(data, path)[p.child]) {
if (get(dataToJS(data, path), p.child)) {
// populate child is key
if (isString(dataToJS(data, path)[p.child])) {
const key = dataToJS(data, path)[p.child]
if (isString(get(dataToJS(data, path), p.child))) {
const key = get(dataToJS(data, path), p.child)
const pathString = p.childParam
? `${p.root}/${key}/${p.childParam}`
: `${p.root}/${key}`
if (dataToJS(data, pathString)) {
return {
[p.child]: p.keyProp
? { [p.keyProp]: key, ...dataToJS(data, pathString) }
: dataToJS(data, pathString)
}
return set({}, p.child, p.keyProp
? { [p.keyProp]: key, ...dataToJS(data, pathString) }
: dataToJS(data, pathString)
)
}

// matching child does not exist
return dataToJS(data, path)
}

return {
[p.child]: buildChildList(data, dataToJS(data, path)[p.child], p)
}
return set({}, p.child, buildChildList(data, get(dataToJS(data, path), p.child), p))
}
// list with child param in each item
return mapValues(dataToJS(data, path), (child, i) => {
Expand All @@ -329,19 +325,16 @@ export const populatedDataToJS = (data, path, populates, notSetValue) => {
? `${p.root}/${key}/${p.childParam}`
: `${p.root}/${key}`
if (dataToJS(data, pathString)) {
return {
[p.child]: p.keyProp
? { [p.keyProp]: key, ...dataToJS(data, pathString) }
: dataToJS(data, pathString)
}
return set({}, p.child, p.keyProp
? { [p.keyProp]: key, ...dataToJS(data, pathString) }
: dataToJS(data, pathString)
)
}
// matching child does not exist
return child
}
// populate child list
return {
[p.child]: buildChildList(data, child[p.child], p)
}
return set({}, p.child, buildChildList(data, child[p.child], p))
})
}),
// combine data from all populates to one object starting with original data
Expand Down
8 changes: 4 additions & 4 deletions src/utils/populate.js
Original file line number Diff line number Diff line change
Expand Up @@ -119,21 +119,21 @@ export const promisesForPopulate = (firebase, originalData, populatesIn) => {
// Data is single parameter
if (has(originalData, p.child)) {
// Single Parameter is single ID
if (isString(originalData[p.child])) {
if (isString(get(originalData, p.child))) {
return promisesArray.push(
getPopulateChild(firebase, p, originalData[p.child])
getPopulateChild(firebase, p, get(originalData, p.child))
.then((v) => {
// write child to result object under root name if it is found
if (v) {
set(results, `${p.root}.${originalData[p.child]}`, v)
set(results, `${p.root}.${get(originalData, p.child)}`, v)
}
})
)
}

// Single Parameter is list
return promisesArray.push(
populateList(firebase, originalData[p.child], p, results)
populateList(firebase, get(originalData, p.child), p, results)
)
}

Expand Down