/
publish.js
112 lines (94 loc) · 3.32 KB
/
publish.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
112
'use strict';
const fs = require('fs');
const { spawn } = require("child_process");
var argv = process.argv.slice(2);
var argc = argv.length;
var log = fs.createWriteStream("publish.log");
var err = log;
var clog = console.log;
console.log = function(x) {
clog(x);
log.write(x+"\n");
}
function runCmd(cmd, args){
log.write(new Date().toISOString() +" Running command: "+ cmd + " "+ args.join(" ") +"\n");
var prc = spawn(cmd, args);
var out = '';
return new Promise((res, rej) => {
prc.stdout.on('data', (x) => {
out += x.toString();
log.write(x.toString());
});
prc.stderr.on('data', (x) => {
err.write(x.toString());
});
prc.on('error', (e) => {
err.write(e.toString());
console.error("[Publish] Error! Check logs")
rej(err.message);
});
prc.on('exit', (c) => {
if (c > 0) {
err.write(`[Publish] Process exited with code ${c}\n`)
rej(c);
} else {
log.write(`[Publish] Process exited with code ${c}\n`)
res(out);
}
});
});
}
async function checkArguments(argc, argv) {
var increment = false;
var message = undefined;
for(var i = 0; i < argc; i++) {
if (argv[i] == "-i" || argv[i] == "--increment-version")
increment = true;
if ((argv[i] == "-m" || argv[i] == "--message") && argc > i + 1)
message = argv[++i].replace("\\n", "\n");
}
if (increment){
await incrementVersion(message);
}
}
async function incrementVersion(message){
var rawdata = fs.readFileSync('package.json');
var packJson = JSON.parse(rawdata);
var match = /([0-9]+).([0-9]+).([0-9]+)/g.exec(packJson.version);
var maj = match[1];
var min = match[2];
var rev = Number(match[3]);
packJson.version = `${maj}.${min}.${++rev}`;
fs.writeFileSync('package.json', JSON.stringify(packJson, null, 2));
console.log("[Publish] package.json updated, new version: " + packJson.version);
await runCmd("git", ["add", "package.json"]);
var status = await runCmd("git", ["status", "-s"]);
var changes = status.split(/\n/).map(l => l.trimEnd()).filter(l => l!= "");
if (changes.every(l => l.charAt(0) != ' ')) {
var msgLines = message == undefined ? [] : [message];
msgLines.push(`version bump to ${packJson.version}`);
await runCmd("git", ["commit", "-m", msgLines.join('\n')]);
console.log("[Publish] committed")
await runCmd("git", ["push"]);
console.log("[Publish] pushed");
} else {
console.log("[Publish] Unstaged changes present, skipping commit & push");
}
}
async function publish() {
var status = await runCmd("git", ["status", "-s"]);
var changes = status.split(/\n/).map(l => l.trimEnd()).filter(l => l!= "");
if (changes.every(l => l == "")){
console.log("[Publish] No changes, starting publish");
await runCmd(/^win/i.test(process.platform) ? 'npm.cmd' : 'npm', ["publish", "--access", "public"]);
console.log("[Publish] Package published");
}
else {
console.error("[Publish] Changes present, skipping publish");
}
}
async function main() {
await checkArguments(argc, argv);
await publish();
}
main();