1const npa = require('npm-package-arg') 2 3// extracted from npm v6 lib/install/realize-shrinkwrap-specifier.js 4const specFromLock = (name, lock, where) => { 5 try { 6 if (lock.version) { 7 const spec = npa.resolve(name, lock.version, where) 8 if (lock.integrity || spec.type === 'git') { 9 return spec 10 } 11 } 12 if (lock.from) { 13 // legacy metadata includes "from", but not integrity 14 const spec = npa.resolve(name, lock.from, where) 15 if (spec.registry && lock.version) { 16 return npa.resolve(name, lock.version, where) 17 } else if (!lock.resolved) { 18 return spec 19 } 20 } 21 if (lock.resolved) { 22 return npa.resolve(name, lock.resolved, where) 23 } 24 } catch { 25 // ignore errors 26 } 27 try { 28 return npa.resolve(name, lock.version, where) 29 } catch { 30 return {} 31 } 32} 33 34module.exports = specFromLock 35