@@ -62,7 +62,6 @@ const printMemberPreview = (member: Member): void => {
6262
6363const fetchAllMembers = async (
6464 spinner : ReturnType < typeof yoctoSpinner > ,
65- order = "ASC" ,
6665 filters ?: Record < string , unknown >
6766) : Promise < { members : Member [ ] ; totalCount : number } > => {
6867 const allMembers : Member [ ] = [ ] ;
@@ -74,22 +73,24 @@ const fetchAllMembers = async (
7473 do {
7574 const result = await graphqlRequest < {
7675 getMembers : {
77- edges : { cursor : string ; node : Member } [ ] ;
76+ edges : { node : Member } [ ] ;
77+ pageInfo : { endCursor : string | null } ;
7878 } ;
7979 } > ( {
80- query : `query($first: Int, $after: String, $order: OrderByInput, $filters: MemberFilter) {
81- getMembers(first: $first, after: $after, order: $order, filters: $filters) {
82- edges { cursor node { ${ MEMBER_FIELDS } } }
80+ query : `query($first: Int, $after: String, $filters: MemberFilter) {
81+ getMembers(first: $first, after: $after, filters: $filters) {
82+ edges { node { ${ MEMBER_FIELDS } } }
83+ pageInfo { endCursor }
8384 }
8485 }` ,
85- variables : { first : pageSize , after : cursor , order , filters } ,
86+ variables : { first : pageSize , after : cursor , filters } ,
8687 } ) ;
8788
88- const { edges } = result . getMembers ;
89+ const { edges, pageInfo } = result . getMembers ;
8990 allMembers . push ( ...edges . map ( ( e ) => e . node ) ) ;
9091
91- if ( edges . length === pageSize ) {
92- cursor = edges . at ( - 1 ) ?. cursor ;
92+ if ( edges . length === pageSize && pageInfo . endCursor ) {
93+ cursor = pageInfo . endCursor ;
9394 spinner . text = `Fetching members... (${ allMembers . length } so far)` ;
9495 } else {
9596 cursor = undefined ;
@@ -107,8 +108,12 @@ const flattenMember = (member: Member): Record<string, unknown> => ({
107108 createdAt : member . createdAt ,
108109 lastLogin : member . lastLogin ?? "" ,
109110 loginRedirect : member . loginRedirect ?? "" ,
110- permissions : member . permissions . all . join ( ", " ) ,
111- plans : member . planConnections . map ( ( p ) => p . plan . id ) . join ( ", " ) ,
111+ permissions : member . permissions ?. all ?. join ( ", " ) ?? "" ,
112+ plans :
113+ member . planConnections
114+ ?. map ( ( p ) => p . plan ?. id )
115+ . filter ( Boolean )
116+ . join ( ", " ) ?? "" ,
112117 ...Object . fromEntries (
113118 Object . entries ( member . customFields ?? { } ) . map ( ( [ k , v ] ) => [
114119 `customFields.${ k } ` ,
@@ -205,7 +210,7 @@ membersCommand
205210 "--after <cursor>" ,
206211 "Pagination cursor (endCursor from previous page)"
207212 )
208- . option ( "--order <order>" , "Sort order (ASC or DESC)" , "ASC" )
213+ . option ( "--order <order>" , "Sort order (ASC or DESC)" )
209214 . option ( "--limit <number>" , "Max members to return (default: 50, max: 200)" )
210215 . option ( "--all" , "Auto-paginate and fetch all members" )
211216 . action ( async ( options : MembersListOptions ) => {
@@ -223,29 +228,39 @@ membersCommand
223228
224229 const result = await graphqlRequest < {
225230 getMembers : {
226- edges : { cursor : string ; node : Member } [ ] ;
231+ edges : { node : Member } [ ] ;
232+ pageInfo : { endCursor : string | null } ;
227233 } ;
228234 } > ( {
229- query : `query($first: Int, $after: String, $order: OrderByInput) {
230- getMembers(first: $first, after: $after, order: $order) {
231- edges { cursor node { ${ MEMBER_FIELDS } } }
235+ query : `query($first: Int, $after: String) {
236+ getMembers(first: $first, after: $after) {
237+ edges { node { ${ MEMBER_FIELDS } } }
238+ pageInfo { endCursor }
232239 }
233240 }` ,
234- variables : { first : perPage , after : cursor , order : options . order } ,
241+ variables : { first : perPage , after : cursor } ,
235242 } ) ;
236243
237- const { edges } = result . getMembers ;
244+ const { edges, pageInfo } = result . getMembers ;
238245 const members = edges . map ( ( e ) => e . node ) ;
239246 allMembers . push ( ...members ) ;
240247
241- if ( allMembers . length < target && edges . length === perPage ) {
242- cursor = edges . at ( - 1 ) ?. cursor ;
248+ if (
249+ allMembers . length < target &&
250+ edges . length === perPage &&
251+ pageInfo . endCursor
252+ ) {
253+ cursor = pageInfo . endCursor ;
243254 spinner . text = `Fetching members... (${ allMembers . length } so far)` ;
244255 } else {
245256 cursor = undefined ;
246257 }
247258 } while ( cursor ) ;
248259
260+ if ( options . order === "DESC" ) {
261+ allMembers . reverse ( ) ;
262+ }
263+
249264 spinner . stop ( ) ;
250265
251266 const [ first ] = allMembers ;
@@ -279,11 +294,16 @@ membersCommand
279294 const spinner = yoctoSpinner ( { text : "Fetching member..." } ) . start ( ) ;
280295 try {
281296 if ( idOrEmail . startsWith ( "mem_" ) ) {
282- const result = await graphqlRequest < { currentMember : Member } > ( {
297+ const result = await graphqlRequest < {
298+ currentMember : Member | null ;
299+ } > ( {
283300 query : `query($id: ID) { currentMember(id: $id) { ${ MEMBER_FIELDS } } }` ,
284301 variables : { id : idOrEmail } ,
285302 } ) ;
286303 spinner . stop ( ) ;
304+ if ( ! result . currentMember ) {
305+ throw new Error ( `Member not found: ${ idOrEmail } ` ) ;
306+ }
287307 printRecord ( result . currentMember ) ;
288308 } else {
289309 const result = await graphqlRequest < {
@@ -418,6 +438,11 @@ membersCommand
418438 if ( member ) {
419439 printSuccess ( `Member updated: ${ member . id } ` ) ;
420440 printRecord ( member ) ;
441+ } else {
442+ printError (
443+ "No update options provided. Use --help to see available options."
444+ ) ;
445+ process . exitCode = 1 ;
421446 }
422447 } catch ( error ) {
423448 spinner . stop ( ) ;
@@ -627,7 +652,7 @@ membersCommand
627652 let members : Member [ ] ;
628653
629654 if ( hasPlanFilter && ! hasFieldFilter ) {
630- const { members : fetched } = await fetchAllMembers ( spinner , "ASC" , {
655+ const { members : fetched } = await fetchAllMembers ( spinner , {
631656 planIds : [ options . plan ] ,
632657 } ) ;
633658 members = fetched ;
@@ -692,8 +717,10 @@ membersCommand
692717 inactive ++ ;
693718 }
694719
695- for ( const conn of member . planConnections ) {
696- planCounts [ conn . plan . id ] = ( planCounts [ conn . plan . id ] ?? 0 ) + 1 ;
720+ for ( const conn of member . planConnections ?? [ ] ) {
721+ if ( conn . plan ?. id ) {
722+ planCounts [ conn . plan . id ] = ( planCounts [ conn . plan . id ] ?? 0 ) + 1 ;
723+ }
697724 }
698725
699726 const created = new Date ( member . createdAt ) . getTime ( ) ;
0 commit comments