All files / latest/src/helpers/query/src getAbsolutePath.js

100% Statements 54/54
100% Branches 12/12
100% Functions 3/3
100% Lines 54/54

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 551x 1x 1x 1x 1x 1x 1x 25x 24x 24x 1x 1x 1x 1x 1x 1x 1x 272x 272x 247x 247x 247x 247x 272x 25x 25x 25x 25x 25x 25x 25x 271x 271x 1x 1x 1x 1x 1x 1x 1x 1x 1x 319x 319x 47x 47x 47x 319x 272x 272x 318x 318x 1x 1x  
const pathTransformer = require('../../pathTransformer');
 
/**
 * Get index of relativeDepth and check whether it is valid
 * (non-existing index <0 is considered invalid)
 */
const getRelativeIndex = (index, relativeDepth) => {
  if (index + relativeDepth >= 0 && relativeDepth <= 0) {
    return index + relativeDepth;
  }
  throw new Error(`Relative depth (${index}+${relativeDepth}) of query is invalid.`);
};
 
/**
 * Create element with relativePath and relativeOrigin
 */
const setNewElementFromRelativePath = (priorPath, element) => {
  let newElement = element;
  if (newElement.relativeDepth === 0) {
    newElement = {
      relativePath: pathTransformer(newElement.relativePath),
      relativeOrigin: priorPath,
    };
  } else {
    const relativeIndex = getRelativeIndex(
      priorPath.length, newElement.relativeDepth,
    );
    newElement = {
      path: [...priorPath.slice(0, relativeIndex), ...pathTransformer(newElement.relativePath)],
    };
  }
  return newElement;
};
 
/**
 * Retreive full path from priorPath and provided element (following path)
 * @param {Array} priorPath - priorPath up to origin of tempObject
 * @param {Object} element - element containing absolute or relative
 * (starting from origin of tempObject) path
 * @returns {Array} - full path from origin of object
 */
const getAbsolutePath = (priorPath, element) => {
  let newElement = element;
  if (newElement.absolutePath) {
    newElement = {
      path: pathTransformer(newElement.absolutePath),
    };
  } else if (newElement.relativePath) {
    newElement = setNewElementFromRelativePath(priorPath, element);
  }
  return newElement;
};
 
module.exports = getAbsolutePath;