diff options
Diffstat (limited to 'nixpkgs/pkgs/development/tools/yarn2nix-moretea/yarn2nix/lib/fixPkgAddMissingSha1.js')
-rw-r--r-- | nixpkgs/pkgs/development/tools/yarn2nix-moretea/yarn2nix/lib/fixPkgAddMissingSha1.js | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/nixpkgs/pkgs/development/tools/yarn2nix-moretea/yarn2nix/lib/fixPkgAddMissingSha1.js b/nixpkgs/pkgs/development/tools/yarn2nix-moretea/yarn2nix/lib/fixPkgAddMissingSha1.js new file mode 100644 index 000000000000..2826f36e3260 --- /dev/null +++ b/nixpkgs/pkgs/development/tools/yarn2nix-moretea/yarn2nix/lib/fixPkgAddMissingSha1.js @@ -0,0 +1,66 @@ +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 |