// @ts-nocheck /** * metona-sqlark Vue Integration (v0.2.5) * @module integrations/vue * * 轻量 Vue composables,需要 vue 作为 peer dependency。 * * @example * import { useSqlarkQuery, useSqlarkTable } from 'metona-sqlark/vue'; * import { db } from './db'; * * const { data, loading, refresh } = useSqlarkQuery(db, 'SELECT * FROM users'); */ import { MetonaSqlark } from '../core'; import { ref, watch, onMounted, onUnmounted, type Ref } from 'vue'; /** useSqlarkQuery: 执行 SQL 查询 */ export function useSqlarkQuery( db: MetonaSqlark, sql: string, deps: Ref[] = [], ): { data: Ref[]>; loading: Ref; error: Ref; refresh: () => void } { const data = ref[]>([]) as Ref[]>; const loading = ref(true); const error = ref(null) as Ref; const execute = async () => { loading.value = true; try { data.value = await db.query(sql) as Record[]; error.value = null; } catch (e) { error.value = e as Error; } finally { loading.value = false; } }; onMounted(execute); watch([() => sql, ...deps], execute); return { data, loading, error, refresh: execute }; } /** 表名合法性校验(防 SQL 注入) */ function validateTableName(name: string): string { if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(name)) { throw new Error(`Invalid table name: "${name}"`); } return name; } /** useSqlarkTable: 快速获取表数据 */ export function useSqlarkTable( db: MetonaSqlark, tableName: string, ): { data: Ref[]>; loading: Ref; refresh: () => void } { const { data, loading, refresh } = useSqlarkQuery(db, `SELECT * FROM ${validateTableName(tableName)}`); return { data, loading, refresh }; } /** useSqlarkDatabase: 创建/管理数据库实例 */ export function useSqlarkDatabase(config: import('../constants').DatabaseConfig): { db: Ref; ready: Ref; error: Ref; } { const db = ref(null) as Ref; const ready = ref(false); const error = ref(null) as Ref; onMounted(async () => { try { const instance = new MetonaSqlark(config); await instance.init(); db.value = instance; ready.value = true; } catch (e) { error.value = e as Error; } }); // v0.7.3: 组件卸载时关闭数据库 —— 此前实例永不 close(连接/锁/后端句柄泄漏) onUnmounted(() => { const instance = db.value; if (instance) { instance.close().catch(() => { /* 关闭失败不阻塞卸载 */ }); } }); return { db, ready, error }; }