43 lines
1.5 KiB
TypeScript
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).`,
|
|
);
|
|
}
|
|
}
|