Skip to content

Commit

Permalink
feat: added script to update dist-tags
Browse files Browse the repository at this point in the history
PR-URL: npm#736
Credit: @
Close: npm#736
Reviewed-by: @darcy Clarke
  • Loading branch information
Michael Perrotte authored and darcyclarke committed Feb 25, 2020
1 parent 7d0cd65 commit 85c7963
Showing 1 changed file with 123 additions and 0 deletions.
123 changes: 123 additions & 0 deletions scripts/update-dist-tags.js
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)
}
}

0 comments on commit 85c7963

Please sign in to comment.