github.com/nektos/act@v0.2.63/pkg/runner/testdata/actions/node12/node_modules/@octokit/plugin-paginate-rest/dist-web/index.js (about) 1 const VERSION = "2.21.3"; 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}/audit-log", 129 "GET /enterprises/{enterprise}/secret-scanning/alerts", 130 "GET /enterprises/{enterprise}/settings/billing/advanced-security", 131 "GET /events", 132 "GET /gists", 133 "GET /gists/public", 134 "GET /gists/starred", 135 "GET /gists/{gist_id}/comments", 136 "GET /gists/{gist_id}/commits", 137 "GET /gists/{gist_id}/forks", 138 "GET /installation/repositories", 139 "GET /issues", 140 "GET /licenses", 141 "GET /marketplace_listing/plans", 142 "GET /marketplace_listing/plans/{plan_id}/accounts", 143 "GET /marketplace_listing/stubbed/plans", 144 "GET /marketplace_listing/stubbed/plans/{plan_id}/accounts", 145 "GET /networks/{owner}/{repo}/events", 146 "GET /notifications", 147 "GET /organizations", 148 "GET /orgs/{org}/actions/cache/usage-by-repository", 149 "GET /orgs/{org}/actions/permissions/repositories", 150 "GET /orgs/{org}/actions/runner-groups", 151 "GET /orgs/{org}/actions/runner-groups/{runner_group_id}/repositories", 152 "GET /orgs/{org}/actions/runner-groups/{runner_group_id}/runners", 153 "GET /orgs/{org}/actions/runners", 154 "GET /orgs/{org}/actions/secrets", 155 "GET /orgs/{org}/actions/secrets/{secret_name}/repositories", 156 "GET /orgs/{org}/audit-log", 157 "GET /orgs/{org}/blocks", 158 "GET /orgs/{org}/code-scanning/alerts", 159 "GET /orgs/{org}/codespaces", 160 "GET /orgs/{org}/credential-authorizations", 161 "GET /orgs/{org}/dependabot/secrets", 162 "GET /orgs/{org}/dependabot/secrets/{secret_name}/repositories", 163 "GET /orgs/{org}/events", 164 "GET /orgs/{org}/external-groups", 165 "GET /orgs/{org}/failed_invitations", 166 "GET /orgs/{org}/hooks", 167 "GET /orgs/{org}/hooks/{hook_id}/deliveries", 168 "GET /orgs/{org}/installations", 169 "GET /orgs/{org}/invitations", 170 "GET /orgs/{org}/invitations/{invitation_id}/teams", 171 "GET /orgs/{org}/issues", 172 "GET /orgs/{org}/members", 173 "GET /orgs/{org}/migrations", 174 "GET /orgs/{org}/migrations/{migration_id}/repositories", 175 "GET /orgs/{org}/outside_collaborators", 176 "GET /orgs/{org}/packages", 177 "GET /orgs/{org}/packages/{package_type}/{package_name}/versions", 178 "GET /orgs/{org}/projects", 179 "GET /orgs/{org}/public_members", 180 "GET /orgs/{org}/repos", 181 "GET /orgs/{org}/secret-scanning/alerts", 182 "GET /orgs/{org}/settings/billing/advanced-security", 183 "GET /orgs/{org}/team-sync/groups", 184 "GET /orgs/{org}/teams", 185 "GET /orgs/{org}/teams/{team_slug}/discussions", 186 "GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments", 187 "GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions", 188 "GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions", 189 "GET /orgs/{org}/teams/{team_slug}/invitations", 190 "GET /orgs/{org}/teams/{team_slug}/members", 191 "GET /orgs/{org}/teams/{team_slug}/projects", 192 "GET /orgs/{org}/teams/{team_slug}/repos", 193 "GET /orgs/{org}/teams/{team_slug}/teams", 194 "GET /projects/columns/{column_id}/cards", 195 "GET /projects/{project_id}/collaborators", 196 "GET /projects/{project_id}/columns", 197 "GET /repos/{owner}/{repo}/actions/artifacts", 198 "GET /repos/{owner}/{repo}/actions/caches", 199 "GET /repos/{owner}/{repo}/actions/runners", 200 "GET /repos/{owner}/{repo}/actions/runs", 201 "GET /repos/{owner}/{repo}/actions/runs/{run_id}/artifacts", 202 "GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt_number}/jobs", 203 "GET /repos/{owner}/{repo}/actions/runs/{run_id}/jobs", 204 "GET /repos/{owner}/{repo}/actions/secrets", 205 "GET /repos/{owner}/{repo}/actions/workflows", 206 "GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}/runs", 207 "GET /repos/{owner}/{repo}/assignees", 208 "GET /repos/{owner}/{repo}/branches", 209 "GET /repos/{owner}/{repo}/check-runs/{check_run_id}/annotations", 210 "GET /repos/{owner}/{repo}/check-suites/{check_suite_id}/check-runs", 211 "GET /repos/{owner}/{repo}/code-scanning/alerts", 212 "GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/instances", 213 "GET /repos/{owner}/{repo}/code-scanning/analyses", 214 "GET /repos/{owner}/{repo}/codespaces", 215 "GET /repos/{owner}/{repo}/codespaces/devcontainers", 216 "GET /repos/{owner}/{repo}/codespaces/secrets", 217 "GET /repos/{owner}/{repo}/collaborators", 218 "GET /repos/{owner}/{repo}/comments", 219 "GET /repos/{owner}/{repo}/comments/{comment_id}/reactions", 220 "GET /repos/{owner}/{repo}/commits", 221 "GET /repos/{owner}/{repo}/commits/{commit_sha}/comments", 222 "GET /repos/{owner}/{repo}/commits/{commit_sha}/pulls", 223 "GET /repos/{owner}/{repo}/commits/{ref}/check-runs", 224 "GET /repos/{owner}/{repo}/commits/{ref}/check-suites", 225 "GET /repos/{owner}/{repo}/commits/{ref}/status", 226 "GET /repos/{owner}/{repo}/commits/{ref}/statuses", 227 "GET /repos/{owner}/{repo}/contributors", 228 "GET /repos/{owner}/{repo}/dependabot/secrets", 229 "GET /repos/{owner}/{repo}/deployments", 230 "GET /repos/{owner}/{repo}/deployments/{deployment_id}/statuses", 231 "GET /repos/{owner}/{repo}/environments", 232 "GET /repos/{owner}/{repo}/events", 233 "GET /repos/{owner}/{repo}/forks", 234 "GET /repos/{owner}/{repo}/git/matching-refs/{ref}", 235 "GET /repos/{owner}/{repo}/hooks", 236 "GET /repos/{owner}/{repo}/hooks/{hook_id}/deliveries", 237 "GET /repos/{owner}/{repo}/invitations", 238 "GET /repos/{owner}/{repo}/issues", 239 "GET /repos/{owner}/{repo}/issues/comments", 240 "GET /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions", 241 "GET /repos/{owner}/{repo}/issues/events", 242 "GET /repos/{owner}/{repo}/issues/{issue_number}/comments", 243 "GET /repos/{owner}/{repo}/issues/{issue_number}/events", 244 "GET /repos/{owner}/{repo}/issues/{issue_number}/labels", 245 "GET /repos/{owner}/{repo}/issues/{issue_number}/reactions", 246 "GET /repos/{owner}/{repo}/issues/{issue_number}/timeline", 247 "GET /repos/{owner}/{repo}/keys", 248 "GET /repos/{owner}/{repo}/labels", 249 "GET /repos/{owner}/{repo}/milestones", 250 "GET /repos/{owner}/{repo}/milestones/{milestone_number}/labels", 251 "GET /repos/{owner}/{repo}/notifications", 252 "GET /repos/{owner}/{repo}/pages/builds", 253 "GET /repos/{owner}/{repo}/projects", 254 "GET /repos/{owner}/{repo}/pulls", 255 "GET /repos/{owner}/{repo}/pulls/comments", 256 "GET /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions", 257 "GET /repos/{owner}/{repo}/pulls/{pull_number}/comments", 258 "GET /repos/{owner}/{repo}/pulls/{pull_number}/commits", 259 "GET /repos/{owner}/{repo}/pulls/{pull_number}/files", 260 "GET /repos/{owner}/{repo}/pulls/{pull_number}/requested_reviewers", 261 "GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews", 262 "GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/comments", 263 "GET /repos/{owner}/{repo}/releases", 264 "GET /repos/{owner}/{repo}/releases/{release_id}/assets", 265 "GET /repos/{owner}/{repo}/releases/{release_id}/reactions", 266 "GET /repos/{owner}/{repo}/secret-scanning/alerts", 267 "GET /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}/locations", 268 "GET /repos/{owner}/{repo}/stargazers", 269 "GET /repos/{owner}/{repo}/subscribers", 270 "GET /repos/{owner}/{repo}/tags", 271 "GET /repos/{owner}/{repo}/teams", 272 "GET /repos/{owner}/{repo}/topics", 273 "GET /repositories", 274 "GET /repositories/{repository_id}/environments/{environment_name}/secrets", 275 "GET /search/code", 276 "GET /search/commits", 277 "GET /search/issues", 278 "GET /search/labels", 279 "GET /search/repositories", 280 "GET /search/topics", 281 "GET /search/users", 282 "GET /teams/{team_id}/discussions", 283 "GET /teams/{team_id}/discussions/{discussion_number}/comments", 284 "GET /teams/{team_id}/discussions/{discussion_number}/comments/{comment_number}/reactions", 285 "GET /teams/{team_id}/discussions/{discussion_number}/reactions", 286 "GET /teams/{team_id}/invitations", 287 "GET /teams/{team_id}/members", 288 "GET /teams/{team_id}/projects", 289 "GET /teams/{team_id}/repos", 290 "GET /teams/{team_id}/teams", 291 "GET /user/blocks", 292 "GET /user/codespaces", 293 "GET /user/codespaces/secrets", 294 "GET /user/emails", 295 "GET /user/followers", 296 "GET /user/following", 297 "GET /user/gpg_keys", 298 "GET /user/installations", 299 "GET /user/installations/{installation_id}/repositories", 300 "GET /user/issues", 301 "GET /user/keys", 302 "GET /user/marketplace_purchases", 303 "GET /user/marketplace_purchases/stubbed", 304 "GET /user/memberships/orgs", 305 "GET /user/migrations", 306 "GET /user/migrations/{migration_id}/repositories", 307 "GET /user/orgs", 308 "GET /user/packages", 309 "GET /user/packages/{package_type}/{package_name}/versions", 310 "GET /user/public_emails", 311 "GET /user/repos", 312 "GET /user/repository_invitations", 313 "GET /user/starred", 314 "GET /user/subscriptions", 315 "GET /user/teams", 316 "GET /users", 317 "GET /users/{username}/events", 318 "GET /users/{username}/events/orgs/{org}", 319 "GET /users/{username}/events/public", 320 "GET /users/{username}/followers", 321 "GET /users/{username}/following", 322 "GET /users/{username}/gists", 323 "GET /users/{username}/gpg_keys", 324 "GET /users/{username}/keys", 325 "GET /users/{username}/orgs", 326 "GET /users/{username}/packages", 327 "GET /users/{username}/projects", 328 "GET /users/{username}/received_events", 329 "GET /users/{username}/received_events/public", 330 "GET /users/{username}/repos", 331 "GET /users/{username}/starred", 332 "GET /users/{username}/subscriptions", 333 ]; 334 335 function isPaginatingEndpoint(arg) { 336 if (typeof arg === "string") { 337 return paginatingEndpoints.includes(arg); 338 } 339 else { 340 return false; 341 } 342 } 343 344 /** 345 * @param octokit Octokit instance 346 * @param options Options passed to Octokit constructor 347 */ 348 function paginateRest(octokit) { 349 return { 350 paginate: Object.assign(paginate.bind(null, octokit), { 351 iterator: iterator.bind(null, octokit), 352 }), 353 }; 354 } 355 paginateRest.VERSION = VERSION; 356 357 export { composePaginateRest, isPaginatingEndpoint, paginateRest, paginatingEndpoints }; 358 //# sourceMappingURL=index.js.map