mirror of
https://github.com/nodejs/node.git
synced 2025-05-21 17:44:15 +00:00

PR-URL: https://github.com/nodejs/node/pull/37018 Reviewed-By: Myles Borins <myles.borins@gmail.com> Reviewed-By: Beth Griggs <bgriggs@redhat.com> Reviewed-By: Juan José Arboleda <soyjuanarbol@gmail.com>
39 lines
1.3 KiB
JavaScript
39 lines
1.3 KiB
JavaScript
// take a path and a resolved value, and turn it into a resolution from
|
|
// the given new path. This is used with converting a package.json's
|
|
// relative file: path into one suitable for a lockfile, or between
|
|
// lockfiles, and for converting hosted git repos to a consistent url type.
|
|
const npa = require('npm-package-arg')
|
|
const relpath = require('./relpath.js')
|
|
const consistentResolve = (resolved, fromPath, toPath, relPaths = false) => {
|
|
if (!resolved)
|
|
return null
|
|
|
|
try {
|
|
const hostedOpt = { noCommittish: false }
|
|
const {
|
|
fetchSpec,
|
|
saveSpec,
|
|
type,
|
|
hosted,
|
|
rawSpec,
|
|
raw,
|
|
} = npa(resolved, fromPath)
|
|
const isPath = type === 'file' || type === 'directory'
|
|
return isPath && !relPaths ? `file:${fetchSpec}`
|
|
: isPath ? 'file:' + (toPath ? relpath(toPath, fetchSpec) : fetchSpec)
|
|
: hosted ? `git+${
|
|
hosted.auth ? hosted.https(hostedOpt) : hosted.sshurl(hostedOpt)
|
|
}`
|
|
: type === 'git' ? saveSpec
|
|
// always return something. 'foo' is interpreted as 'foo@' otherwise.
|
|
: rawSpec === '' && raw.slice(-1) !== '@' ? raw
|
|
// just strip off the name, but otherwise return as-is
|
|
: rawSpec
|
|
} catch (_) {
|
|
// whatever we passed in was not acceptable to npa.
|
|
// leave it 100% untouched.
|
|
return resolved
|
|
}
|
|
}
|
|
module.exports = consistentResolve
|