nuxt-users
Version:
A comprehensive user management module for Nuxt 3 and Nuxt 4 applications with authentication, authorization, database support, and CLI tools
66 lines (65 loc) • 2.24 kB
JavaScript
import { createDatabase } from "db0";
import { isBuildTime } from "./build-time.js";
const dbCache = /* @__PURE__ */ new Map();
export const closeAllDbConnections = async () => {
for (const db of dbCache.values()) {
if (db && typeof db.disconnect === "function") {
await db.disconnect();
}
}
dbCache.clear();
};
export const getConnector = async (name) => {
try {
switch (name) {
case "mysql":
return (await import("db0/connectors/mysql2")).default;
case "postgresql":
return (await import("db0/connectors/postgresql")).default;
case "sqlite":
return (await import("db0/connectors/better-sqlite3")).default;
default:
throw new Error(`Unsupported database connector: ${name}`);
}
} catch (error) {
if (error instanceof Error && error.message.includes("Cannot resolve")) {
throw new Error(`Database connector "${name}" not found. Please install the required peer dependency:
- For sqlite: yarn add better-sqlite3
- For mysql: yarn add mysql2
- For postgresql: yarn add pg`);
}
throw error;
}
};
export const useDb = async (options) => {
if (isBuildTime()) {
throw new Error("[Nuxt Users] Database connections are not available during build/prerendering phase. This should not happen - please check your prerender configuration.");
}
const cacheKey = JSON.stringify(options.connector);
if (dbCache.has(cacheKey)) {
return dbCache.get(cacheKey);
}
const connectorName = options.connector.name;
const connector = await getConnector(connectorName);
const connectorOptions = { ...options.connector.options };
if (connectorName !== "sqlite") {
delete connectorOptions.path;
}
try {
const db = createDatabase(connector(connectorOptions));
dbCache.set(cacheKey, db);
return db;
} catch (error) {
console.warn(`[Nuxt Users] \u26A0\uFE0F Failed to connect to ${connectorName} database:`, error instanceof Error ? error.message : "Unknown error");
throw error;
}
};
export const checkTableExists = async (options, tableName) => {
try {
const db = await useDb(options);
await db.sql`SELECT 1 FROM {${tableName}} LIMIT 1`;
return true;
} catch {
return false;
}
};