Skip to content

Commit

Permalink
feat: paginatingEndpoints and isPaginatingEndpoint (#283)
Browse files Browse the repository at this point in the history
  • Loading branch information
ptomulik authored Mar 10, 2021
1 parent c6a2c02 commit 0db1a8a
Show file tree
Hide file tree
Showing 6 changed files with 268 additions and 2 deletions.
11 changes: 10 additions & 1 deletion scripts/update-endpoints/typescript.js
Original file line number Diff line number Diff line change
Expand Up @@ -81,14 +81,23 @@ function endpointToTypes(endpoint) {
`;
}

function endpointToKey(endpoint) {
return `"GET ${endpoint.url}"`;
}

writeFileSync(
"./src/generated/paginating-endpoints.ts",
prettier.format(
`import { Endpoints } from "@octokit/types";
export interface PaginatingEndpoints {
${sortEndpoints(endpoints).map(endpointToTypes).join("\n\n")}
}`,
}
export const paginatingEndpoints: (keyof PaginatingEndpoints)[] = [
${sortEndpoints(endpoints).map(endpointToKey).join(",\n")}
]
`,
{
parser: "typescript",
}
Expand Down
192 changes: 192 additions & 0 deletions src/generated/paginating-endpoints.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1597,3 +1597,195 @@ export interface PaginatingEndpoints {
response: Endpoints["GET /users/{username}/subscriptions"]["response"];
};
}

export const paginatingEndpoints: (keyof PaginatingEndpoints)[] = [
"GET /app/installations",
"GET /applications/grants",
"GET /authorizations",
"GET /enterprises/{enterprise}/actions/permissions/organizations",
"GET /enterprises/{enterprise}/actions/runner-groups",
"GET /enterprises/{enterprise}/actions/runner-groups/{runner_group_id}/organizations",
"GET /enterprises/{enterprise}/actions/runner-groups/{runner_group_id}/runners",
"GET /enterprises/{enterprise}/actions/runners",
"GET /enterprises/{enterprise}/actions/runners/downloads",
"GET /events",
"GET /gists",
"GET /gists/public",
"GET /gists/starred",
"GET /gists/{gist_id}/comments",
"GET /gists/{gist_id}/commits",
"GET /gists/{gist_id}/forks",
"GET /installation/repositories",
"GET /issues",
"GET /marketplace_listing/plans",
"GET /marketplace_listing/plans/{plan_id}/accounts",
"GET /marketplace_listing/stubbed/plans",
"GET /marketplace_listing/stubbed/plans/{plan_id}/accounts",
"GET /networks/{owner}/{repo}/events",
"GET /notifications",
"GET /organizations",
"GET /orgs/{org}/actions/permissions/repositories",
"GET /orgs/{org}/actions/runner-groups",
"GET /orgs/{org}/actions/runner-groups/{runner_group_id}/repositories",
"GET /orgs/{org}/actions/runner-groups/{runner_group_id}/runners",
"GET /orgs/{org}/actions/runners",
"GET /orgs/{org}/actions/runners/downloads",
"GET /orgs/{org}/actions/secrets",
"GET /orgs/{org}/actions/secrets/{secret_name}/repositories",
"GET /orgs/{org}/blocks",
"GET /orgs/{org}/credential-authorizations",
"GET /orgs/{org}/events",
"GET /orgs/{org}/failed_invitations",
"GET /orgs/{org}/hooks",
"GET /orgs/{org}/installations",
"GET /orgs/{org}/invitations",
"GET /orgs/{org}/invitations/{invitation_id}/teams",
"GET /orgs/{org}/issues",
"GET /orgs/{org}/members",
"GET /orgs/{org}/migrations",
"GET /orgs/{org}/migrations/{migration_id}/repositories",
"GET /orgs/{org}/outside_collaborators",
"GET /orgs/{org}/projects",
"GET /orgs/{org}/public_members",
"GET /orgs/{org}/repos",
"GET /orgs/{org}/team-sync/groups",
"GET /orgs/{org}/teams",
"GET /orgs/{org}/teams/{team_slug}/discussions",
"GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments",
"GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions",
"GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions",
"GET /orgs/{org}/teams/{team_slug}/invitations",
"GET /orgs/{org}/teams/{team_slug}/members",
"GET /orgs/{org}/teams/{team_slug}/projects",
"GET /orgs/{org}/teams/{team_slug}/repos",
"GET /orgs/{org}/teams/{team_slug}/team-sync/group-mappings",
"GET /orgs/{org}/teams/{team_slug}/teams",
"GET /projects/columns/{column_id}/cards",
"GET /projects/{project_id}/collaborators",
"GET /projects/{project_id}/columns",
"GET /repos/{owner}/{repo}/actions/artifacts",
"GET /repos/{owner}/{repo}/actions/runners",
"GET /repos/{owner}/{repo}/actions/runners/downloads",
"GET /repos/{owner}/{repo}/actions/runs",
"GET /repos/{owner}/{repo}/actions/runs/{run_id}/artifacts",
"GET /repos/{owner}/{repo}/actions/runs/{run_id}/jobs",
"GET /repos/{owner}/{repo}/actions/secrets",
"GET /repos/{owner}/{repo}/actions/workflows",
"GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}/runs",
"GET /repos/{owner}/{repo}/assignees",
"GET /repos/{owner}/{repo}/branches",
"GET /repos/{owner}/{repo}/check-runs/{check_run_id}/annotations",
"GET /repos/{owner}/{repo}/check-suites/{check_suite_id}/check-runs",
"GET /repos/{owner}/{repo}/code-scanning/alerts",
"GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/instances",
"GET /repos/{owner}/{repo}/code-scanning/analyses",
"GET /repos/{owner}/{repo}/collaborators",
"GET /repos/{owner}/{repo}/comments",
"GET /repos/{owner}/{repo}/comments/{comment_id}/reactions",
"GET /repos/{owner}/{repo}/commits",
"GET /repos/{owner}/{repo}/commits/{commit_sha}/branches-where-head",
"GET /repos/{owner}/{repo}/commits/{commit_sha}/comments",
"GET /repos/{owner}/{repo}/commits/{commit_sha}/pulls",
"GET /repos/{owner}/{repo}/commits/{ref}/check-runs",
"GET /repos/{owner}/{repo}/commits/{ref}/check-suites",
"GET /repos/{owner}/{repo}/commits/{ref}/statuses",
"GET /repos/{owner}/{repo}/contributors",
"GET /repos/{owner}/{repo}/deployments",
"GET /repos/{owner}/{repo}/deployments/{deployment_id}/statuses",
"GET /repos/{owner}/{repo}/events",
"GET /repos/{owner}/{repo}/forks",
"GET /repos/{owner}/{repo}/git/matching-refs/{ref}",
"GET /repos/{owner}/{repo}/hooks",
"GET /repos/{owner}/{repo}/invitations",
"GET /repos/{owner}/{repo}/issues",
"GET /repos/{owner}/{repo}/issues/comments",
"GET /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions",
"GET /repos/{owner}/{repo}/issues/events",
"GET /repos/{owner}/{repo}/issues/{issue_number}/comments",
"GET /repos/{owner}/{repo}/issues/{issue_number}/events",
"GET /repos/{owner}/{repo}/issues/{issue_number}/labels",
"GET /repos/{owner}/{repo}/issues/{issue_number}/reactions",
"GET /repos/{owner}/{repo}/issues/{issue_number}/timeline",
"GET /repos/{owner}/{repo}/keys",
"GET /repos/{owner}/{repo}/labels",
"GET /repos/{owner}/{repo}/milestones",
"GET /repos/{owner}/{repo}/milestones/{milestone_number}/labels",
"GET /repos/{owner}/{repo}/notifications",
"GET /repos/{owner}/{repo}/pages/builds",
"GET /repos/{owner}/{repo}/projects",
"GET /repos/{owner}/{repo}/pulls",
"GET /repos/{owner}/{repo}/pulls/comments",
"GET /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions",
"GET /repos/{owner}/{repo}/pulls/{pull_number}/comments",
"GET /repos/{owner}/{repo}/pulls/{pull_number}/commits",
"GET /repos/{owner}/{repo}/pulls/{pull_number}/files",
"GET /repos/{owner}/{repo}/pulls/{pull_number}/requested_reviewers",
"GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews",
"GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/comments",
"GET /repos/{owner}/{repo}/releases",
"GET /repos/{owner}/{repo}/releases/{release_id}/assets",
"GET /repos/{owner}/{repo}/secret-scanning/alerts",
"GET /repos/{owner}/{repo}/stargazers",
"GET /repos/{owner}/{repo}/subscribers",
"GET /repos/{owner}/{repo}/tags",
"GET /repos/{owner}/{repo}/teams",
"GET /repositories",
"GET /repositories/{repository_id}/environments/{environment_name}/secrets",
"GET /scim/v2/enterprises/{enterprise}/Groups",
"GET /scim/v2/enterprises/{enterprise}/Users",
"GET /scim/v2/organizations/{org}/Users",
"GET /search/code",
"GET /search/commits",
"GET /search/issues",
"GET /search/labels",
"GET /search/repositories",
"GET /search/topics",
"GET /search/users",
"GET /teams/{team_id}/discussions",
"GET /teams/{team_id}/discussions/{discussion_number}/comments",
"GET /teams/{team_id}/discussions/{discussion_number}/comments/{comment_number}/reactions",
"GET /teams/{team_id}/discussions/{discussion_number}/reactions",
"GET /teams/{team_id}/invitations",
"GET /teams/{team_id}/members",
"GET /teams/{team_id}/projects",
"GET /teams/{team_id}/repos",
"GET /teams/{team_id}/team-sync/group-mappings",
"GET /teams/{team_id}/teams",
"GET /user/blocks",
"GET /user/emails",
"GET /user/followers",
"GET /user/following",
"GET /user/gpg_keys",
"GET /user/installations",
"GET /user/installations/{installation_id}/repositories",
"GET /user/issues",
"GET /user/keys",
"GET /user/marketplace_purchases",
"GET /user/marketplace_purchases/stubbed",
"GET /user/memberships/orgs",
"GET /user/migrations",
"GET /user/migrations/{migration_id}/repositories",
"GET /user/orgs",
"GET /user/public_emails",
"GET /user/repos",
"GET /user/repository_invitations",
"GET /user/starred",
"GET /user/subscriptions",
"GET /user/teams",
"GET /users",
"GET /users/{username}/events",
"GET /users/{username}/events/orgs/{org}",
"GET /users/{username}/events/public",
"GET /users/{username}/followers",
"GET /users/{username}/following",
"GET /users/{username}/gists",
"GET /users/{username}/gpg_keys",
"GET /users/{username}/keys",
"GET /users/{username}/orgs",
"GET /users/{username}/projects",
"GET /users/{username}/received_events",
"GET /users/{username}/received_events/public",
"GET /users/{username}/repos",
"GET /users/{username}/starred",
"GET /users/{username}/subscriptions",
];
4 changes: 4 additions & 0 deletions src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,10 @@ import { PaginateInterface } from "./types";
export { PaginateInterface } from "./types";
export { PaginatingEndpoints } from "./types";
export { composePaginateRest } from "./compose-paginate";
export {
isPaginatingEndpoint,
paginatingEndpoints,
} from "./paginating-endpoints";

/**
* @param octokit Octokit instance
Expand Down
16 changes: 16 additions & 0 deletions src/paginating-endpoints.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import {
PaginatingEndpoints,
paginatingEndpoints,
} from "./generated/paginating-endpoints";

export { paginatingEndpoints } from "./generated/paginating-endpoints";

export function isPaginatingEndpoint(
arg: unknown
): arg is keyof PaginatingEndpoints {
if (typeof arg === "string") {
return paginatingEndpoints.includes(arg as keyof PaginatingEndpoints);
} else {
return false;
}
}
28 changes: 28 additions & 0 deletions test/paginating-endpoints.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
import { paginatingEndpoints, isPaginatingEndpoint } from "../src";

describe("paginating endpoints", () => {
describe.each(paginatingEndpoints.map((arg) => [arg]))(
"isPaginatingEndpoint(%p)",
(arg) => {
it("returns true", () => {
expect.assertions(1);
expect(isPaginatingEndpoint(arg)).toBe(true);
});
}
);

describe.each([
["GET /unknown/url"],
["a string, but not an endpoint"],
[123],
[null],
[undefined],
[false],
[true],
])("isPaginatingEndpoint(%p)", (arg) => {
it("returns false", () => {
expect.assertions(1);
expect(isPaginatingEndpoint(arg)).toBe(false);
});
});
});
19 changes: 18 additions & 1 deletion test/smoke.test.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,11 @@
import { Octokit } from "@octokit/core";

import { paginateRest, composePaginateRest } from "../src";
import {
paginateRest,
composePaginateRest,
isPaginatingEndpoint,
paginatingEndpoints,
} from "../src";

describe("Smoke test", () => {
it("paginateRest", () => {
Expand All @@ -15,6 +20,18 @@ describe("Smoke test", () => {
expect(composePaginateRest).toBeInstanceOf(Function);
});

it("isPaginatingEndpoint", () => {
expect(isPaginatingEndpoint("GET /repos/{owner}/{repo}/releases")).toBe(
true
);
expect(isPaginatingEndpoint(123)).toBe(false);
});

it("paginatingEndpoints", () => {
expect(paginatingEndpoints).toBeInstanceOf(Array);
expect(paginatingEndpoints).toContain("GET /repos/{owner}/{repo}/releases");
});

it("Loads plugin", () => {
const TestOctokit = Octokit.plugin(paginateRest);
const testOctokit = new TestOctokit();
Expand Down

0 comments on commit 0db1a8a

Please sign in to comment.