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 43x 42x 42x 1x 1x 1x 1x 1x 1x 1x 372x 372x 329x 329x 329x 329x 372x 43x 43x 43x 43x 43x 43x 43x 371x 371x 1x 1x 1x 1x 1x 1x 1x 1x 1x 445x 445x 73x 73x 73x 445x 372x 372x 444x 444x 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;