first commit
This commit is contained in:
@@ -0,0 +1,42 @@
|
||||
/**
|
||||
* 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).`,
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user