This repository was archived by the owner on Aug 7, 2026. It is now read-only.
-
-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathenterprise.js
More file actions
218 lines (189 loc) · 4.79 KB
/
Copy pathenterprise.js
File metadata and controls
218 lines (189 loc) · 4.79 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
import chalk from 'chalk'
import Base from './base.js'
// GitHub API classes
import Owner from './owner.js'
// Utilities
import wait from '../util/wait.js'
const {cyan} = chalk
/**
* Represents a GitHub Enterprise instance with associated organizations.
* @extends Base
*/
export default class Enterprise extends Base {
#logger
#options
// Private fields
#name
#id
#node_id
#organizations
/**
* Creates a new Enterprise instance.
* @param {string} name - The name of the enterprise
* @param {object} [options={}] - Configuration options for the enterprise
* @param {string|null} [options.token=null] - GitHub personal access token
* @param {string|null} [options.hostname=null] - GitHub hostname for Enterprise servers
* @param {boolean} [options.debug=false] - Enable debug mode
* @param {boolean} [options.archived=false] - Skip archived repositories
* @param {boolean} [options.forked=false] - Skip forked repositories
*/
constructor(
name,
options = {
token: null,
hostname: null,
debug: false,
archived: false,
forked: false,
},
) {
super(options)
this.#options = options
this.#name = name
this.#id = undefined
this.#node_id = undefined
this.#organizations = []
}
/**
* Gets the enterprise name.
* @returns {string} The enterprise name
*/
get name() {
return this.#name
}
/**
* Sets the enterprise name.
* @param {string} name - The enterprise name
*/
set name(name) {
this.#name = name
}
/**
* Gets the enterprise ID.
* @returns {number|undefined} The enterprise ID
*/
get id() {
return this.#id
}
/**
* Sets the enterprise ID.
* @param {number} id - The enterprise ID
*/
set id(id) {
this.#id = id
}
/**
* Gets the enterprise node ID.
* @returns {string|undefined} The enterprise node ID
*/
get node_id() {
return this.#node_id
}
/**
* Sets the enterprise node ID.
* @param {string} node_id - The enterprise node ID
*/
set node_id(node_id) {
this.#node_id = node_id
}
/**
* Gets the organizations array.
* @returns {Array} The array of organizations
*/
get organizations() {
return this.#organizations
}
/**
* Sets the organizations array.
* @param {Array} organizations - The array of organizations
*/
set organizations(organizations) {
this.#organizations = organizations
}
/**
* Gets the options object.
* @returns {object} The options object
*/
get options() {
return this.#options
}
/**
* Fetches all organizations for this enterprise using GraphQL pagination.
* @async
* @param {string} enterprise - The enterprise slug
* @param {string|null} [cursor=null] - Pagination cursor for GraphQL query
* @returns {Promise<Array>} Array of organization objects with repositories
*/
async getOrganizations(enterprise, cursor = null) {
if (!enterprise) {
return []
}
const {
enterprise: {
name,
id,
node_id,
organizations: {nodes, pageInfo},
},
} = await this.octokit.graphql(ENTERPRISE_QUERY, {enterprise, cursor})
this.#name = name
this.#id = id
this.#node_id = node_id
/* c8 ignore start */
// Process each organization and fetch its repositories
await Promise.all(
nodes.map(async data => {
const org = new Owner(data.login, this.options)
org.login = data.login
org.name = data.name
org.id = data.id
org.node_id = data.node_id
org.type = 'organization'
// Load repositories for the organization
this.spinner.text = `Loading organization ${cyan(data.login)}...`
const repos = await org.getRepositories(data.login)
// Add the organization to the list
this.#organizations.push({
login: org.login,
name: org.name,
id: org.id,
node_id: org.node_id,
type: 'organization',
repositories: repos,
})
}),
)
/* c8 ignore stop */
// Sleep for 1s to avoid hitting the rate limit
await wait(1000)
// Paginate through the organizations
if (pageInfo.hasNextPage) {
await this.getOrganizations(enterprise, pageInfo.endCursor)
}
return this.#organizations
}
}
/**
* GraphQL query to fetch enterprise information and organizations.
* Retrieves enterprise metadata and paginated organization data.
*/
const ENTERPRISE_QUERY = `query ($enterprise: String!, $cursor: String = null) {
enterprise(slug: $enterprise) {
name: slug
id: databaseId
node_id: id
organizations(first: 5, after: $cursor) {
pageInfo {
hasNextPage
endCursor
}
nodes {
name
login
id: databaseId
node_id: id
}
}
}
}
`