UNPKG

@lunaticmuch/front-matter-manipulator

Version:

A utility for parsing and manipulating documents with Front Matter

71 lines (58 loc) 2.12 kB
import isMissing from './isMissing.js'; import parseField from './parseField.js'; export default function getFieldPermutations(field, data) { var permutations = getFieldFromKey(field, data); if (!Array.isArray(permutations)) permutations = [permutations]; return permutations.filter(function (p) { return !isMissing(p); }); } function getFieldFromKey(field, data, target) { if (isMissing(field)) throw new Error('Missing value for "field"'); if (!data) throw new Error('Missing value for "data"'); var { currentField, subFields, fieldValue } = parseField(field, data); if (isMissing(target)) { target = currentField; } else { target += `.${currentField}`; } if (subFields.length >= 1 && Array.isArray(fieldValue)) { return getFieldFromArray(subFields, fieldValue, target); } else if (subFields.length >= 1 && !isMissing(fieldValue)) { return getFieldFromKey(subFields, fieldValue, target); } else if (Array.isArray(fieldValue)) { return getFieldFromArray(subFields, fieldValue, target); } else { return target; } } function getFieldFromArray(field, data, target) { if (isMissing(field)) throw new Error('Missing value for "field"'); if (!data) throw new Error('Missing value for "data"'); if (data.length > 0) { return data.map(function (item, i) { var newTarget = target; var { totalSubFields, currentField, subFields, fieldValue } = parseField(field, item); if (currentField) { newTarget += `.${i}.${currentField}`; } else { newTarget += `.${i}`; } if (Array.isArray(fieldValue)) { return getFieldFromArray(subFields, fieldValue, newTarget); } else if (totalSubFields.length >= 1) { return getFieldFromKey(subFields, fieldValue, newTarget); } else { return newTarget; } }); } }