-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathupdate-dist-tags.js
123 lines (109 loc) · 3.46 KB
/
update-dist-tags.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
113
114
115
116
117
118
119
120
121
122
123
'use strict'
/**
* Usage:
*
* node scripts/update-dist-tags.js --otp <one-time password>
* node scripts/update-dist-tags.js --otp=<one-time password>
* node scripts/update-dist-tags.js --otp<one-time password>
*/
const usage = `
Usage:
node scripts/update-dist-tags.js --otp <one-time password>
node scripts/update-dist-tags.js --otp=<one-time password>
node scripts/update-dist-tags.js --otp<one-time password>
`
const { execSync } = require('child_process')
const semver = require('semver')
const path = require('path')
const getMajorVersion = (input) => semver.parse(input).major
const getMinorVersion = (input) => semver.parse(input).minor
// INFO: String templates to generate the tags to update
const LATEST_TAG = (strings, major) => `latest-${major}`
const NEXT_TAG = (strings, major) => `next-${major}`
const TAG_LIST = ['lts', 'next', 'latest']
const REMOVE_TAG = (strings, major, minor) => `v${major}.${minor}-next`
// INFO: Finds `--otp` and subsequently otp value (if present)
const PARSE_OTP_FLAG = new RegExp(/(--otp)(=|\s)?([0-9]{6})?/, 'gm')
// INFO: Used to validate otp value (if not found by other regexp)
const PARSE_OTP_VALUE = new RegExp(/^[0-9]{6}$/, 'g')
const args = process.argv.slice(2)
const versionPath = path.resolve(__dirname, '..', 'package.json')
const { version } = require(versionPath)
// Run Script
main()
function main () {
const otp = parseOTP(args)
if (version) {
const major = getMajorVersion(version)
const minor = getMinorVersion(version)
const latestTag = LATEST_TAG`${major}`
const nextTag = NEXT_TAG`${major}`
const removeTag = REMOVE_TAG`${major}${minor}`
const updateList = [].concat(TAG_LIST, latestTag, nextTag)
updateList.forEach((tag) => {
setDistTag(tag, version, otp)
})
removeDistTag(removeTag, version, otp)
} else {
console.error('Invalid semver.')
process.exit(1)
}
}
function parseOTP (args) {
// NOTE: making assumption first _thing_ is a string with "--otp" in it
const parsedArgs = PARSE_OTP_FLAG.exec(args[0])
if (!parsedArgs) {
console.error('Invalid arguments supplied. Must supply --otp flag.')
console.error(usage)
process.exit(1)
}
// INFO: From the regexp, third group is the OTP code
const otp = parsedArgs[3]
switch (args.length) {
case 0: {
console.error('No arguments supplied.')
console.error(usage)
process.exit(1)
}
case 1: {
// --otp=123456 or --otp123456
if (otp) {
return otp
}
console.error('Invalid otp value supplied. [CASE 1]')
process.exit(1)
}
case 2: {
// --otp 123456
// INFO: validating the second argument is an otp code
const isValidOtp = PARSE_OTP_VALUE.test(args[1])
if (isValidOtp) {
return args[1]
}
console.error('Invalid otp value supplied. [CASE 2]')
process.exit(1)
}
default: {
console.error('Invalid arguments supplied.')
process.exit(1)
}
}
}
function setDistTag (tag, version, otp) {
try {
const result = execSync(`npm dist-tag set npm@${version} ${tag} --otp=${otp}`, { encoding: 'utf-8' })
console.log('Result:', result)
} catch (err) {
console.error('Bad dist-tag command.')
process.exit(1)
}
}
function removeDistTag (tag, version, otp) {
try {
const result = execSync(`npm dist-tag rm npm ${tag} --otp=${otp}`, { encoding: 'utf-8' })
console.log('Result:', result)
} catch (err) {
console.error('Bad dist-tag command.')
process.exit(1)
}
}