@@ -16,6 +16,9 @@ import { ExtendedAuthFields, FullyPopulatedScratchOrgFields } from '../../shared
1616Messages . importMessagesDirectory ( __dirname ) ;
1717const messages = Messages . loadMessages ( '@salesforce/plugin-org' , 'list' ) ;
1818
19+ const defaultOrgEmoji = '🍁' ;
20+ const defaultHubEmoji = '🌳' ;
21+
1922export type OrgListResult = {
2023 /**
2124 * @deprecated
@@ -94,11 +97,18 @@ export class OrgListCommand extends SfCommand<OrgListResult> {
9497 devHubs : result . devHubs ,
9598 regularOrgs : result . regularOrgs ,
9699 sandboxes : result . sandboxes ,
100+ scratchOrgs : result . scratchOrgs ,
97101 skipconnectionstatus : flags [ 'skip-connection-status' ] ,
98102 } ) ;
99- this . printScratchOrgTable ( result . scratchOrgs ) ;
103+ // this.printScratchOrgTable(result.scratchOrgs);
104+
105+ this . log (
106+ `
107+ Legend: ${ defaultHubEmoji } =Default DevHub, ${ defaultOrgEmoji } =Default Org ${
108+ this . flags . all ? ' Use --all to see expired and deleted scratch orgs' : ''
109+ } `
110+ ) ;
100111
101- this . info ( 'Legend: (D)=Default DevHub, (U)=Default Org' ) ;
102112 return result ;
103113 }
104114
@@ -133,43 +143,48 @@ export class OrgListCommand extends SfCommand<OrgListResult> {
133143
134144 protected printOrgTable ( {
135145 devHubs,
146+ scratchOrgs,
136147 regularOrgs,
137148 sandboxes,
138149 skipconnectionstatus,
139150 } : {
140151 devHubs : ExtendedAuthFields [ ] ;
141152 regularOrgs : ExtendedAuthFields [ ] ;
142153 sandboxes : ExtendedAuthFields [ ] ;
154+ scratchOrgs : FullyPopulatedScratchOrgFields [ ] ;
143155 skipconnectionstatus : boolean ;
144156 } ) : void {
145157 if ( ! devHubs . length && ! regularOrgs . length && ! sandboxes . length ) {
146158 this . info ( messages . getMessage ( 'noResultsFound' ) ) ;
147159 return ;
148160 }
149- this . log ( ) ;
150- this . info ( 'Non-scratch orgs' ) ;
151- const nonScratchOrgs = [
161+ const allOrgs : Array < FullyPopulatedScratchOrgFields | ExtendedAuthFieldsWithType > = [
152162 ...devHubs
153163 . map ( addType ( 'DevHub' ) )
154164 . map ( colorEveryFieldButConnectedStatus ( chalk . cyanBright ) )
155- . map ( ( row ) => getStyledObject ( row ) ) ,
165+ . map ( ( row ) => getStyledObject ( row ) )
166+ . map ( statusToEmoji ) ,
156167
157- ...regularOrgs . map ( colorEveryFieldButConnectedStatus ( chalk . magentaBright ) ) . map ( ( row ) => getStyledObject ( row ) ) ,
168+ ...regularOrgs
169+ . map ( colorEveryFieldButConnectedStatus ( chalk . magentaBright ) )
170+ . map ( ( row ) => getStyledObject ( row ) )
171+ . map ( statusToEmoji ) ,
158172
159173 ...sandboxes
160174 . map ( addType ( 'Sandbox' ) )
161175 . map ( colorEveryFieldButConnectedStatus ( chalk . yellowBright ) )
162- . map ( ( row ) => getStyledObject ( row ) ) ,
176+ . map ( ( row ) => getStyledObject ( row ) )
177+ . map ( statusToEmoji ) ,
178+
179+ ...scratchOrgs
180+ . map ( ( row ) => ( { ...row , type : 'Scratch' } ) )
181+ . map ( convertScratchOrgStatus )
182+ . map ( ( row ) => getStyledObject ( row ) )
183+ . map ( statusToEmoji ) ,
163184 ] ;
164185
165186 this . table (
166- nonScratchOrgs . map ( ( org ) =>
167- Object . fromEntries (
168- Object . entries ( org ) . filter ( ( [ key ] ) =>
169- [ 'type' , 'defaultMarker' , 'alias' , 'username' , 'orgId' , 'connectedStatus' ] . includes ( key )
170- )
171- )
172- ) ,
187+ allOrgs . map ( ( org ) => Object . fromEntries ( Object . entries ( org ) . filter ( fieldFilter ) ) ) ,
173188 {
174189 defaultMarker : {
175190 header : '' ,
@@ -183,51 +198,32 @@ export class OrgListCommand extends SfCommand<OrgListResult> {
183198 username : { header : 'Username' } ,
184199 orgId : { header : 'Org ID' } ,
185200 ...( ! skipconnectionstatus ? { connectedStatus : { header : 'Status' } } : { } ) ,
186- }
187- ) ;
188-
189- this . log ( ) ;
190- }
191-
192- private printScratchOrgTable ( scratchOrgs : FullyPopulatedScratchOrgFields [ ] ) : void {
193- if ( scratchOrgs . length === 0 ) {
194- this . info ( messages . getMessage ( 'noActiveScratchOrgs' ) ) ;
195- } else {
196- this . info ( this . flags . all ? 'Scratch Orgs' : 'Active Scratch Orgs (use --all to see all)' ) ;
197-
198- // One or more rows are available.
199- // we only need a few of the props for our table. Oclif table doesn't like extra props non-string props.
200- const rows = scratchOrgs
201- . map ( getStyledObject )
202- . map ( ( org ) => Object . fromEntries ( Object . entries ( org ) . filter ( scratchOrgFieldFilter ) ) ) ;
203- this . table ( rows , {
204- defaultMarker : {
205- header : '' ,
206- } ,
207- alias : {
208- header : 'Alias' ,
209- } ,
210- username : { header : 'Username' } ,
211- orgId : { header : 'Org ID' } ,
212- ...( this . flags . all || this . flags . verbose ? { status : { header : 'Status' } } : { } ) ,
213201 ...( this . flags . verbose
214202 ? {
215- devHubOrgId : { header : 'Dev Hub ID' } ,
216203 instanceUrl : { header : 'Instance URL' } ,
217- createdDate : { header : 'Created' , get : ( data ) : string => data . createdDate ?. split ( 'T' ) [ 0 ] ?? '' } ,
204+ devHubOrgId : { header : 'Dev Hub ID' } ,
205+ createdDate : {
206+ header : 'Created' ,
207+ get : ( data ) : string => ( data . createdDate as string ) ?. split ( 'T' ) ?. [ 0 ] ?? '' ,
208+ } ,
218209 }
219210 : { } ) ,
220211 expirationDate : { header : 'Expires' } ,
221- } ) ;
222- }
223- this . log ( ) ;
212+ }
213+ ) ;
224214 }
225215}
226216
227217const decorateWithDefaultStatus = < T extends ExtendedAuthFields | FullyPopulatedScratchOrgFields > ( val : T ) : T => ( {
228218 ...val ,
229219 ...( val . isDefaultDevHubUsername ? { defaultMarker : '(D)' } : { } ) ,
230220 ...( val . isDefaultUsername ? { defaultMarker : '(U)' } : { } ) ,
221+ ...( val . isDefaultDevHubUsername && val . isDefaultUsername ? { defaultMarker : '(D),(U)' } : { } ) ,
222+ } ) ;
223+
224+ const statusToEmoji = < T extends ExtendedAuthFields | FullyPopulatedScratchOrgFields > ( val : T ) : T => ( {
225+ ...val ,
226+ defaultMarker : val . defaultMarker ?. replace ( '(D)' , defaultHubEmoji ) ?. replace ( '(U)' , defaultOrgEmoji ) ,
231227} ) ;
232228
233229// sort by alias then username
@@ -251,6 +247,7 @@ const getAuthFileNames = async (): Promise<string[]> => {
251247} ;
252248
253249type ExtendedAuthFieldsWithType = ExtendedAuthFields & { type ?: string } ;
250+
254251const addType =
255252 ( type : string ) =>
256253 ( val : ExtendedAuthFields ) : ExtendedAuthFieldsWithType => ( { ...val , type } ) ;
@@ -266,15 +263,23 @@ const colorEveryFieldButConnectedStatus =
266263 // TS is not smart enough to know this didn't change any types
267264 ) as ExtendedAuthFieldsWithType ;
268265
269- const scratchOrgFieldFilter = ( [ key ] : [ string , string ] ) : boolean =>
266+ const fieldFilter = ( [ key ] : [ string , string ] ) : boolean =>
270267 [
271268 'defaultMarker' ,
272269 'alias' ,
273270 'username' ,
274271 'orgId' ,
275272 'status' ,
273+ 'connectedStatus' ,
276274 'expirationDate' ,
277275 'devHubOrgId' ,
278276 'createdDate' ,
279277 'instanceUrl' ,
278+ 'type' ,
279+ 'createdDate' ,
280280 ] . includes ( key ) ;
281+
282+ const convertScratchOrgStatus = (
283+ row : FullyPopulatedScratchOrgFields
284+ ) : FullyPopulatedScratchOrgFields & { connectedStatus : string } =>
285+ ( { ...row , connectedStatus : row . status } as FullyPopulatedScratchOrgFields & { connectedStatus : string } ) ;
0 commit comments