All files index.js

100% Statements 33/33
88.89% Branches 16/18
100% Functions 4/4
100% Lines 33/33

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 55 56 57 58 59 60 61    2x 2x   2x   4x 4x 4x           4x   7x 7x 7x 5x 5x 5x   7x   3x     2x     11x 11x 11x 11x         11x 11x 11x 9x 9x 9x 5x 5x 1x   4x     4x 4x   4x        
'use strict'
 
const logicalTree = require('npm-logical-tree')
const makeNode = logicalTree.node
 
module.exports = yarnLogicalTree
function yarnLogicalTree (pkg, yarnLock, opts) {
  const tree = makeNode(pkg.name, null, pkg)
  const allDeps = new Map()
  const pkgDeps = Object.assign(
    {},
    pkg.devDependencies || {},
    pkg.optionalDependencies || {},
    pkg.dependencies || {}
  )
  Object.keys(pkgDeps)
    .forEach(name => {
      const semverString = pkgDeps[name]
      let dep = allDeps.get(`${name}@${semverString}`)
      if (!dep) {
        const semverString = pkgDeps[name]
        const depNode = yarnLock[`${name}@${semverString}`]
        dep = {node: makeNode(name, name, depNode), semverString}
      }
      addChild(dep, {node: tree}, allDeps, yarnLock)
    })
  return tree
}
 
module.exports.node = makeNode
 
function addChild (dep, treeNode, allDeps, yarnLock) {
  const tree = treeNode.node
  const { node, semverString } = dep
  const lockNode = yarnLock[`${node.name}@${semverString}`]
  const dependencies = Object.assign(
    {},
    lockNode.optionalDependencies || {},
    lockNode.dependencies || {}
  )
  tree.addDep(node)
  allDeps.set(`${node.name}@${semverString}`, dep)
  Object.keys(dependencies).forEach(name => {
    const tdepSemver = dependencies[name]
    let tdep = allDeps.get(`${name}@${tdepSemver}`)
    if (!tdep) {
      const tdepNode = yarnLock[`${name}@${tdepSemver}`]
      if (!tdepNode) {
        throw new Error(`${name} not accessible from ${node.name}`)
      }
      tdepNode.optional = lockNode.optionalDependencies
        ? lockNode.optionalDependencies[name]
        : false
      tdep = {node: makeNode(name, name, tdepNode), semverString: tdepSemver}
      addChild(tdep, dep, allDeps, yarnLock)
    } else {
      node.addDep(tdep.node)
    }
  })
}