-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.js
111 lines (87 loc) · 2.8 KB
/
index.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
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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
#!/usr/bin/env node
const argv = require("minimist")(process.argv.slice(2), { boolean: true});
const path = require("path");
const chalk = require("chalk");
const fs = require("fs");
function readPackageJSON(p)
{
return JSON.parse(
fs.readFileSync(p, "UTF-8")
);
}
const files = argv._;
const update = !!argv.update;
if (argv.help)
{
usage();
process.exit(0);
}
function usage()
{
console.log(`
Usage: pkg-version ${chalk.dim("<src>")} ${chalk.dim("<dst>")} [ ${chalk.dim("<dst2>")} ... ] [--update]
Compares package versions from of one package.json with the versions in multiple other versions. If --update is given, copy
newer versions of the packages in the first package.json to the others.
`);
}
if (files.length < 2)
{
usage();
console.log(chalk.red("\nERROR: Need package.json files\n"));
process.exit(1);
}
const src = readPackageJSON(files[0]);
for (let i = 1 ; i < files.length; i++)
{
const dst = readPackageJSON(files[i]);
console.log(
chalk.bold(`
${files[0]} vs ${files[i]}:
`));
const longest = Object.keys(src.dependencies).concat(Object.keys(src.devDependencies)).map(n => n.length).reduce((a,b) => Math.max(a,b), 0);
const cmp = (srcName, deps, dstName, pkgJSON) =>
{
let changed = false;
for (let name in deps)
{
if (deps.hasOwnProperty(name))
{
const version = deps[name];
if (pkgJSON.dependencies[name] && pkgJSON.dependencies[name] !== version)
{
console.log(`${chalk.green(name.padStart(longest, " "))} : ${version} ${chalk.dim("!==")} ${pkgJSON.dependencies[name]}`);
if (update)
{
pkgJSON.dependencies[name] = version;
changed = true;
}
}
else if (pkgJSON.devDependencies[name] && pkgJSON.devDependencies[name] !== version)
{
console.log(`${chalk.green(name.padStart(longest, " "))} : ${version} ${chalk.dim("!==")} ${pkgJSON.devDependencies[name]}`);
if (update)
{
pkgJSON.devDependencies[name] = version;
changed = true;
}
}
}
}
return changed;
};
const changedDeps = cmp(files[0], src.dependencies, files[i], dst);
const changedDevDeps = cmp(files[0], src.devDependencies, files[i], dst);
if (update && (changedDeps || changedDevDeps))
{
fs.writeFileSync(
files[i],
JSON.stringify(
dst,
null,
4
),
"UTF-8"
);
}
cmp(files[0], src.devDependencies, files[i], dst);
}