Files
WRNexusJS/packages/db/src/connect.ts
T
2026-07-12 15:55:18 +05:30

43 lines
1.5 KiB
TypeScript

/**
* Resolve a `db` config (from wrnexus.config.ts) to a live SQL `Db`. Kept in a
* subpath (`@wrnexus/db/connect`) so importing the core `@wrnexus/db` doesn't pull
* in every adapter. MongoDB is not here — it uses a document API (`@wrnexus/db/mongo`).
*/
import { isAbsolute, join } from "node:path";
import { createDb, type Db } from "./index.ts";
import { sqlite } from "./adapters/sqlite.ts";
import { postgres } from "./adapters/postgres.ts";
import { mysql } from "./adapters/mysql.ts";
export interface DbConfig {
driver: string;
url: string;
}
/** Resolve a `file:`/`sqlite:` URL's relative path against the app root. */
export function resolveDbUrl(url: string, appRoot?: string): string {
const m = /^(?:file:|sqlite:\/\/|sqlite:)(.*)$/.exec(url);
if (!m || !appRoot) return url;
const path = m[1]!.replace(/^\.\//, "");
return `file:${isAbsolute(path) ? path : join(appRoot, path)}`;
}
/** Build the configured SQL database (resolving a file URL against `appRoot`). */
export function connectFromConfig(config: DbConfig, appRoot?: string): Db {
const url = resolveDbUrl(config.url, appRoot);
switch (config.driver) {
case "sqlite":
return createDb(sqlite(url));
case "postgres":
return createDb(postgres(url));
case "mysql":
return createDb(mysql(url));
default:
throw new Error(
`Database driver '${config.driver}' is not a SQL driver ` +
`(use sqlite | postgres | mysql; MongoDB has a document API in @wrnexus/db/mongo).`,
);
}
}