UNPKG

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
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; } };