github.com/jfrog/frogbot@v1.1.1-0.20231221090046-821a26f50338/action/node_modules/@octokit/plugin-paginate-rest/dist-web/index.js (about) 1 const VERSION = "2.17.0"; 2 3 /** 4 * Some “list” response that can be paginated have a different response structure 5 * 6 * They have a `total_count` key in the response (search also has `incomplete_results`, 7 * /installation/repositories also has `repository_selection`), as well as a key with 8 * the list of the items which name varies from endpoint to endpoint. 9 * 10 * Octokit normalizes these responses so that paginated results are always returned following 11 * the same structure. One challenge is that if the list response has only one page, no Link 12 * header is provided, so this header alone is not sufficient to check wether a response is 13 * paginated or not. 14 * 15 * We check if a "total_count" key is present in the response data, but also make sure that 16 * a "url" property is not, as the "Get the combined status for a specific ref" endpoint would 17 * otherwise match: https://developer.github.com/v3/repos/statuses/#get-the-combined-status-for-a-specific-ref 18 */ 19 function normalizePaginatedListResponse(response) { 20 // endpoints can respond with 204 if repository is empty 21 if (!response.data) { 22 return { 23 ...response, 24 data: [], 25 }; 26 } 27 const responseNeedsNormalization = "total_count" in response.data && !("url" in response.data); 28 if (!responseNeedsNormalization) 29 return response; 30 // keep the additional properties intact as there is currently no other way 31 // to retrieve the same information. 32 const incompleteResults = response.data.incomplete_results; 33 const repositorySelection = response.data.repository_selection; 34 const totalCount = response.data.total_count; 35 delete response.data.incomplete_results; 36 delete response.data.repository_selection; 37 delete response.data.total_count; 38 const namespaceKey = Object.keys(response.data)[0]; 39 const data = response.data[namespaceKey]; 40 response.data = data; 41 if (typeof incompleteResults !== "undefined") { 42 response.data.incomplete_results = incompleteResults; 43 } 44 if (typeof repositorySelection !== "undefined") { 45 response.data.repository_selection = repositorySelection; 46 } 47 response.data.total_count = totalCount; 48 return response; 49 } 50 51 function iterator(octokit, route, parameters) { 52 const options = typeof route === "function" 53 ? route.endpoint(parameters) 54 : octokit.request.endpoint(route, parameters); 55 const requestMethod = typeof route === "function" ? route : octokit.request; 56 const method = options.method; 57 const headers = options.headers; 58 let url = options.url; 59 return { 60 [Symbol.asyncIterator]: () => ({ 61 async next() { 62 if (!url) 63 return { done: true }; 64 try { 65 const response = await requestMethod({ method, url, headers }); 66 const normalizedResponse = normalizePaginatedListResponse(response); 67 // `response.headers.link` format: 68 // '<https://api.github.com/users/aseemk/followers?page=2>; rel="next", <https://api.github.com/users/aseemk/followers?page=2>; rel="last"' 69 // sets `url` to undefined if "next" URL is not present or `link` header is not set 70 url = ((normalizedResponse.headers.link || "").match(/<([^>]+)>;\s*rel="next"/) || [])[1]; 71 return { value: normalizedResponse }; 72 } 73 catch (error) { 74 if (error.status !== 409) 75 throw error; 76 url = ""; 77 return { 78 value: { 79 status: 200, 80 headers: {}, 81 data: [], 82 }, 83 }; 84 } 85 }, 86 }), 87 }; 88 } 89 90 function paginate(octokit, route, parameters, mapFn) { 91 if (typeof parameters === "function") { 92 mapFn = parameters; 93 parameters = undefined; 94 } 95 return gather(octokit, [], iterator(octokit, route, parameters)[Symbol.asyncIterator](), mapFn); 96 } 97 function gather(octokit, results, iterator, mapFn) { 98 return iterator.next().then((result) => { 99 if (result.done) { 100 return results; 101 } 102 let earlyExit = false; 103 function done() { 104 earlyExit = true; 105 } 106 results = results.concat(mapFn ? mapFn(result.value, done) : result.value.data); 107 if (earlyExit) { 108 return results; 109 } 110 return gather(octokit, results, iterator, mapFn); 111 }); 112 } 113 114 const composePaginateRest = Object.assign(paginate, { 115 iterator, 116 }); 117 118 const paginatingEndpoints = [ 119 "GET /app/hook/deliveries", 120 "GET /app/installations", 121 "GET /applications/grants", 122 "GET /authorizations", 123 "GET /enterprises/{enterprise}/actions/permissions/organizations", 124 "GET /enterprises/{enterprise}/actions/runner-groups", 125 "GET /enterprises/{enterprise}/actions/runner-groups/{runner_group_id}/organizations", 126 "GET /enterprises/{enterprise}/actions/runner-groups/{runner_group_id}/runners", 127 "GET /enterprises/{enterprise}/actions/runners", 128 "GET /enterprises/{enterprise}/actions/runners/downloads", 129 "GET /events", 130 "GET /gists", 131 "GET /gists/public", 132 "GET /gists/starred", 133 "GET /gists/{gist_id}/comments", 134 "GET /gists/{gist_id}/commits", 135 "GET /gists/{gist_id}/forks", 136 "GET /installation/repositories", 137 "GET /issues", 138 "GET /marketplace_listing/plans", 139 "GET /marketplace_listing/plans/{plan_id}/accounts", 140 "GET /marketplace_listing/stubbed/plans", 141 "GET /marketplace_listing/stubbed/plans/{plan_id}/accounts", 142 "GET /networks/{owner}/{repo}/events", 143 "GET /notifications", 144 "GET /organizations", 145 "GET /orgs/{org}/actions/permissions/repositories", 146 "GET /orgs/{org}/actions/runner-groups", 147 "GET /orgs/{org}/actions/runner-groups/{runner_group_id}/repositories", 148 "GET /orgs/{org}/actions/runner-groups/{runner_group_id}/runners", 149 "GET /orgs/{org}/actions/runners", 150 "GET /orgs/{org}/actions/runners/downloads", 151 "GET /orgs/{org}/actions/secrets", 152 "GET /orgs/{org}/actions/secrets/{secret_name}/repositories", 153 "GET /orgs/{org}/blocks", 154 "GET /orgs/{org}/credential-authorizations", 155 "GET /orgs/{org}/events", 156 "GET /orgs/{org}/failed_invitations", 157 "GET /orgs/{org}/hooks", 158 "GET /orgs/{org}/hooks/{hook_id}/deliveries", 159 "GET /orgs/{org}/installations", 160 "GET /orgs/{org}/invitations", 161 "GET /orgs/{org}/invitations/{invitation_id}/teams", 162 "GET /orgs/{org}/issues", 163 "GET /orgs/{org}/members", 164 "GET /orgs/{org}/migrations", 165 "GET /orgs/{org}/migrations/{migration_id}/repositories", 166 "GET /orgs/{org}/outside_collaborators", 167 "GET /orgs/{org}/packages", 168 "GET /orgs/{org}/projects", 169 "GET /orgs/{org}/public_members", 170 "GET /orgs/{org}/repos", 171 "GET /orgs/{org}/secret-scanning/alerts", 172 "GET /orgs/{org}/team-sync/groups", 173 "GET /orgs/{org}/teams", 174 "GET /orgs/{org}/teams/{team_slug}/discussions", 175 "GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments", 176 "GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions", 177 "GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions", 178 "GET /orgs/{org}/teams/{team_slug}/invitations", 179 "GET /orgs/{org}/teams/{team_slug}/members", 180 "GET /orgs/{org}/teams/{team_slug}/projects", 181 "GET /orgs/{org}/teams/{team_slug}/repos", 182 "GET /orgs/{org}/teams/{team_slug}/team-sync/group-mappings", 183 "GET /orgs/{org}/teams/{team_slug}/teams", 184 "GET /projects/columns/{column_id}/cards", 185 "GET /projects/{project_id}/collaborators", 186 "GET /projects/{project_id}/columns", 187 "GET /repos/{owner}/{repo}/actions/artifacts", 188 "GET /repos/{owner}/{repo}/actions/runners", 189 "GET /repos/{owner}/{repo}/actions/runners/downloads", 190 "GET /repos/{owner}/{repo}/actions/runs", 191 "GET /repos/{owner}/{repo}/actions/runs/{run_id}/artifacts", 192 "GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt_number}/jobs", 193 "GET /repos/{owner}/{repo}/actions/runs/{run_id}/jobs", 194 "GET /repos/{owner}/{repo}/actions/secrets", 195 "GET /repos/{owner}/{repo}/actions/workflows", 196 "GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}/runs", 197 "GET /repos/{owner}/{repo}/assignees", 198 "GET /repos/{owner}/{repo}/autolinks", 199 "GET /repos/{owner}/{repo}/branches", 200 "GET /repos/{owner}/{repo}/check-runs/{check_run_id}/annotations", 201 "GET /repos/{owner}/{repo}/check-suites/{check_suite_id}/check-runs", 202 "GET /repos/{owner}/{repo}/code-scanning/alerts", 203 "GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/instances", 204 "GET /repos/{owner}/{repo}/code-scanning/analyses", 205 "GET /repos/{owner}/{repo}/collaborators", 206 "GET /repos/{owner}/{repo}/comments", 207 "GET /repos/{owner}/{repo}/comments/{comment_id}/reactions", 208 "GET /repos/{owner}/{repo}/commits", 209 "GET /repos/{owner}/{repo}/commits/{commit_sha}/branches-where-head", 210 "GET /repos/{owner}/{repo}/commits/{commit_sha}/comments", 211 "GET /repos/{owner}/{repo}/commits/{commit_sha}/pulls", 212 "GET /repos/{owner}/{repo}/commits/{ref}/check-runs", 213 "GET /repos/{owner}/{repo}/commits/{ref}/check-suites", 214 "GET /repos/{owner}/{repo}/commits/{ref}/statuses", 215 "GET /repos/{owner}/{repo}/contributors", 216 "GET /repos/{owner}/{repo}/deployments", 217 "GET /repos/{owner}/{repo}/deployments/{deployment_id}/statuses", 218 "GET /repos/{owner}/{repo}/events", 219 "GET /repos/{owner}/{repo}/forks", 220 "GET /repos/{owner}/{repo}/git/matching-refs/{ref}", 221 "GET /repos/{owner}/{repo}/hooks", 222 "GET /repos/{owner}/{repo}/hooks/{hook_id}/deliveries", 223 "GET /repos/{owner}/{repo}/invitations", 224 "GET /repos/{owner}/{repo}/issues", 225 "GET /repos/{owner}/{repo}/issues/comments", 226 "GET /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions", 227 "GET /repos/{owner}/{repo}/issues/events", 228 "GET /repos/{owner}/{repo}/issues/{issue_number}/comments", 229 "GET /repos/{owner}/{repo}/issues/{issue_number}/events", 230 "GET /repos/{owner}/{repo}/issues/{issue_number}/labels", 231 "GET /repos/{owner}/{repo}/issues/{issue_number}/reactions", 232 "GET /repos/{owner}/{repo}/issues/{issue_number}/timeline", 233 "GET /repos/{owner}/{repo}/keys", 234 "GET /repos/{owner}/{repo}/labels", 235 "GET /repos/{owner}/{repo}/milestones", 236 "GET /repos/{owner}/{repo}/milestones/{milestone_number}/labels", 237 "GET /repos/{owner}/{repo}/notifications", 238 "GET /repos/{owner}/{repo}/pages/builds", 239 "GET /repos/{owner}/{repo}/projects", 240 "GET /repos/{owner}/{repo}/pulls", 241 "GET /repos/{owner}/{repo}/pulls/comments", 242 "GET /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions", 243 "GET /repos/{owner}/{repo}/pulls/{pull_number}/comments", 244 "GET /repos/{owner}/{repo}/pulls/{pull_number}/commits", 245 "GET /repos/{owner}/{repo}/pulls/{pull_number}/files", 246 "GET /repos/{owner}/{repo}/pulls/{pull_number}/requested_reviewers", 247 "GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews", 248 "GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/comments", 249 "GET /repos/{owner}/{repo}/releases", 250 "GET /repos/{owner}/{repo}/releases/{release_id}/assets", 251 "GET /repos/{owner}/{repo}/secret-scanning/alerts", 252 "GET /repos/{owner}/{repo}/stargazers", 253 "GET /repos/{owner}/{repo}/subscribers", 254 "GET /repos/{owner}/{repo}/tags", 255 "GET /repos/{owner}/{repo}/teams", 256 "GET /repositories", 257 "GET /repositories/{repository_id}/environments/{environment_name}/secrets", 258 "GET /scim/v2/enterprises/{enterprise}/Groups", 259 "GET /scim/v2/enterprises/{enterprise}/Users", 260 "GET /scim/v2/organizations/{org}/Users", 261 "GET /search/code", 262 "GET /search/commits", 263 "GET /search/issues", 264 "GET /search/labels", 265 "GET /search/repositories", 266 "GET /search/topics", 267 "GET /search/users", 268 "GET /teams/{team_id}/discussions", 269 "GET /teams/{team_id}/discussions/{discussion_number}/comments", 270 "GET /teams/{team_id}/discussions/{discussion_number}/comments/{comment_number}/reactions", 271 "GET /teams/{team_id}/discussions/{discussion_number}/reactions", 272 "GET /teams/{team_id}/invitations", 273 "GET /teams/{team_id}/members", 274 "GET /teams/{team_id}/projects", 275 "GET /teams/{team_id}/repos", 276 "GET /teams/{team_id}/team-sync/group-mappings", 277 "GET /teams/{team_id}/teams", 278 "GET /user/blocks", 279 "GET /user/emails", 280 "GET /user/followers", 281 "GET /user/following", 282 "GET /user/gpg_keys", 283 "GET /user/installations", 284 "GET /user/installations/{installation_id}/repositories", 285 "GET /user/issues", 286 "GET /user/keys", 287 "GET /user/marketplace_purchases", 288 "GET /user/marketplace_purchases/stubbed", 289 "GET /user/memberships/orgs", 290 "GET /user/migrations", 291 "GET /user/migrations/{migration_id}/repositories", 292 "GET /user/orgs", 293 "GET /user/packages", 294 "GET /user/public_emails", 295 "GET /user/repos", 296 "GET /user/repository_invitations", 297 "GET /user/starred", 298 "GET /user/subscriptions", 299 "GET /user/teams", 300 "GET /users", 301 "GET /users/{username}/events", 302 "GET /users/{username}/events/orgs/{org}", 303 "GET /users/{username}/events/public", 304 "GET /users/{username}/followers", 305 "GET /users/{username}/following", 306 "GET /users/{username}/gists", 307 "GET /users/{username}/gpg_keys", 308 "GET /users/{username}/keys", 309 "GET /users/{username}/orgs", 310 "GET /users/{username}/packages", 311 "GET /users/{username}/projects", 312 "GET /users/{username}/received_events", 313 "GET /users/{username}/received_events/public", 314 "GET /users/{username}/repos", 315 "GET /users/{username}/starred", 316 "GET /users/{username}/subscriptions", 317 ]; 318 319 function isPaginatingEndpoint(arg) { 320 if (typeof arg === "string") { 321 return paginatingEndpoints.includes(arg); 322 } 323 else { 324 return false; 325 } 326 } 327 328 /** 329 * @param octokit Octokit instance 330 * @param options Options passed to Octokit constructor 331 */ 332 function paginateRest(octokit) { 333 return { 334 paginate: Object.assign(paginate.bind(null, octokit), { 335 iterator: iterator.bind(null, octokit), 336 }), 337 }; 338 } 339 paginateRest.VERSION = VERSION; 340 341 export { composePaginateRest, isPaginatingEndpoint, paginateRest, paginatingEndpoints }; 342 //# sourceMappingURL=index.js.map