nixpkgs/pkgs/development/tools/yarn2nix-moretea/yarn2nix/lib/fixPkgAddMissingSha1.js
2019-07-25 17:15:00 +02:00

66 lines
1.5 KiB
JavaScript

const https = require('https')
const crypto = require('crypto')
// TODO:
// make test case where getSha1 function is used, i.e. the case when resolved is without sha1?
// consider using https://github.com/request/request-promise-native
function getSha1(url) {
return new Promise((resolve, reject) => {
https.get(url, res => {
const { statusCode } = res
const hash = crypto.createHash('sha1')
if (statusCode !== 200) {
const err = new Error(`Request Failed.\nStatus Code: ${statusCode}`)
// consume response data to free up memory
res.resume()
reject(err)
}
res.on('data', chunk => {
hash.update(chunk)
})
res.on('end', () => {
resolve(hash.digest('hex'))
})
res.on('error', reject)
})
})
}
// Object -> Object
async function fixPkgAddMissingSha1(pkg) {
// local dependency
if (!pkg.resolved) {
console.error(
`yarn2nix: can't find "resolved" field for package ${
pkg.nameWithVersion
}, you probably required it using "file:...", this feature is not supported, ignoring`,
)
return pkg
}
const [url, sha1] = pkg.resolved.split('#', 2)
if (sha1) {
return pkg
}
// if there is no sha1 in resolved url
// (this could happen if yarn.lock was generated by older version of yarn)
// - request it from registry by https and add it to pkg
const newSha1 = await getSha1(url)
return {
...pkg,
resolved: `${url}#${newSha1}`,
}
}
module.exports = fixPkgAddMissingSha1