dbx/apps/desktop/src/lib/databaseDriverManifest.ts

103 lines
3.4 KiB
TypeScript

import type { DatabaseType } from "@/types/database";
import driverManifest from "../../../../crates/dbx-core/assets/database-drivers.manifest.json";
export type DatabaseSupportLevel = "connect" | "browse" | "understand" | "operate";
export type DatabaseRuntimeMode = "native" | "file" | "agent" | "external";
export const DATABASE_PRODUCT_CAPABILITY_KEYS = [
"queryExecution",
"metadataBrowse",
"objectBrowser",
"objectSource",
"schemaSearch",
"diagram",
"tableDataEdit",
"tableStructureEdit",
"tableImport",
"dataTransfer",
"sqlFileExecution",
"databaseCreate",
"fieldLineage",
"sqlExplain",
"userAdmin",
"driverManagement",
] as const;
export type DatabaseProductCapability = (typeof DATABASE_PRODUCT_CAPABILITY_KEYS)[number];
export type DatabaseProductCapabilities = Record<DatabaseProductCapability, boolean>;
interface DatabaseDriverManifestEntry {
dbType: DatabaseType;
runtimeMode: DatabaseRuntimeMode;
supportLevel: DatabaseSupportLevel;
capabilities: Partial<DatabaseProductCapabilities>;
}
const SUPPORT_LEVEL_DEFAULTS: Record<DatabaseSupportLevel, DatabaseProductCapabilities> = {
connect: productCapabilities({
queryExecution: true,
sqlFileExecution: true,
}),
browse: productCapabilities({
metadataBrowse: true,
objectBrowser: true,
sqlFileExecution: true,
}),
understand: productCapabilities({
metadataBrowse: true,
objectBrowser: true,
schemaSearch: true,
sqlFileExecution: true,
}),
operate: productCapabilities({
metadataBrowse: true,
objectBrowser: true,
schemaSearch: true,
tableDataEdit: true,
sqlFileExecution: true,
}),
};
const DEFAULT_CAPABILITIES = productCapabilities({});
const DATABASE_DRIVER_ENTRIES = (driverManifest.drivers as DatabaseDriverManifestEntry[]).map((entry) => ({
...entry,
capabilities: {
...SUPPORT_LEVEL_DEFAULTS[entry.supportLevel],
...entry.capabilities,
},
}));
const DATABASE_DRIVER_BY_TYPE = new Map<DatabaseType, DatabaseDriverManifestEntry>(DATABASE_DRIVER_ENTRIES.map((entry) => [entry.dbType, entry]));
export function databaseSupportLevel(dbType?: DatabaseType): DatabaseSupportLevel | undefined {
return dbType ? DATABASE_DRIVER_BY_TYPE.get(dbType)?.supportLevel : undefined;
}
export function databaseRuntimeMode(dbType?: DatabaseType): DatabaseRuntimeMode | undefined {
return dbType ? DATABASE_DRIVER_BY_TYPE.get(dbType)?.runtimeMode : undefined;
}
export function databaseProductCapabilities(dbType?: DatabaseType): DatabaseProductCapabilities {
if (!dbType) return DEFAULT_CAPABILITIES;
return (DATABASE_DRIVER_BY_TYPE.get(dbType)?.capabilities ?? DEFAULT_CAPABILITIES) as DatabaseProductCapabilities;
}
export function supportsDatabaseFeature(dbType: DatabaseType | undefined, capability: DatabaseProductCapability): boolean {
return databaseProductCapabilities(dbType)[capability];
}
export function manifestDatabaseTypes(): DatabaseType[] {
return DATABASE_DRIVER_ENTRIES.map((entry) => entry.dbType);
}
export function usesAgentCursorForQuery(dbType?: DatabaseType): boolean {
const runtimeMode = databaseRuntimeMode(dbType);
return runtimeMode === "agent" || runtimeMode === "external";
}
function productCapabilities(overrides: Partial<DatabaseProductCapabilities>): DatabaseProductCapabilities {
const capabilities = Object.fromEntries(DATABASE_PRODUCT_CAPABILITY_KEYS.map((key) => [key, false])) as DatabaseProductCapabilities;
return { ...capabilities, ...overrides };
}