Open History to see the last commit
1import * as Context from "effect/Context";
2import * as Effect from "effect/Effect";
3import * as Layer from "effect/Layer";
4import type { SourceControlProviderKind } from "@t3tools/contracts";
5
6import * as BuiltInDrivers from "../sourceControl/builtInDrivers.ts";
7import type { PullRequestProviderApi } from "@t3tools/source-control-core/server/PullRequestProvider";
8
9export class PullRequestProviderRegistry extends Context.Service<
10 PullRequestProviderRegistry,
11 {
12 readonly get: (kind: SourceControlProviderKind) => PullRequestProviderApi | null;
13 readonly kinds: ReadonlyArray<SourceControlProviderKind>;
14 }
15>()("t3/pullRequest/PullRequestProviderRegistry") {}
16
17export function fromProviders(
18 providers: ReadonlyArray<PullRequestProviderApi>,
19): PullRequestProviderRegistry["Service"] {
20 const byKind = new Map(providers.map((provider) => [provider.kind, provider]));
21 return {
22 get: (kind) => byKind.get(kind) ?? null,
23 kinds: providers.map((provider) => provider.kind),
24 };
25}
26
27/** @public */
28export const make = Effect.gen(function* () {
29 const drivers = yield* BuiltInDrivers.SourceControlDrivers;
30 return fromProviders(drivers.flatMap(({ instance }) => instance.pullRequests ?? []));
31});
32
33export const layer = Layer.effect(PullRequestProviderRegistry, make).pipe(
34 Layer.provide(BuiltInDrivers.layer),
35);