forked from serokell/nix-npm-buildpackage
-
Notifications
You must be signed in to change notification settings - Fork 0
/
mkyarnjson.js
41 lines (33 loc) · 1.22 KB
/
mkyarnjson.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
const assert = require("assert")
const fs = require("fs")
const lockfile = require("@yarnpkg/lockfile")
const ssri = require("ssri")
const USAGE = "node mkyarnjson.js yarn.lock integrities.json"
if (process.argv.length != USAGE.split(/\s+/).length) {
console.error("Usage:", USAGE)
process.exit(1)
}
const [yarnLockFile, intFile] = process.argv.slice(2)
const yarnJson = lockfile.parse(fs.readFileSync(yarnLockFile, "utf8")).object
const integrities = JSON.parse(fs.readFileSync(intFile))
function splitNameVsn(key) {
// foo@vsn or @foo/bar@vsn
if (key[0] == "@") {
const [name, vsn] = key.slice(1).split("@")
return ["@"+name, vsn]
} else {
return key.split("@")
}
}
const deps = {}
Object.keys(yarnJson).forEach(key => {
if (key in deps) return
const dep = yarnJson[key]
const [name, vsn] = splitNameVsn(key)
const [url, sha1] = dep.resolved.split("#", 2)
const integrity = dep.integrity || integrities[url] ||
(sha1 && ssri.fromHex(sha1, "sha1").toString())
assert(integrity, "missing integrity for " + JSON.stringify(dep))
deps[key] = { name, resolved: url, integrity }
})
console.log(JSON.stringify(deps, null, 2))