• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1// file dependencies need their dependencies resolved based on the location
2// where the tarball was found, not the location where they end up getting
3// installed.  directory (ie, symlink) deps also need to be resolved based on
4// their targets, but that's what realpath is
5
6const { dirname } = require('path')
7const npa = require('npm-package-arg')
8
9const fromPath = (node, edge) => {
10  if (edge && edge.overrides && edge.overrides.name === edge.name && edge.overrides.value) {
11    // fromPath could be called with a node that has a virtual root, if that
12    // happens we want to make sure we get the real root node when overrides
13    // are in use. this is to allow things like overriding a dependency with a
14    // tarball file that's a relative path from the project root
15    if (node.sourceReference) {
16      return node.sourceReference.root.realpath
17    }
18    return node.root.realpath
19  }
20
21  if (node.resolved) {
22    const spec = npa(node.resolved)
23    if (spec?.type === 'file') {
24      return dirname(spec.fetchSpec)
25    }
26  }
27  return node.realpath
28}
29
30module.exports = fromPath
31