1 |
|
2 |
|
3 | const columns = require('cli-columns')
|
4 | const figgyPudding = require('figgy-pudding')
|
5 | const libteam = require('libnpm/team')
|
6 | const npmConfig = require('./config/figgy-config.js')
|
7 | const output = require('./utils/output.js')
|
8 | const otplease = require('./utils/otplease.js')
|
9 | const usage = require('./utils/usage')
|
10 |
|
11 | module.exports = team
|
12 |
|
13 | team.subcommands = ['create', 'destroy', 'add', 'rm', 'ls', 'edit']
|
14 |
|
15 | team.usage = usage(
|
16 | 'team',
|
17 | 'npm team create <scope:team>\n' +
|
18 | 'npm team destroy <scope:team>\n' +
|
19 | 'npm team add <scope:team> <user>\n' +
|
20 | 'npm team rm <scope:team> <user>\n' +
|
21 | 'npm team ls <scope>|<scope:team>\n' +
|
22 | 'npm team edit <scope:team>'
|
23 | )
|
24 |
|
25 | const TeamConfig = figgyPudding({
|
26 | json: {},
|
27 | loglevel: {},
|
28 | parseable: {},
|
29 | silent: {}
|
30 | })
|
31 |
|
32 | function UsageError () {
|
33 | throw Object.assign(new Error(team.usage), {code: 'EUSAGE'})
|
34 | }
|
35 |
|
36 | team.completion = function (opts, cb) {
|
37 | var argv = opts.conf.argv.remain
|
38 | if (argv.length === 2) {
|
39 | return cb(null, team.subcommands)
|
40 | }
|
41 | switch (argv[2]) {
|
42 | case 'ls':
|
43 | case 'create':
|
44 | case 'destroy':
|
45 | case 'add':
|
46 | case 'rm':
|
47 | case 'edit':
|
48 | return cb(null, [])
|
49 | default:
|
50 | return cb(new Error(argv[2] + ' not recognized'))
|
51 | }
|
52 | }
|
53 |
|
54 | function team ([cmd, entity = '', user = ''], cb) {
|
55 |
|
56 | otplease(npmConfig(), opts => {
|
57 | opts = TeamConfig(opts).concat({description: null})
|
58 | entity = entity.replace(/^@/, '')
|
59 | switch (cmd) {
|
60 | case 'create': return teamCreate(entity, opts)
|
61 | case 'destroy': return teamDestroy(entity, opts)
|
62 | case 'add': return teamAdd(entity, user, opts)
|
63 | case 'rm': return teamRm(entity, user, opts)
|
64 | case 'ls': {
|
65 | const match = entity.match(/[^:]+:.+/)
|
66 | if (match) {
|
67 | return teamListUsers(entity, opts)
|
68 | } else {
|
69 | return teamListTeams(entity, opts)
|
70 | }
|
71 | }
|
72 | case 'edit':
|
73 | throw new Error('`npm team edit` is not implemented yet.')
|
74 | default:
|
75 | UsageError()
|
76 | }
|
77 | }).then(
|
78 | data => cb(null, data),
|
79 | err => err.code === 'EUSAGE' ? cb(err.message) : cb(err)
|
80 | )
|
81 | }
|
82 |
|
83 | function teamCreate (entity, opts) {
|
84 | return libteam.create(entity, opts).then(() => {
|
85 | if (opts.json) {
|
86 | output(JSON.stringify({
|
87 | created: true,
|
88 | team: entity
|
89 | }))
|
90 | } else if (opts.parseable) {
|
91 | output(`${entity}\tcreated`)
|
92 | } else if (!opts.silent && opts.loglevel !== 'silent') {
|
93 | output(`+@${entity}`)
|
94 | }
|
95 | })
|
96 | }
|
97 |
|
98 | function teamDestroy (entity, opts) {
|
99 | return libteam.destroy(entity, opts).then(() => {
|
100 | if (opts.json) {
|
101 | output(JSON.stringify({
|
102 | deleted: true,
|
103 | team: entity
|
104 | }))
|
105 | } else if (opts.parseable) {
|
106 | output(`${entity}\tdeleted`)
|
107 | } else if (!opts.silent && opts.loglevel !== 'silent') {
|
108 | output(`-@${entity}`)
|
109 | }
|
110 | })
|
111 | }
|
112 |
|
113 | function teamAdd (entity, user, opts) {
|
114 | return libteam.add(user, entity, opts).then(() => {
|
115 | if (opts.json) {
|
116 | output(JSON.stringify({
|
117 | added: true,
|
118 | team: entity,
|
119 | user
|
120 | }))
|
121 | } else if (opts.parseable) {
|
122 | output(`${user}\t${entity}\tadded`)
|
123 | } else if (!opts.silent && opts.loglevel !== 'silent') {
|
124 | output(`${user} added to @${entity}`)
|
125 | }
|
126 | })
|
127 | }
|
128 |
|
129 | function teamRm (entity, user, opts) {
|
130 | return libteam.rm(user, entity, opts).then(() => {
|
131 | if (opts.json) {
|
132 | output(JSON.stringify({
|
133 | removed: true,
|
134 | team: entity,
|
135 | user
|
136 | }))
|
137 | } else if (opts.parseable) {
|
138 | output(`${user}\t${entity}\tremoved`)
|
139 | } else if (!opts.silent && opts.loglevel !== 'silent') {
|
140 | output(`${user} removed from @${entity}`)
|
141 | }
|
142 | })
|
143 | }
|
144 |
|
145 | function teamListUsers (entity, opts) {
|
146 | return libteam.lsUsers(entity, opts).then(users => {
|
147 | users = users.sort()
|
148 | if (opts.json) {
|
149 | output(JSON.stringify(users, null, 2))
|
150 | } else if (opts.parseable) {
|
151 | output(users.join('\n'))
|
152 | } else if (!opts.silent && opts.loglevel !== 'silent') {
|
153 | output(`\n@${entity} has ${users.length} user${users.length === 1 ? '' : 's'}:\n`)
|
154 | output(columns(users, {padding: 1}))
|
155 | }
|
156 | })
|
157 | }
|
158 |
|
159 | function teamListTeams (entity, opts) {
|
160 | return libteam.lsTeams(entity, opts).then(teams => {
|
161 | teams = teams.sort()
|
162 | if (opts.json) {
|
163 | output(JSON.stringify(teams, null, 2))
|
164 | } else if (opts.parseable) {
|
165 | output(teams.join('\n'))
|
166 | } else if (!opts.silent && opts.loglevel !== 'silent') {
|
167 | output(`\n@${entity} has ${teams.length} team${teams.length === 1 ? '' : 's'}:\n`)
|
168 | output(columns(teams.map(t => `@${t}`), {padding: 1}))
|
169 | }
|
170 | })
|
171 | }
|