1import * as Layer from "effect/Layer";
2import { CredentialsStoreLive } from "../Auth/Credentials.ts";
3import { ProfileStoreLive } from "../Auth/Profile.ts";
4import * as Provider from "../Provider.ts";
5import { type GitHubAuthOptions, makeGitHubAuth } from "./AuthProvider.ts";
6import {
7 BranchProtection,
8 BranchProtectionProvider,
9} from "./BranchProtection.ts";
10import { Collaborator, CollaboratorProvider } from "./Collaborator.ts";
11import { Comment, CommentProvider } from "./Comment.ts";
12import * as Credentials from "./Credentials.ts";
13import { Environment, EnvironmentProvider } from "./Environment.ts";
14import { Label, LabelProvider } from "./Label.ts";
15import { Milestone, MilestoneProvider } from "./Milestone.ts";
16import { Issue, IssueProvider } from "./Issue.ts";
17import { PullRequest, PullRequestProvider } from "./PullRequest.ts";
18import { Release, ReleaseProvider } from "./Release.ts";
19import { Repository, RepositoryProvider } from "./Repository.ts";
20import { Ruleset, RulesetProvider } from "./Ruleset.ts";
21import { Secret, SecretProvider } from "./Secret.ts";
22import { TeamAccess, TeamAccessProvider } from "./TeamAccess.ts";
23import { Variable, VariableProvider } from "./Variable.ts";
24import { Webhook, WebhookProvider } from "./Webhook.ts";
25import { WikiPage, WikiPageProvider } from "./WikiPage.ts";
26
27export { GitHubCredentials } from "./Credentials.ts";
28
29export class Providers extends Provider.ProviderCollection<Providers>()(
30 "GitHub",
31) {}
32
33export type ProviderRequirements = Layer.Services<ReturnType<typeof providers>>;
34
35export 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 */
52export 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 );