about summary refs log tree commit diff
path: root/nixpkgs/pkgs/build-support/node/fetch-yarn-deps/fixup.js
blob: 8b91e7efa63fd284f5db03d01cccd044a22174b5 (plain) (blame)
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#!/usr/bin/env node
'use strict'

const fs = require('fs')
const process = require('process')
const lockfile = require('./yarnpkg-lockfile.js')
const { urlToName } = require('./common.js')

const fixupYarnLock = async (lockContents, verbose) => {
	const lockData = lockfile.parse(lockContents)

	const fixedData = Object.fromEntries(
		Object.entries(lockData.object)
		.map(([dep, pkg]) => {
			const [ url, hash ] = pkg.resolved.split("#", 2)

			if (hash || url.startsWith("https://codeload.github.com")) {
				if (verbose) console.log(`Removing integrity for git dependency ${dep}`)
				delete pkg.integrity
			}

			if (verbose) console.log(`Rewriting URL ${url} for dependency ${dep}`)
			pkg.resolved = urlToName(url)

			return [dep, pkg]
		})
	)

	if (verbose) console.log('Done')

	return fixedData
}

const showUsage = async () => {
	process.stderr.write(`
syntax: fixup-yarn-lock [path to yarn.lock] [options]

Options:
  -h --help         Show this help
  -v --verbose      Verbose output
`)
	process.exit(1)
}

const main = async () => {
	const args = process.argv.slice(2)
	let next, lockFile, verbose
	while (next = args.shift()) {
		if (next == '--verbose' || next == '-v') {
			verbose = true
		} else if (next == '--help' || next == '-h') {
			showUsage()
		} else if (!lockFile) {
			lockFile = next
		} else {
			showUsage()
		}
	}
	let lockContents
	try {
		lockContents = await fs.promises.readFile(lockFile || 'yarn.lock', 'utf-8')
	} catch {
		showUsage()
	}

	const fixedData = await fixupYarnLock(lockContents, verbose)
	await fs.promises.writeFile(lockFile || 'yarn.lock', lockfile.stringify(fixedData))
}

main()
	.catch(e => {
		console.error(e)
		process.exit(1)
	})