11const { log, output } = require ( 'proc-log' )
2- const { listTokens, createToken , removeToken } = require ( 'npm-profile' )
2+ const { listTokens, createGatToken , removeToken } = require ( 'npm-profile' )
33const { otplease } = require ( '../utils/auth.js' )
44const readUserInfo = require ( '../utils/read-user-info.js' )
55const BaseCommand = require ( '../base-cmd.js' )
66
77class Token extends BaseCommand {
88 static description = 'Manage your authentication tokens'
99 static name = 'token'
10- static usage = [ 'list' , 'revoke <id|token>' , 'create [--read-only] [--cidr=list]' ]
11- static params = [ 'read-only' , 'cidr' , 'registry' , 'otp' ]
10+ static usage = [ 'list' , 'revoke <id|token>' , 'create --name=<name> [--token-description=<desc>] [--packages=<pkg1,pkg2>] [--packages-all] [--scopes=<scope1,scope2>] [--orgs=<org1,org2>] [--packages-and-scopes-permission=<read-only|read-write|no-access>] [--orgs-permission=<read-only|read-write|no-access>] [--expires=<days>] [--cidr=<ip-range>] [--bypass-2fa] [--password=<pass>]' ]
11+ static params = [ 'name' ,
12+ 'token-description' ,
13+ 'expires' ,
14+ 'packages' ,
15+ 'packages-all' ,
16+ 'scopes' ,
17+ 'orgs' ,
18+ 'packages-and-scopes-permission' ,
19+ 'orgs-permission' ,
20+ 'cidr' ,
21+ 'bypass-2fa' ,
22+ 'password' ,
23+ 'registry' ,
24+ 'otp' ,
25+ 'read-only' ,
26+ ]
1227
1328 static async completion ( opts ) {
1429 const argv = opts . conf . argv . remain
@@ -127,15 +142,72 @@ class Token extends BaseCommand {
127142 const json = this . npm . config . get ( 'json' )
128143 const parseable = this . npm . config . get ( 'parseable' )
129144 const cidr = this . npm . config . get ( 'cidr' )
130- const readonly = this . npm . config . get ( 'read-only' )
145+ const name = this . npm . config . get ( 'name' )
146+ const tokenDescription = this . npm . config . get ( 'token-description' )
147+ const expires = this . npm . config . get ( 'expires' )
148+ const packages = this . npm . config . get ( 'packages' )
149+ const packagesAll = this . npm . config . get ( 'packages-all' )
150+ const scopes = this . npm . config . get ( 'scopes' )
151+ const orgs = this . npm . config . get ( 'orgs' )
152+ const packagesAndScopesPermission = this . npm . config . get ( 'packages-and-scopes-permission' )
153+ const orgsPermission = this . npm . config . get ( 'orgs-permission' )
154+ const bypassTwoFactor = this . npm . config . get ( 'bypass-2fa' )
155+ let password = this . npm . config . get ( 'password' )
131156
132157 const validCIDR = await this . validateCIDRList ( cidr )
133- const password = await readUserInfo . password ( )
158+
159+ /* istanbul ignore if - skip testing read input */
160+ if ( ! password ) {
161+ password = await readUserInfo . password ( )
162+ }
163+
164+ const tokenData = {
165+ name : name ,
166+ password : password ,
167+ }
168+
169+ if ( tokenDescription ) {
170+ tokenData . description = tokenDescription
171+ }
172+
173+ if ( packages ?. length > 0 ) {
174+ tokenData . packages = packages
175+ }
176+ if ( packagesAll ) {
177+ tokenData . packages_all = true
178+ }
179+ if ( scopes ?. length > 0 ) {
180+ tokenData . scopes = scopes
181+ }
182+ if ( orgs ?. length > 0 ) {
183+ tokenData . orgs = orgs
184+ }
185+
186+ if ( packagesAndScopesPermission ) {
187+ tokenData . packages_and_scopes_permission = packagesAndScopesPermission
188+ }
189+ if ( orgsPermission ) {
190+ tokenData . orgs_permission = orgsPermission
191+ }
192+
193+ // Add expiration in days
194+ if ( expires ) {
195+ tokenData . expires = parseInt ( expires , 10 )
196+ }
197+
198+ // Add optional fields
199+ if ( validCIDR ?. length > 0 ) {
200+ tokenData . cidr_whitelist = validCIDR
201+ }
202+ if ( bypassTwoFactor ) {
203+ tokenData . bypass_2fa = true
204+ }
205+
134206 log . info ( 'token' , 'creating' )
135207 const result = await otplease (
136208 this . npm ,
137209 { ...this . npm . flatOptions } ,
138- c => createToken ( password , readonly , validCIDR , c )
210+ c => createGatToken ( tokenData , c )
139211 )
140212 delete result . key
141213 delete result . updated
@@ -145,12 +217,15 @@ class Token extends BaseCommand {
145217 Object . keys ( result ) . forEach ( k => output . standard ( k + '\t' + result [ k ] ) )
146218 } else {
147219 const chalk = this . npm . chalk
148- // Identical to list
149- const level = result . readonly ? 'read only' : 'publish'
220+ // Display based on access level
221+ const level = result . access === 'read-only' || result . readonly ? 'read only' : 'publish'
150222 output . standard ( `Created ${ chalk . blue ( level ) } token ${ result . token } ` )
151223 if ( result . cidr_whitelist ?. length ) {
152224 output . standard ( `with IP whitelist: ${ chalk . green ( result . cidr_whitelist . join ( ',' ) ) } ` )
153225 }
226+ if ( result . expires ) {
227+ output . standard ( `expires: ${ result . expires } ` )
228+ }
154229 }
155230 }
156231
@@ -180,7 +255,7 @@ class Token extends BaseCommand {
180255 for ( const cidr of list ) {
181256 if ( isCidrV6 ( cidr ) ) {
182257 throw this . invalidCIDRError (
183- `CIDR whitelist can only contain IPv4 addresses${ cidr } is IPv6`
258+ `CIDR whitelist can only contain IPv4 addresses, ${ cidr } is IPv6`
184259 )
185260 }
186261
0 commit comments