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,80 @@
|
||||
// @ts-nocheck
|
||||
/**
|
||||
* metona-sqlark React Integration (v0.1.11)
|
||||
* @module integrations/react
|
||||
*
|
||||
* 轻量 React hooks,需要 react 作为 peer dependency。
|
||||
*
|
||||
* @example
|
||||
* import { useQuery, useTable } from 'metona-sqlark/react';
|
||||
* import { db } from './db';
|
||||
*
|
||||
* function UserList() {
|
||||
* const { data, loading, refresh } = useQuery(db, 'SELECT * FROM users');
|
||||
* return loading ? <div>Loading...</div> : <div>{data.map(u => <div key={u.id}>{u.name}</div>)}</div>;
|
||||
* }
|
||||
*/
|
||||
|
||||
import type { MetonaSqlark } from '../core';
|
||||
import { useState, useEffect, useCallback, useRef } from 'react';
|
||||
|
||||
/** useQuery: 执行 SQL 查询 */
|
||||
export function useQuery(
|
||||
db: MetonaSqlark,
|
||||
sql: string,
|
||||
deps: unknown[] = [],
|
||||
): { data: Record<string, unknown>[]; loading: boolean; error: Error | null; refresh: () => void } {
|
||||
const [data, setData] = useState<Record<string, unknown>[]>([]);
|
||||
const [loading, setLoading] = useState(true);
|
||||
const [error, setError] = useState<Error | null>(null);
|
||||
|
||||
const execute = useCallback(async () => {
|
||||
setLoading(true);
|
||||
try {
|
||||
const result = await db.query(sql) as Record<string, unknown>[];
|
||||
setData(result);
|
||||
setError(null);
|
||||
} catch (e) {
|
||||
setError(e as Error);
|
||||
} finally {
|
||||
setLoading(false);
|
||||
}
|
||||
}, [db, sql, ...deps]);
|
||||
|
||||
useEffect(() => { execute(); }, [execute]);
|
||||
|
||||
return { data, loading, error, refresh: execute };
|
||||
}
|
||||
|
||||
/** useTable: 快速获取表数据 */
|
||||
export function useTable(
|
||||
db: MetonaSqlark,
|
||||
tableName: string,
|
||||
): { data: Record<string, unknown>[]; loading: boolean; refresh: () => void } {
|
||||
const { data, loading, refresh } = useQuery(db, `SELECT * FROM ${tableName}`, [tableName]);
|
||||
return { data, loading, refresh };
|
||||
}
|
||||
|
||||
/** useDatabase: 创建/管理数据库实例 */
|
||||
export function useDatabase(config: import('../constants').DatabaseConfig): {
|
||||
db: MetonaSqlark | null;
|
||||
ready: boolean;
|
||||
error: Error | null;
|
||||
} {
|
||||
const [db, setDb] = useState<MetonaSqlark | null>(null);
|
||||
const [ready, setReady] = useState(false);
|
||||
const [error, setError] = useState<Error | null>(null);
|
||||
const initRef = useRef(false);
|
||||
|
||||
useEffect(() => {
|
||||
if (initRef.current) return;
|
||||
initRef.current = true;
|
||||
const instance = new MetonaSqlark(config);
|
||||
instance.init()
|
||||
.then(() => { setDb(instance); setReady(true); })
|
||||
.catch(setError);
|
||||
return () => { instance.close(); };
|
||||
}, []);
|
||||
|
||||
return { db, ready, error };
|
||||
}
|
||||
@@ -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