1'use strict' 2 3const eu = encodeURIComponent 4const fetch = require('npm-registry-fetch') 5const validate = require('aproba') 6 7// From https://github.com/npm/registry/blob/master/docs/orgs/memberships.md 8const cmd = module.exports 9 10class MembershipDetail {} 11cmd.set = (org, user, role, opts = {}) => { 12 if ( 13 typeof role === 'object' && 14 Object.keys(opts).length === 0 15 ) { 16 opts = role 17 role = undefined 18 } 19 validate('SSSO|SSZO', [org, user, role, opts]) 20 user = user.replace(/^@?/, '') 21 org = org.replace(/^@?/, '') 22 return fetch.json(`/-/org/${eu(org)}/user`, { 23 ...opts, 24 method: 'PUT', 25 body: { user, role }, 26 }).then(ret => Object.assign(new MembershipDetail(), ret)) 27} 28 29cmd.rm = (org, user, opts = {}) => { 30 validate('SSO', [org, user, opts]) 31 user = user.replace(/^@?/, '') 32 org = org.replace(/^@?/, '') 33 return fetch(`/-/org/${eu(org)}/user`, { 34 ...opts, 35 method: 'DELETE', 36 body: { user }, 37 ignoreBody: true, 38 }).then(() => null) 39} 40 41class Roster {} 42cmd.ls = (org, opts = {}) => { 43 return cmd.ls.stream(org, opts) 44 .collect() 45 .then(data => data.reduce((acc, [key, val]) => { 46 if (!acc) { 47 acc = {} 48 } 49 acc[key] = val 50 return acc 51 }, null)) 52 .then(ret => Object.assign(new Roster(), ret)) 53} 54 55cmd.ls.stream = (org, opts = {}) => { 56 validate('SO', [org, opts]) 57 org = org.replace(/^@?/, '') 58 return fetch.json.stream(`/-/org/${eu(org)}/user`, '*', { 59 ...opts, 60 mapJSON: (value, [key]) => { 61 return [key, value] 62 }, 63 }) 64} 65