Welcome to mirror list, hosted at ThFree Co, Russian Federation.

update-dist-tags.js « scripts - github.com/npm/cli.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: f28bfd0b917394f60fba98e5d2b99a85f2a538a7 (plain)
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)
  }
}