Files
dbx/apps/desktop/src/lib/database/driverProfileExtensions.ts
T

72 lines
3.3 KiB
TypeScript

import { DOLT_DRIVER_PROFILE_EXTENSION } from "@/lib/database/doltProfile";
import type { SqlCompletionObject, SqlCompletionTable, SqlStatementKind } from "@/lib/sql/sqlCompletion";
import type { ConnectionConfig, TableNameFilter, TreeNodeType } from "@/types/database";
export type DriverProfileObjectTreeProfile = {
cacheKey: string;
groupOverrides: Array<{
nodeType: TreeNodeType;
label?: string;
tableNameFilter: TableNameFilter;
}>;
};
export type DriverProfileSqlCompletionContext = {
statementKind: SqlStatementKind;
suggestTables: boolean;
suggestRoutines: boolean;
exclusiveRoutineSuggestions: boolean;
prefix: string;
openingParenAfterCursor: boolean;
};
export type DriverProfileCompletionTableMetadata = Pick<SqlCompletionTable, "detail" | "boost">;
export type DriverProfileExtensionDefinition = {
id: string;
objectTreeProfile?: (config: ConnectionConfig) => DriverProfileObjectTreeProfile | undefined;
completionTableMetadata?: (tableName: string) => DriverProfileCompletionTableMetadata | undefined;
completionObjects?: (context: DriverProfileSqlCompletionContext) => SqlCompletionObject[];
completionTables?: (context: DriverProfileSqlCompletionContext) => SqlCompletionTable[];
sqlBuiltinTerms?: () => string;
routineSignatures?: () => Map<string, string[]>;
};
export const DRIVER_PROFILE_EXTENSIONS = [DOLT_DRIVER_PROFILE_EXTENSION] as const satisfies readonly DriverProfileExtensionDefinition[];
export function driverProfileExtension(driverProfile?: string): DriverProfileExtensionDefinition | undefined {
const normalized = driverProfile?.trim().toLowerCase();
if (!normalized) return undefined;
return DRIVER_PROFILE_EXTENSIONS.find((extension) => extension.id.toLowerCase() === normalized);
}
export function driverProfileObjectTreeProfileForConnection(config?: ConnectionConfig): DriverProfileObjectTreeProfile | undefined {
if (!config) return undefined;
return driverProfileExtension(config.driver_profile)?.objectTreeProfile?.(config);
}
export function driverProfileCompletionTableMetadata(driverProfile: string | undefined, tableName: string): DriverProfileCompletionTableMetadata | undefined {
return driverProfileExtension(driverProfile)?.completionTableMetadata?.(tableName);
}
export function driverProfileCompletionObjects(driverProfile: string | undefined, context: DriverProfileSqlCompletionContext): SqlCompletionObject[] {
return driverProfileExtension(driverProfile)?.completionObjects?.(context) ?? [];
}
export function driverProfileCompletionTables(driverProfile: string | undefined, context: DriverProfileSqlCompletionContext): SqlCompletionTable[] {
return driverProfileExtension(driverProfile)?.completionTables?.(context) ?? [];
}
export function driverProfileHasCompletionCandidates(driverProfile: string | undefined, context: DriverProfileSqlCompletionContext): boolean {
const extension = driverProfileExtension(driverProfile);
return Boolean(extension?.completionObjects?.(context).length || extension?.completionTables?.(context).length);
}
export function driverProfileSqlBuiltinTerms(driverProfile?: string): string {
return driverProfileExtension(driverProfile)?.sqlBuiltinTerms?.() ?? "";
}
export function driverProfileRoutineSignatures(driverProfile?: string): Map<string, string[]> {
return driverProfileExtension(driverProfile)?.routineSignatures?.() ?? new Map();
}