diff --git a/src/get-github-repositories.mjs b/src/get-github-repositories.mjs index d80d3c5..5106088 100644 --- a/src/get-github-repositories.mjs +++ b/src/get-github-repositories.mjs @@ -1,13 +1,33 @@ async function getRepositories(octokit, mirrorOptions) { - const repos = await octokit - .paginate("GET /users/:username/repos", { username: "jaedle" }) + const publicRepositories = await fetchPublicRepositories( + octokit, + mirrorOptions.username, + ); + const privateRepos = mirrorOptions.privateRepositories + ? await fetchPrivateRepositories(octokit) + : []; + const repos = [...publicRepositories, ...privateRepos]; + + return mirrorOptions.skipForks ? withoutForks(repos) : repos; +} + +async function fetchPublicRepositories(octokit, username) { + return octokit + .paginate("GET /users/:username/repos", { username }) .then(toRepositoryList); +} - if (mirrorOptions.skipForks) { - return repos.filter((repo) => !repo.fork); - } +async function fetchPrivateRepositories(octokit) { + return octokit + .paginate("GET /user/repos", { + affiliation: "owner", + visibility: "private", + }) + .then(toRepositoryList); +} - return repos; +function withoutForks(repositories) { + return repositories.filter((repo) => !repo.fork); } function toRepositoryList(repositories) { diff --git a/src/get-github-repositories.spec.js b/src/get-github-repositories.spec.js index 8c5cf7a..931af57 100644 --- a/src/get-github-repositories.spec.js +++ b/src/get-github-repositories.spec.js @@ -79,4 +79,86 @@ describe("get-github-repositories", () => { { name: "repo3", url: "clone-url-of-repo3", private: false, fork: false }, ]); }); + + it("includes private repositories for user", async () => { + const moctokit = new Moctokit(); + moctokit.rest.repos.listForUser({ username: "jaedle" }).reply({ + status: 200, + data: [ + { + name: "public-repo-1", + clone_url: "clone-url-of-public-repo-1", + private: false, + fork: false, + }, + { + name: "public-repo-2", + clone_url: "clone-url-of-public-repo-2", + private: false, + fork: false, + }, + ], + }); + + moctokit.rest.repos + .listForAuthenticatedUser({ + affiliation: "owner", + visibility: "private", + }) + .reply({ + status: 200, + data: [ + { + name: "private-repo-1", + clone_url: "clone-url-of-private-repo-1", + private: true, + fork: false, + }, + { + name: "private-repo-2", + clone_url: "clone-url-of-private-repo-2", + private: true, + fork: false, + }, + ], + }); + + const result = await get( + new Octokit({ + auth: "a-github-token", + }), + { + username: "jaedle", + privateRepositories: true, + skipForks: false, + }, + ); + + expect(result).toEqual([ + { + name: "public-repo-1", + url: "clone-url-of-public-repo-1", + private: false, + fork: false, + }, + { + name: "public-repo-2", + url: "clone-url-of-public-repo-2", + private: false, + fork: false, + }, + { + name: "private-repo-1", + url: "clone-url-of-private-repo-1", + private: true, + fork: false, + }, + { + name: "private-repo-2", + url: "clone-url-of-private-repo-2", + private: true, + fork: false, + }, + ]); + }); });