about summary refs log tree commit diff
path: root/pkgs/development/tools/yarn2nix-moretea/yarn2nix/bin/yarn2nix.js
diff options
context:
space:
mode:
Diffstat (limited to 'pkgs/development/tools/yarn2nix-moretea/yarn2nix/bin/yarn2nix.js')
-rwxr-xr-xpkgs/development/tools/yarn2nix-moretea/yarn2nix/bin/yarn2nix.js90
1 files changed, 90 insertions, 0 deletions
diff --git a/pkgs/development/tools/yarn2nix-moretea/yarn2nix/bin/yarn2nix.js b/pkgs/development/tools/yarn2nix-moretea/yarn2nix/bin/yarn2nix.js
new file mode 100755
index 0000000000000..d4f160b124d75
--- /dev/null
+++ b/pkgs/development/tools/yarn2nix-moretea/yarn2nix/bin/yarn2nix.js
@@ -0,0 +1,90 @@
+#!/usr/bin/env node
+
+const fs = require('fs')
+const lockfile = require('@yarnpkg/lockfile')
+const { docopt } = require('docopt')
+const deepEqual = require('deep-equal')
+const R = require('ramda')
+
+const fixPkgAddMissingSha1 = require('../lib/fixPkgAddMissingSha1')
+const mapObjIndexedReturnArray = require('../lib/mapObjIndexedReturnArray')
+const generateNix = require('../lib/generateNix')
+
+const USAGE = `
+Usage: yarn2nix [options]
+
+Options:
+  -h --help           Shows this help.
+  --no-nix            Hide the nix output
+  --no-patch          Don't patch the lockfile if hashes are missing
+  --lockfile=FILE     Specify path to the lockfile [default: ./yarn.lock].
+  --builtin-fetchgit  Use builtin fetchGit for git dependencies to support on-the-fly generation of yarn.nix without an internet connection
+`
+
+const options = docopt(USAGE)
+
+const data = fs.readFileSync(options['--lockfile'], 'utf8')
+
+// json example:
+
+// {
+//   type:'success',
+//   object:{
+//     'abbrev@1':{
+//       version:'1.0.9',
+//       resolved:'https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135'
+//     },
+//     'shell-quote@git+https://github.com/srghma/node-shell-quote.git#without_unlicenced_jsonify':{
+//       version:'1.6.0',
+//       resolved:'git+https://github.com/srghma/node-shell-quote.git#0aa381896e0cd7409ead15fd444f225807a61e0a'
+//     },
+//     '@graphile/plugin-supporter@git+https://1234user:1234pass@git.graphile.com/git/users/1234user/postgraphile-supporter.git':{
+//       version:'1.6.0',
+//       resolved:'git+https://1234user:1234pass@git.graphile.com/git/users/1234user/postgraphile-supporter.git#1234commit'
+//     },
+//   }
+// }
+
+const json = lockfile.parse(data)
+
+if (json.type !== 'success') {
+  throw new Error('yarn.lock parse error')
+}
+
+// Check for missing hashes in the yarn.lock and patch if necessary
+
+const pkgs = R.pipe(
+  mapObjIndexedReturnArray((value, key) => ({
+    ...value,
+    nameWithVersion: key,
+  })),
+  R.uniqBy(R.prop('resolved')),
+)(json.object)
+
+const fixedPkgsPromises = R.map(fixPkgAddMissingSha1, pkgs)
+
+;(async () => {
+  const fixedPkgs = await Promise.all(fixedPkgsPromises)
+
+  const origJson = lockfile.parse(data)
+
+  if (!deepEqual(origJson, json)) {
+    console.error('found changes in the lockfile', options['--lockfile'])
+
+    if (options['--no-patch']) {
+      console.error('...aborting')
+      process.exit(1)
+    }
+
+    fs.writeFileSync(options['--lockfile'], lockfile.stringify(json.object))
+  }
+
+  if (!options['--no-nix']) {
+    // print to stdout
+    console.log(generateNix(fixedPkgs, options['--builtin-fetchgit']))
+  }
+})().catch(error => {
+  console.error(error)
+
+  process.exit(1)
+})