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