mirror of
https://github.com/shimataro/ssh-key-action.git
synced 2025-06-19 22:52:10 +10:00
81 lines
2.5 KiB
JavaScript
81 lines
2.5 KiB
JavaScript
'use strict'
|
|
|
|
const fetch = require('npm-registry-fetch')
|
|
const fetchPackument = require('./packument')
|
|
const optCheck = require('../../util/opt-check')
|
|
const pickManifest = require('npm-pick-manifest')
|
|
const ssri = require('ssri')
|
|
|
|
module.exports = manifest
|
|
function manifest (spec, opts) {
|
|
opts = optCheck(opts)
|
|
|
|
return getManifest(spec, opts).then(manifest => {
|
|
return annotateManifest(spec, manifest, opts)
|
|
})
|
|
}
|
|
|
|
function getManifest (spec, opts) {
|
|
opts = opts.concat({
|
|
fullMetadata: opts.enjoyBy ? true : opts.fullMetadata
|
|
})
|
|
return fetchPackument(spec, opts).then(packument => {
|
|
try {
|
|
return pickManifest(packument, spec.fetchSpec, {
|
|
defaultTag: opts.defaultTag,
|
|
enjoyBy: opts.enjoyBy,
|
|
includeDeprecated: opts.includeDeprecated
|
|
})
|
|
} catch (err) {
|
|
if ((err.code === 'ETARGET' || err.code === 'E403') && packument._cached && !opts.offline) {
|
|
opts.log.silly(
|
|
'registry:manifest',
|
|
`no matching version for ${spec.name}@${spec.fetchSpec} in the cache. Forcing revalidation.`
|
|
)
|
|
opts = opts.concat({
|
|
preferOffline: false,
|
|
preferOnline: true
|
|
})
|
|
return fetchPackument(spec, opts.concat({
|
|
// Fetch full metadata in case ETARGET was due to corgi delay
|
|
fullMetadata: true
|
|
})).then(packument => {
|
|
return pickManifest(packument, spec.fetchSpec, {
|
|
defaultTag: opts.defaultTag,
|
|
enjoyBy: opts.enjoyBy
|
|
})
|
|
})
|
|
} else {
|
|
throw err
|
|
}
|
|
}
|
|
})
|
|
}
|
|
|
|
function annotateManifest (spec, manifest, opts) {
|
|
const shasum = manifest.dist && manifest.dist.shasum
|
|
manifest._integrity = manifest.dist && manifest.dist.integrity
|
|
manifest._shasum = shasum
|
|
if (!manifest._integrity && shasum) {
|
|
// Use legacy dist.shasum field if available.
|
|
manifest._integrity = ssri.fromHex(shasum, 'sha1').toString()
|
|
}
|
|
manifest._resolved = (
|
|
manifest.dist && manifest.dist.tarball
|
|
)
|
|
if (!manifest._resolved) {
|
|
const registry = fetch.pickRegistry(spec, opts)
|
|
const uri = registry.replace(/\/?$/, '/') + spec.escapedName
|
|
|
|
const err = new Error(
|
|
`Manifest for ${manifest.name}@${manifest.version} from ${uri} is missing a tarball url (pkg.dist.tarball). Guessing a default.`
|
|
)
|
|
err.code = 'ENOTARBALL'
|
|
err.manifest = manifest
|
|
if (!manifest._warnings) { manifest._warnings = [] }
|
|
manifest._warnings.push(err.message)
|
|
manifest._resolved =
|
|
`${registry}/${manifest.name}/-/${manifest.name}-${manifest.version}.tgz`
|
|
}
|
|
return manifest
|
|
}
|