authorgravatar for julius0216@outlook.comJulius Marminge <julius0216@outlook.com> 2026-09-08 01:11:10-07:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2026-09-08 01:11:10-07:00
log3b6ce931cc225b4b743daaa063e0bc9875555582
tree19c728a40a85c84e40314650bf99d29ddfd87c72
parent060c576f8922703725f0dbdd01443ed88ecc9baa
signature Signed by PGP key B5690EEEBB952194

refactor(server): classify source control exports (#10279)


22 files changed, 21 insertions(+), 28 deletions(-)

apps/server/src/pullRequest/AzureDevOpsPullRequestCli.ts+1
...@@ -261,6 +261,7 @@ function isReviewerName(value: string): boolean {...@@ -261,6 +261,7 @@ function isReviewerName(value: string): boolean {
261 return name.length > 0 && !name.startsWith("-");261 return name.length > 0 && !name.startsWith("-");
262}262}
263263
264/** @public Service construction is part of the canonical Effect module API. */
264export const make = Effect.gen(function* () {265export const make = Effect.gen(function* () {
265 const azure = yield* AzureDevOpsCli.AzureDevOpsCli;266 const azure = yield* AzureDevOpsCli.AzureDevOpsCli;
266267
apps/server/src/pullRequest/BitbucketPullRequestApi.ts+1
...@@ -378,6 +378,7 @@ function bitbucketReviewPosition(...@@ -378,6 +378,7 @@ function bitbucketReviewPosition(
378 }378 }
379}379}
380380
381/** @public Service construction is part of the canonical Effect module API. */
381export const make = Effect.gen(function* () {382export const make = Effect.gen(function* () {
382 const bitbucket = yield* BitbucketApi.BitbucketApi;383 const bitbucket = yield* BitbucketApi.BitbucketApi;
383384
apps/server/src/pullRequest/GitHubPullRequestCli.ts+2-1
...@@ -714,7 +714,7 @@ export class GitHubPullRequestCli extends Context.Service<...@@ -714,7 +714,7 @@ export class GitHubPullRequestCli extends Context.Service<
714 * The host is not read off the identity: it travels alongside it, because the identity a714 * The host is not read off the identity: it travels alongside it, because the identity a
715 * project records is the path below its host and never names the host itself.715 * project records is the path below its host and never names the host itself.
716 */716 */
717export function parseRepositorySelector(value: string): {717function parseRepositorySelector(value: string): {
718 readonly owner: string;718 readonly owner: string;
719 readonly name: string;719 readonly name: string;
720} {720} {
...@@ -980,6 +980,7 @@ function actionArgs(...@@ -980,6 +980,7 @@ function actionArgs(
980 }980 }
981}981}
982982
983/** @public Service construction is part of the canonical Effect module API. */
983export const make = Effect.gen(function* () {984export const make = Effect.gen(function* () {
984 const github = yield* GitHubCli.GitHubCli;985 const github = yield* GitHubCli.GitHubCli;
985 const graphQlBudget = yield* GitHubGraphQlBudget.GitHubGraphQlBudget;986 const graphQlBudget = yield* GitHubGraphQlBudget.GitHubGraphQlBudget;
apps/server/src/pullRequest/GitLabPullRequestCli.ts+1
...@@ -511,6 +511,7 @@ function actionArgs(...@@ -511,6 +511,7 @@ function actionArgs(
511 }511 }
512}512}
513513
514/** @public Service construction is part of the canonical Effect module API. */
514export const make = Effect.gen(function* () {515export const make = Effect.gen(function* () {
515 const gitlab = yield* GitLabCli.GitLabCli;516 const gitlab = yield* GitLabCli.GitLabCli;
516517
apps/server/src/pullRequest/PullRequestProviderRegistry.ts+2
...@@ -41,6 +41,8 @@ export function fromProviders(...@@ -41,6 +41,8 @@ export function fromProviders(
41/**41/**
42 * The hosts this build can read change requests from. A host with no entry here still shows up42 * The hosts this build can read change requests from. A host with no entry here still shows up
43 * in the provider list as unimplemented, so its projects are explained rather than missing.43 * in the provider list as unimplemented, so its projects are explained rather than missing.
44 *
45 * @public Service construction is part of the canonical Effect module API.
44 */46 */
45export const make = Effect.map(47export const make = Effect.map(
46 Effect.all([48 Effect.all([
apps/server/src/sourceControl/AzureDevOpsCli.ts+1-2
...@@ -203,8 +203,6 @@ export const AzureDevOpsCliError = Schema.Union([...@@ -203,8 +203,6 @@ export const AzureDevOpsCliError = Schema.Union([
203]);203]);
204export type AzureDevOpsCliError = typeof AzureDevOpsCliError.Type;204export type AzureDevOpsCliError = typeof AzureDevOpsCliError.Type;
205205
206export const isAzureDevOpsCliError = Schema.is(AzureDevOpsCliError);
207
208export interface AzureDevOpsRepositoryCloneUrls {206export interface AzureDevOpsRepositoryCloneUrls {
209 readonly nameWithOwner: string;207 readonly nameWithOwner: string;
210 readonly url: string;208 readonly url: string;
...@@ -352,6 +350,7 @@ function decodeAzureDevOpsJson<S extends Schema.Top>(...@@ -352,6 +350,7 @@ function decodeAzureDevOpsJson<S extends Schema.Top>(
352 );350 );
353}351}
354352
353/** @public Service construction is part of the canonical Effect module API. */
355export const make = Effect.gen(function* () {354export const make = Effect.gen(function* () {
356 const process = yield* VcsProcess.VcsProcess;355 const process = yield* VcsProcess.VcsProcess;
357356
apps/server/src/sourceControl/AzureDevOpsSourceControlProvider.ts-3
...@@ -1,5 +1,4 @@...@@ -1,5 +1,4 @@
1import * as Effect from "effect/Effect";1import * as Effect from "effect/Effect";
2import * as Layer from "effect/Layer";
3import { SourceControlProviderError, type ChangeRequest } from "@t3tools/contracts";2import { SourceControlProviderError, type ChangeRequest } from "@t3tools/contracts";
43
5import * as AzureDevOpsCli from "./AzureDevOpsCli.ts";4import * as AzureDevOpsCli from "./AzureDevOpsCli.ts";
...@@ -235,5 +234,3 @@ export const make = Effect.gen(function* () {...@@ -235,5 +234,3 @@ export const make = Effect.gen(function* () {
235 ),234 ),
236 });235 });
237});236});
238
239export const layer = Layer.effect(SourceControlProvider.SourceControlProvider, make);
apps/server/src/sourceControl/BitbucketApi.ts+2-1
...@@ -262,7 +262,7 @@ export const BitbucketApiError = Schema.Union([...@@ -262,7 +262,7 @@ export const BitbucketApiError = Schema.Union([
262 BitbucketCheckoutError,262 BitbucketCheckoutError,
263]);263]);
264export type BitbucketApiError = typeof BitbucketApiError.Type;264export type BitbucketApiError = typeof BitbucketApiError.Type;
265export const isBitbucketApiError = Schema.is(BitbucketApiError);265const isBitbucketApiError = Schema.is(BitbucketApiError);
266266
267const RawBitbucketRepositorySchema = Schema.Struct({267const RawBitbucketRepositorySchema = Schema.Struct({
268 full_name: TrimmedNonEmptyString,268 full_name: TrimmedNonEmptyString,
...@@ -606,6 +606,7 @@ function responseError(...@@ -606,6 +606,7 @@ function responseError(
606 });606 });
607}607}
608608
609/** @public Service construction is part of the canonical Effect module API. */
609export const make = Effect.gen(function* () {610export const make = Effect.gen(function* () {
610 const config = yield* BitbucketApiEnvConfig;611 const config = yield* BitbucketApiEnvConfig;
611 const httpClient = yield* HttpClient.HttpClient;612 const httpClient = yield* HttpClient.HttpClient;
apps/server/src/sourceControl/BitbucketSourceControlProvider.ts-3
...@@ -1,5 +1,4 @@...@@ -1,5 +1,4 @@
1import * as Effect from "effect/Effect";1import * as Effect from "effect/Effect";
2import * as Layer from "effect/Layer";
3import * as Option from "effect/Option";2import * as Option from "effect/Option";
4import { SourceControlProviderError, type ChangeRequest } from "@t3tools/contracts";3import { SourceControlProviderError, type ChangeRequest } from "@t3tools/contracts";
54
...@@ -186,8 +185,6 @@ export const make = Effect.gen(function* () {...@@ -186,8 +185,6 @@ export const make = Effect.gen(function* () {
186 });185 });
187});186});
188187
189export const layer = Layer.effect(SourceControlProvider.SourceControlProvider, make);
190
191export const makeDiscovery = Effect.gen(function* () {188export const makeDiscovery = Effect.gen(function* () {
192 const bitbucket = yield* BitbucketApi.BitbucketApi;189 const bitbucket = yield* BitbucketApi.BitbucketApi;
193190
apps/server/src/sourceControl/GitHubCli.ts+1
...@@ -338,6 +338,7 @@ function deriveRepositoryCloneUrlsFromCreateOutput(...@@ -338,6 +338,7 @@ function deriveRepositoryCloneUrlsFromCreateOutput(
338 };338 };
339}339}
340340
341/** @public Service construction is part of the canonical Effect module API. */
341export const make = Effect.gen(function* () {342export const make = Effect.gen(function* () {
342 const process = yield* VcsProcess.VcsProcess;343 const process = yield* VcsProcess.VcsProcess;
343344
apps/server/src/sourceControl/GitHubSourceControlProvider.ts-3
...@@ -1,6 +1,5 @@...@@ -1,6 +1,5 @@
1import * as DateTime from "effect/DateTime";1import * as DateTime from "effect/DateTime";
2import * as Effect from "effect/Effect";2import * as Effect from "effect/Effect";
3import * as Layer from "effect/Layer";
4import * as Option from "effect/Option";3import * as Option from "effect/Option";
5import * as Result from "effect/Result";4import * as Result from "effect/Result";
6import {5import {
...@@ -322,5 +321,3 @@ export const make = Effect.gen(function* () {...@@ -322,5 +321,3 @@ export const make = Effect.gen(function* () {
322 ),321 ),
323 });322 });
324});323});
325
326export const layer = Layer.effect(SourceControlProvider.SourceControlProvider, make);
apps/server/src/sourceControl/GitLabCli.ts+1-1
...@@ -237,7 +237,6 @@ export const GitLabCliError = Schema.Union([...@@ -237,7 +237,6 @@ export const GitLabCliError = Schema.Union([
237 GitLabNamespaceDecodeError,237 GitLabNamespaceDecodeError,
238]);238]);
239export type GitLabCliError = typeof GitLabCliError.Type;239export type GitLabCliError = typeof GitLabCliError.Type;
240export const isGitLabCliError = Schema.is(GitLabCliError);
241240
242export interface GitLabMergeRequestSummary {241export interface GitLabMergeRequestSummary {
243 readonly number: number;242 readonly number: number;
...@@ -409,6 +408,7 @@ function parseRepositoryPath(repository: string): {...@@ -409,6 +408,7 @@ function parseRepositoryPath(repository: string): {
409 return { namespacePath, projectPath };408 return { namespacePath, projectPath };
410}409}
411410
411/** @public Service construction is part of the canonical Effect module API. */
412export const make = Effect.gen(function* () {412export const make = Effect.gen(function* () {
413 const process = yield* VcsProcess.VcsProcess;413 const process = yield* VcsProcess.VcsProcess;
414414
apps/server/src/sourceControl/GitLabSourceControlProvider.ts-3
...@@ -1,5 +1,4 @@...@@ -1,5 +1,4 @@
1import * as Effect from "effect/Effect";1import * as Effect from "effect/Effect";
2import * as Layer from "effect/Layer";
3import * as Option from "effect/Option";2import * as Option from "effect/Option";
4import { SourceControlProviderError, type ChangeRequest } from "@t3tools/contracts";3import { SourceControlProviderError, type ChangeRequest } from "@t3tools/contracts";
54
...@@ -250,5 +249,3 @@ export const make = Effect.gen(function* () {...@@ -250,5 +249,3 @@ export const make = Effect.gen(function* () {
250 ),249 ),
251 });250 });
252});251});
253
254export const layer = Layer.effect(SourceControlProvider.SourceControlProvider, make);
apps/server/src/sourceControl/SourceControlDiscovery.ts+1
...@@ -64,6 +64,7 @@ export class SourceControlDiscovery extends Context.Service<...@@ -64,6 +64,7 @@ export class SourceControlDiscovery extends Context.Service<
64 }64 }
65>()("t3/sourceControl/SourceControlDiscovery") {}65>()("t3/sourceControl/SourceControlDiscovery") {}
6666
67/** @public Service construction is part of the canonical Effect module API. */
67export const make = Effect.gen(function* () {68export const make = Effect.gen(function* () {
68 const config = yield* ServerConfig;69 const config = yield* ServerConfig;
69 const process = yield* VcsProcess.VcsProcess;70 const process = yield* VcsProcess.VcsProcess;
apps/server/src/sourceControl/SourceControlProvider.ts+1-1
...@@ -61,7 +61,7 @@ export function parseSourceControlOwnerRef(...@@ -61,7 +61,7 @@ export function parseSourceControlOwnerRef(
61 return owner && refName ? { owner, refName } : undefined;61 return owner && refName ? { owner, refName } : undefined;
62}62}
6363
64export function normalizeSourceBranch(headSelector: string): string {64function normalizeSourceBranch(headSelector: string): string {
65 return parseSourceControlOwnerRef(headSelector)?.refName ?? headSelector.trim();65 return parseSourceControlOwnerRef(headSelector)?.refName ?? headSelector.trim();
66}66}
6767
apps/server/src/sourceControl/SourceControlProviderDiscovery.ts+1-1
...@@ -115,7 +115,7 @@ export function providerAuth(input: {...@@ -115,7 +115,7 @@ export function providerAuth(input: {
115 };115 };
116}116}
117117
118export function unknownAuth(detail?: string): SourceControlProviderAuth {118function unknownAuth(detail?: string): SourceControlProviderAuth {
119 return providerAuth({ status: "unknown", detail });119 return providerAuth({ status: "unknown", detail });
120}120}
121121
apps/server/src/sourceControl/SourceControlRateLimit.ts+1
...@@ -82,6 +82,7 @@ export function retryAtFromHeader(value: string | undefined, now: number): numbe...@@ -82,6 +82,7 @@ export function retryAtFromHeader(value: string | undefined, now: number): numbe
82 return Number.isFinite(retryAt) && retryAt > now ? retryAt : undefined;82 return Number.isFinite(retryAt) && retryAt > now ? retryAt : undefined;
83}83}
8484
85/** @public Service construction is part of the canonical Effect module API. */
85export const make = Effect.gen(function* () {86export const make = Effect.gen(function* () {
86 const entries = yield* Ref.make<ReadonlyMap<string, RateLimitEntry>>(new Map());87 const entries = yield* Ref.make<ReadonlyMap<string, RateLimitEntry>>(new Map());
8788
apps/server/src/sourceControl/SourceControlRepositoryService.ts+1
...@@ -77,6 +77,7 @@ function selectRemoteUrl(...@@ -77,6 +77,7 @@ function selectRemoteUrl(
77 }77 }
78}78}
7979
80/** @public Service construction is part of the canonical Effect module API. */
80export const make = Effect.gen(function* () {81export const make = Effect.gen(function* () {
81 const config = yield* ServerConfig;82 const config = yield* ServerConfig;
82 const fileSystem = yield* FileSystem.FileSystem;83 const fileSystem = yield* FileSystem.FileSystem;
apps/server/src/sourceControl/azureDevOpsPullRequests.ts+1-3
...@@ -5,7 +5,7 @@ import * as Option from "effect/Option";...@@ -5,7 +5,7 @@ import * as Option from "effect/Option";
5import * as Result from "effect/Result";5import * as Result from "effect/Result";
6import * as Schema from "effect/Schema";6import * as Schema from "effect/Schema";
7import { PositiveInt, TrimmedNonEmptyString } from "@t3tools/contracts";7import { PositiveInt, TrimmedNonEmptyString } from "@t3tools/contracts";
8import { decodeJsonResult, formatSchemaError } from "@t3tools/shared/schemaJson";8import { decodeJsonResult } from "@t3tools/shared/schemaJson";
99
10export interface NormalizedAzureDevOpsPullRequestRecord {10export interface NormalizedAzureDevOpsPullRequestRecord {
11 readonly number: number;11 readonly number: number;
...@@ -190,8 +190,6 @@ const decodeAzureDevOpsPullRequestList = decodeJsonResult(Schema.Array(Schema.Un...@@ -190,8 +190,6 @@ const decodeAzureDevOpsPullRequestList = decodeJsonResult(Schema.Array(Schema.Un
190const decodeAzureDevOpsPullRequest = decodeJsonResult(AzureDevOpsPullRequestSchema);190const decodeAzureDevOpsPullRequest = decodeJsonResult(AzureDevOpsPullRequestSchema);
191const decodeAzureDevOpsPullRequestEntry = Schema.decodeUnknownExit(AzureDevOpsPullRequestSchema);191const decodeAzureDevOpsPullRequestEntry = Schema.decodeUnknownExit(AzureDevOpsPullRequestSchema);
192192
193export const formatAzureDevOpsJsonDecodeError = formatSchemaError;
194
195export function decodeAzureDevOpsPullRequestListJson(193export function decodeAzureDevOpsPullRequestListJson(
196 raw: string,194 raw: string,
197): Result.Result<195): Result.Result<
apps/server/src/sourceControl/gitHubPullRequests.ts+1-3
...@@ -5,7 +5,7 @@ import * as Option from "effect/Option";...@@ -5,7 +5,7 @@ import * as Option from "effect/Option";
5import * as Result from "effect/Result";5import * as Result from "effect/Result";
6import * as Schema from "effect/Schema";6import * as Schema from "effect/Schema";
7import { PositiveInt, TrimmedNonEmptyString } from "@t3tools/contracts";7import { PositiveInt, TrimmedNonEmptyString } from "@t3tools/contracts";
8import { decodeJsonResult, formatSchemaError } from "@t3tools/shared/schemaJson";8import { decodeJsonResult } from "@t3tools/shared/schemaJson";
99
10export interface NormalizedGitHubPullRequestRecord {10export interface NormalizedGitHubPullRequestRecord {
11 readonly number: number;11 readonly number: number;
...@@ -114,8 +114,6 @@ const decodeGitHubPullRequestList = decodeJsonResult(Schema.Array(Schema.Unknown...@@ -114,8 +114,6 @@ const decodeGitHubPullRequestList = decodeJsonResult(Schema.Array(Schema.Unknown
114const decodeGitHubPullRequest = decodeJsonResult(GitHubPullRequestSchema);114const decodeGitHubPullRequest = decodeJsonResult(GitHubPullRequestSchema);
115const decodeGitHubPullRequestEntry = Schema.decodeUnknownExit(GitHubPullRequestSchema);115const decodeGitHubPullRequestEntry = Schema.decodeUnknownExit(GitHubPullRequestSchema);
116116
117export const formatGitHubJsonDecodeError = formatSchemaError;
118
119export function decodeGitHubPullRequestListJson(117export function decodeGitHubPullRequestListJson(
120 raw: string,118 raw: string,
121): Result.Result<119): Result.Result<
apps/server/src/sourceControl/gitLabMergeRequests.ts+1-3
...@@ -5,7 +5,7 @@ import * as Option from "effect/Option";...@@ -5,7 +5,7 @@ import * as Option from "effect/Option";
5import * as Result from "effect/Result";5import * as Result from "effect/Result";
6import * as Schema from "effect/Schema";6import * as Schema from "effect/Schema";
7import { PositiveInt, TrimmedNonEmptyString } from "@t3tools/contracts";7import { PositiveInt, TrimmedNonEmptyString } from "@t3tools/contracts";
8import { decodeJsonResult, formatSchemaError } from "@t3tools/shared/schemaJson";8import { decodeJsonResult } from "@t3tools/shared/schemaJson";
99
10export interface NormalizedGitLabMergeRequestRecord {10export interface NormalizedGitLabMergeRequestRecord {
11 readonly number: number;11 readonly number: number;
...@@ -129,8 +129,6 @@ const decodeGitLabMergeRequestList = decodeJsonResult(Schema.Array(Schema.Unknow...@@ -129,8 +129,6 @@ const decodeGitLabMergeRequestList = decodeJsonResult(Schema.Array(Schema.Unknow
129const decodeGitLabMergeRequest = decodeJsonResult(GitLabMergeRequestSchema);129const decodeGitLabMergeRequest = decodeJsonResult(GitLabMergeRequestSchema);
130const decodeGitLabMergeRequestEntry = Schema.decodeUnknownExit(GitLabMergeRequestSchema);130const decodeGitLabMergeRequestEntry = Schema.decodeUnknownExit(GitLabMergeRequestSchema);
131131
132export const formatGitLabJsonDecodeError = formatSchemaError;
133
134export function decodeGitLabMergeRequestListJson(132export function decodeGitLabMergeRequestListJson(
135 raw: string,133 raw: string,
136): Result.Result<134): Result.Result<
apps/server/src/sourceControl/githubGraphQlBudget.ts+1
...@@ -77,6 +77,7 @@ function withRateLimit(document: string): string {...@@ -77,6 +77,7 @@ function withRateLimit(document: string): string {
77 return `${document.slice(0, end)}\n ${RATE_LIMIT_SELECTION}\n${document.slice(end)}`;77 return `${document.slice(0, end)}\n ${RATE_LIMIT_SELECTION}\n${document.slice(end)}`;
78}78}
7979
80/** @public Service construction is part of the canonical Effect module API. */
80export const make = Effect.gen(function* () {81export const make = Effect.gen(function* () {
81 const snapshots = yield* Ref.make<ReadonlyMap<string, GraphQlBudgetSnapshot>>(new Map());82 const snapshots = yield* Ref.make<ReadonlyMap<string, GraphQlBudgetSnapshot>>(new Map());
8283