fix types

This commit is contained in:
bkellam 2025-10-30 21:47:51 -07:00
parent 94877debc1
commit d7f8af20b0
15 changed files with 72 additions and 69 deletions

View file

@ -1,11 +1,12 @@
import { CodeHostType } from "@sourcebot/db";
import { env } from "./env.js"; import { env } from "./env.js";
import path from "path"; import path from "path";
export const SINGLE_TENANT_ORG_ID = 1; export const SINGLE_TENANT_ORG_ID = 1;
export const PERMISSION_SYNC_SUPPORTED_CODE_HOST_TYPES = [ export const PERMISSION_SYNC_SUPPORTED_CODE_HOST_TYPES = [
'github', CodeHostType.github,
'gitlab', CodeHostType.gitlab,
]; ];
export const REPOS_CACHE_DIR = path.join(env.DATA_CACHE_DIR, 'repos'); export const REPOS_CACHE_DIR = path.join(env.DATA_CACHE_DIR, 'repos');

View file

@ -7,7 +7,7 @@ import { BitbucketRepository, getBitbucketReposFromConfig } from "./bitbucket.js
import { getAzureDevOpsReposFromConfig } from "./azuredevops.js"; import { getAzureDevOpsReposFromConfig } from "./azuredevops.js";
import { SchemaRestRepository as BitbucketServerRepository } from "@coderabbitai/bitbucket/server/openapi"; import { SchemaRestRepository as BitbucketServerRepository } from "@coderabbitai/bitbucket/server/openapi";
import { SchemaRepository as BitbucketCloudRepository } from "@coderabbitai/bitbucket/cloud/openapi"; import { SchemaRepository as BitbucketCloudRepository } from "@coderabbitai/bitbucket/cloud/openapi";
import { Prisma, PrismaClient } from '@sourcebot/db'; import { CodeHostType, Prisma, PrismaClient } from '@sourcebot/db';
import { WithRequired } from "./types.js" import { WithRequired } from "./types.js"
import { marshalBool } from "./utils.js"; import { marshalBool } from "./utils.js";
import { createLogger } from '@sourcebot/logger'; import { createLogger } from '@sourcebot/logger';
@ -392,7 +392,7 @@ export const compileBitbucketConfig = async (
const repos = bitbucketRepos.map((repo) => { const repos = bitbucketRepos.map((repo) => {
const isServer = config.deploymentType === 'server'; const isServer = config.deploymentType === 'server';
const codeHostType = isServer ? 'bitbucket-server' : 'bitbucket-cloud'; // zoekt expects bitbucket-server const codeHostType: CodeHostType = isServer ? 'bitbucketServer' : 'bitbucketCloud';
const displayName = isServer ? (repo as BitbucketServerRepository).name! : (repo as BitbucketCloudRepository).full_name!; const displayName = isServer ? (repo as BitbucketServerRepository).name! : (repo as BitbucketCloudRepository).full_name!;
const externalId = isServer ? (repo as BitbucketServerRepository).id!.toString() : (repo as BitbucketCloudRepository).uuid!; const externalId = isServer ? (repo as BitbucketServerRepository).id!.toString() : (repo as BitbucketCloudRepository).uuid!;
const isPublic = isServer ? (repo as BitbucketServerRepository).public : (repo as BitbucketCloudRepository).is_private === false; const isPublic = isServer ? (repo as BitbucketServerRepository).public : (repo as BitbucketCloudRepository).is_private === false;
@ -425,7 +425,8 @@ export const compileBitbucketConfig = async (
}, },
metadata: { metadata: {
gitConfig: { gitConfig: {
'zoekt.web-url-type': codeHostType, // zoekt expects bitbucket-server and bitbucket-cloud
'zoekt.web-url-type': codeHostType === 'bitbucketServer' ? 'bitbucket-server' : 'bitbucket-cloud',
'zoekt.web-url': webUrl, 'zoekt.web-url': webUrl,
'zoekt.name': repoName, 'zoekt.name': repoName,
'zoekt.archived': marshalBool(isArchived), 'zoekt.archived': marshalBool(isArchived),
@ -507,7 +508,7 @@ export const compileGenericGitHostConfig_file = async (
const repoName = path.join(remoteUrl.host, remoteUrl.pathname.replace(/\.git$/, '')); const repoName = path.join(remoteUrl.host, remoteUrl.pathname.replace(/\.git$/, ''));
const repo: RepoData = { const repo: RepoData = {
external_codeHostType: 'generic-git-host', external_codeHostType: 'genericGitHost',
external_codeHostUrl: remoteUrl.resource, external_codeHostUrl: remoteUrl.resource,
external_id: remoteUrl.toString(), external_id: remoteUrl.toString(),
cloneUrl: `file://${repoPath}`, cloneUrl: `file://${repoPath}`,
@ -571,7 +572,7 @@ export const compileGenericGitHostConfig_url = async (
const repoName = path.join(remoteUrl.host, remoteUrl.pathname.replace(/\.git$/, '')); const repoName = path.join(remoteUrl.host, remoteUrl.pathname.replace(/\.git$/, ''));
const repo: RepoData = { const repo: RepoData = {
external_codeHostType: 'generic-git-host', external_codeHostType: 'genericGitHost',
external_codeHostUrl: remoteUrl.origin, external_codeHostUrl: remoteUrl.origin,
external_id: remoteUrl.toString(), external_id: remoteUrl.toString(),
cloneUrl: remoteUrl.toString(), cloneUrl: remoteUrl.toString(),

View file

@ -59,7 +59,7 @@ export const getRepoPath = (repo: Repo): { path: string, isReadOnly: boolean } =
// If we are dealing with a local repository, then use that as the path. // If we are dealing with a local repository, then use that as the path.
// Mark as read-only since we aren't guaranteed to have write access to the local filesystem. // Mark as read-only since we aren't guaranteed to have write access to the local filesystem.
const cloneUrl = new URL(repo.cloneUrl); const cloneUrl = new URL(repo.cloneUrl);
if (repo.external_codeHostType === 'generic-git-host' && cloneUrl.protocol === 'file:') { if (repo.external_codeHostType === 'genericGitHost' && cloneUrl.protocol === 'file:') {
return { return {
path: cloneUrl.pathname, path: cloneUrl.pathname,
isReadOnly: true, isReadOnly: true,

View file

@ -7,9 +7,10 @@ import { Badge } from "@/components/ui/badge";
import { Card } from "@/components/ui/card"; import { Card } from "@/components/ui/card";
import { CardContent } from "@/components/ui/card"; import { CardContent } from "@/components/ui/card";
import { DemoExamples, DemoSearchExample, DemoSearchScope } from "@/types"; import { DemoExamples, DemoSearchExample, DemoSearchScope } from "@/types";
import { cn, CodeHostType, getCodeHostIcon } from "@/lib/utils"; import { cn, getCodeHostIcon } from "@/lib/utils";
import useCaptureEvent from "@/hooks/useCaptureEvent"; import useCaptureEvent from "@/hooks/useCaptureEvent";
import { SearchScopeInfoCard } from "@/features/chat/components/chatBox/searchScopeInfoCard"; import { SearchScopeInfoCard } from "@/features/chat/components/chatBox/searchScopeInfoCard";
import { CodeHostType } from "@sourcebot/db";
interface DemoCards { interface DemoCards {
demoExamples: DemoExamples; demoExamples: DemoExamples;

View file

@ -12,8 +12,8 @@ import { Separator } from "@/components/ui/separator";
import { Schema } from "ajv"; import { Schema } from "ajv";
import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "@/components/ui/tooltip"; import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "@/components/ui/tooltip";
import useCaptureEvent from "@/hooks/useCaptureEvent"; import useCaptureEvent from "@/hooks/useCaptureEvent";
import { CodeHostType } from "@/lib/utils";
import { useCodeMirrorTheme } from "@/hooks/useCodeMirrorTheme"; import { useCodeMirrorTheme } from "@/hooks/useCodeMirrorTheme";
import { CodeHostType } from "@sourcebot/db";
export type QuickActionFn<T> = (previous: T) => T; export type QuickActionFn<T> = (previous: T) => T;
export type QuickAction<T> = { export type QuickAction<T> = {

View file

@ -9,10 +9,11 @@ import { Input } from "@/components/ui/input";
import { Separator } from "@/components/ui/separator"; import { Separator } from "@/components/ui/separator";
import useCaptureEvent from "@/hooks/useCaptureEvent"; import useCaptureEvent from "@/hooks/useCaptureEvent";
import { useDomain } from "@/hooks/useDomain"; import { useDomain } from "@/hooks/useDomain";
import { CodeHostType, isServiceError } from "@/lib/utils"; import { isServiceError } from "@/lib/utils";
import githubPatCreation from "@/public/github_pat_creation.png"; import githubPatCreation from "@/public/github_pat_creation.png";
import gitlabPatCreation from "@/public/gitlab_pat_creation.png"; import gitlabPatCreation from "@/public/gitlab_pat_creation.png";
import giteaPatCreation from "@/public/gitea_pat_creation.png"; import giteaPatCreation from "@/public/gitea_pat_creation.png";
import { CodeHostType } from "@sourcebot/db";
import { zodResolver } from "@hookform/resolvers/zod"; import { zodResolver } from "@hookform/resolvers/zod";
import { Eye, EyeOff, Loader2 } from "lucide-react"; import { Eye, EyeOff, Loader2 } from "lucide-react";
import Image from "next/image"; import Image from "next/image";
@ -88,9 +89,9 @@ export const ImportSecretDialog = ({ open, onOpenChange, onSecretCreated, codeHo
return <GitHubPATCreationStep step={1} />; return <GitHubPATCreationStep step={1} />;
case 'gitlab': case 'gitlab':
return <GitLabPATCreationStep step={1} />; return <GitLabPATCreationStep step={1} />;
case 'bitbucket-cloud': case 'bitbucketCloud':
return <BitbucketCloudPATCreationStep step={1} />; return <BitbucketCloudPATCreationStep step={1} />;
case 'bitbucket-server': case 'bitbucketServer':
return <BitbucketServerPATCreationStep step={1} />; return <BitbucketServerPATCreationStep step={1} />;
case 'gitea': case 'gitea':
return <GiteaPATCreationStep step={1} />; return <GiteaPATCreationStep step={1} />;

View file

@ -15,13 +15,14 @@ import {
import { Button } from "@/components/ui/button" import { Button } from "@/components/ui/button"
import { Input } from "@/components/ui/input" import { Input } from "@/components/ui/input"
import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table" import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table"
import { CodeHostType, getCodeHostBrowseAtBranchUrl } from "@/lib/utils" import { getCodeHostBrowseAtBranchUrl } from "@/lib/utils"
import Link from "next/link" import Link from "next/link"
import { CodeHostType } from "@sourcebot/db";
type RepoBranchesTableProps = { type RepoBranchesTableProps = {
indexRevisions: string[]; indexRevisions: string[];
repoWebUrl: string | null; repoWebUrl: string | null;
repoCodeHostType: string; repoCodeHostType: CodeHostType;
} }
export const RepoBranchesTable = ({ indexRevisions, repoWebUrl, repoCodeHostType }: RepoBranchesTableProps) => { export const RepoBranchesTable = ({ indexRevisions, repoWebUrl, repoCodeHostType }: RepoBranchesTableProps) => {
@ -39,7 +40,7 @@ export const RepoBranchesTable = ({ indexRevisions, repoWebUrl, repoCodeHostType
const branchUrl = getCodeHostBrowseAtBranchUrl({ const branchUrl = getCodeHostBrowseAtBranchUrl({
webUrl: repoWebUrl, webUrl: repoWebUrl,
codeHostType: repoCodeHostType as CodeHostType, codeHostType: repoCodeHostType,
branchName: refName, branchName: refName,
}); });

View file

@ -14,7 +14,7 @@ import { Input } from "@/components/ui/input"
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select" import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"
import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table" import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table"
import { SINGLE_TENANT_ORG_DOMAIN } from "@/lib/constants" import { SINGLE_TENANT_ORG_DOMAIN } from "@/lib/constants"
import { cn, CodeHostType, getCodeHostCommitUrl, getCodeHostIcon, getCodeHostInfoForRepo, getRepoImageSrc } from "@/lib/utils" import { cn, getCodeHostCommitUrl, getCodeHostIcon, getCodeHostInfoForRepo, getRepoImageSrc } from "@/lib/utils"
import { import {
type ColumnDef, type ColumnDef,
type ColumnFiltersState, type ColumnFiltersState,
@ -38,6 +38,7 @@ import { useToast } from "@/components/hooks/use-toast";
import { DisplayDate } from "../../components/DisplayDate" import { DisplayDate } from "../../components/DisplayDate"
import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/tooltip" import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/tooltip"
import { NotificationDot } from "../../components/notificationDot" import { NotificationDot } from "../../components/notificationDot"
import { CodeHostType } from "@sourcebot/db"
// @see: https://v0.app/chat/repo-indexing-status-uhjdDim8OUS // @see: https://v0.app/chat/repo-indexing-status-uhjdDim8OUS
@ -50,7 +51,7 @@ export type Repo = {
indexedAt: Date | null indexedAt: Date | null
createdAt: Date createdAt: Date
webUrl: string | null webUrl: string | null
codeHostType: string codeHostType: CodeHostType
imageUrl: string | null imageUrl: string | null
indexedCommitHash: string | null indexedCommitHash: string | null
latestJobStatus: "PENDING" | "IN_PROGRESS" | "COMPLETED" | "FAILED" | null latestJobStatus: "PENDING" | "IN_PROGRESS" | "COMPLETED" | "FAILED" | null
@ -97,7 +98,7 @@ export const columns: ColumnDef<Repo>[] = [
}, },
cell: ({ row }) => { cell: ({ row }) => {
const repo = row.original; const repo = row.original;
const codeHostIcon = getCodeHostIcon(repo.codeHostType as CodeHostType); const codeHostIcon = getCodeHostIcon(repo.codeHostType);
const repoImageSrc = repo.imageUrl ? getRepoImageSrc(repo.imageUrl, repo.id) : undefined; const repoImageSrc = repo.imageUrl ? getRepoImageSrc(repo.imageUrl, repo.id) : undefined;
return ( return (
@ -192,7 +193,7 @@ export const columns: ColumnDef<Repo>[] = [
const smallHash = hash.slice(0, 7); const smallHash = hash.slice(0, 7);
const repo = row.original; const repo = row.original;
const codeHostType = repo.codeHostType as CodeHostType; const codeHostType = repo.codeHostType;
const webUrl = repo.webUrl; const webUrl = repo.webUrl;
const commitUrl = getCodeHostCommitUrl({ const commitUrl = getCodeHostCommitUrl({

View file

@ -7,7 +7,7 @@ import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/tooltip
import { env } from "@/env.mjs"; import { env } from "@/env.mjs";
import { SINGLE_TENANT_ORG_DOMAIN } from "@/lib/constants"; import { SINGLE_TENANT_ORG_DOMAIN } from "@/lib/constants";
import { notFound, ServiceErrorException } from "@/lib/serviceError"; import { notFound, ServiceErrorException } from "@/lib/serviceError";
import { CodeHostType, isServiceError } from "@/lib/utils"; import { isServiceError } from "@/lib/utils";
import { withAuthV2 } from "@/withAuthV2"; import { withAuthV2 } from "@/withAuthV2";
import { AzureDevOpsConnectionConfig, BitbucketConnectionConfig, GenericGitHostConnectionConfig, GerritConnectionConfig, GiteaConnectionConfig, GithubConnectionConfig, GitlabConnectionConfig } from "@sourcebot/schemas/v3/index.type"; import { AzureDevOpsConnectionConfig, BitbucketConnectionConfig, GenericGitHostConnectionConfig, GerritConnectionConfig, GiteaConnectionConfig, GithubConnectionConfig, GitlabConnectionConfig } from "@sourcebot/schemas/v3/index.type";
import { getConfigSettings } from "@sourcebot/shared"; import { getConfigSettings } from "@sourcebot/shared";
@ -47,8 +47,9 @@ export default async function ConnectionDetailPage(props: ConnectionDetailPagePr
return undefined; return undefined;
})(); })();
const codeHostUrl = (() => { // Extracts the code host URL from the connection config.
const connectionType = connection.connectionType as CodeHostType; const codeHostUrl: string = (() => {
const connectionType = connection.connectionType;
switch (connectionType) { switch (connectionType) {
case 'github': { case 'github': {
const config = connection.config as unknown as GithubConnectionConfig; const config = connection.config as unknown as GithubConnectionConfig;
@ -66,19 +67,19 @@ export default async function ConnectionDetailPage(props: ConnectionDetailPagePr
const config = connection.config as unknown as GerritConnectionConfig; const config = connection.config as unknown as GerritConnectionConfig;
return config.url; return config.url;
} }
case 'bitbucket-server': { case 'bitbucket': {
const config = connection.config as unknown as BitbucketConnectionConfig; const config = connection.config as unknown as BitbucketConnectionConfig;
return config.url!; if (config.deploymentType === 'cloud') {
} return config.url ?? 'https://bitbucket.org';
case 'bitbucket-cloud': { } else {
const config = connection.config as unknown as BitbucketConnectionConfig; return config.url!;
return config.url ?? 'https://bitbucket.org'; }
} }
case 'azuredevops': { case 'azuredevops': {
const config = connection.config as unknown as AzureDevOpsConnectionConfig; const config = connection.config as unknown as AzureDevOpsConnectionConfig;
return config.url ?? 'https://dev.azure.com'; return config.url ?? 'https://dev.azure.com';
} }
case 'generic-git-host': { case 'git': {
const config = connection.config as unknown as GenericGitHostConnectionConfig; const config = connection.config as unknown as GenericGitHostConnectionConfig;
return config.url; return config.url;
} }

View file

@ -10,7 +10,8 @@ import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@
import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table" import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table"
import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/tooltip" import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/tooltip"
import { SINGLE_TENANT_ORG_DOMAIN } from "@/lib/constants" import { SINGLE_TENANT_ORG_DOMAIN } from "@/lib/constants"
import { CodeHostType, getCodeHostIcon } from "@/lib/utils" import { getCodeHostIcon } from "@/lib/utils"
import { ConnectionType } from "@sourcebot/db"
import { import {
type ColumnDef, type ColumnDef,
type ColumnFiltersState, type ColumnFiltersState,
@ -35,7 +36,7 @@ export type Connection = {
id: number id: number
name: string name: string
syncedAt: Date | null syncedAt: Date | null
codeHostType: CodeHostType connectionType: ConnectionType
latestJobStatus: "PENDING" | "IN_PROGRESS" | "COMPLETED" | "FAILED" | null latestJobStatus: "PENDING" | "IN_PROGRESS" | "COMPLETED" | "FAILED" | null
isFirstTimeSync: boolean isFirstTimeSync: boolean
} }
@ -80,13 +81,13 @@ export const columns: ColumnDef<Connection>[] = [
}, },
cell: ({ row }) => { cell: ({ row }) => {
const connection = row.original; const connection = row.original;
const codeHostIcon = getCodeHostIcon(connection.codeHostType); const codeHostIcon = getCodeHostIcon(connection.connectionType);
return ( return (
<div className="flex flex-row gap-2 items-center"> <div className="flex flex-row gap-2 items-center">
<Image <Image
src={codeHostIcon.src} src={codeHostIcon.src}
alt={`${connection.codeHostType} logo`} alt={`${connection.connectionType} logo`}
className={codeHostIcon.className} className={codeHostIcon.className}
width={20} width={20}
height={20} height={20}

View file

@ -1,6 +1,6 @@
import { sew } from "@/actions"; import { sew } from "@/actions";
import { ServiceErrorException } from "@/lib/serviceError"; import { ServiceErrorException } from "@/lib/serviceError";
import { CodeHostType, isServiceError } from "@/lib/utils"; import { isServiceError } from "@/lib/utils";
import { withAuthV2 } from "@/withAuthV2"; import { withAuthV2 } from "@/withAuthV2";
import Link from "next/link"; import Link from "next/link";
import { ConnectionsTable } from "./components/connectionsTable"; import { ConnectionsTable } from "./components/connectionsTable";
@ -40,7 +40,7 @@ export default async function ConnectionsPage() {
<ConnectionsTable data={connections.map((connection) => ({ <ConnectionsTable data={connections.map((connection) => ({
id: connection.id, id: connection.id,
name: connection.name, name: connection.name,
codeHostType: connection.connectionType as CodeHostType, connectionType: connection.connectionType,
syncedAt: connection.syncedAt, syncedAt: connection.syncedAt,
latestJobStatus: connection.latestJobStatus, latestJobStatus: connection.latestJobStatus,
isFirstTimeSync: connection.isFirstTimeSync, isFirstTimeSync: connection.isFirstTimeSync,

View file

@ -3,7 +3,8 @@
import { CodeHostIconButton } from "@/app/[domain]/components/codeHostIconButton"; import { CodeHostIconButton } from "@/app/[domain]/components/codeHostIconButton";
import { Card, CardTitle, CardDescription, CardHeader, CardContent } from "@/components/ui/card"; import { Card, CardTitle, CardDescription, CardHeader, CardContent } from "@/components/ui/card";
import { getCodeHostIcon } from "@/lib/utils"; import { getCodeHostIcon } from "@/lib/utils";
import { cn, CodeHostType } from "@/lib/utils"; import { cn } from "@/lib/utils";
import { CodeHostType } from "@sourcebot/db";
import { useState } from "react"; import { useState } from "react";
import { ImportSecretDialog } from "@/app/[domain]/components/importSecretDialog"; import { ImportSecretDialog } from "@/app/[domain]/components/importSecretDialog";
import { useRouter } from "next/navigation"; import { useRouter } from "next/navigation";

View file

@ -1,4 +1,5 @@
import { cn, CodeHostType, getCodeHostIcon } from "@/lib/utils"; import { cn, getCodeHostIcon } from "@/lib/utils";
import { CodeHostType } from "@sourcebot/db";
import { LibraryBigIcon } from "lucide-react"; import { LibraryBigIcon } from "lucide-react";
import Image from "next/image"; import Image from "next/image";
import { SearchScope } from "../types"; import { SearchScope } from "../types";

View file

@ -263,7 +263,7 @@ const getRepoPath = (repo: Repo): { path: string, isReadOnly: boolean } => {
// If we are dealing with a local repository, then use that as the path. // If we are dealing with a local repository, then use that as the path.
// Mark as read-only since we aren't guaranteed to have write access to the local filesystem. // Mark as read-only since we aren't guaranteed to have write access to the local filesystem.
const cloneUrl = new URL(repo.cloneUrl); const cloneUrl = new URL(repo.cloneUrl);
if (repo.external_codeHostType === 'generic-git-host' && cloneUrl.protocol === 'file:') { if (repo.external_codeHostType === 'genericGitHost' && cloneUrl.protocol === 'file:') {
return { return {
path: cloneUrl.pathname, path: cloneUrl.pathname,
isReadOnly: true, isReadOnly: true,

View file

@ -15,9 +15,10 @@ import { ServiceError } from "./serviceError";
import { StatusCodes } from "http-status-codes"; import { StatusCodes } from "http-status-codes";
import { ErrorCode } from "./errorCodes"; import { ErrorCode } from "./errorCodes";
import { NextRequest } from "next/server"; import { NextRequest } from "next/server";
import { Org } from "@sourcebot/db"; import { ConnectionType, Org } from "@sourcebot/db";
import { OrgMetadata, orgMetadataSchema } from "@/types"; import { OrgMetadata, orgMetadataSchema } from "@/types";
import { SINGLE_TENANT_ORG_DOMAIN } from "./constants"; import { SINGLE_TENANT_ORG_DOMAIN } from "./constants";
import { CodeHostType } from "@sourcebot/db";
export function cn(...inputs: ClassValue[]) { export function cn(...inputs: ClassValue[]) {
return twMerge(clsx(inputs)) return twMerge(clsx(inputs))
@ -64,16 +65,6 @@ export const createPathWithQueryParams = (path: string, ...queryParams: [string,
return `${path}?${queryString}`; return `${path}?${queryString}`;
} }
export type CodeHostType =
"github" |
"gitlab" |
"gitea" |
"gerrit" |
"bitbucket-cloud" |
"bitbucket-server" |
"azuredevops" |
"generic-git-host";
export type AuthProviderType = export type AuthProviderType =
"github" | "github" |
"gitlab" | "gitlab" |
@ -248,9 +239,9 @@ export const getCodeHostInfoForRepo = (repo: {
} }
} }
case "bitbucket-server": { case "bitbucket-server": {
const { src, className } = getCodeHostIcon('bitbucket-server')!; const { src, className } = getCodeHostIcon('bitbucketServer')!;
return { return {
type: "bitbucket-server", type: "bitbucketServer",
displayName: displayName ?? name, displayName: displayName ?? name,
codeHostName: "Bitbucket", codeHostName: "Bitbucket",
repoLink: webUrl, repoLink: webUrl,
@ -259,9 +250,9 @@ export const getCodeHostInfoForRepo = (repo: {
} }
} }
case "bitbucket-cloud": { case "bitbucket-cloud": {
const { src, className } = getCodeHostIcon('bitbucket-cloud')!; const { src, className } = getCodeHostIcon('bitbucketCloud')!;
return { return {
type: "bitbucket-cloud", type: "bitbucketCloud",
displayName: displayName ?? name, displayName: displayName ?? name,
codeHostName: "Bitbucket", codeHostName: "Bitbucket",
repoLink: webUrl, repoLink: webUrl,
@ -270,9 +261,9 @@ export const getCodeHostInfoForRepo = (repo: {
} }
} }
case "generic-git-host": { case "generic-git-host": {
const { src, className } = getCodeHostIcon('generic-git-host')!; const { src, className } = getCodeHostIcon('genericGitHost')!;
return { return {
type: "generic-git-host", type: "genericGitHost",
displayName: displayName ?? name, displayName: displayName ?? name,
codeHostName: "Git Host", codeHostName: "Git Host",
repoLink: webUrl, repoLink: webUrl,
@ -283,7 +274,7 @@ export const getCodeHostInfoForRepo = (repo: {
} }
} }
export const getCodeHostIcon = (codeHostType: CodeHostType): { src: string, className?: string } => { export const getCodeHostIcon = (codeHostType: CodeHostType | ConnectionType): { src: string, className?: string } => {
switch (codeHostType) { switch (codeHostType) {
case "github": case "github":
return { return {
@ -302,8 +293,9 @@ export const getCodeHostIcon = (codeHostType: CodeHostType): { src: string, clas
return { return {
src: gerritLogo, src: gerritLogo,
} }
case "bitbucket-cloud": case "bitbucket":
case "bitbucket-server": case "bitbucketCloud":
case "bitbucketServer":
return { return {
src: bitbucketLogo, src: bitbucketLogo,
} }
@ -311,7 +303,8 @@ export const getCodeHostIcon = (codeHostType: CodeHostType): { src: string, clas
return { return {
src: azuredevopsLogo, src: azuredevopsLogo,
} }
case "generic-git-host": case "git":
case "genericGitHost":
return { return {
src: gitLogo, src: gitLogo,
} }
@ -340,13 +333,13 @@ export const getCodeHostCommitUrl = ({
return `${webUrl}/commit/${commitHash}`; return `${webUrl}/commit/${commitHash}`;
case 'azuredevops': case 'azuredevops':
return `${webUrl}/commit/${commitHash}`; return `${webUrl}/commit/${commitHash}`;
case 'bitbucket-cloud': case 'bitbucketCloud':
return `${webUrl}/commits/${commitHash}`; return `${webUrl}/commits/${commitHash}`;
case 'bitbucket-server': case 'bitbucketServer':
return `${webUrl}/commits/${commitHash}`; return `${webUrl}/commits/${commitHash}`;
case 'gerrit': case 'gerrit':
return `${webUrl}/+/${commitHash}`; return `${webUrl}/+/${commitHash}`;
case 'generic-git-host': case 'genericGitHost':
return undefined; return undefined;
} }
} }
@ -373,13 +366,13 @@ export const getCodeHostBrowseAtBranchUrl = ({
return `${webUrl}/src/branch/${branchName}`; return `${webUrl}/src/branch/${branchName}`;
case 'azuredevops': case 'azuredevops':
return `${webUrl}?branch=${branchName}`; return `${webUrl}?branch=${branchName}`;
case 'bitbucket-cloud': case 'bitbucketCloud':
return `${webUrl}?at=${branchName}`; return `${webUrl}?at=${branchName}`;
case 'bitbucket-server': case 'bitbucketServer':
return `${webUrl}?at=${branchName}`; return `${webUrl}?at=${branchName}`;
case 'gerrit': case 'gerrit':
return `${webUrl}/+/${branchName}`; return `${webUrl}/+/${branchName}`;
case 'generic-git-host': case 'genericGitHost':
return undefined; return undefined;
} }
} }
@ -389,11 +382,11 @@ export const isAuthSupportedForCodeHost = (codeHostType: CodeHostType): boolean
case "github": case "github":
case "gitlab": case "gitlab":
case "gitea": case "gitea":
case "bitbucket-cloud": case "bitbucketCloud":
case "bitbucket-server": case "bitbucketServer":
case "azuredevops": case "azuredevops":
return true; return true;
case "generic-git-host": case "genericGitHost":
case "gerrit": case "gerrit":
return false; return false;
} }