-
Notifications
You must be signed in to change notification settings - Fork 3.2k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat: added script to update dist-tags
- Loading branch information
1 parent
7d0cd65
commit 85c7963
Showing
1 changed file
with
123 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,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) | ||
} | ||
} |