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 || url.startsWith("https://codeload.github.com/")) { 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;