| 1 | import * as Layer from "effect/Layer"; |
| 2 | import { CredentialsStoreLive } from "../Auth/Credentials.ts"; |
| 3 | import { ProfileStoreLive } from "../Auth/Profile.ts"; |
| 4 | import * as Provider from "../Provider.ts"; |
| 5 | import { type GitHubAuthOptions, makeGitHubAuth } from "./AuthProvider.ts"; |
| 6 | import { |
| 7 | BranchProtection, |
| 8 | BranchProtectionProvider, |
| 9 | } from "./BranchProtection.ts"; |
| 10 | import { Collaborator, CollaboratorProvider } from "./Collaborator.ts"; |
| 11 | import { Comment, CommentProvider } from "./Comment.ts"; |
| 12 | import * as Credentials from "./Credentials.ts"; |
| 13 | import { Environment, EnvironmentProvider } from "./Environment.ts"; |
| 14 | import { Label, LabelProvider } from "./Label.ts"; |
| 15 | import { Milestone, MilestoneProvider } from "./Milestone.ts"; |
| 16 | import { Issue, IssueProvider } from "./Issue.ts"; |
| 17 | import { PullRequest, PullRequestProvider } from "./PullRequest.ts"; |
| 18 | import { Release, ReleaseProvider } from "./Release.ts"; |
| 19 | import { Repository, RepositoryProvider } from "./Repository.ts"; |
| 20 | import { Ruleset, RulesetProvider } from "./Ruleset.ts"; |
| 21 | import { Secret, SecretProvider } from "./Secret.ts"; |
| 22 | import { TeamAccess, TeamAccessProvider } from "./TeamAccess.ts"; |
| 23 | import { Variable, VariableProvider } from "./Variable.ts"; |
| 24 | import { Webhook, WebhookProvider } from "./Webhook.ts"; |
| 25 | import { WikiPage, WikiPageProvider } from "./WikiPage.ts"; |
| 26 | |
| 27 | export { GitHubCredentials } from "./Credentials.ts"; |
| 28 | |
| 29 | export class Providers extends Provider.ProviderCollection<Providers>()( |
| 30 | "GitHub", |
| 31 | ) {} |
| 32 | |
| 33 | export type ProviderRequirements = Layer.Services<ReturnType<typeof providers>>; |
| 34 | |
| 35 | export interface ProvidersOptions extends GitHubAuthOptions {} |
| 36 | |
| 37 | /** |
| 38 | * GitHub resource providers and the GitHub AuthProvider discovered by the CLI. |
| 39 | * |
| 40 | * Pass `baseUrl` to pin every GitHub resource to a GitHub Enterprise host |
| 41 | * without relying on the auth provider's configuration: |
| 42 | * |
| 43 | * ```typescript |
| 44 | * providers: GitHub.providers({ baseUrl: "github.example.com" }) |
| 45 | * ``` |
| 46 | * |
| 47 | * The auth provider receives the same value, so the configure flow skips the |
| 48 | * host prompt and authenticates against the pinned host (`gh auth token |
| 49 | * --hostname`, enterprise token env vars). Individual resources can still |
| 50 | * override the host per-resource via their own `baseUrl` prop. |
| 51 | */ |
| 52 | export const providers = (options?: ProvidersOptions) => |
| 53 | Layer.effect( |
| 54 | Providers, |
| 55 | Provider.collection([ |
| 56 | BranchProtection, |
| 57 | Collaborator, |
| 58 | Comment, |
| 59 | Environment, |
| 60 | Label, |
| 61 | Milestone, |
| 62 | Issue, |
| 63 | PullRequest, |
| 64 | Release, |
| 65 | Repository, |
| 66 | Ruleset, |
| 67 | Secret, |
| 68 | TeamAccess, |
| 69 | Variable, |
| 70 | Webhook, |
| 71 | WikiPage, |
| 72 | ]), |
| 73 | ).pipe( |
| 74 | Layer.provide( |
| 75 | Layer.mergeAll( |
| 76 | BranchProtectionProvider(), |
| 77 | CollaboratorProvider(), |
| 78 | CommentProvider(), |
| 79 | EnvironmentProvider(), |
| 80 | LabelProvider(), |
| 81 | MilestoneProvider(), |
| 82 | IssueProvider(), |
| 83 | PullRequestProvider(), |
| 84 | ReleaseProvider(), |
| 85 | RepositoryProvider(), |
| 86 | RulesetProvider(), |
| 87 | SecretProvider(), |
| 88 | TeamAccessProvider(), |
| 89 | VariableProvider(), |
| 90 | WebhookProvider(), |
| 91 | WikiPageProvider(), |
| 92 | ), |
| 93 | ), |
| 94 | Layer.provideMerge(Credentials.fromAuthProvider(options)), |
| 95 | Layer.provideMerge(makeGitHubAuth(options)), |
| 96 | Layer.provideMerge(ProfileStoreLive), |
| 97 | Layer.provideMerge(CredentialsStoreLive), |
| 98 | Layer.orDie, |
| 99 | ); |