org.js 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. const liborg = require('libnpmorg')
  2. const { otplease } = require('../utils/auth.js')
  3. const BaseCommand = require('../base-cmd.js')
  4. const { output } = require('proc-log')
  5. class Org extends BaseCommand {
  6. static description = 'Manage orgs'
  7. static name = 'org'
  8. static usage = [
  9. 'set orgname username [developer | admin | owner]',
  10. 'rm orgname username',
  11. 'ls orgname [<username>]',
  12. ]
  13. static params = ['registry', 'otp', 'json', 'parseable']
  14. static async completion (opts) {
  15. const argv = opts.conf.argv.remain
  16. if (argv.length === 2) {
  17. return ['set', 'rm', 'ls']
  18. }
  19. switch (argv[2]) {
  20. case 'ls':
  21. case 'add':
  22. case 'rm':
  23. case 'set':
  24. return []
  25. default:
  26. throw new Error(argv[2] + ' not recognized')
  27. }
  28. }
  29. async exec ([cmd, orgname, username, role]) {
  30. return otplease(this.npm, {
  31. ...this.npm.flatOptions,
  32. }, opts => {
  33. switch (cmd) {
  34. case 'add':
  35. case 'set':
  36. return this.set(orgname, username, role, opts)
  37. case 'rm':
  38. return this.rm(orgname, username, opts)
  39. case 'ls':
  40. return this.ls(orgname, username, opts)
  41. default:
  42. throw this.usageError()
  43. }
  44. })
  45. }
  46. async set (org, user, role, opts) {
  47. role = role || 'developer'
  48. if (!org) {
  49. throw new Error('First argument `orgname` is required.')
  50. }
  51. if (!user) {
  52. throw new Error('Second argument `username` is required.')
  53. }
  54. if (!['owner', 'admin', 'developer'].find(x => x === role)) {
  55. throw new Error(
  56. 'Third argument `role` must be one of `owner`, `admin`, or `developer`, with `developer` being the default value if omitted.'
  57. )
  58. }
  59. const memDeets = await liborg.set(org, user, role, opts)
  60. if (opts.json) {
  61. output.standard(JSON.stringify(memDeets, null, 2))
  62. } else if (opts.parseable) {
  63. output.standard(['org', 'orgsize', 'user', 'role'].join('\t'))
  64. output.standard(
  65. [memDeets.org.name, memDeets.org.size, memDeets.user, memDeets.role].join('\t')
  66. )
  67. } else if (!this.npm.silent) {
  68. output.standard(
  69. `Added ${memDeets.user} as ${memDeets.role} to ${memDeets.org.name}. You now have ${
  70. memDeets.org.size
  71. } member${memDeets.org.size === 1 ? '' : 's'} in this org.`
  72. )
  73. }
  74. return memDeets
  75. }
  76. async rm (org, user, opts) {
  77. if (!org) {
  78. throw new Error('First argument `orgname` is required.')
  79. }
  80. if (!user) {
  81. throw new Error('Second argument `username` is required.')
  82. }
  83. await liborg.rm(org, user, opts)
  84. const roster = await liborg.ls(org, opts)
  85. user = user.replace(/^[~@]?/, '')
  86. org = org.replace(/^[~@]?/, '')
  87. const userCount = Object.keys(roster).length
  88. if (opts.json) {
  89. output.buffer({
  90. user,
  91. org,
  92. userCount,
  93. deleted: true,
  94. })
  95. } else if (opts.parseable) {
  96. output.standard(['user', 'org', 'userCount', 'deleted'].join('\t'))
  97. output.standard([user, org, userCount, true].join('\t'))
  98. } else if (!this.npm.silent) {
  99. output.standard(
  100. `Successfully removed ${user} from ${org}. You now have ${userCount} member${userCount === 1 ? '' : 's'} in this org.`
  101. )
  102. }
  103. }
  104. async ls (org, user, opts) {
  105. if (!org) {
  106. throw new Error('First argument `orgname` is required.')
  107. }
  108. let roster = await liborg.ls(org, opts)
  109. if (user) {
  110. const newRoster = {}
  111. if (roster[user]) {
  112. newRoster[user] = roster[user]
  113. }
  114. roster = newRoster
  115. }
  116. if (opts.json) {
  117. output.buffer(roster)
  118. } else if (opts.parseable) {
  119. output.standard(['user', 'role'].join('\t'))
  120. Object.keys(roster).forEach(u => {
  121. output.standard([u, roster[u]].join('\t'))
  122. })
  123. } else if (!this.npm.silent) {
  124. const chalk = this.npm.chalk
  125. for (const u of Object.keys(roster).sort()) {
  126. output.standard(`${u} - ${chalk.cyan(roster[u])}`)
  127. }
  128. }
  129. }
  130. }
  131. module.exports = Org