// adapted from https://github.com/gatsbyjs/gatsby/blob/master/packages/gatsby-source-graphql/src/batching/merge-queries.js export function createPrefix(index) { return `_${index}_`; } function matchKey(prefixedKey) { const match = /^_(\d+)_(.*)$/.exec(prefixedKey); if (match && match.length === 3 && !isNaN(Number(match[1])) && match[2]) { return { index: Number(match[1]), originalKey: match[2] }; } return null; } export function parseKey(prefixedKey) { const match = matchKey(prefixedKey); if (!match) { throw new Error(`Key ${prefixedKey} is not correctly prefixed`); } return match; } export function parseKeyFromPath(path) { let keyOffset = 0; let match = null; // Keep looping over path until we've found a match or path has no more items left for (; !match && keyOffset < path.length; keyOffset++) { const pathKey = path[keyOffset]; if (typeof pathKey === 'string') { match = matchKey(pathKey); } } if (!match) { throw new Error(`Path ${path.join('.')} does not contain correctly prefixed key`); } return { ...match, keyOffset, }; }