2020-10-02 17:52:19 -04:00
const liborg = require ( 'libnpmorg' )
2019-01-29 14:43:00 -08:00
const otplease = require ( './utils/otplease.js' )
const Table = require ( 'cli-table3' )
2021-03-11 17:54:23 -05:00
const BaseCommand = require ( './base-command.js' )
2019-01-29 14:43:00 -08:00
2021-03-11 17:54:23 -05:00
class Org extends BaseCommand {
2021-03-23 14:58:11 -04:00
static get description ( ) {
return 'Manage orgs'
}
2021-03-11 17:54:23 -05:00
/* istanbul ignore next - see test/lib/load-all-commands.js */
static get name ( ) {
return 'org'
2021-03-04 17:40:28 -05:00
}
2020-11-01 07:54:36 +01:00
2021-03-11 17:54:23 -05:00
/* istanbul ignore next - see test/lib/load-all-commands.js */
static get usage ( ) {
return [
'set orgname username [developer | admin | owner]' ,
'rm orgname username' ,
'ls orgname [<username>]' ,
]
2019-01-29 14:43:00 -08:00
}
2021-03-04 17:40:28 -05:00
async completion ( opts ) {
const argv = opts . conf . argv . remain
if ( argv . length === 2 )
return [ 'set' , 'rm' , 'ls' ]
2019-01-29 14:43:00 -08:00
2021-03-04 17:40:28 -05:00
switch ( argv [ 2 ] ) {
case 'ls' :
2019-01-29 14:43:00 -08:00
case 'add' :
case 'rm' :
2021-03-04 17:40:28 -05:00
case 'set' :
return [ ]
2019-01-29 14:43:00 -08:00
default :
2021-03-04 17:40:28 -05:00
throw new Error ( argv [ 2 ] + ' not recognized' )
2019-01-29 14:43:00 -08:00
}
2021-03-04 17:40:28 -05:00
}
2019-01-29 14:43:00 -08:00
2021-03-04 17:40:28 -05:00
exec ( args , cb ) {
this . org ( args )
. then ( x => cb ( null , x ) )
. catch ( err => err . code === 'EUSAGE'
? cb ( err . message )
: cb ( err )
)
}
2019-01-29 14:43:00 -08:00
2021-03-04 17:40:28 -05:00
async org ( [ cmd , orgname , username , role ] , cb ) {
return otplease ( this . npm . flatOptions , opts => {
switch ( cmd ) {
case 'add' :
case 'set' :
return this . set ( orgname , username , role , opts )
case 'rm' :
return this . rm ( orgname , username , opts )
case 'ls' :
return this . ls ( orgname , username , opts )
default :
throw Object . assign ( new Error ( this . usage ) , { code : 'EUSAGE' } )
}
} )
}
2019-01-29 14:43:00 -08:00
2021-03-04 17:40:28 -05:00
set ( org , user , role , opts ) {
role = role || 'developer'
if ( ! org )
throw new Error ( 'First argument `orgname` is required.' )
if ( ! user )
throw new Error ( 'Second argument `username` is required.' )
if ( ! [ 'owner' , 'admin' , 'developer' ] . find ( x => x === role ) )
throw new Error ( 'Third argument `role` must be one of `owner`, `admin`, or `developer`, with `developer` being the default value if omitted.' )
return liborg . set ( org , user , role , opts ) . then ( memDeets => {
if ( opts . json )
2021-03-11 17:54:23 -05:00
this . npm . output ( JSON . stringify ( memDeets , null , 2 ) )
2021-03-04 17:40:28 -05:00
else if ( opts . parseable ) {
2021-03-11 17:54:23 -05:00
this . npm . output ( [ 'org' , 'orgsize' , 'user' , 'role' ] . join ( '\t' ) )
this . npm . output ( [
2021-03-04 17:40:28 -05:00
memDeets . org . name ,
memDeets . org . size ,
memDeets . user ,
memDeets . role ,
] . join ( '\t' ) )
} else if ( ! opts . silent && opts . loglevel !== 'silent' )
2021-03-11 17:54:23 -05:00
this . npm . output ( ` Added ${ memDeets . user } as ${ memDeets . role } to ${ memDeets . org . name } . You now have ${ memDeets . org . size } member ${ memDeets . org . size === 1 ? '' : 's' } in this org. ` )
2021-03-04 17:40:28 -05:00
return memDeets
} )
}
2020-11-01 07:54:36 +01:00
2021-03-04 17:40:28 -05:00
rm ( org , user , opts ) {
if ( ! org )
throw new Error ( 'First argument `orgname` is required.' )
if ( ! user )
throw new Error ( 'Second argument `username` is required.' )
return liborg . rm ( org , user , opts ) . then ( ( ) => {
return liborg . ls ( org , opts )
} ) . then ( roster => {
user = user . replace ( /^[~@]?/ , '' )
org = org . replace ( /^[~@]?/ , '' )
const userCount = Object . keys ( roster ) . length
if ( opts . json ) {
2021-03-11 17:54:23 -05:00
this . npm . output ( JSON . stringify ( {
2021-03-04 17:40:28 -05:00
user ,
org ,
userCount ,
deleted : true ,
} ) )
} else if ( opts . parseable ) {
2021-03-11 17:54:23 -05:00
this . npm . output ( [ 'user' , 'org' , 'userCount' , 'deleted' ] . join ( '\t' ) )
this . npm . output ( [ user , org , userCount , true ] . join ( '\t' ) )
2021-03-04 17:40:28 -05:00
} else if ( ! opts . silent && opts . loglevel !== 'silent' )
2021-03-11 17:54:23 -05:00
this . npm . output ( ` Successfully removed ${ user } from ${ org } . You now have ${ userCount } member ${ userCount === 1 ? '' : 's' } in this org. ` )
2021-03-04 17:40:28 -05:00
} )
}
2020-11-01 07:54:36 +01:00
2021-03-04 17:40:28 -05:00
ls ( org , user , opts ) {
if ( ! org )
throw new Error ( 'First argument `orgname` is required.' )
return liborg . ls ( org , opts ) . then ( roster => {
if ( user ) {
const newRoster = { }
if ( roster [ user ] )
newRoster [ user ] = roster [ user ]
roster = newRoster
}
if ( opts . json )
2021-03-11 17:54:23 -05:00
this . npm . output ( JSON . stringify ( roster , null , 2 ) )
2021-03-04 17:40:28 -05:00
else if ( opts . parseable ) {
2021-03-11 17:54:23 -05:00
this . npm . output ( [ 'user' , 'role' ] . join ( '\t' ) )
2021-03-04 17:40:28 -05:00
Object . keys ( roster ) . forEach ( user => {
2021-03-11 17:54:23 -05:00
this . npm . output ( [ user , roster [ user ] ] . join ( '\t' ) )
2021-03-04 17:40:28 -05:00
} )
} else if ( ! opts . silent && opts . loglevel !== 'silent' ) {
const table = new Table ( { head : [ 'user' , 'role' ] } )
Object . keys ( roster ) . sort ( ) . forEach ( user => {
table . push ( [ user , roster [ user ] ] )
} )
2021-03-11 17:54:23 -05:00
this . npm . output ( table . toString ( ) )
2021-03-04 17:40:28 -05:00
}
} )
}
2019-01-29 14:43:00 -08:00
}
2021-03-04 17:40:28 -05:00
module . exports = Org