@remcostoeten/fync
Version:
A unified TypeScript library for easy access to popular APIs (GitHub, Spotify, GitLab, etc.)
213 lines (212 loc) • 6.79 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.GitHub = GitHub;
var _githubClient = require("./services/github-client");
/**
* Creates a new GitHub API client
*
* @param config - Configuration for the GitHub client
* @param config.token - GitHub personal access token or OAuth token (required)
* @param config.baseUrl - Custom GitHub API URL (default: https://api.github.com)
* @param config.cache - Enable response caching (default: false)
* @param config.cacheTTL - Cache time-to-live in milliseconds (default: 300000)
* @param config.timeout - Request timeout in milliseconds (default: 30000)
*
* @returns GitHub client instance with access to users, repositories, organizations, and more
*
* @example
* ```typescript
* const github = GitHub({
* token: process.env.GITHUB_TOKEN,
* cache: true
* });
*
* // Get user information
* const user = await github.user('octocat').get();
*
* // Get repository details
* const repo = await github.repo('facebook', 'react').get();
*
* // Search repositories
* const results = await github.search.repositories('typescript');
*
* // Get current user's notifications
* const notifications = await github.notifications.get();
* ```
*/
function GitHub(config) {
const client = (0, _githubClient.createGitHubClient)(config);
function createUserClient(username) {
const userBase = client.users[username];
return {
get: () => userBase.get(),
repos: userBase.repos,
gists: userBase.gists,
followers: userBase.followers,
following: userBase.following,
starred: userBase.starred,
subscriptions: userBase.subscriptions,
orgs: userBase.orgs,
events: userBase.events,
received_events: userBase.received_events,
chain: userBase
};
}
function createRepoClient(owner, repo) {
const repoBase = client.repos[owner][repo];
return {
get: () => repoBase.get(),
branches: repoBase.branches,
commits: repoBase.commits,
contents: repoBase.contents,
contributors: repoBase.contributors,
deployments: repoBase.deployments,
forks: repoBase.forks,
issues: repoBase.issues,
pulls: repoBase.pulls,
releases: repoBase.releases,
tags: repoBase.tags,
topics: repoBase.topics,
labels: repoBase.labels,
milestones: repoBase.milestones,
// Enhanced typed methods for common operations
getIssues: options => repoBase.issues.get(options),
getIssue: issueNumber => repoBase.issues[issueNumber].get(),
getIssueComments: (issueNumber, options) => repoBase.issues[issueNumber].comments.get(options),
getIssueEvents: (issueNumber, options) => repoBase.issues[issueNumber].events.get(options),
getPulls: options => repoBase.pulls.get(options),
getPull: pullNumber => repoBase.pulls[pullNumber].get(),
getPullReviews: (pullNumber, options) => repoBase.pulls[pullNumber].reviews.get(options),
getPullComments: (pullNumber, options) => repoBase.pulls[pullNumber].comments.get(options),
getReleases: options => repoBase.releases.get(options),
getRelease: releaseId => repoBase.releases[releaseId].get(),
getLatestRelease: () => repoBase.releases.latest.get(),
getReleaseAssets: releaseId => repoBase.releases[releaseId].assets.get(),
getTags: options => repoBase.tags.get(options),
getLabels: options => repoBase.labels.get(options),
getMilestones: options => repoBase.milestones.get(options),
// Actions and workflows
actions: {
workflows: {
list: options => repoBase.actions.workflows.get(options),
get: workflowId => repoBase.actions.workflows[workflowId].get(),
runs: (workflowId, options) => repoBase.actions.workflows[workflowId].runs.get(options),
jobs: (runId, options) => repoBase.actions.runs[runId].jobs.get(options)
},
runs: {
list: options => repoBase.actions.runs.get(options),
get: runId => repoBase.actions.runs[runId].get(),
jobs: (runId, options) => repoBase.actions.runs[runId].jobs.get(options)
},
secrets: {
get: options => repoBase.actions.secrets.get(options)
}
},
chain: repoBase
};
}
function createOrgClient(orgName) {
const orgBase = client.orgs[orgName];
return {
get: () => orgBase.get(),
repos: orgBase.repos,
members: orgBase.members,
teams: orgBase.teams,
events: orgBase.events,
chain: orgBase
};
}
function createGistClient(gistId) {
const gistBase = client.gists[gistId];
return {
get: () => gistBase.get(),
comments: gistBase.comments,
commits: gistBase.commits,
forks: gistBase.forks,
star: gistBase.star,
chain: gistBase
};
}
const searchClient = {
repositories: (query, options) => client.search.repositories.get({
...options,
params: {
...options?.params,
q: query
}
}),
users: (query, options) => client.search.users.get({
...options,
params: {
...options?.params,
q: query
}
}),
issues: (query, options) => client.search.issues.get({
...options,
params: {
...options?.params,
q: query
}
}),
code: (query, options) => client.search.code.get({
...options,
params: {
...options?.params,
q: query
}
}),
commits: (query, options) => client.search.commits.get({
...options,
params: {
...options?.params,
q: query
}
}),
topics: (query, options) => client.search.topics.get({
...options,
params: {
...options?.params,
q: query
}
}),
labels: (query, options) => client.search.labels.get({
...options,
params: {
...options?.params,
q: query
}
})
};
const authenticatedUserClient = {
get: () => client.user.get(),
repos: client.user.repos,
gists: client.user.gists,
followers: client.user.followers,
following: client.user.following,
starred: client.user.starred,
subscriptions: client.user.subscriptions,
orgs: client.user.orgs,
issues: client.user.issues,
chain: client.user
};
const rateLimitClient = {
get: () => client.rate_limit.get()
};
const notificationsClient = {
get: options => client.notifications.get(options)
};
return {
api: client,
user: createUserClient,
repo: createRepoClient,
org: createOrgClient,
gist: createGistClient,
search: searchClient,
me: authenticatedUserClient,
rateLimit: rateLimitClient,
notifications: notificationsClient
};
}