about summary refs log tree commit diff
path: root/nixpkgs/pkgs/development/tools/yarn2nix-moretea/yarn2nix/lib/fixPkgAddMissingSha1.js
diff options
context:
space:
mode:
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.js66
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