feat: metona-sqlark v0.1.12 — 前端TypeScript关系型数据库
- 4种存储引擎:Memory / IndexedDB / OPFS / Hybrid - 完整SQL支持:SELECT/INSERT/UPDATE/DELETE/JOIN/GROUP BY/HAVING/DISTINCT - Query Builder链式API + TypeScript泛型支持 - 聚合函数:COUNT/SUM/AVG/MIN/MAX - 事务、插件系统(14 hooks)、发布订阅、数据迁移、导入导出 - React/Vue框架集成 - 264个测试用例,93.46%覆盖率 - 零运行时依赖
This commit is contained in:
@@ -0,0 +1,77 @@
|
||||
// @ts-nocheck
|
||||
/**
|
||||
* metona-sqlark Vue Integration (v0.1.11)
|
||||
* @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 type { MetonaSqlark } from '../core';
|
||||
import { ref, watch, onMounted, type Ref } from 'vue';
|
||||
|
||||
/** useSqlarkQuery: 执行 SQL 查询 */
|
||||
export function useSqlarkQuery(
|
||||
db: MetonaSqlark,
|
||||
sql: string,
|
||||
deps: Ref<unknown>[] = [],
|
||||
): { data: Ref<Record<string, unknown>[]>; loading: Ref<boolean>; error: Ref<Error | null>; refresh: () => void } {
|
||||
const data = ref<Record<string, unknown>[]>([]) as Ref<Record<string, unknown>[]>;
|
||||
const loading = ref(true);
|
||||
const error = ref<Error | null>(null) as Ref<Error | null>;
|
||||
|
||||
const execute = async () => {
|
||||
loading.value = true;
|
||||
try {
|
||||
data.value = await db.query(sql) as Record<string, unknown>[];
|
||||
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 };
|
||||
}
|
||||
|
||||
/** useSqlarkTable: 快速获取表数据 */
|
||||
export function useSqlarkTable(
|
||||
db: MetonaSqlark,
|
||||
tableName: string,
|
||||
): { data: Ref<Record<string, unknown>[]>; loading: Ref<boolean>; refresh: () => void } {
|
||||
const { data, loading, refresh } = useSqlarkQuery(db, `SELECT * FROM ${tableName}`);
|
||||
return { data, loading, refresh };
|
||||
}
|
||||
|
||||
/** useSqlarkDatabase: 创建/管理数据库实例 */
|
||||
export function useSqlarkDatabase(config: import('../constants').DatabaseConfig): {
|
||||
db: Ref<MetonaSqlark | null>;
|
||||
ready: Ref<boolean>;
|
||||
error: Ref<Error | null>;
|
||||
} {
|
||||
const db = ref<MetonaSqlark | null>(null) as Ref<MetonaSqlark | null>;
|
||||
const ready = ref(false);
|
||||
const error = ref<Error | null>(null) as Ref<Error | null>;
|
||||
|
||||
onMounted(async () => {
|
||||
try {
|
||||
const instance = new MetonaSqlark(config);
|
||||
await instance.init();
|
||||
db.value = instance;
|
||||
ready.value = true;
|
||||
} catch (e) {
|
||||
error.value = e as Error;
|
||||
}
|
||||
});
|
||||
|
||||
return { db, ready, error };
|
||||
}
|
||||
Reference in New Issue
Block a user