import type { ServerConfig, SourceControlRepositoryInfo } from "@t3tools/contracts"; export type CloudEnvironmentProvider = "render"; interface CloudEnvironmentLike { readonly displayUrl: string | null; readonly serverConfig: ServerConfig | null;} function isRenderHostname(value: string): boolean { try { return new URL(value).hostname.toLowerCase().endsWith(".onrender.com"); } catch { return false; }} export function cloudEnvironmentProvider( environment: CloudEnvironmentLike,): CloudEnvironmentProvider | null { const advertisedProvider = environment.serverConfig?.environment.cloud?.provider; if (advertisedProvider === "render") { return advertisedProvider; } return environment.displayUrl && isRenderHostname(environment.displayUrl) ? "render" : null;} export function cloudEnvironmentWorkspaceRoot(environment: CloudEnvironmentLike): string | null { return environment.serverConfig?.environment.cloud?.workspaceRoot ?? null;} export function cloudEnvironmentProviderLabel(provider: CloudEnvironmentProvider): string { switch (provider) { case "render": return "Render"; }} export function inferRepositoryDirectoryName(input: { readonly repository: SourceControlRepositoryInfo | null; readonly remoteUrl: string;}): string | null { const candidate = input.repository?.nameWithOwner ?? input.remoteUrl; const withoutQuery = candidate.split(/[?#]/, 1)[0]?.replace(/[\\/]+$/, "") ?? ""; const segment = withoutQuery .split(/[\\/:]/) .at(-1) ?.replace(/\.git$/i, "") .trim() ?? ""; return segment.length > 0 && segment !== "." && segment !== ".." ? segment : null;} export function cloudCloneDestination(input: { readonly workspaceRoot: string; readonly repository: SourceControlRepositoryInfo | null; readonly remoteUrl: string;}): string | null { const directoryName = inferRepositoryDirectoryName(input); if (!directoryName) { return null; } const workspaceRoot = input.workspaceRoot.trim().replace(/[\\/]+$/, ""); return workspaceRoot.length > 0 ? `${workspaceRoot}/${directoryName}` : null;}
import type { ServerConfig, SourceControlRepositoryInfo } from "@t3tools/contracts";
export type CloudEnvironmentProvider = "render";
interface CloudEnvironmentLike {
readonly displayUrl: string | null;
readonly serverConfig: ServerConfig | null;
}
function isRenderHostname(value: string): boolean {
try {
return new URL(value).hostname.toLowerCase().endsWith(".onrender.com");
} catch {
return false;
}
}
export function cloudEnvironmentProvider(
environment: CloudEnvironmentLike,
): CloudEnvironmentProvider | null {
const advertisedProvider = environment.serverConfig?.environment.cloud?.provider;
if (advertisedProvider === "render") {
return advertisedProvider;
}
return environment.displayUrl && isRenderHostname(environment.displayUrl) ? "render" : null;
}
export function cloudEnvironmentWorkspaceRoot(environment: CloudEnvironmentLike): string | null {
return environment.serverConfig?.environment.cloud?.workspaceRoot ?? null;
}
export function cloudEnvironmentProviderLabel(provider: CloudEnvironmentProvider): string {
switch (provider) {
case "render":
return "Render";
}
}
export function inferRepositoryDirectoryName(input: {
readonly repository: SourceControlRepositoryInfo | null;
readonly remoteUrl: string;
}): string | null {
const candidate = input.repository?.nameWithOwner ?? input.remoteUrl;
const withoutQuery = candidate.split(/[?#]/, 1)[0]?.replace(/[\\/]+$/, "") ?? "";
const segment =
withoutQuery
.split(/[\\/:]/)
.at(-1)
?.replace(/\.git$/i, "")
.trim() ?? "";
return segment.length > 0 && segment !== "." && segment !== ".." ? segment : null;
}
export function cloudCloneDestination(input: {
readonly workspaceRoot: string;
readonly repository: SourceControlRepositoryInfo | null;
readonly remoteUrl: string;
}): string | null {
const directoryName = inferRepositoryDirectoryName(input);
if (!directoryName) {
return null;
}
const workspaceRoot = input.workspaceRoot.trim().replace(/[\\/]+$/, "");
return workspaceRoot.length > 0 ? `${workspaceRoot}/${directoryName}` : null;
}