feat: MetonaSqlark v0.1.12 — 前端TypeScript关系型数据库
CI / test (18.x) (push) Successful in 9m49s
CI / test (20.x) (push) Successful in 9m50s
CI / test (22.x) (push) Successful in 9m48s
CI / test (24.x) (push) Successful in 9m45s

- 4种存储引擎:Memory / IndexedDB / OPFS / Hybrid
- 完整SQL:SELECT/INSERT/UPDATE/DELETE/JOIN/GROUP BY/HAVING/DISTINCT
- Query Builder链式API + TypeScript泛型
- 聚合/事务/插件/发布订阅/迁移/导入导出
- React/Vue集成,264测试,93.46%覆盖率,零运行时依赖
This commit is contained in:
thzxx
2026-07-26 15:18:45 +08:00
parent e2a590c5b1
commit 7858cf3720
14 changed files with 9086 additions and 62 deletions
+85 -43
View File
@@ -1,4 +1,4 @@
# metona-sqlark
# MetonaSqlark
<p align="center">
<img src="https://img.shields.io/badge/version-0.1.12-blue?style=flat-square" alt="version">
@@ -11,35 +11,74 @@
---
## ✨ 核心特性
- 🧠 **双模式存储** — Memory / Disk / Hybrid,内存极速 + 磁盘持久化
-**完整 SQL** — SELECT / INSERT / UPDATE / DELETE / JOIN / GROUP BY / HAVING / DISTINCT
- 🔗 **Query Builder** — 链式 APITypeScript 类型友好
- 📊 **聚合函数** — COUNT / SUM / AVG / MIN / MAX
- 🔒 **事务支持** — 原子性操作,失败自动回滚
- 🧩 **插件系统** — 14 种生命周期钩子
- 📡 **发布订阅** — 表级变更监听
- 🔄 **数据迁移** — 版本化 migration 系统
- 📤 **导入导出** — JSON 格式全库/单表导入导出
- ⚛️ **React / Vue** — 原生 hooks & composables
- 📦 **零运行时依赖** — 纯 TypeScript,约 42KB min+gzip
---
## 📦 安装
```bash
npm install @metona-team/metona-sqlark
```
```typescript
// ESM / TypeScript
import { MetonaSqlark, MeSqlark } from '@metona-team/metona-sqlark';
> 如果提示找不到包,先配置 scope registry(一次性):
> ```bash
> npm config set @metona-team:registry https://git.metona.cn/api/packages/MetonaTeam/npm/
> ```
// Browser UMD
### CDN / 直接下载
```html
<!-- UMD 格式,暴露 window.MetonaSqlark 和 window.MeSqlark -->
<script src="https://git.metona.cn/MetonaTeam/MetonaSqlark/raw/branch/master/dist/metona-sqlark.min.js"></script>
```
或从 [`dist/`](./dist/) 目录下载:
- `metona-sqlark.js` — UMD 开发版(含 sourcemap
- `metona-sqlark.min.js` — UMD 压缩版(~42KB
- `metona-sqlark.esm.js` — ES Module
- `metona-sqlark.cjs.js` — CommonJS
- `metona-sqlark.d.ts` — TypeScript 类型声明
---
## 🚀 引入方式
### ESM / TypeScript
```typescript
import { MetonaSqlark } from '@metona-team/metona-sqlark';
// 别名
import { MeSqlark } from '@metona-team/metona-sqlark';
const db = await MetonaSqlark.create({ name: 'my-app', mode: 'hybrid' });
```
### CommonJS
```javascript
const { MetonaSqlark } = require('@metona-team/metona-sqlark');
(async () => {
const db = await MetonaSqlark.create({ name: 'my-app', mode: 'hybrid' });
})();
```
### Browser UMD
```html
<script src="metona-sqlark.min.js"></script>
// → window.MetonaSqlark / window.MeSqlark
<script>
(async () => {
const db = await window.MetonaSqlark.create({ name: 'my-app', mode: 'hybrid' });
// 或 window.MeSqlark(完全等价)
})();
</script>
```
### ES Module in Browser
```html
<script type="module">
import { MetonaSqlark } from './metona-sqlark.esm.js';
const db = await MetonaSqlark.create({ name: 'my-app', mode: 'hybrid' });
</script>
```
---
@@ -49,11 +88,10 @@ import { MetonaSqlark, MeSqlark } from '@metona-team/metona-sqlark';
```typescript
import { MetonaSqlark } from '@metona-team/metona-sqlark';
// 创建数据库
const db = await MetonaSqlark.create({
name: 'my-app',
mode: 'hybrid',
diskEngine: 'indexeddb',
mode: 'hybrid', // 'memory' | 'disk' | 'hybrid'
diskEngine: 'indexeddb', // 'indexeddb' | 'opfs'
});
// 定义表
@@ -69,9 +107,12 @@ await db.query("INSERT INTO users VALUES ('1', 'Alice', 30, 'alice@demo.com')");
const rows = await db.query('SELECT * FROM users WHERE age > 18 ORDER BY name');
// Query Builder
const users = db.table('users');
await users.insert({ id: '2', name: 'Bob', age: 25, email: 'bob@demo.com' });
const result = await users.select().where({ age: { $gt: 18 } }).orderBy('age', 'desc').execute();
const result = await db.table('users')
.select(['name', 'age'])
.where({ age: { $gt: 18 } })
.orderBy('age', 'desc')
.limit(10)
.execute();
// JOIN
await db.query(`SELECT u.name, o.product FROM users u INNER JOIN orders o ON u.id = o.user_id`);
@@ -116,7 +157,8 @@ await db.transaction(async (trx) => {
| `db.table(name)` | 获取表操作对象 |
| `db.defineTable(name, cols)` | 定义表结构 |
| `db.transaction(fn)` | 执行事务 |
| `db.exportTable(name)` / `db.exportAll()` | 导出数据 |
| `db.exportTable(name)` / `db.exportAll()` | 导出数据 JSON |
| `db.importTable(name, data)` | 导入数据 |
| `db.addMigration(v, fn)` / `db.migrateTo(v)` | 数据迁移 |
| `db.subscribe(table, fn)` | 订阅表变更 |
| `db.on(hook, fn)` | 注册钩子 |
@@ -135,6 +177,19 @@ const { data, loading, refresh } = useSqlarkQuery(db, 'SELECT * FROM users');
---
## 🛠 开发
```bash
npm install # 安装依赖
npm run dev # 开发模式(localhost:3001
npm run build # 生产构建(生成 dist/
npm test # 运行测试
npm run lint # 代码检查
npm run typecheck # 类型检查
```
---
## 📊 项目状态
| 指标 | 数值 |
@@ -147,19 +202,6 @@ const { data, loading, refresh } = useSqlarkQuery(db, 'SELECT * FROM users');
---
## 🛠 开发
```bash
npm install # 安装依赖
npm run dev # 开发模式(localhost:3001
npm run build # 生产构建
npm test # 运行测试
npm run lint # 代码检查
npm run typecheck # 类型检查
```
---
## 📂 项目结构
```
@@ -181,4 +223,4 @@ src/
## 📄 License
MIT © [MetonaTeam](https://git.metona.cn/MetonaTeam)
MIT © [MetonaTeam](https://git.metona.cn/MetonaTeam/MetonaSqlark)