diff --git a/.gitignore b/.gitignore
index 1d932ff..497bb25 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,5 +1,4 @@
node_modules/
-dist/
coverage/
.DS_Store
diff --git a/README.md b/README.md
index d652995..bda6d22 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# metona-sqlark
+# MetonaSqlark
@@ -11,35 +11,74 @@
---
-## ✨ 核心特性
-
-- 🧠 **双模式存储** — Memory / Disk / Hybrid,内存极速 + 磁盘持久化
-- ⚡ **完整 SQL** — SELECT / INSERT / UPDATE / DELETE / JOIN / GROUP BY / HAVING / DISTINCT
-- 🔗 **Query Builder** — 链式 API,TypeScript 类型友好
-- 📊 **聚合函数** — 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
+
+
+```
+
+或从 [`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
-// → window.MetonaSqlark / window.MeSqlark
+
+```
+
+### ES Module in Browser
+
+```html
+
```
---
@@ -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)
diff --git a/dist/metona-sqlark.cjs.js b/dist/metona-sqlark.cjs.js
new file mode 100644
index 0000000..1c14e75
--- /dev/null
+++ b/dist/metona-sqlark.cjs.js
@@ -0,0 +1,2732 @@
+'use strict';
+
+Object.defineProperty(exports, '__esModule', { value: true });
+
+/**
+ * metona-sqlark Constants — 类型定义 / 默认配置 / 枚举
+ * @module constants
+ */
+/** 所有存储模式 */
+/** 所有字段类型 */
+const FIELD_TYPES = ['string', 'number', 'boolean', 'date', 'json'];
+/** 数据库默认配置 */
+const DB_DEFAULTS = Object.freeze({
+ name: 'metona-sqlark',
+ mode: 'hybrid',
+ diskEngine: 'indexeddb',
+ version: 1,
+});
+// ---------------------------------------------------------------------------
+// 错误类型
+// ---------------------------------------------------------------------------
+/** 数据库错误 */
+class DatabaseError extends Error {
+ constructor(message, code, details) {
+ super(message);
+ this.code = code;
+ this.details = details;
+ this.name = 'DatabaseError';
+ }
+}
+// ---------------------------------------------------------------------------
+// 版本
+// ---------------------------------------------------------------------------
+const VERSION = '0.1.12';
+
+/**
+ * metona-sqlark Shared WHERE Matcher — 统一的条件匹配逻辑
+ * @module query/where-matcher
+ *
+ * MemoryEngine / IndexedDBEngine / QueryExecutor 共享此模块,
+ * 消除 220+ 行重复代码,统一 $and/$or/$not/$col 行为。
+ */
+// ---------------------------------------------------------------------------
+// LIKE 正则缓存
+// ---------------------------------------------------------------------------
+const likeCache = new Map();
+function compileLikeRegex(pattern) {
+ const cached = likeCache.get(pattern);
+ if (cached)
+ return cached;
+ const escaped = pattern
+ .replace(/[.+^${}()|[\]\\]/g, '\\$&')
+ .replace(/%/g, '.*')
+ .replace(/_/g, '.');
+ const regex = new RegExp(`^${escaped}$`, 'i');
+ likeCache.set(pattern, regex);
+ return regex;
+}
+// ---------------------------------------------------------------------------
+// WHERE 匹配(顶层入口)
+// ---------------------------------------------------------------------------
+/**
+ * 匹配完整 WHERE 条件
+ * @param row 当前数据行
+ * @param where WHERE 条件对象
+ * @param options.$col 是否启用 $col 列引用解析
+ */
+function matchWhere(row, where, options = {}) {
+ for (const [field, condition] of Object.entries(where)) {
+ // 顶层 $and
+ if (field === '$and') {
+ const subs = condition;
+ if (!subs.every((sub) => matchWhere(row, sub, options)))
+ return false;
+ continue;
+ }
+ // 顶层 $or
+ if (field === '$or') {
+ const subs = condition;
+ if (!subs.some((sub) => matchWhere(row, sub, options)))
+ return false;
+ continue;
+ }
+ if (!matchField(row[field], condition, row, options))
+ return false;
+ }
+ return true;
+}
+// ---------------------------------------------------------------------------
+// 字段匹配
+// ---------------------------------------------------------------------------
+function matchField(value, condition, row, options) {
+ // 嵌套 $and
+ if (typeof condition === 'object' && condition !== null && '$and' in condition) {
+ const subs = condition.$and;
+ return subs.every((sub) => matchWhere(row, sub, options));
+ }
+ // 嵌套 $or
+ if (typeof condition === 'object' && condition !== null && '$or' in condition) {
+ const subs = condition.$or;
+ return subs.some((sub) => matchWhere(row, sub, options));
+ }
+ // $not
+ if (typeof condition === 'object' && condition !== null && '$not' in condition) {
+ return !matchField(value, condition.$not, row, options);
+ }
+ // 简单值 => $eq
+ if (typeof condition !== 'object' || condition === null || Array.isArray(condition)) {
+ return value === condition;
+ }
+ const ops = condition;
+ // $col 简写: { $col: name } === { $eq: { $col: name } }(仅 JOIN ON 场景)
+ if (options.$col && '$col' in ops && Object.keys(ops).length === 1) {
+ return value === row[ops.$col];
+ }
+ // 遍历操作符
+ for (const [op, operand] of Object.entries(ops)) {
+ let actualOperand = operand;
+ // $col 列引用解析
+ if (options.$col && typeof operand === 'object' && operand !== null && '$col' in operand) {
+ actualOperand = row[operand.$col];
+ }
+ if (!matchOperator(value, op, actualOperand))
+ return false;
+ }
+ return true;
+}
+// ---------------------------------------------------------------------------
+// 操作符匹配
+// ---------------------------------------------------------------------------
+function matchOperator(value, op, operand) {
+ switch (op) {
+ case '$eq': return value === operand;
+ case '$ne': return value !== operand;
+ case '$gt': return value > operand;
+ case '$gte': return value >= operand;
+ case '$lt': return value < operand;
+ case '$lte': return value <= operand;
+ case '$in': return Array.isArray(operand) && operand.includes(value);
+ case '$nin': return Array.isArray(operand) && !operand.includes(value);
+ case '$like': return compileLikeRegex(String(operand)).test(String(value));
+ default: return true;
+ }
+}
+// ---------------------------------------------------------------------------
+// 排序
+// ---------------------------------------------------------------------------
+function applyOrderBy(rows, orderBy) {
+ return [...rows].sort((a, b) => {
+ for (const { column, direction } of orderBy) {
+ const cmp = compare(a[column], b[column]);
+ if (cmp !== 0)
+ return direction === 'desc' ? -cmp : cmp;
+ }
+ return 0;
+ });
+}
+function compare(a, b) {
+ if (a === b)
+ return 0;
+ if (a === null || a === undefined)
+ return 1;
+ if (b === null || b === undefined)
+ return -1;
+ if (typeof a === 'string' && typeof b === 'string')
+ return a.localeCompare(b);
+ if (typeof a === 'number' && typeof b === 'number')
+ return a - b;
+ return String(a).localeCompare(String(b));
+}
+// ---------------------------------------------------------------------------
+// 列投影
+// ---------------------------------------------------------------------------
+function projectColumns(row, columns) {
+ const projected = {};
+ for (const col of columns) {
+ if (col in row) {
+ projected[col] = row[col];
+ }
+ else {
+ for (const key of Object.keys(row)) {
+ if (key.endsWith(`.${col}`) || key === col) {
+ projected[col] = row[key];
+ break;
+ }
+ }
+ }
+ }
+ return projected;
+}
+
+/**
+ * metona-sqlark Memory Engine — 基于 Map 的内存存储引擎
+ * @module engine/memory
+ */
+class MemoryEngine {
+ constructor() {
+ this.name = 'memory';
+ this.tables = new Map();
+ this.schemas = new Map();
+ this.indexes = new Map();
+ this.opened = false;
+ }
+ // ---- 生命周期 ----
+ async open(_dbName, _version) { this.opened = true; }
+ async close() {
+ this.tables.clear();
+ this.schemas.clear();
+ this.indexes.clear();
+ this.opened = false;
+ }
+ isOpen() { return this.opened; }
+ // ---- 表管理 ----
+ async createTable(schema) {
+ if (this.schemas.has(schema.name))
+ throw new DatabaseError(`Table "${schema.name}" already exists`, 'TABLE_EXISTS');
+ this.schemas.set(schema.name, schema);
+ this.tables.set(schema.name, new Map());
+ const tableIndexes = new Map();
+ for (const [colName, colDef] of Object.entries(schema.columns)) {
+ if (colDef.index || colDef.unique)
+ tableIndexes.set(colName, new Map());
+ }
+ this.indexes.set(schema.name, tableIndexes);
+ }
+ async dropTable(tableName) {
+ this.ensureTable(tableName);
+ this.schemas.delete(tableName);
+ this.tables.delete(tableName);
+ this.indexes.delete(tableName);
+ }
+ async hasTable(tableName) { return this.schemas.has(tableName); }
+ async getTableNames() { return Array.from(this.schemas.keys()); }
+ async getTableSchema(tableName) { return this.schemas.get(tableName) ?? null; }
+ // ---- CRUD ----
+ async insert(tableName, rows) {
+ this.ensureTable(tableName);
+ const schema = this.schemas.get(tableName);
+ const table = this.tables.get(tableName);
+ const pkColumn = this.getPrimaryKey(schema);
+ const pks = [];
+ for (const row of rows) {
+ const validatedRow = this.validateRow(schema, row);
+ const pkValue = String(validatedRow[pkColumn]);
+ if (table.has(pkValue))
+ throw new DatabaseError(`Duplicate primary key "${pkValue}" in table "${tableName}"`, 'DUPLICATE_KEY');
+ this.checkUniqueness(schema, validatedRow);
+ table.set(pkValue, validatedRow);
+ this.updateIndexes(tableName, validatedRow, pkValue);
+ pks.push(pkValue);
+ }
+ return pks;
+ }
+ async find(tableName, query) {
+ this.ensureTable(tableName);
+ const table = this.tables.get(tableName);
+ let results = this.tryIndexLookup(tableName, table, query);
+ if (query.where && Object.keys(query.where).length > 0) {
+ results = results.filter((row) => matchWhere(row, query.where));
+ }
+ if (query.orderBy && query.orderBy.length > 0) {
+ results = applyOrderBy(results, query.orderBy);
+ }
+ const offset = query.offset ?? 0;
+ const limit = query.limit ?? results.length;
+ results = results.slice(offset, offset + limit);
+ if (query.columns && query.columns.length > 0 && query.columns[0] !== '*') {
+ results = results.map((row) => projectColumns(row, query.columns));
+ }
+ return results;
+ }
+ async update(tableName, query, updates) {
+ this.ensureTable(tableName);
+ const schema = this.schemas.get(tableName);
+ const table = this.tables.get(tableName);
+ let count = 0;
+ for (const [pk, row] of table) {
+ if (!query.where || Object.keys(query.where).length === 0 || matchWhere(row, query.where)) {
+ const updated = { ...row, ...updates };
+ this.validateRow(schema, updated);
+ table.set(pk, updated);
+ count++;
+ }
+ }
+ return count;
+ }
+ async delete(tableName, query) {
+ this.ensureTable(tableName);
+ const table = this.tables.get(tableName);
+ const toDelete = [];
+ for (const [pk, row] of table) {
+ if (!query.where || Object.keys(query.where).length === 0 || matchWhere(row, query.where)) {
+ toDelete.push(pk);
+ }
+ }
+ for (const pk of toDelete)
+ table.delete(pk);
+ return toDelete.length;
+ }
+ async count(tableName, query) {
+ this.ensureTable(tableName);
+ const table = this.tables.get(tableName);
+ if (!query?.where || Object.keys(query.where).length === 0)
+ return table.size;
+ let result = 0;
+ for (const row of table.values()) {
+ if (matchWhere(row, query.where))
+ result++;
+ }
+ return result;
+ }
+ async clear(tableName) {
+ this.ensureTable(tableName);
+ this.tables.get(tableName).clear();
+ const tableIndexes = this.indexes.get(tableName);
+ if (tableIndexes)
+ for (const colIndex of tableIndexes.values())
+ colIndex.clear();
+ }
+ // ---- 内部辅助 ----
+ ensureTable(tableName) {
+ if (!this.tables.has(tableName))
+ throw new DatabaseError(`Table "${tableName}" does not exist`, 'TABLE_NOT_FOUND');
+ }
+ getPrimaryKey(schema) {
+ for (const [name, col] of Object.entries(schema.columns)) {
+ if (col.primaryKey)
+ return name;
+ }
+ return Object.keys(schema.columns)[0];
+ }
+ validateRow(schema, row) {
+ const validated = {};
+ for (const [colName, colDef] of Object.entries(schema.columns)) {
+ let value = row[colName];
+ if (value === undefined && colDef.default !== undefined)
+ value = colDef.default;
+ if (colDef.required && (value === undefined || value === null)) {
+ throw new DatabaseError(`Column "${colName}" is required in table "${schema.name}"`, 'VALIDATION_ERROR');
+ }
+ if (value !== undefined && value !== null)
+ this.checkType(colName, colDef.type, value);
+ if (value !== undefined)
+ validated[colName] = value;
+ }
+ return validated;
+ }
+ checkType(colName, type, value) {
+ const jsType = typeof value;
+ switch (type) {
+ case 'string':
+ if (jsType !== 'string')
+ throw new DatabaseError(`Column "${colName}" expects string, got ${jsType}`, 'TYPE_ERROR');
+ break;
+ case 'number':
+ if (jsType !== 'number')
+ throw new DatabaseError(`Column "${colName}" expects number, got ${jsType}`, 'TYPE_ERROR');
+ break;
+ case 'boolean':
+ if (jsType !== 'boolean')
+ throw new DatabaseError(`Column "${colName}" expects boolean, got ${jsType}`, 'TYPE_ERROR');
+ break;
+ case 'date':
+ if (jsType !== 'string' || isNaN(Date.parse(value)))
+ throw new DatabaseError(`Column "${colName}" expects valid date`, 'TYPE_ERROR');
+ break;
+ case 'json':
+ if (jsType !== 'object')
+ throw new DatabaseError(`Column "${colName}" expects object/array, got ${jsType}`, 'TYPE_ERROR');
+ break;
+ }
+ }
+ /** O(1) 唯一性检查:利用哈希索引 */
+ checkUniqueness(schema, row) {
+ const tableIndexes = this.indexes.get(schema.name);
+ if (!tableIndexes)
+ return;
+ for (const [colName, colDef] of Object.entries(schema.columns)) {
+ if (!colDef.unique || row[colName] === undefined || row[colName] === null)
+ continue;
+ const colIndex = tableIndexes.get(colName);
+ if (colIndex && colIndex.has(row[colName])) {
+ throw new DatabaseError(`Unique constraint violation on column "${colName}" in table "${schema.name}"`, 'UNIQUE_VIOLATION');
+ }
+ }
+ }
+ /** 索引查找 */
+ tryIndexLookup(tableName, table, query) {
+ const tableIndexes = this.indexes.get(tableName);
+ if (!tableIndexes || !query.where)
+ return Array.from(table.values());
+ for (const [col, condition] of Object.entries(query.where)) {
+ if (typeof condition !== 'object' || condition === null) {
+ const colIndex = tableIndexes.get(col);
+ if (colIndex) {
+ const pks = colIndex.get(condition);
+ if (pks) {
+ const result = [];
+ for (const pk of pks) {
+ const r = table.get(pk);
+ if (r)
+ result.push(r);
+ }
+ return result;
+ }
+ return [];
+ }
+ }
+ }
+ return Array.from(table.values());
+ }
+ /** 更新索引 */
+ updateIndexes(tableName, row, pk) {
+ const tableIndexes = this.indexes.get(tableName);
+ if (!tableIndexes)
+ return;
+ for (const [colName, colIndex] of tableIndexes) {
+ const value = row[colName];
+ if (value !== undefined && value !== null) {
+ if (!colIndex.has(value))
+ colIndex.set(value, new Set());
+ colIndex.get(value).add(pk);
+ }
+ }
+ }
+}
+
+/**
+ * metona-sqlark IndexedDB Engine — 基于 IndexedDB 的持久化存储引擎
+ * @module engine/indexeddb
+ */
+class IndexedDBEngine {
+ constructor() {
+ this.name = 'indexeddb';
+ this.db = null;
+ this.dbName = '';
+ this.version = 1;
+ this.memoryCache = new MemoryEngine();
+ }
+ async open(dbName, version) {
+ this.dbName = dbName;
+ this.version = version;
+ await this.memoryCache.open(dbName, version);
+ return new Promise((resolve, reject) => {
+ const request = indexedDB.open(dbName, version);
+ request.onsuccess = () => { this.db = request.result; resolve(); };
+ request.onerror = () => reject(new DatabaseError(`Failed to open IndexedDB "${dbName}"`, 'IDB_OPEN_ERROR', request.error));
+ request.onblocked = () => reject(new DatabaseError(`IndexedDB "${dbName}" is blocked`, 'IDB_BLOCKED'));
+ });
+ }
+ async close() {
+ if (this.db) {
+ this.db.close();
+ this.db = null;
+ }
+ await this.memoryCache.close();
+ }
+ isOpen() { return this.db !== null; }
+ // ---- 表管理 ----
+ async createTable(schema) {
+ await this.memoryCache.createTable(schema);
+ const db = this.ensureDB();
+ return new Promise((resolve, reject) => {
+ const newVersion = db.version + 1;
+ db.close();
+ const request = indexedDB.open(this.dbName, newVersion);
+ request.onupgradeneeded = (event) => {
+ const db = event.target.result;
+ const pkColumn = Object.entries(schema.columns).find(([, c]) => c.primaryKey)?.[0] ?? Object.keys(schema.columns)[0];
+ const store = db.createObjectStore(schema.name, { keyPath: pkColumn });
+ for (const [colName, colDef] of Object.entries(schema.columns)) {
+ if (colDef.index && colName !== pkColumn) {
+ store.createIndex(`idx_${colName}`, colName, { unique: colDef.unique ?? false });
+ }
+ }
+ };
+ request.onsuccess = () => { this.db = request.result; resolve(); };
+ request.onerror = () => reject(new DatabaseError(`Failed to create table "${schema.name}"`, 'IDB_UPGRADE_ERROR', request.error));
+ });
+ }
+ async dropTable(tableName) {
+ await this.memoryCache.dropTable(tableName);
+ const db = this.ensureDB();
+ return new Promise((resolve, reject) => {
+ const newVersion = db.version + 1;
+ db.close();
+ const request = indexedDB.open(this.dbName, newVersion);
+ request.onupgradeneeded = (event) => {
+ const db = event.target.result;
+ if (db.objectStoreNames.contains(tableName))
+ db.deleteObjectStore(tableName);
+ };
+ request.onsuccess = () => { this.db = request.result; resolve(); };
+ request.onerror = () => reject(new DatabaseError(`Failed to drop table "${tableName}"`, 'IDB_UPGRADE_ERROR', request.error));
+ });
+ }
+ async hasTable(tableName) { return this.ensureDB().objectStoreNames.contains(tableName); }
+ async getTableNames() { return Array.from(this.ensureDB().objectStoreNames); }
+ async getTableSchema(tableName) { return this.memoryCache.getTableSchema(tableName); }
+ // ---- CRUD ----
+ async insert(tableName, rows) {
+ await this.memoryCache.insert(tableName, rows);
+ const db = this.ensureDB();
+ return new Promise((resolve, reject) => {
+ const tx = db.transaction(tableName, 'readwrite');
+ const store = tx.objectStore(tableName);
+ const pks = [];
+ for (const row of rows) {
+ const req = store.add(row);
+ req.onsuccess = () => pks.push(String(req.result));
+ req.onerror = () => { }; // 内存层已校验,忽略 IDB 重复键
+ }
+ tx.oncomplete = () => resolve(pks);
+ tx.onerror = () => reject(new DatabaseError(`Insert failed for "${tableName}"`, 'IDB_TX_ERROR', tx.error));
+ });
+ }
+ async find(tableName, query) {
+ const db = this.ensureDB();
+ return new Promise((resolve, reject) => {
+ const tx = db.transaction(tableName, 'readonly');
+ const req = tx.objectStore(tableName).getAll();
+ req.onsuccess = () => {
+ let results = req.result ?? [];
+ if (query.where && Object.keys(query.where).length > 0) {
+ results = results.filter((row) => matchWhere(row, query.where));
+ }
+ if (query.orderBy && query.orderBy.length > 0) {
+ results = applyOrderBy(results, query.orderBy);
+ }
+ const offset = query.offset ?? 0;
+ const limit = query.limit ?? results.length;
+ results = results.slice(offset, offset + limit);
+ if (query.columns && query.columns.length > 0 && query.columns[0] !== '*') {
+ results = results.map((r) => projectColumns(r, query.columns));
+ }
+ resolve(results);
+ };
+ req.onerror = () => reject(new DatabaseError(`Find failed for "${tableName}"`, 'IDB_READ_ERROR', req.error));
+ });
+ }
+ async update(tableName, query, updates) {
+ await this.memoryCache.update(tableName, query, updates);
+ const db = this.ensureDB();
+ return new Promise((resolve, reject) => {
+ const tx = db.transaction(tableName, 'readwrite');
+ const store = tx.objectStore(tableName);
+ const getAllReq = store.getAll();
+ let count = 0;
+ getAllReq.onsuccess = () => {
+ for (const row of getAllReq.result ?? []) {
+ if (!query.where || Object.keys(query.where).length === 0 || matchWhere(row, query.where)) {
+ Object.assign(row, updates);
+ store.put(row);
+ count++;
+ }
+ }
+ };
+ tx.oncomplete = () => resolve(count);
+ tx.onerror = () => reject(new DatabaseError(`Update failed for "${tableName}"`, 'IDB_TX_ERROR', tx.error));
+ });
+ }
+ async delete(tableName, query) {
+ await this.memoryCache.delete(tableName, query);
+ const db = this.ensureDB();
+ const schema = await this.memoryCache.getTableSchema(tableName);
+ if (!schema)
+ throw new DatabaseError(`Table "${tableName}" not found`, 'TABLE_NOT_FOUND');
+ const pkColumn = Object.entries(schema.columns).find(([, c]) => c.primaryKey)?.[0] ?? Object.keys(schema.columns)[0];
+ return new Promise((resolve, reject) => {
+ const tx = db.transaction(tableName, 'readwrite');
+ const store = tx.objectStore(tableName);
+ const getAllReq = store.getAll();
+ let count = 0;
+ getAllReq.onsuccess = () => {
+ for (const row of getAllReq.result ?? []) {
+ if (!query.where || Object.keys(query.where).length === 0 || matchWhere(row, query.where)) {
+ store.delete(row[pkColumn]);
+ count++;
+ }
+ }
+ };
+ tx.oncomplete = () => resolve(count);
+ tx.onerror = () => reject(new DatabaseError(`Delete failed for "${tableName}"`, 'IDB_TX_ERROR', tx.error));
+ });
+ }
+ async count(tableName, query) {
+ const results = await this.find(tableName, { table: tableName, where: query?.where ?? {} });
+ return results.length;
+ }
+ async clear(tableName) {
+ await this.memoryCache.clear(tableName);
+ const db = this.ensureDB();
+ return new Promise((resolve, reject) => {
+ const tx = db.transaction(tableName, 'readwrite');
+ tx.objectStore(tableName).clear();
+ tx.oncomplete = () => resolve();
+ tx.onerror = () => reject(new DatabaseError(`Clear failed for "${tableName}"`, 'IDB_TX_ERROR', tx.error));
+ });
+ }
+ ensureDB() {
+ if (!this.db)
+ throw new DatabaseError('Database not opened', 'DB_NOT_OPEN');
+ return this.db;
+ }
+}
+
+/**
+ * metona-sqlark OPFS Engine — 基于 Origin Private File System 的持久化存储引擎
+ * @module engine/opfs
+ *
+ * 使用 JSON-per-table 文件存储方案。
+ * 目录结构:{dbName}/tables/{tableName}.json
+ */
+// ---------------------------------------------------------------------------
+// OPFSEngine
+// ---------------------------------------------------------------------------
+class OPFSEngine {
+ constructor() {
+ this.name = 'opfs';
+ this.root = null;
+ this.tablesDir = null;
+ this.dbName = '';
+ // 运行时内存缓存(OPFS 文件读写有延迟)
+ this.memoryCache = new MemoryEngine();
+ }
+ // ---- 生命周期 ----
+ async open(dbName, version) {
+ this.dbName = dbName;
+ await this.memoryCache.open(dbName, version);
+ // 获取 OPFS 根目录
+ this.root = await navigator.storage.getDirectory();
+ // 创建数据库目录
+ this.tablesDir = await this.root.getDirectoryHandle(dbName, { create: true });
+ }
+ async close() {
+ this.root = null;
+ this.tablesDir = null;
+ await this.memoryCache.close();
+ }
+ isOpen() {
+ return this.tablesDir !== null;
+ }
+ // ---- 表管理 ----
+ async createTable(schema) {
+ await this.memoryCache.createTable(schema);
+ // OPFS 中表以空 JSON 数组文件形式存在
+ await this.writeTableData(schema.name, []);
+ }
+ async dropTable(tableName) {
+ await this.memoryCache.dropTable(tableName);
+ if (this.tablesDir) {
+ try {
+ await this.tablesDir.removeEntry(`${tableName}.json`);
+ }
+ catch {
+ // 文件不存在则忽略
+ }
+ }
+ }
+ async hasTable(tableName) {
+ if (!this.tablesDir)
+ return false;
+ try {
+ await this.tablesDir.getFileHandle(`${tableName}.json`);
+ return true;
+ }
+ catch {
+ return false;
+ }
+ }
+ async getTableNames() {
+ if (!this.tablesDir)
+ return [];
+ const names = [];
+ for await (const [name] of this.tablesDir.entries()) {
+ if (name.endsWith('.json')) {
+ names.push(name.replace('.json', ''));
+ }
+ }
+ return names;
+ }
+ async getTableSchema(tableName) {
+ return this.memoryCache.getTableSchema(tableName);
+ }
+ // ---- CRUD ----
+ async insert(tableName, rows) {
+ const pks = await this.memoryCache.insert(tableName, rows);
+ // 持久化到 OPFS
+ const allRows = await this.memoryCache.find(tableName, { table: tableName });
+ await this.writeTableData(tableName, allRows);
+ return pks;
+ }
+ async find(tableName, query) {
+ return this.memoryCache.find(tableName, query);
+ }
+ async update(tableName, query, updates) {
+ const count = await this.memoryCache.update(tableName, query, updates);
+ const allRows = await this.memoryCache.find(tableName, { table: tableName });
+ await this.writeTableData(tableName, allRows);
+ return count;
+ }
+ async delete(tableName, query) {
+ const count = await this.memoryCache.delete(tableName, query);
+ const allRows = await this.memoryCache.find(tableName, { table: tableName });
+ await this.writeTableData(tableName, allRows);
+ return count;
+ }
+ async count(tableName, query) {
+ return this.memoryCache.count(tableName, query);
+ }
+ async clear(tableName) {
+ await this.memoryCache.clear(tableName);
+ await this.writeTableData(tableName, []);
+ }
+ // ---- 内部辅助 ----
+ ensureDir() {
+ if (!this.tablesDir) {
+ throw new DatabaseError('Database not opened', 'DB_NOT_OPEN');
+ }
+ return this.tablesDir;
+ }
+ async writeTableData(tableName, data) {
+ const dir = this.ensureDir();
+ const fileName = `${tableName}.json`;
+ const fileHandle = await dir.getFileHandle(fileName, { create: true });
+ const writable = await fileHandle.createWritable();
+ await writable.write(JSON.stringify(data));
+ await writable.close();
+ }
+ async readTableData(tableName) {
+ const dir = this.ensureDir();
+ const fileName = `${tableName}.json`;
+ try {
+ const fileHandle = await dir.getFileHandle(fileName);
+ const file = await fileHandle.getFile();
+ const text = await file.text();
+ return JSON.parse(text);
+ }
+ catch {
+ return [];
+ }
+ }
+ /** 从 OPFS 加载表数据到内存缓存 */
+ async loadTableIntoMemory(tableName, schema) {
+ await this.memoryCache.createTable(schema);
+ const rows = await this.readTableData(tableName);
+ if (rows.length > 0) {
+ // 直接用 Map 设置绕过 insert 校验
+ for (const row of rows) {
+ await this.memoryCache.insert(tableName, [row]);
+ }
+ }
+ }
+}
+
+/**
+ * metona-sqlark Hybrid Engine — 内存 + 磁盘混合存储引擎
+ * @module hybrid/index
+ *
+ * 采用 write-through 策略:
+ * - 所有写操作同时写入内存和磁盘
+ * - 所有读操作直接从内存返回
+ * - 数据库打开时从磁盘加载数据到内存
+ */
+// ---------------------------------------------------------------------------
+// HybridEngine
+// ---------------------------------------------------------------------------
+class HybridEngine {
+ constructor(diskEngine = 'indexeddb') {
+ this.name = 'hybrid';
+ this.memoryEngine = new MemoryEngine();
+ this.diskEngineType = diskEngine;
+ this.diskEngine = diskEngine === 'opfs' ? new OPFSEngine() : new IndexedDBEngine();
+ }
+ // ---- 生命周期 ----
+ async open(dbName, version) {
+ // 先打开磁盘引擎
+ await this.diskEngine.open(dbName, version);
+ // 再打开内存引擎
+ await this.memoryEngine.open(dbName, version);
+ // 从磁盘加载现存表
+ const tableNames = await this.diskEngine.getTableNames();
+ for (const tableName of tableNames) {
+ const schema = await this.diskEngine.getTableSchema(tableName);
+ if (!schema)
+ continue;
+ // 在内存中创建表
+ await this.memoryEngine.createTable(schema);
+ // 从磁盘加载数据到内存
+ const rows = await this.diskEngine.find(tableName, { table: tableName });
+ if (rows.length > 0) {
+ try {
+ await this.memoryEngine.insert(tableName, rows);
+ }
+ catch (e) {
+ // eslint-disable-next-line no-console
+ console.warn(`[metona-sqlark] Failed to load table "${tableName}" data from disk:`, e);
+ }
+ }
+ }
+ }
+ async close() {
+ await this.memoryEngine.close();
+ await this.diskEngine.close();
+ }
+ isOpen() {
+ return this.memoryEngine.isOpen() && this.diskEngine.isOpen();
+ }
+ // ---- 表管理 ----
+ async createTable(schema) {
+ await this.memoryEngine.createTable(schema);
+ await this.diskEngine.createTable(schema);
+ }
+ async dropTable(tableName) {
+ await this.memoryEngine.dropTable(tableName);
+ await this.diskEngine.dropTable(tableName);
+ }
+ async hasTable(tableName) {
+ return this.memoryEngine.hasTable(tableName);
+ }
+ async getTableNames() {
+ return this.memoryEngine.getTableNames();
+ }
+ async getTableSchema(tableName) {
+ return this.memoryEngine.getTableSchema(tableName);
+ }
+ // ---- CRUD(write-through 策略) ----
+ async insert(tableName, rows) {
+ const pks = await this.memoryEngine.insert(tableName, rows);
+ // write-through: 同步写入磁盘
+ await this.diskEngine.insert(tableName, rows);
+ return pks;
+ }
+ async find(tableName, query) {
+ // 直接从内存读取
+ return this.memoryEngine.find(tableName, query);
+ }
+ async update(tableName, query, updates) {
+ const count = await this.memoryEngine.update(tableName, query, updates);
+ // write-through: 同步更新磁盘
+ await this.diskEngine.update(tableName, query, updates);
+ return count;
+ }
+ async delete(tableName, query) {
+ const count = await this.memoryEngine.delete(tableName, query);
+ // write-through: 同步删除磁盘
+ await this.diskEngine.delete(tableName, query);
+ return count;
+ }
+ async count(tableName, query) {
+ return this.memoryEngine.count(tableName, query);
+ }
+ async clear(tableName) {
+ await this.memoryEngine.clear(tableName);
+ await this.diskEngine.clear(tableName);
+ }
+ // ---- 引擎信息 ----
+ /** 获取磁盘引擎类型 */
+ getDiskEngineType() {
+ return this.diskEngineType;
+ }
+ /** 获取内存引擎(供内部使用) */
+ getMemoryEngine() {
+ return this.memoryEngine;
+ }
+}
+
+/**
+ * metona-sqlark Query Builder — 链式查询构建器
+ * @module query/builder
+ *
+ * 链式调用 → 构建 AST → 执行引擎操作。
+ * 支持 JOIN(需要 Executor)。
+ */
+// ---------------------------------------------------------------------------
+// SelectQueryBuilder
+// ---------------------------------------------------------------------------
+class SelectQueryBuilder {
+ constructor(engine, tableName, _columns = ['*'], executor) {
+ this.engine = engine;
+ this.tableName = tableName;
+ this._columns = _columns;
+ this._where = {};
+ this._orderBy = [];
+ this._joins = [];
+ this._executor = executor;
+ }
+ /** 主表别名 */
+ as(alias) {
+ this._alias = alias;
+ return this;
+ }
+ /** INNER JOIN */
+ innerJoin(table, on, alias) {
+ return this._addJoin('INNER', table, on, alias);
+ }
+ /** LEFT JOIN */
+ leftJoin(table, on, alias) {
+ return this._addJoin('LEFT', table, on, alias);
+ }
+ /** RIGHT JOIN */
+ rightJoin(table, on, alias) {
+ return this._addJoin('RIGHT', table, on, alias);
+ }
+ /** CROSS JOIN */
+ crossJoin(table, alias) {
+ return this._addJoin('CROSS', table, {}, alias);
+ }
+ /** 通用 JOIN */
+ join(table, on, alias) {
+ return this._addJoin('INNER', table, on, alias);
+ }
+ _addJoin(type, table, on, alias) {
+ this._joins.push({ type, table, on, alias });
+ return this;
+ }
+ /** 添加过滤条件 */
+ where(condition) {
+ this._where = { ...this._where, ...condition };
+ return this;
+ }
+ /** 排序 */
+ orderBy(column, direction = 'asc') {
+ this._orderBy.push({ column, direction });
+ return this;
+ }
+ /** 限制返回条数 */
+ limit(n) {
+ this._limit = n;
+ return this;
+ }
+ /** 偏移量 */
+ offset(n) {
+ this._offset = n;
+ return this;
+ }
+ /** 执行查询 */
+ async execute() {
+ // 有 JOIN → 通过 Executor 执行
+ if (this._joins.length > 0 && this._executor) {
+ const ast = this.toAST();
+ return this._executor.execute(ast);
+ }
+ // 无 JOIN → 直接调用引擎
+ return this.engine.find(this.tableName, {
+ table: this.tableName,
+ columns: this._columns,
+ where: this._where,
+ orderBy: this._orderBy.length > 0 ? this._orderBy : undefined,
+ limit: this._limit,
+ offset: this._offset,
+ });
+ }
+ /** 获取 AST */
+ toAST() {
+ return {
+ type: 'SELECT',
+ columns: this._columns,
+ from: this.tableName,
+ alias: this._alias,
+ joins: this._joins.length > 0 ? [...this._joins] : undefined,
+ where: this._where,
+ orderBy: this._orderBy.length > 0 ? this._orderBy : undefined,
+ limit: this._limit,
+ offset: this._offset,
+ };
+ }
+}
+// ---------------------------------------------------------------------------
+// UpdateQueryBuilder
+// ---------------------------------------------------------------------------
+class UpdateQueryBuilder {
+ constructor(engine, tableName, _updates) {
+ this.engine = engine;
+ this.tableName = tableName;
+ this._updates = _updates;
+ this._where = {};
+ }
+ where(condition) {
+ this._where = { ...this._where, ...condition };
+ return this;
+ }
+ async execute() {
+ return this.engine.update(this.tableName, { table: this.tableName, where: this._where }, this._updates);
+ }
+ toAST() {
+ return { type: 'UPDATE', table: this.tableName, sets: this._updates, where: this._where };
+ }
+}
+// ---------------------------------------------------------------------------
+// DeleteQueryBuilder
+// ---------------------------------------------------------------------------
+class DeleteQueryBuilder {
+ constructor(engine, tableName) {
+ this.engine = engine;
+ this.tableName = tableName;
+ this._where = {};
+ }
+ where(condition) {
+ this._where = { ...this._where, ...condition };
+ return this;
+ }
+ async execute() {
+ return this.engine.delete(this.tableName, { table: this.tableName, where: this._where });
+ }
+ toAST() {
+ return { type: 'DELETE', from: this.tableName, where: this._where };
+ }
+}
+
+/**
+ * metona-sqlark Table — 表操作 API
+ * @module table/table
+ */
+// ---------------------------------------------------------------------------
+// Table
+// ---------------------------------------------------------------------------
+class Table {
+ constructor(engine, tableName, executor) {
+ this.schema = null;
+ this.engine = engine;
+ this.name = tableName;
+ this.executor = executor;
+ }
+ // ---- Schema ----
+ async getSchema() {
+ if (!this.schema) {
+ const s = await this.engine.getTableSchema(this.name);
+ if (!s)
+ throw new DatabaseError(`Table "${this.name}" does not exist`, 'TABLE_NOT_FOUND');
+ this.schema = s;
+ }
+ return this.schema;
+ }
+ // ---- 插入 ----
+ async insert(row) {
+ const pks = await this.engine.insert(this.name, [row]);
+ return pks[0];
+ }
+ async insertMany(rows) {
+ return this.engine.insert(this.name, rows);
+ }
+ // ---- 查询 ----
+ select(columns = ['*']) {
+ return new SelectQueryBuilder(this.engine, this.name, columns, this.executor);
+ }
+ // ---- 更新 ----
+ update(updates) {
+ return new UpdateQueryBuilder(this.engine, this.name, updates);
+ }
+ // ---- 删除 ----
+ delete() {
+ return new DeleteQueryBuilder(this.engine, this.name);
+ }
+ // ---- 聚合 ----
+ async count(where) {
+ return this.engine.count(this.name, where ? { table: this.name, where } : undefined);
+ }
+ // ---- 管理 ----
+ async clear() {
+ return this.engine.clear(this.name);
+ }
+ async drop() {
+ return this.engine.dropTable(this.name);
+ }
+}
+
+/**
+ * metona-sqlark Schema — 表结构定义与校验
+ * @module table/schema
+ */
+// ---------------------------------------------------------------------------
+// Schema 工具
+// ---------------------------------------------------------------------------
+/** 从列定义创建 TableSchema */
+function createSchema(name, columns) {
+ validateColumns(columns);
+ return { name, columns };
+}
+/** 校验列定义 */
+function validateColumns(columns) {
+ const colNames = Object.keys(columns);
+ if (colNames.length === 0) {
+ throw new DatabaseError('Table must have at least one column', 'SCHEMA_ERROR');
+ }
+ let primaryKeyCount = 0;
+ for (const [colName, colDef] of Object.entries(columns)) {
+ // 类型校验
+ if (!FIELD_TYPES.includes(colDef.type)) {
+ throw new DatabaseError(`Invalid type "${colDef.type}" for column "${colName}". Valid types: ${FIELD_TYPES.join(', ')}`, 'SCHEMA_ERROR');
+ }
+ // 主键计数
+ if (colDef.primaryKey) {
+ primaryKeyCount++;
+ }
+ }
+ // 至少需要一个主键
+ if (primaryKeyCount === 0) {
+ throw new DatabaseError('Table must have at least one primary key column', 'SCHEMA_ERROR');
+ }
+}
+/** 将 AST 列定义转换为 ColumnDef */
+function astColumnToColumnDef(astCol) {
+ return {
+ type: astCol.type,
+ primaryKey: astCol.primaryKey,
+ unique: astCol.unique,
+ required: astCol.required,
+ default: astCol.default,
+ index: astCol.index,
+ maxLength: astCol.maxLength,
+ min: astCol.min,
+ max: astCol.max,
+ };
+}
+
+/**
+ * metona-sqlark Query Compiler — AST → 查询计划
+ * @module query/compiler
+ *
+ * 将 AST 语句编译为引擎可执行的 QueryPlan。
+ * v0.0.1: 简单直接映射,未来可加入索引选择、过滤下推等优化。
+ */
+// ---------------------------------------------------------------------------
+// 编译 AST → QueryPlan
+// ---------------------------------------------------------------------------
+/**
+ * 编译 SELECT / DELETE / UPDATE 语句为 QueryPlan。
+ * INSERT 和 DDL 语句不需要 QueryPlan。
+ */
+function compileStatement(stmt) {
+ switch (stmt.type) {
+ case 'SELECT':
+ return compileSelect(stmt);
+ case 'DELETE':
+ return compileDelete(stmt);
+ case 'UPDATE':
+ return compileUpdate(stmt);
+ default:
+ throw new DatabaseError(`Cannot compile statement type "${stmt.type}" to QueryPlan`, 'COMPILE_ERROR');
+ }
+}
+function compileSelect(stmt) {
+ return {
+ table: stmt.from,
+ columns: stmt.columns,
+ where: stmt.where,
+ orderBy: stmt.orderBy?.length ? stmt.orderBy : undefined,
+ limit: stmt.limit,
+ offset: stmt.offset,
+ };
+}
+function compileDelete(stmt) {
+ return {
+ table: stmt.from,
+ where: stmt.where,
+ };
+}
+function compileUpdate(stmt) {
+ return {
+ table: stmt.table,
+ where: stmt.where,
+ };
+}
+
+/**
+ * metona-sqlark Query Executor — AST 执行器
+ * @module query/executor
+ *
+ * JOIN / GROUP BY / DISTINCT 逻辑在此层处理。
+ */
+// ---------------------------------------------------------------------------
+// Executor
+// ---------------------------------------------------------------------------
+class QueryExecutor {
+ constructor(engine) {
+ this.engine = engine;
+ }
+ async execute(stmt) {
+ switch (stmt.type) {
+ case 'SELECT': return this.executeSelect(stmt);
+ case 'INSERT': return this.executeInsert(stmt);
+ case 'UPDATE': return this.executeUpdate(stmt);
+ case 'DELETE': return this.executeDelete(stmt);
+ case 'CREATE_TABLE': return this.executeCreateTable(stmt);
+ case 'DROP_TABLE': return this.executeDropTable(stmt);
+ default: throw new DatabaseError('Unknown statement type', 'UNKNOWN_STATEMENT');
+ }
+ }
+ // ===================================================================
+ // SELECT
+ // ===================================================================
+ async executeSelect(stmt) {
+ const hasGroupBy = !!(stmt.groupBy && stmt.groupBy.length > 0);
+ let rows;
+ if (!stmt.joins || stmt.joins.length === 0) {
+ const plan = compileStatement(hasGroupBy ? { ...stmt, columns: ['*'] } : stmt);
+ rows = await this.engine.find(plan.table, plan);
+ }
+ else {
+ rows = await this.executeJoinSelect(stmt);
+ }
+ if (hasGroupBy)
+ rows = this.executeGroupBy(rows, stmt);
+ if (stmt.distinct)
+ rows = this.executeDistinct(rows);
+ if (stmt.having && Object.keys(stmt.having).length > 0) {
+ rows = rows.filter((row) => matchWhere(row, stmt.having));
+ }
+ if (stmt.orderBy && stmt.orderBy.length > 0)
+ rows = applyOrderBy(rows, stmt.orderBy);
+ const offset = stmt.offset ?? 0;
+ const limit = stmt.limit ?? rows.length;
+ rows = rows.slice(offset, offset + limit);
+ if (!hasGroupBy && stmt.columns.length > 0 && stmt.columns[0] !== '*') {
+ rows = rows.map((row) => projectColumns(row, stmt.columns));
+ }
+ return rows;
+ }
+ // ---- JOIN ----
+ async executeJoinSelect(stmt) {
+ const mainAlias = stmt.alias ?? stmt.from;
+ const mainRows = (await this.engine.find(stmt.from, { table: stmt.from }))
+ .map((row) => this.prefixRow(row, mainAlias));
+ let resultRows = mainRows;
+ for (const join of stmt.joins) {
+ const joinAlias = join.alias ?? join.table;
+ const joinRows = (await this.engine.find(join.table, { table: join.table }))
+ .map((row) => this.prefixRow(row, joinAlias));
+ resultRows = this.joinRows(resultRows, joinRows, join);
+ }
+ if (stmt.where && Object.keys(stmt.where).length > 0) {
+ resultRows = resultRows.filter((row) => matchWhere(row, stmt.where));
+ }
+ return resultRows;
+ }
+ prefixRow(row, alias) {
+ const prefixed = {};
+ for (const [key, value] of Object.entries(row))
+ prefixed[`${alias}.${key}`] = value;
+ return prefixed;
+ }
+ /** 嵌套循环连接(优化:避免 ON 时对象扩散) */
+ joinRows(leftRows, rightRows, join) {
+ if (join.type === 'CROSS') {
+ const result = [];
+ for (const l of leftRows)
+ for (const r of rightRows)
+ result.push({ ...l, ...r });
+ return result;
+ }
+ const result = [];
+ for (const l of leftRows) {
+ let matched = false;
+ for (const r of rightRows) {
+ // 合并后匹配 ON(避免创建临时对象再丢弃)
+ const merged = { ...l, ...r };
+ if (matchWhere(merged, join.on, { $col: true })) {
+ result.push(merged);
+ matched = true;
+ }
+ }
+ if (!matched && join.type === 'LEFT') {
+ const nullRight = {};
+ for (const key of Object.keys(rightRows[0] ?? {}))
+ nullRight[key] = null;
+ result.push({ ...l, ...nullRight });
+ }
+ }
+ if (join.type === 'RIGHT') {
+ for (const r of rightRows) {
+ const isMatched = leftRows.some((l) => {
+ const merged = { ...l, ...r };
+ return matchWhere(merged, join.on, { $col: true });
+ });
+ if (!isMatched) {
+ const nullLeft = {};
+ for (const key of Object.keys(leftRows[0] ?? {}))
+ nullLeft[key] = null;
+ result.push({ ...nullLeft, ...r });
+ }
+ }
+ }
+ return result;
+ }
+ // ---- GROUP BY ----
+ executeGroupBy(rows, stmt) {
+ const groups = new Map();
+ for (const row of rows) {
+ const key = stmt.groupBy.map((col) => String(row[col] ?? 'null')).join('|');
+ if (!groups.has(key))
+ groups.set(key, []);
+ groups.get(key).push(row);
+ }
+ const result = [];
+ for (const groupRows of groups.values()) {
+ const aggregated = {};
+ for (const col of stmt.groupBy)
+ aggregated[col] = groupRows[0][col];
+ for (const colExpr of stmt.columns) {
+ if (colExpr === '*')
+ continue;
+ const m = colExpr.match(/^(COUNT|SUM|AVG|MIN|MAX)\((.+?)\)(?:\s+AS\s+(\w+))?$/i);
+ if (m) {
+ const [, func, arg, alias] = m;
+ aggregated[alias || colExpr] = this.computeAggregate(func.toUpperCase(), groupRows, arg.trim());
+ }
+ else if (!stmt.groupBy.includes(colExpr)) {
+ aggregated[colExpr] = groupRows[0][colExpr];
+ }
+ }
+ result.push(aggregated);
+ }
+ return result;
+ }
+ computeAggregate(func, rows, col) {
+ const nums = rows.map((r) => r[col]).filter((v) => v !== null && v !== undefined).map(Number);
+ switch (func) {
+ case 'COUNT': return col === '*' ? rows.length : nums.length;
+ case 'SUM': return nums.reduce((a, b) => a + b, 0);
+ case 'AVG': return nums.length === 0 ? 0 : nums.reduce((a, b) => a + b, 0) / nums.length;
+ case 'MIN': return nums.length === 0 ? 0 : Math.min(...nums);
+ case 'MAX': return nums.length === 0 ? 0 : Math.max(...nums);
+ default: return 0;
+ }
+ }
+ // ---- DISTINCT(优化:列值拼接代替 JSON.stringify) ----
+ executeDistinct(rows) {
+ const seen = new Set();
+ return rows.filter((row) => {
+ const key = Object.values(row).map((v) => String(v ?? '\0')).join('\x1f');
+ if (seen.has(key))
+ return false;
+ seen.add(key);
+ return true;
+ });
+ }
+ // ===================================================================
+ // 其他语句
+ // ===================================================================
+ async executeInsert(stmt) {
+ const schema = await this.engine.getTableSchema(stmt.into);
+ if (!schema)
+ throw new DatabaseError(`Table "${stmt.into}" does not exist`, 'TABLE_NOT_FOUND');
+ const colNames = stmt.columns ?? Object.keys(schema.columns);
+ const rows = stmt.values.map((vals) => {
+ const row = {};
+ for (let i = 0; i < colNames.length; i++) {
+ if (i < vals.length)
+ row[colNames[i]] = vals[i];
+ }
+ return row;
+ });
+ return this.engine.insert(stmt.into, rows);
+ }
+ async executeUpdate(stmt) {
+ const plan = compileStatement(stmt);
+ return this.engine.update(plan.table, plan, stmt.sets);
+ }
+ async executeDelete(stmt) {
+ const plan = compileStatement(stmt);
+ return this.engine.delete(plan.table, plan);
+ }
+ async executeCreateTable(stmt) {
+ const columns = {};
+ for (const col of stmt.columns)
+ columns[col.name] = astColumnToColumnDef(col);
+ return this.engine.createTable(createSchema(stmt.name, columns));
+ }
+ async executeDropTable(stmt) {
+ return this.engine.dropTable(stmt.name);
+ }
+ getEngine() { return this.engine; }
+}
+
+/**
+ * metona-sqlark SQL Token Types — 词法单元定义
+ * @module sql/tokens
+ */
+// ---------------------------------------------------------------------------
+// Token 类型枚举
+// ---------------------------------------------------------------------------
+var TokenType;
+(function (TokenType) {
+ // 关键字
+ TokenType["SELECT"] = "SELECT";
+ TokenType["FROM"] = "FROM";
+ TokenType["WHERE"] = "WHERE";
+ TokenType["INSERT"] = "INSERT";
+ TokenType["INTO"] = "INTO";
+ TokenType["VALUES"] = "VALUES";
+ TokenType["UPDATE"] = "UPDATE";
+ TokenType["SET"] = "SET";
+ TokenType["DELETE"] = "DELETE";
+ TokenType["CREATE"] = "CREATE";
+ TokenType["TABLE"] = "TABLE";
+ TokenType["DROP"] = "DROP";
+ TokenType["ORDER"] = "ORDER";
+ TokenType["BY"] = "BY";
+ TokenType["ASC"] = "ASC";
+ TokenType["DESC"] = "DESC";
+ TokenType["LIMIT"] = "LIMIT";
+ TokenType["OFFSET"] = "OFFSET";
+ TokenType["AND"] = "AND";
+ TokenType["OR"] = "OR";
+ TokenType["NOT"] = "NOT";
+ TokenType["LIKE"] = "LIKE";
+ TokenType["IN"] = "IN";
+ TokenType["PRIMARY"] = "PRIMARY";
+ TokenType["KEY"] = "KEY";
+ TokenType["UNIQUE"] = "UNIQUE";
+ TokenType["DEFAULT"] = "DEFAULT";
+ TokenType["NULL"] = "NULL";
+ TokenType["TRUE"] = "TRUE";
+ TokenType["FALSE"] = "FALSE";
+ // JOIN 相关
+ TokenType["INNER"] = "INNER";
+ TokenType["LEFT"] = "LEFT";
+ TokenType["RIGHT"] = "RIGHT";
+ TokenType["CROSS"] = "CROSS";
+ TokenType["JOIN"] = "JOIN";
+ TokenType["ON"] = "ON";
+ TokenType["AS"] = "AS";
+ TokenType["OUTER"] = "OUTER";
+ // 聚合
+ TokenType["GROUP"] = "GROUP";
+ TokenType["HAVING"] = "HAVING";
+ TokenType["COUNT"] = "COUNT";
+ TokenType["SUM"] = "SUM";
+ TokenType["AVG"] = "AVG";
+ TokenType["MIN"] = "MIN";
+ TokenType["MAX"] = "MAX";
+ TokenType["DISTINCT"] = "DISTINCT";
+ // 标识符 & 字面量
+ TokenType["IDENTIFIER"] = "IDENTIFIER";
+ TokenType["STRING"] = "STRING";
+ TokenType["NUMBER"] = "NUMBER";
+ // 运算符 & 分隔符
+ TokenType["COMMA"] = "COMMA";
+ TokenType["LPAREN"] = "LPAREN";
+ TokenType["RPAREN"] = "RPAREN";
+ TokenType["SEMICOLON"] = "SEMICOLON";
+ TokenType["EQ"] = "EQ";
+ TokenType["NEQ"] = "NEQ";
+ TokenType["GT"] = "GT";
+ TokenType["GTE"] = "GTE";
+ TokenType["LT"] = "LT";
+ TokenType["LTE"] = "LTE";
+ TokenType["STAR"] = "STAR";
+ TokenType["DOT"] = "DOT";
+ // 特殊
+ TokenType["EOF"] = "EOF";
+ TokenType["ILLEGAL"] = "ILLEGAL";
+})(TokenType || (TokenType = {}));
+// ---------------------------------------------------------------------------
+// 关键字映射
+// ---------------------------------------------------------------------------
+const KEYWORDS = {
+ 'SELECT': TokenType.SELECT,
+ 'FROM': TokenType.FROM,
+ 'WHERE': TokenType.WHERE,
+ 'INSERT': TokenType.INSERT,
+ 'INTO': TokenType.INTO,
+ 'VALUES': TokenType.VALUES,
+ 'UPDATE': TokenType.UPDATE,
+ 'SET': TokenType.SET,
+ 'DELETE': TokenType.DELETE,
+ 'CREATE': TokenType.CREATE,
+ 'TABLE': TokenType.TABLE,
+ 'DROP': TokenType.DROP,
+ 'ORDER': TokenType.ORDER,
+ 'BY': TokenType.BY,
+ 'ASC': TokenType.ASC,
+ 'DESC': TokenType.DESC,
+ 'LIMIT': TokenType.LIMIT,
+ 'OFFSET': TokenType.OFFSET,
+ 'AND': TokenType.AND,
+ 'OR': TokenType.OR,
+ 'NOT': TokenType.NOT,
+ 'LIKE': TokenType.LIKE,
+ 'IN': TokenType.IN,
+ 'PRIMARY': TokenType.PRIMARY,
+ 'KEY': TokenType.KEY,
+ 'UNIQUE': TokenType.UNIQUE,
+ 'DEFAULT': TokenType.DEFAULT,
+ 'NULL': TokenType.NULL,
+ 'TRUE': TokenType.TRUE,
+ 'FALSE': TokenType.FALSE,
+ // JOIN
+ 'INNER': TokenType.INNER,
+ 'LEFT': TokenType.LEFT,
+ 'RIGHT': TokenType.RIGHT,
+ 'CROSS': TokenType.CROSS,
+ 'JOIN': TokenType.JOIN,
+ 'ON': TokenType.ON,
+ 'AS': TokenType.AS,
+ 'OUTER': TokenType.OUTER,
+ // 聚合
+ 'GROUP': TokenType.GROUP,
+ 'HAVING': TokenType.HAVING,
+ 'COUNT': TokenType.COUNT,
+ 'SUM': TokenType.SUM,
+ 'AVG': TokenType.AVG,
+ 'MIN': TokenType.MIN,
+ 'MAX': TokenType.MAX,
+ 'DISTINCT': TokenType.DISTINCT,
+};
+
+/**
+ * metona-sqlark SQL Lexer — 词法分析器
+ * @module sql/lexer
+ *
+ * 将 SQL 字符串切分为 Token 流。
+ */
+// ---------------------------------------------------------------------------
+// Lexer
+// ---------------------------------------------------------------------------
+class Lexer {
+ constructor(input) {
+ this.position = 0;
+ this.readPosition = 0;
+ this.ch = '';
+ this.input = input;
+ this.readChar();
+ }
+ /** 读取下一个 Token */
+ nextToken() {
+ this.skipWhitespace();
+ let tok;
+ switch (this.ch) {
+ case ',':
+ tok = this.makeToken(TokenType.COMMA, ',');
+ break;
+ case '(':
+ tok = this.makeToken(TokenType.LPAREN, '(');
+ break;
+ case ')':
+ tok = this.makeToken(TokenType.RPAREN, ')');
+ break;
+ case ';':
+ tok = this.makeToken(TokenType.SEMICOLON, ';');
+ break;
+ case '*':
+ tok = this.makeToken(TokenType.STAR, '*');
+ break;
+ case '.':
+ tok = this.makeToken(TokenType.DOT, '.');
+ break;
+ case '=':
+ tok = this.makeToken(TokenType.EQ, '=');
+ break;
+ case '!':
+ if (this.peekChar() === '=') {
+ this.readChar();
+ tok = this.makeToken(TokenType.NEQ, '!=');
+ }
+ else {
+ tok = this.makeToken(TokenType.ILLEGAL, '!');
+ }
+ break;
+ case '>':
+ if (this.peekChar() === '=') {
+ this.readChar();
+ tok = this.makeToken(TokenType.GTE, '>=');
+ }
+ else {
+ tok = this.makeToken(TokenType.GT, '>');
+ }
+ break;
+ case '<':
+ if (this.peekChar() === '=') {
+ this.readChar();
+ tok = this.makeToken(TokenType.LTE, '<=');
+ }
+ else if (this.peekChar() === '>') {
+ this.readChar();
+ tok = this.makeToken(TokenType.NEQ, '<>');
+ }
+ else {
+ tok = this.makeToken(TokenType.LT, '<');
+ }
+ break;
+ case "'":
+ case '"':
+ tok = this.readString(this.ch);
+ break;
+ case '':
+ tok = { type: TokenType.EOF, value: '', position: this.position };
+ break;
+ default:
+ if (this.isLetter(this.ch)) {
+ const ident = this.readIdentifier();
+ const keyword = KEYWORDS[ident.toUpperCase()];
+ tok = {
+ type: keyword ?? TokenType.IDENTIFIER,
+ value: ident,
+ position: this.position - ident.length,
+ };
+ return tok; // 已读取完毕,不需要再 readChar
+ }
+ else if (this.isDigit(this.ch) || (this.ch === '-' && this.isDigit(this.peekChar()))) {
+ const num = this.readNumber();
+ tok = {
+ type: TokenType.NUMBER,
+ value: num,
+ position: this.position - num.length,
+ };
+ return tok;
+ }
+ else {
+ tok = this.makeToken(TokenType.ILLEGAL, this.ch);
+ }
+ break;
+ }
+ this.readChar();
+ return tok;
+ }
+ // ---- 内部 ----
+ readChar() {
+ if (this.readPosition >= this.input.length) {
+ this.ch = '';
+ }
+ else {
+ this.ch = this.input[this.readPosition];
+ }
+ this.position = this.readPosition;
+ this.readPosition++;
+ }
+ peekChar() {
+ if (this.readPosition >= this.input.length)
+ return '';
+ return this.input[this.readPosition];
+ }
+ skipWhitespace() {
+ while (this.ch === ' ' || this.ch === '\t' || this.ch === '\n' || this.ch === '\r') {
+ this.readChar();
+ }
+ }
+ readIdentifier() {
+ const start = this.position;
+ while (this.isLetter(this.ch) || this.isDigit(this.ch) || this.ch === '_') {
+ this.readChar();
+ }
+ return this.input.slice(start, this.position);
+ }
+ readNumber() {
+ const start = this.position;
+ // 负号
+ if (this.ch === '-')
+ this.readChar();
+ while (this.isDigit(this.ch)) {
+ this.readChar();
+ }
+ // 小数点
+ if (this.ch === '.' && this.isDigit(this.peekChar())) {
+ this.readChar();
+ while (this.isDigit(this.ch)) {
+ this.readChar();
+ }
+ }
+ return this.input.slice(start, this.position);
+ }
+ readString(quote) {
+ const start = this.position + 1; // 跳过一个引号
+ this.readChar(); // 跳过开始引号
+ let value = '';
+ while (this.ch !== quote && this.ch !== '') {
+ // 处理转义
+ if (this.ch === '\\' && this.peekChar() === quote) {
+ this.readChar();
+ value += quote;
+ }
+ else {
+ value += this.ch;
+ }
+ this.readChar();
+ }
+ // 跳过结束引号(在 readChar 之后才会调用,所以这里不需要处理)
+ return {
+ type: TokenType.STRING,
+ value,
+ position: start,
+ };
+ }
+ isLetter(ch) {
+ return /[a-zA-Z_]/.test(ch);
+ }
+ isDigit(ch) {
+ return /[0-9]/.test(ch);
+ }
+ makeToken(type, value) {
+ return { type, value, position: this.position };
+ }
+}
+// ---------------------------------------------------------------------------
+// 便捷方法:一次性词法分析
+// ---------------------------------------------------------------------------
+/** 将 SQL 字符串解析为 Token 列表 */
+function tokenize(sql) {
+ const lexer = new Lexer(sql);
+ const tokens = [];
+ let tok = lexer.nextToken();
+ while (tok.type !== TokenType.EOF) {
+ tokens.push(tok);
+ tok = lexer.nextToken();
+ }
+ tokens.push(tok); // EOF
+ return tokens;
+}
+
+/**
+ * metona-sqlark SQL Parser — 递归下降语法分析器
+ * @module sql/parser
+ *
+ * Token 流 → AST Statement。
+ * 支持的语法是标准 SQL 的子集。
+ */
+// ---------------------------------------------------------------------------
+// Parser
+// ---------------------------------------------------------------------------
+class Parser {
+ constructor(sql) {
+ this.lexer = new Lexer(sql);
+ // 预读两个 token
+ this.nextToken();
+ this.nextToken();
+ }
+ /** 解析完整 SQL 语句 */
+ parseStatement() {
+ switch (this.curToken.type) {
+ case TokenType.SELECT:
+ return this.parseSelect();
+ case TokenType.INSERT:
+ return this.parseInsert();
+ case TokenType.UPDATE:
+ return this.parseUpdate();
+ case TokenType.DELETE:
+ return this.parseDelete();
+ case TokenType.CREATE:
+ return this.parseCreateTable();
+ case TokenType.DROP:
+ return this.parseDropTable();
+ default:
+ throw this.error(`Unexpected token "${this.curToken.value}"`);
+ }
+ }
+ // ===================================================================
+ // SELECT
+ // ===================================================================
+ parseSelect() {
+ this.expect(TokenType.SELECT);
+ // DISTINCT(可选)
+ let distinct = false;
+ if (this.curTokenIs(TokenType.DISTINCT)) {
+ distinct = true;
+ this.nextToken();
+ }
+ // 列
+ const columns = [];
+ if (this.curTokenIs(TokenType.STAR)) {
+ columns.push('*');
+ this.nextToken();
+ }
+ else {
+ columns.push(...this.parseColumnList());
+ }
+ // FROM
+ this.expect(TokenType.FROM);
+ const tableName = this.expectIdentifier('table name');
+ // 表别名(可选)
+ let alias;
+ if (this.curTokenIs(TokenType.AS)) {
+ this.nextToken();
+ alias = this.expectIdentifier('alias');
+ }
+ else if (this.curToken.type === TokenType.IDENTIFIER && !this._isReservedAfterFrom()) {
+ alias = this.curToken.value;
+ this.nextToken();
+ }
+ const stmt = {
+ type: 'SELECT',
+ columns,
+ distinct: distinct || undefined,
+ from: tableName,
+ alias,
+ where: {},
+ };
+ // JOIN 子句(可选,支持多个)
+ const joins = this.parseJoinClauses();
+ if (joins.length > 0) {
+ stmt.joins = joins;
+ }
+ // WHERE(可选)
+ if (this.curTokenIs(TokenType.WHERE)) {
+ this.nextToken();
+ stmt.where = this.parseCondition();
+ }
+ // GROUP BY(可选)
+ if (this.curTokenIs(TokenType.GROUP)) {
+ this.nextToken();
+ this.expect(TokenType.BY);
+ stmt.groupBy = this.parseIdentifierList();
+ }
+ // HAVING(可选)
+ if (this.curTokenIs(TokenType.HAVING)) {
+ this.nextToken();
+ stmt.having = this.parseCondition();
+ }
+ // ORDER BY(可选)
+ if (this.curTokenIs(TokenType.ORDER)) {
+ this.nextToken();
+ this.expect(TokenType.BY);
+ stmt.orderBy = this.parseOrderByList();
+ }
+ // LIMIT(可选)
+ if (this.curTokenIs(TokenType.LIMIT)) {
+ this.nextToken();
+ stmt.limit = this.expectNumber('LIMIT value');
+ }
+ // OFFSET(可选)
+ if (this.curTokenIs(TokenType.OFFSET)) {
+ this.nextToken();
+ stmt.offset = this.expectNumber('OFFSET value');
+ }
+ return stmt;
+ }
+ /** 解析 JOIN 子句列表 */
+ parseJoinClauses() {
+ const joins = [];
+ while (this._isJoinKeyword()) {
+ joins.push(this.parseJoinClause());
+ }
+ return joins;
+ }
+ _isJoinKeyword() {
+ return (this.curTokenIs(TokenType.INNER) ||
+ this.curTokenIs(TokenType.LEFT) ||
+ this.curTokenIs(TokenType.RIGHT) ||
+ this.curTokenIs(TokenType.CROSS) ||
+ this.curTokenIs(TokenType.JOIN));
+ }
+ /** 解析单个 JOIN 子句 */
+ parseJoinClause() {
+ let type = 'INNER';
+ if (this.curTokenIs(TokenType.INNER)) {
+ type = 'INNER';
+ this.nextToken();
+ }
+ else if (this.curTokenIs(TokenType.LEFT)) {
+ type = 'LEFT';
+ this.nextToken();
+ if (this.curTokenIs(TokenType.OUTER))
+ this.nextToken(); // 可选 OUTER
+ }
+ else if (this.curTokenIs(TokenType.RIGHT)) {
+ type = 'RIGHT';
+ this.nextToken();
+ if (this.curTokenIs(TokenType.OUTER))
+ this.nextToken();
+ }
+ else if (this.curTokenIs(TokenType.CROSS)) {
+ type = 'CROSS';
+ this.nextToken();
+ }
+ this.expect(TokenType.JOIN);
+ const tableName = this.expectIdentifier('table name');
+ // JOIN 表别名(可选)
+ let alias;
+ if (this.curTokenIs(TokenType.AS)) {
+ this.nextToken();
+ alias = this.expectIdentifier('alias');
+ }
+ else if (this.curToken.type === TokenType.IDENTIFIER && !this._isJoinReserved()) {
+ alias = this.curToken.value;
+ this.nextToken();
+ }
+ // ON 条件(CROSS JOIN 不需要 ON)
+ let on = {};
+ if (type !== 'CROSS' && this.curTokenIs(TokenType.ON)) {
+ this.nextToken();
+ on = this.parseCondition();
+ }
+ return { type, table: tableName, alias, on };
+ }
+ /** 判断当前 token 是否为 FROM 之后的保留字 */
+ _isReservedAfterFrom() {
+ return (this.curTokenIs(TokenType.WHERE) ||
+ this.curTokenIs(TokenType.ORDER) ||
+ this.curTokenIs(TokenType.LIMIT) ||
+ this.curTokenIs(TokenType.OFFSET) ||
+ this.curTokenIs(TokenType.GROUP) ||
+ this._isJoinKeyword());
+ }
+ _isJoinReserved() {
+ return (this.curTokenIs(TokenType.ON) ||
+ this.curTokenIs(TokenType.WHERE) ||
+ this.curTokenIs(TokenType.ORDER) ||
+ this.curTokenIs(TokenType.LIMIT) ||
+ this._isJoinKeyword());
+ }
+ // ===================================================================
+ // INSERT
+ // ===================================================================
+ parseInsert() {
+ this.expect(TokenType.INSERT);
+ this.expect(TokenType.INTO);
+ const tableName = this.expectIdentifier('table name');
+ // 列名(可选)
+ let columns;
+ if (this.curTokenIs(TokenType.LPAREN)) {
+ this.nextToken();
+ columns = this.parseIdentifierList();
+ this.expect(TokenType.RPAREN);
+ }
+ // VALUES
+ this.expect(TokenType.VALUES);
+ // 值列表
+ const values = [];
+ do {
+ if (this.curTokenIs(TokenType.COMMA)) {
+ this.nextToken();
+ }
+ this.expect(TokenType.LPAREN);
+ const rowValues = this.parseValueList();
+ this.expect(TokenType.RPAREN);
+ values.push(rowValues);
+ } while (this.curTokenIs(TokenType.COMMA));
+ return {
+ type: 'INSERT',
+ into: tableName,
+ columns,
+ values,
+ };
+ }
+ // ===================================================================
+ // UPDATE
+ // ===================================================================
+ parseUpdate() {
+ this.expect(TokenType.UPDATE);
+ const tableName = this.expectIdentifier('table name');
+ this.expect(TokenType.SET);
+ // SET col=val, ...
+ const sets = {};
+ do {
+ if (this.curTokenIs(TokenType.COMMA))
+ this.nextToken();
+ const col = this.expectIdentifier('column name');
+ this.expect(TokenType.EQ);
+ sets[col] = this.parseValue();
+ } while (this.curTokenIs(TokenType.COMMA));
+ let where = {};
+ if (this.curTokenIs(TokenType.WHERE)) {
+ this.nextToken();
+ where = this.parseCondition();
+ }
+ return { type: 'UPDATE', table: tableName, sets, where };
+ }
+ // ===================================================================
+ // DELETE
+ // ===================================================================
+ parseDelete() {
+ this.expect(TokenType.DELETE);
+ this.expect(TokenType.FROM);
+ const tableName = this.expectIdentifier('table name');
+ let where = {};
+ if (this.curTokenIs(TokenType.WHERE)) {
+ this.nextToken();
+ where = this.parseCondition();
+ }
+ return { type: 'DELETE', from: tableName, where };
+ }
+ // ===================================================================
+ // CREATE TABLE
+ // ===================================================================
+ parseCreateTable() {
+ this.expect(TokenType.CREATE);
+ this.expect(TokenType.TABLE);
+ const tableName = this.expectIdentifier('table name');
+ this.expect(TokenType.LPAREN);
+ const columns = [];
+ do {
+ if (this.curTokenIs(TokenType.COMMA))
+ this.nextToken();
+ columns.push(this.parseColumnDef());
+ } while (this.curTokenIs(TokenType.COMMA));
+ this.expect(TokenType.RPAREN);
+ return { type: 'CREATE_TABLE', name: tableName, columns };
+ }
+ parseColumnDef() {
+ const name = this.expectIdentifier('column name');
+ const type = this.expectIdentifier('column type').toLowerCase();
+ const col = { name, type };
+ // 修饰符
+ while (this.curTokenIs(TokenType.PRIMARY) ||
+ this.curTokenIs(TokenType.UNIQUE) ||
+ this.curTokenIs(TokenType.NOT) ||
+ this.curTokenIs(TokenType.DEFAULT)) {
+ if (this.curTokenIs(TokenType.PRIMARY)) {
+ this.nextToken();
+ this.expect(TokenType.KEY);
+ col.primaryKey = true;
+ }
+ else if (this.curTokenIs(TokenType.UNIQUE)) {
+ this.nextToken();
+ col.unique = true;
+ }
+ else if (this.curTokenIs(TokenType.NOT)) {
+ this.nextToken();
+ // 支持 NOT NULL → required
+ this.expect(TokenType.NULL);
+ col.required = true;
+ }
+ else if (this.curTokenIs(TokenType.DEFAULT)) {
+ this.nextToken();
+ col.default = this.parseValue();
+ }
+ else {
+ break;
+ }
+ }
+ return col;
+ }
+ // ===================================================================
+ // DROP TABLE
+ // ===================================================================
+ parseDropTable() {
+ this.expect(TokenType.DROP);
+ this.expect(TokenType.TABLE);
+ const tableName = this.expectIdentifier('table name');
+ return { type: 'DROP_TABLE', name: tableName };
+ }
+ // ===================================================================
+ // 条件表达式
+ // ===================================================================
+ /** condition → simple_cond ((AND|OR) simple_cond)* */
+ parseCondition() {
+ let left = this.parseSimpleCondition();
+ while (this.curTokenIs(TokenType.AND) || this.curTokenIs(TokenType.OR)) {
+ const isAnd = this.curTokenIs(TokenType.AND);
+ this.nextToken();
+ const right = this.parseSimpleCondition();
+ if (isAnd) {
+ // 合并到 $and
+ left = { $and: [left, right] };
+ }
+ else {
+ left = { $or: [left, right] };
+ }
+ }
+ return left;
+ }
+ /** simple_cond → column op value | column IS [NOT] NULL | column [NOT] LIKE pattern
+ * | column [NOT] IN (values) | NOT condition | (condition) */
+ parseSimpleCondition() {
+ // NOT expr
+ if (this.curTokenIs(TokenType.NOT)) {
+ this.nextToken();
+ const inner = this.parseSimpleCondition();
+ return { $not: inner };
+ }
+ // (condition)
+ if (this.curTokenIs(TokenType.LPAREN)) {
+ this.nextToken();
+ const inner = this.parseCondition();
+ this.expect(TokenType.RPAREN);
+ return inner;
+ }
+ // column
+ const column = this.parseColumnRef();
+ // IS NULL / IS NOT NULL
+ if (this.curTokenIs(TokenType.IDENTIFIER) && this.curToken.value.toUpperCase() === 'IS') {
+ this.nextToken();
+ const isNot = this.curTokenIs(TokenType.NOT);
+ if (isNot)
+ this.nextToken();
+ this.expect(TokenType.NULL);
+ const result = {};
+ result[column] = isNot ? { $ne: null } : { $eq: null };
+ return result;
+ }
+ // LIKE
+ if (this.curTokenIs(TokenType.LIKE)) {
+ this.nextToken();
+ const pattern = this.parseValue();
+ const result = {};
+ result[column] = { $like: pattern };
+ return result;
+ }
+ // IN
+ if (this.curTokenIs(TokenType.IN)) {
+ this.nextToken();
+ this.expect(TokenType.LPAREN);
+ const values = this.parseValueList();
+ this.expect(TokenType.RPAREN);
+ const result = {};
+ result[column] = { $in: values };
+ return result;
+ }
+ // 比较运算符
+ const op = this.parseComparisonOp();
+ // 尝试解析列引用(identifier DOT identifier 格式)
+ let value;
+ if ((this.curToken.type === TokenType.IDENTIFIER || this._isKeywordAsIdent()) &&
+ this.peekTokenIs(TokenType.DOT)) {
+ const colRef = this.parseColumnRef();
+ value = { $col: colRef };
+ }
+ else {
+ value = this.parseValue();
+ }
+ const result = {};
+ result[column] = { [op]: value };
+ return result;
+ }
+ peekTokenIs(type) {
+ return this.peekToken.type === type;
+ }
+ parseComparisonOp() {
+ switch (this.curToken.type) {
+ case TokenType.EQ:
+ this.nextToken();
+ return '$eq';
+ case TokenType.NEQ:
+ this.nextToken();
+ return '$ne';
+ case TokenType.GT:
+ this.nextToken();
+ return '$gt';
+ case TokenType.GTE:
+ this.nextToken();
+ return '$gte';
+ case TokenType.LT:
+ this.nextToken();
+ return '$lt';
+ case TokenType.LTE:
+ this.nextToken();
+ return '$lte';
+ default:
+ throw this.error(`Expected comparison operator, got "${this.curToken.value}"`);
+ }
+ }
+ // ===================================================================
+ // 辅助解析
+ // ===================================================================
+ parseColumnList() {
+ const cols = [];
+ cols.push(this.parseColumnRef());
+ while (this.curTokenIs(TokenType.COMMA)) {
+ this.nextToken();
+ cols.push(this.parseColumnRef());
+ }
+ return cols;
+ }
+ /** 解析列引用:支持 'col'、'table.col' 和 'COUNT(*)'/'SUM(col)' 等 */
+ parseColumnRef() {
+ // 聚合函数?
+ if (this.curTokenIs(TokenType.COUNT) ||
+ this.curTokenIs(TokenType.SUM) ||
+ this.curTokenIs(TokenType.AVG) ||
+ this.curTokenIs(TokenType.MIN) ||
+ this.curTokenIs(TokenType.MAX)) {
+ return this.parseAggregateCall();
+ }
+ const first = this.expectIdentifier('column name');
+ if (this.curTokenIs(TokenType.DOT)) {
+ this.nextToken();
+ const second = this.expectIdentifier('column name');
+ return `${first}.${second}`;
+ }
+ return first;
+ }
+ /** 解析聚合函数调用: COUNT(*), SUM(col), AVG(col), MIN(col), MAX(col) */
+ parseAggregateCall() {
+ const func = this.curToken.value.toUpperCase();
+ this.nextToken();
+ this.expect(TokenType.LPAREN);
+ let arg;
+ if (this.curTokenIs(TokenType.STAR)) {
+ arg = '*';
+ this.nextToken();
+ }
+ else {
+ arg = this.parseColumnRef();
+ }
+ this.expect(TokenType.RPAREN);
+ // 可选别名: AS alias
+ let alias = '';
+ if (this.curTokenIs(TokenType.AS)) {
+ this.nextToken();
+ alias = this.expectIdentifier('alias');
+ }
+ else if (this.curToken.type === TokenType.IDENTIFIER && this._isAggregateAlias()) {
+ alias = this.curToken.value;
+ this.nextToken();
+ }
+ if (alias) {
+ return `${func}(${arg}) AS ${alias}`;
+ }
+ return `${func}(${arg})`;
+ }
+ _isAggregateAlias() {
+ return !this._isReservedAfterFrom() && !this._isJoinKeyword();
+ }
+ parseIdentifierList() {
+ const ids = [];
+ ids.push(this.expectIdentifier('identifier'));
+ while (this.curTokenIs(TokenType.COMMA)) {
+ this.nextToken();
+ ids.push(this.expectIdentifier('identifier'));
+ }
+ return ids;
+ }
+ parseValueList() {
+ const vals = [];
+ vals.push(this.parseValue());
+ while (this.curTokenIs(TokenType.COMMA)) {
+ this.nextToken();
+ vals.push(this.parseValue());
+ }
+ return vals;
+ }
+ parseOrderByList() {
+ const list = [];
+ list.push(this.parseOrderBy());
+ while (this.curTokenIs(TokenType.COMMA)) {
+ this.nextToken();
+ list.push(this.parseOrderBy());
+ }
+ return list;
+ }
+ parseOrderBy() {
+ const column = this.expectIdentifier('column name');
+ let direction = 'asc';
+ if (this.curTokenIs(TokenType.ASC)) {
+ this.nextToken();
+ }
+ else if (this.curTokenIs(TokenType.DESC)) {
+ direction = 'desc';
+ this.nextToken();
+ }
+ return { column, direction };
+ }
+ /** 解析字面量值 */
+ parseValue() {
+ switch (this.curToken.type) {
+ case TokenType.STRING: {
+ const val = this.curToken.value;
+ this.nextToken();
+ return val;
+ }
+ case TokenType.NUMBER: {
+ const val = Number(this.curToken.value);
+ this.nextToken();
+ return val;
+ }
+ case TokenType.TRUE:
+ this.nextToken();
+ return true;
+ case TokenType.FALSE:
+ this.nextToken();
+ return false;
+ case TokenType.NULL:
+ this.nextToken();
+ return null;
+ default:
+ throw this.error(`Expected value, got "${this.curToken.value}"`);
+ }
+ }
+ // ===================================================================
+ // Token 操作
+ // ===================================================================
+ nextToken() {
+ this.curToken = this.peekToken;
+ this.peekToken = this.lexer.nextToken();
+ }
+ curTokenIs(type) {
+ return this.curToken.type === type;
+ }
+ expect(type) {
+ if (this.curTokenIs(type)) {
+ this.nextToken();
+ return;
+ }
+ throw this.error(`Expected ${type}, got "${this.curToken.value}"`);
+ }
+ expectIdentifier(context) {
+ if (this.curToken.type === TokenType.IDENTIFIER || this._isKeywordAsIdent()) {
+ const val = this.curToken.value;
+ this.nextToken();
+ return val;
+ }
+ throw this.error(`Expected ${context}, got "${this.curToken.value}"`);
+ }
+ /** 关键字可以作为标识符(如列名等于关键字) */
+ _isKeywordAsIdent() {
+ return (this.curToken.type !== TokenType.EOF &&
+ this.curToken.type !== TokenType.ILLEGAL &&
+ this.curToken.type !== TokenType.STRING &&
+ this.curToken.type !== TokenType.NUMBER &&
+ this.curToken.type !== TokenType.COMMA &&
+ this.curToken.type !== TokenType.LPAREN &&
+ this.curToken.type !== TokenType.RPAREN &&
+ this.curToken.type !== TokenType.SEMICOLON &&
+ this.curToken.type !== TokenType.EQ &&
+ this.curToken.type !== TokenType.NEQ &&
+ this.curToken.type !== TokenType.GT &&
+ this.curToken.type !== TokenType.GTE &&
+ this.curToken.type !== TokenType.LT &&
+ this.curToken.type !== TokenType.LTE &&
+ this.curToken.type !== TokenType.DOT &&
+ this.curToken.type !== TokenType.STAR);
+ }
+ expectNumber(context) {
+ if (this.curToken.type === TokenType.NUMBER) {
+ const val = Number(this.curToken.value);
+ this.nextToken();
+ return val;
+ }
+ throw this.error(`Expected ${context}, got "${this.curToken.value}"`);
+ }
+ error(msg) {
+ return new DatabaseError(`Parse error at position ${this.curToken.position}: ${msg}`, 'PARSE_ERROR');
+ }
+}
+// ---------------------------------------------------------------------------
+// 便捷方法
+// ---------------------------------------------------------------------------
+/** 解析 SQL 字符串为 AST Statement */
+function parse(sql) {
+ const parser = new Parser(sql);
+ const stmt = parser.parseStatement();
+ return stmt;
+}
+
+/**
+ * metona-sqlark Transaction — 事务管理
+ * @module transaction
+ *
+ * 封装多操作事务,保证原子性。
+ * v0.0.1: 基于引擎层操作实现,IndexedDB 引擎利用原生事务。
+ */
+// ---------------------------------------------------------------------------
+// Transaction
+// ---------------------------------------------------------------------------
+class Transaction {
+ constructor(engine) {
+ this.tables = new Map();
+ this.completed = false;
+ this.engine = engine;
+ }
+ /** 获取表操作对象 */
+ table(tableName) {
+ let t = this.tables.get(tableName);
+ if (!t) {
+ t = new Table(this.engine, tableName);
+ this.tables.set(tableName, t);
+ }
+ return t;
+ }
+ /** 标记事务完成(由 TransactionManager 调用) */
+ _markCompleted() {
+ this.completed = true;
+ }
+ /** 是否已完成 */
+ isCompleted() {
+ return this.completed;
+ }
+}
+// ---------------------------------------------------------------------------
+// TransactionManager
+// ---------------------------------------------------------------------------
+class TransactionManager {
+ constructor(engine) {
+ this.engine = engine;
+ }
+ /** 执行事务 */
+ async execute(fn) {
+ const trx = new Transaction(this.engine);
+ try {
+ const result = await fn(trx);
+ trx._markCompleted();
+ return result;
+ }
+ catch (error) {
+ if (error instanceof DatabaseError)
+ throw error;
+ throw new DatabaseError(`Transaction failed: ${error.message}`, 'TRANSACTION_ERROR', error);
+ }
+ }
+}
+
+/**
+ * metona-sqlark Plugin — 插件系统
+ * @module plugin
+ *
+ * 管理插件的注册、生命周期和钩子调度。
+ */
+// ---------------------------------------------------------------------------
+// PluginManager
+// ---------------------------------------------------------------------------
+class PluginManager {
+ constructor() {
+ this.plugins = [];
+ this.hooks = new Map();
+ }
+ /** 注册插件 */
+ register(plugin) {
+ // 按优先级插入
+ const priority = plugin.priority ?? 0;
+ const insertIndex = this.plugins.findIndex((p) => (p.priority ?? 0) < priority);
+ if (insertIndex === -1) {
+ this.plugins.push(plugin);
+ }
+ else {
+ this.plugins.splice(insertIndex, 0, plugin);
+ }
+ // 安装
+ plugin.install(null); // 实际引用由 MetonaSqlark 注入
+ }
+ /** 卸载插件 */
+ unregister(pluginName) {
+ const idx = this.plugins.findIndex((p) => p.name === pluginName);
+ if (idx !== -1) {
+ this.plugins[idx].destroy();
+ this.plugins.splice(idx, 1);
+ }
+ }
+ /** 获取所有已注册插件 */
+ getPlugins() {
+ return [...this.plugins];
+ }
+ /** 添加钩子回调 */
+ on(hook, callback) {
+ const callbacks = this.hooks.get(hook) ?? [];
+ callbacks.push(callback);
+ this.hooks.set(hook, callbacks);
+ }
+ /** 移除钩子回调 */
+ off(hook, callback) {
+ const callbacks = this.hooks.get(hook);
+ if (callbacks) {
+ const idx = callbacks.indexOf(callback);
+ if (idx !== -1)
+ callbacks.splice(idx, 1);
+ }
+ }
+ /** 触发钩子 */
+ async trigger(hook, ...args) {
+ const callbacks = this.hooks.get(hook);
+ if (callbacks) {
+ for (const cb of callbacks) {
+ await cb(...args);
+ }
+ }
+ }
+ /** 销毁所有插件 */
+ destroy() {
+ for (const plugin of this.plugins) {
+ try {
+ plugin.destroy();
+ }
+ catch (e) {
+ // eslint-disable-next-line no-console
+ console.warn(`[metona-sqlark] Plugin "${plugin.name}" destroy error:`, e);
+ }
+ }
+ this.plugins = [];
+ this.hooks.clear();
+ }
+}
+
+/**
+ * metona-sqlark Core — 数据库主类
+ * @module core
+ *
+ * 管理数据库生命周期、引擎调度、表操作、SQL 查询、事务和插件。
+ */
+// ---------------------------------------------------------------------------
+// MetonaSqlark
+// ---------------------------------------------------------------------------
+class MetonaSqlark {
+ /** 获取版本号 */
+ get version() { return this._version; }
+ constructor(config) {
+ this.ready = false;
+ this.tableCache = new Map();
+ // ---- 发布订阅 ----
+ this.listeners = new Map();
+ // ---- 迁移 ----
+ this.migrations = new Map();
+ this.config = config;
+ this.name = config.name ?? DB_DEFAULTS.name;
+ this.mode = config.mode ?? DB_DEFAULTS.mode;
+ this._version = config.version ?? DB_DEFAULTS.version;
+ this.pluginManager = new PluginManager();
+ }
+ // ---- 初始化 ----
+ /** 初始化数据库(创建引擎、打开连接) */
+ async init() {
+ // 创建引擎
+ this.engine = this.createEngine();
+ // 打开连接
+ await this.engine.open(this.name, this.version);
+ // 初始化执行器和事务管理器
+ this.executor = new QueryExecutor(this.engine);
+ this.transactionManager = new TransactionManager(this.engine);
+ // 注册插件
+ if (this.config.plugins) {
+ for (const plugin of this.config.plugins) {
+ this.pluginManager.register(plugin);
+ }
+ }
+ this.ready = true;
+ // 回调
+ if (this.config.onReady) {
+ this.config.onReady(this);
+ }
+ }
+ /** 检查是否就绪 */
+ isReady() {
+ return this.ready;
+ }
+ // ---- 表管理 ----
+ /** 创建表 */
+ async defineTable(name, columns) {
+ this.ensureReady();
+ const schema = createSchema(name, columns);
+ await this.pluginManager.trigger('beforeCreateTable', schema);
+ await this.engine.createTable(schema);
+ await this.pluginManager.trigger('afterCreateTable', schema);
+ // 清除缓存
+ this.tableCache.delete(name);
+ }
+ /** 获取表操作对象 */
+ table(name) {
+ this.ensureReady();
+ let t = this.tableCache.get(name);
+ if (!t) {
+ t = new Table(this.engine, name, this.executor);
+ this.tableCache.set(name, t);
+ }
+ return t;
+ }
+ /** 删除表 */
+ async dropTable(name) {
+ this.ensureReady();
+ await this.pluginManager.trigger('beforeDropTable', name);
+ await this.engine.dropTable(name);
+ await this.pluginManager.trigger('afterDropTable', name);
+ this.tableCache.delete(name);
+ }
+ /** 获取所有表名 */
+ async getTableNames() {
+ this.ensureReady();
+ return this.engine.getTableNames();
+ }
+ // ---- SQL 查询 ----
+ /** 执行 SQL 字符串查询 */
+ async query(sql) {
+ this.ensureReady();
+ await this.pluginManager.trigger('beforeQuery', sql);
+ const stmt = parse(sql);
+ const result = await this.executor.execute(stmt);
+ await this.pluginManager.trigger('afterQuery', sql, result);
+ return result;
+ }
+ // ---- 事务 ----
+ /** 执行事务 */
+ async transaction(fn) {
+ this.ensureReady();
+ await this.pluginManager.trigger('beforeTransaction');
+ const result = await this.transactionManager.execute(fn);
+ await this.pluginManager.trigger('afterTransaction');
+ return result;
+ }
+ // ---- 导入导出 ----
+ /** 导出表数据为 JSON */
+ async exportTable(tableName) {
+ this.ensureReady();
+ return this.engine.find(tableName, { table: tableName });
+ }
+ /** 导入 JSON 数据到表 */
+ async importTable(tableName, data) {
+ this.ensureReady();
+ return this.engine.insert(tableName, data);
+ }
+ /** 导出整个数据库为 JSON */
+ async exportAll() {
+ this.ensureReady();
+ const result = {};
+ const names = await this.engine.getTableNames();
+ for (const name of names) {
+ result[name] = await this.engine.find(name, { table: name });
+ }
+ return result;
+ }
+ /** 订阅表变更 */
+ subscribe(tableName, callback) {
+ const key = `change:${tableName}`;
+ if (!this.listeners.has(key))
+ this.listeners.set(key, new Set());
+ this.listeners.get(key).add(callback);
+ return () => this.listeners.get(key)?.delete(callback);
+ }
+ /** 触发变更事件 */
+ emit(tableName, event) {
+ const key = `change:${tableName}`;
+ this.listeners.get(key)?.forEach((cb) => cb(event));
+ }
+ /** 注册迁移 */
+ addMigration(version, up) {
+ this.migrations.set(version, up);
+ }
+ /** 执行迁移到指定版本 */
+ async migrateTo(targetVersion) {
+ this.ensureReady();
+ for (const [version, up] of [...this.migrations.entries()].sort((a, b) => a[0] - b[0])) {
+ if (version <= targetVersion && version > this.version) {
+ await up(this);
+ this._version = version;
+ }
+ }
+ }
+ // ---- 插件 ----
+ /** 获取插件管理器 */
+ getPluginManager() {
+ return this.pluginManager;
+ }
+ /** 注册钩子 */
+ on(hook, callback) {
+ this.pluginManager.on(hook, callback);
+ }
+ // ---- 生命周期 ----
+ /** 关闭数据库 */
+ async close() {
+ this.pluginManager.destroy();
+ await this.engine.close();
+ this.tableCache.clear();
+ this.ready = false;
+ }
+ /** 获取底层引擎 */
+ getEngine() {
+ return this.engine;
+ }
+ // ---- 内部 ----
+ createEngine() {
+ const mode = this.mode;
+ const diskEngine = this.config.diskEngine ?? 'indexeddb';
+ switch (mode) {
+ case 'memory':
+ return new MemoryEngine();
+ case 'disk':
+ return diskEngine === 'opfs' ? new OPFSEngine() : new IndexedDBEngine();
+ case 'hybrid':
+ return new HybridEngine(diskEngine);
+ default:
+ throw new DatabaseError(`Unknown storage mode: ${mode}`, 'CONFIG_ERROR');
+ }
+ }
+ ensureReady() {
+ if (!this.ready) {
+ throw new DatabaseError('Database not initialized. Call await db.init() first.', 'DB_NOT_READY');
+ }
+ }
+}
+
+/**
+ * metona-sqlark — 入口文件
+ * @module metona-sqlark
+ * @version 0.1.12
+ *
+ * 前端关系型数据库,内存与磁盘双模式。
+ * 支持 Query Builder 链式 API 和 SQL 字符串查询。
+ */
+// ---------------------------------------------------------------------------
+// 工厂函数
+// ---------------------------------------------------------------------------
+/**
+ * 创建数据库实例并初始化
+ *
+ * @example
+ * ```ts
+ * const db = await MetonaSqlark.create({
+ * name: 'my-app',
+ * mode: 'hybrid',
+ * });
+ *
+ * await db.defineTable('users', {
+ * id: { type: 'string', primaryKey: true },
+ * name: { type: 'string', required: true },
+ * });
+ *
+ * await db.table('users').insert({ id: '1', name: 'Alice' });
+ * const results = await db.query('SELECT * FROM users');
+ * ```
+ */
+async function create(config) {
+ const db = new MetonaSqlark(config);
+ await db.init();
+ return db;
+}
+// ---------------------------------------------------------------------------
+// 全局 API
+// ---------------------------------------------------------------------------
+const api = {
+ VERSION,
+ version: VERSION,
+ create,
+ MetonaSqlark,
+ MeSqlark: MetonaSqlark,
+};
+if (typeof window !== 'undefined') {
+ window.MetonaSqlark = api;
+ window.MeSqlark = api;
+}
+// 别名
+const MeSqlark = MetonaSqlark;
+
+exports.HybridEngine = HybridEngine;
+exports.IndexedDBEngine = IndexedDBEngine;
+exports.MeSqlark = MeSqlark;
+exports.MemoryEngine = MemoryEngine;
+exports.MetonaSqlark = MetonaSqlark;
+exports.OPFSEngine = OPFSEngine;
+exports.Table = Table;
+exports.VERSION = VERSION;
+exports.api = api;
+exports.create = create;
+exports.default = api;
+exports.parse = parse;
+exports.tokenize = tokenize;
+//# sourceMappingURL=metona-sqlark.cjs.js.map
diff --git a/dist/metona-sqlark.cjs.js.map b/dist/metona-sqlark.cjs.js.map
new file mode 100644
index 0000000..ce0420d
--- /dev/null
+++ b/dist/metona-sqlark.cjs.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"metona-sqlark.cjs.js","sources":["../src/constants.ts","../src/query/where-matcher.ts","../src/engine/memory.ts","../src/engine/indexeddb.ts","../src/engine/opfs.ts","../src/hybrid/index.ts","../src/query/builder.ts","../src/table/table.ts","../src/table/schema.ts","../src/query/compiler.ts","../src/query/executor.ts","../src/sql/tokens.ts","../src/sql/lexer.ts","../src/sql/parser.ts","../src/transaction/index.ts","../src/plugin/index.ts","../src/core.ts","../src/index.ts"],"sourcesContent":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/dist/metona-sqlark.d.ts b/dist/metona-sqlark.d.ts
new file mode 100644
index 0000000..a69c5f6
--- /dev/null
+++ b/dist/metona-sqlark.d.ts
@@ -0,0 +1,733 @@
+/**
+ * metona-sqlark Constants — 类型定义 / 默认配置 / 枚举
+ * @module constants
+ */
+/** 存储模式 */
+type StorageMode = 'memory' | 'disk' | 'hybrid';
+/** 磁盘引擎类型 */
+type DiskEngine = 'indexeddb' | 'opfs';
+/** 字段数据类型 */
+type FieldType = 'string' | 'number' | 'boolean' | 'date' | 'json';
+/** 列定义 */
+interface ColumnDef {
+ /** 字段类型 */
+ type: FieldType;
+ /** 是否主键 */
+ primaryKey?: boolean;
+ /** 是否必填 */
+ required?: boolean;
+ /** 是否唯一 */
+ unique?: boolean;
+ /** 默认值 */
+ default?: unknown;
+ /** 是否创建索引 */
+ index?: boolean;
+ /** 外键引用: 'table.column' */
+ references?: string;
+ /** 字符串最大长度 */
+ maxLength?: number;
+ /** 数字最小值 */
+ min?: number;
+ /** 数字最大值 */
+ max?: number;
+}
+/** 表结构定义 */
+interface TableSchema {
+ /** 表名 */
+ name: string;
+ /** 列定义映射 */
+ columns: Record;
+}
+/** 数据库配置 */
+interface DatabaseConfig {
+ /** 数据库名称 */
+ name: string;
+ /** 存储模式 */
+ mode?: StorageMode;
+ /** 磁盘引擎(仅 mode='disk'|'hybrid' 时生效) */
+ diskEngine?: DiskEngine;
+ /** 版本号 */
+ version?: number;
+ /** 插件列表 */
+ plugins?: MetonaPlugin[];
+ /** 数据库就绪回调 */
+ onReady?: (db: unknown) => void;
+ /** 错误回调 */
+ onError?: (error: Error) => void;
+}
+/** Where 条件操作符 */
+type WhereOperator = '$eq' | '$ne' | '$gt' | '$gte' | '$lt' | '$lte' | '$in' | '$nin' | '$like' | '$and' | '$or' | '$not';
+/** 简单条件值:直接相等 */
+type SimpleCondition = unknown;
+/** 操作符条件 */
+type OperatorCondition = Partial>;
+/** 字段条件:简单值 | 操作符对象 */
+type FieldCondition = SimpleCondition | OperatorCondition;
+/** Where 条件对象 */
+type WhereCondition = Record;
+/** 排序方向 */
+type SortDirection = 'asc' | 'desc';
+/** 排序定义 */
+interface OrderBy {
+ /** 列名 */
+ column: string;
+ /** 排序方向 */
+ direction: SortDirection;
+}
+/** 查询计划 — 由 Executor 编译 AST 后生成 */
+interface QueryPlan {
+ /** 表名 */
+ table: string;
+ /** 要返回的列(undefined = 全部,['*'] = 全部) */
+ columns?: string[];
+ /** 过滤条件 */
+ where?: WhereCondition;
+ /** 排序 */
+ orderBy?: OrderBy[];
+ /** 限制条数 */
+ limit?: number;
+ /** 偏移量 */
+ offset?: number;
+}
+/** 钩子名称 */
+type HookName = 'beforeCreateTable' | 'afterCreateTable' | 'beforeDropTable' | 'afterDropTable' | 'beforeInsert' | 'afterInsert' | 'beforeUpdate' | 'afterUpdate' | 'beforeDelete' | 'afterDelete' | 'beforeQuery' | 'afterQuery' | 'beforeTransaction' | 'afterTransaction';
+/** 插件定义 */
+interface MetonaPlugin {
+ /** 插件名称 */
+ name: string;
+ /** 插件版本 */
+ version: string;
+ /** 描述 */
+ description?: string;
+ /** 优先级,越大越先执行 */
+ priority?: number;
+ /** 安装 */
+ install(db: unknown): void;
+ /** 销毁 */
+ destroy(): void;
+}
+declare const VERSION = "0.1.12";
+
+/**
+ * metona-sqlark Plugin — 插件系统
+ * @module plugin
+ *
+ * 管理插件的注册、生命周期和钩子调度。
+ */
+
+type HookCallback = (...args: unknown[]) => void | Promise;
+declare class PluginManager {
+ private plugins;
+ private hooks;
+ /** 注册插件 */
+ register(plugin: MetonaPlugin): void;
+ /** 卸载插件 */
+ unregister(pluginName: string): void;
+ /** 获取所有已注册插件 */
+ getPlugins(): MetonaPlugin[];
+ /** 添加钩子回调 */
+ on(hook: HookName, callback: HookCallback): void;
+ /** 移除钩子回调 */
+ off(hook: HookName, callback: HookCallback): void;
+ /** 触发钩子 */
+ trigger(hook: HookName, ...args: unknown[]): Promise;
+ /** 销毁所有插件 */
+ destroy(): void;
+}
+
+/**
+ * metona-sqlark Engine Interface — 存储引擎抽象接口
+ * @module engine/interface
+ */
+
+interface IStorageEngine {
+ /** 引擎名称 */
+ readonly name: string;
+ /** 打开数据库 */
+ open(dbName: string, version: number): Promise;
+ /** 关闭数据库 */
+ close(): Promise;
+ /** 检查数据库是否已打开 */
+ isOpen(): boolean;
+ /** 创建表 */
+ createTable(schema: TableSchema): Promise;
+ /** 删除表 */
+ dropTable(tableName: string): Promise;
+ /** 检查表是否存在 */
+ hasTable(tableName: string): Promise;
+ /** 获取所有表名 */
+ getTableNames(): Promise;
+ /** 获取表结构 */
+ getTableSchema(tableName: string): Promise;
+ /** 插入行,返回主键值列表 */
+ insert(tableName: string, rows: Record[]): Promise;
+ /** 查询行 */
+ find(tableName: string, query: QueryPlan): Promise[]>;
+ /** 更新行,返回影响行数 */
+ update(tableName: string, query: QueryPlan, updates: Record): Promise;
+ /** 删除行,返回影响行数 */
+ delete(tableName: string, query: QueryPlan): Promise;
+ /** 计数 */
+ count(tableName: string, query?: QueryPlan): Promise;
+ /** 清空表数据(保留结构) */
+ clear(tableName: string): Promise;
+}
+
+/**
+ * metona-sqlark Query AST — 查询抽象语法树类型定义
+ * @module query/ast
+ *
+ * QueryBuilder 和 SQL Parser 统一输出此 AST,
+ * Executor 只认 AST,保证两种查询接口行为一致。
+ */
+
+/** 列引用,'*' 表示所有列;支持 'table.column' 格式 */
+type ColumnRef = string;
+/** JOIN 类型 */
+type JoinType = 'INNER' | 'LEFT' | 'RIGHT' | 'CROSS';
+/** JOIN 子句 */
+interface JoinClause {
+ type: JoinType;
+ table: string;
+ alias?: string;
+ on: WhereCondition;
+}
+interface ASTColumnDef {
+ name: string;
+ type: string;
+ primaryKey?: boolean;
+ unique?: boolean;
+ required?: boolean;
+ default?: unknown;
+ index?: boolean;
+ maxLength?: number;
+ min?: number;
+ max?: number;
+}
+interface CreateTableStatement {
+ type: 'CREATE_TABLE';
+ name: string;
+ columns: ASTColumnDef[];
+}
+interface DropTableStatement {
+ type: 'DROP_TABLE';
+ name: string;
+}
+interface InsertStatement {
+ type: 'INSERT';
+ into: string;
+ columns?: string[];
+ values: unknown[][];
+}
+interface UpdateStatement {
+ type: 'UPDATE';
+ table: string;
+ sets: Record;
+ where: WhereCondition;
+}
+interface DeleteStatement {
+ type: 'DELETE';
+ from: string;
+ where: WhereCondition;
+}
+interface SelectStatement {
+ type: 'SELECT';
+ columns: ColumnRef[];
+ distinct?: boolean;
+ from: string;
+ /** 主表别名 */
+ alias?: string;
+ /** JOIN 子句列表 */
+ joins?: JoinClause[];
+ where: WhereCondition;
+ /** GROUP BY */
+ groupBy?: string[];
+ /** HAVING */
+ having?: WhereCondition;
+ orderBy?: OrderBy[];
+ limit?: number;
+ offset?: number;
+}
+type Statement = SelectStatement | InsertStatement | UpdateStatement | DeleteStatement | CreateTableStatement | DropTableStatement;
+
+/**
+ * metona-sqlark Query Executor — AST 执行器
+ * @module query/executor
+ *
+ * JOIN / GROUP BY / DISTINCT 逻辑在此层处理。
+ */
+
+declare class QueryExecutor {
+ private engine;
+ constructor(engine: IStorageEngine);
+ execute(stmt: Statement): Promise;
+ private executeSelect;
+ private executeJoinSelect;
+ private prefixRow;
+ /** 嵌套循环连接(优化:避免 ON 时对象扩散) */
+ private joinRows;
+ private executeGroupBy;
+ private computeAggregate;
+ private executeDistinct;
+ private executeInsert;
+ private executeUpdate;
+ private executeDelete;
+ private executeCreateTable;
+ private executeDropTable;
+ getEngine(): IStorageEngine;
+}
+
+/**
+ * metona-sqlark Query Builder — 链式查询构建器
+ * @module query/builder
+ *
+ * 链式调用 → 构建 AST → 执行引擎操作。
+ * 支持 JOIN(需要 Executor)。
+ */
+
+declare class SelectQueryBuilder {
+ private engine;
+ private tableName;
+ private _columns;
+ private _where;
+ private _orderBy;
+ private _limit?;
+ private _offset?;
+ private _joins;
+ private _alias?;
+ private _executor?;
+ constructor(engine: IStorageEngine, tableName: string, _columns?: string[], executor?: QueryExecutor);
+ /** 主表别名 */
+ as(alias: string): this;
+ /** INNER JOIN */
+ innerJoin(table: string, on: WhereCondition, alias?: string): this;
+ /** LEFT JOIN */
+ leftJoin(table: string, on: WhereCondition, alias?: string): this;
+ /** RIGHT JOIN */
+ rightJoin(table: string, on: WhereCondition, alias?: string): this;
+ /** CROSS JOIN */
+ crossJoin(table: string, alias?: string): this;
+ /** 通用 JOIN */
+ join(table: string, on: WhereCondition, alias?: string): this;
+ private _addJoin;
+ /** 添加过滤条件 */
+ where(condition: WhereCondition): this;
+ /** 排序 */
+ orderBy(column: string, direction?: SortDirection): this;
+ /** 限制返回条数 */
+ limit(n: number): this;
+ /** 偏移量 */
+ offset(n: number): this;
+ /** 执行查询 */
+ execute(): Promise[]>;
+ /** 获取 AST */
+ toAST(): SelectStatement;
+}
+declare class UpdateQueryBuilder {
+ private engine;
+ private tableName;
+ private _updates;
+ private _where;
+ constructor(engine: IStorageEngine, tableName: string, _updates: Record);
+ where(condition: WhereCondition): this;
+ execute(): Promise;
+ toAST(): UpdateStatement;
+}
+declare class DeleteQueryBuilder {
+ private engine;
+ private tableName;
+ private _where;
+ constructor(engine: IStorageEngine, tableName: string);
+ where(condition: WhereCondition): this;
+ execute(): Promise;
+ toAST(): DeleteStatement;
+}
+
+/**
+ * metona-sqlark Table — 表操作 API
+ * @module table/table
+ */
+
+declare class Table> {
+ readonly name: string;
+ private engine;
+ private schema;
+ private executor;
+ constructor(engine: IStorageEngine, tableName: string, executor?: QueryExecutor);
+ getSchema(): Promise;
+ insert(row: T & Record): Promise;
+ insertMany(rows: (T & Record)[]): Promise;
+ select(columns?: string[]): SelectQueryBuilder;
+ update(updates: Partial & Record): UpdateQueryBuilder;
+ delete(): DeleteQueryBuilder;
+ count(where?: Record): Promise;
+ clear(): Promise;
+ drop(): Promise;
+}
+
+/**
+ * metona-sqlark Transaction — 事务管理
+ * @module transaction
+ *
+ * 封装多操作事务,保证原子性。
+ * v0.0.1: 基于引擎层操作实现,IndexedDB 引擎利用原生事务。
+ */
+
+declare class Transaction {
+ private engine;
+ private tables;
+ private completed;
+ constructor(engine: IStorageEngine);
+ /** 获取表操作对象 */
+ table(tableName: string): Table;
+ /** 标记事务完成(由 TransactionManager 调用) */
+ _markCompleted(): void;
+ /** 是否已完成 */
+ isCompleted(): boolean;
+}
+
+declare class MetonaSqlark {
+ /** 数据库名称 */
+ readonly name: string;
+ /** 存储模式 */
+ readonly mode: string;
+ /** 版本号 */
+ private _version;
+ /** 获取版本号 */
+ get version(): number;
+ private engine;
+ private executor;
+ private transactionManager;
+ private pluginManager;
+ private config;
+ private ready;
+ private tableCache;
+ constructor(config: DatabaseConfig);
+ /** 初始化数据库(创建引擎、打开连接) */
+ init(): Promise;
+ /** 检查是否就绪 */
+ isReady(): boolean;
+ /** 创建表 */
+ defineTable(name: string, columns: Record): Promise;
+ /** 获取表操作对象 */
+ table(name: string): Table;
+ /** 删除表 */
+ dropTable(name: string): Promise;
+ /** 获取所有表名 */
+ getTableNames(): Promise;
+ /** 执行 SQL 字符串查询 */
+ query(sql: string): Promise;
+ /** 执行事务 */
+ transaction(fn: (trx: Transaction) => Promise): Promise;
+ /** 导出表数据为 JSON */
+ exportTable(tableName: string): Promise[]>;
+ /** 导入 JSON 数据到表 */
+ importTable(tableName: string, data: Record[]): Promise;
+ /** 导出整个数据库为 JSON */
+ exportAll(): Promise[]>>;
+ private listeners;
+ /** 订阅表变更 */
+ subscribe(tableName: string, callback: (event: {
+ type: string;
+ row?: unknown;
+ }) => void): () => void;
+ /** 触发变更事件 */
+ emit(tableName: string, event: {
+ type: string;
+ row?: unknown;
+ }): void;
+ private migrations;
+ /** 注册迁移 */
+ addMigration(version: number, up: (db: MetonaSqlark) => Promise): void;
+ /** 执行迁移到指定版本 */
+ migrateTo(targetVersion: number): Promise;
+ /** 获取插件管理器 */
+ getPluginManager(): PluginManager;
+ /** 注册钩子 */
+ on(hook: HookName, callback: HookCallback): void;
+ /** 关闭数据库 */
+ close(): Promise;
+ /** 获取底层引擎 */
+ getEngine(): IStorageEngine;
+ private createEngine;
+ private ensureReady;
+}
+
+/**
+ * metona-sqlark Memory Engine — 基于 Map 的内存存储引擎
+ * @module engine/memory
+ */
+
+declare class MemoryEngine implements IStorageEngine {
+ readonly name = "memory";
+ private tables;
+ private schemas;
+ private indexes;
+ private opened;
+ open(_dbName: string, _version: number): Promise;
+ close(): Promise;
+ isOpen(): boolean;
+ createTable(schema: TableSchema): Promise;
+ dropTable(tableName: string): Promise;
+ hasTable(tableName: string): Promise;
+ getTableNames(): Promise;
+ getTableSchema(tableName: string): Promise;
+ insert(tableName: string, rows: Record[]): Promise;
+ find(tableName: string, query: QueryPlan): Promise[]>;
+ update(tableName: string, query: QueryPlan, updates: Record): Promise;
+ delete(tableName: string, query: QueryPlan): Promise;
+ count(tableName: string, query?: QueryPlan): Promise;
+ clear(tableName: string): Promise;
+ private ensureTable;
+ private getPrimaryKey;
+ private validateRow;
+ private checkType;
+ /** O(1) 唯一性检查:利用哈希索引 */
+ private checkUniqueness;
+ /** 索引查找 */
+ private tryIndexLookup;
+ /** 更新索引 */
+ private updateIndexes;
+}
+
+/**
+ * metona-sqlark IndexedDB Engine — 基于 IndexedDB 的持久化存储引擎
+ * @module engine/indexeddb
+ */
+
+declare class IndexedDBEngine implements IStorageEngine {
+ readonly name = "indexeddb";
+ private db;
+ private dbName;
+ private version;
+ private memoryCache;
+ open(dbName: string, version: number): Promise;
+ close(): Promise;
+ isOpen(): boolean;
+ createTable(schema: TableSchema): Promise;
+ dropTable(tableName: string): Promise;
+ hasTable(tableName: string): Promise;
+ getTableNames(): Promise;
+ getTableSchema(tableName: string): Promise;
+ insert(tableName: string, rows: Record[]): Promise;
+ find(tableName: string, query: QueryPlan): Promise[]>;
+ update(tableName: string, query: QueryPlan, updates: Record): Promise;
+ delete(tableName: string, query: QueryPlan): Promise;
+ count(tableName: string, query?: QueryPlan): Promise;
+ clear(tableName: string): Promise;
+ private ensureDB;
+}
+
+/**
+ * metona-sqlark OPFS Engine — 基于 Origin Private File System 的持久化存储引擎
+ * @module engine/opfs
+ *
+ * 使用 JSON-per-table 文件存储方案。
+ * 目录结构:{dbName}/tables/{tableName}.json
+ */
+
+declare class OPFSEngine implements IStorageEngine {
+ readonly name = "opfs";
+ private root;
+ private tablesDir;
+ private dbName;
+ private memoryCache;
+ open(dbName: string, version: number): Promise;
+ close(): Promise;
+ isOpen(): boolean;
+ createTable(schema: TableSchema): Promise;
+ dropTable(tableName: string): Promise;
+ hasTable(tableName: string): Promise;
+ getTableNames(): Promise;
+ getTableSchema(tableName: string): Promise;
+ insert(tableName: string, rows: Record[]): Promise;
+ find(tableName: string, query: QueryPlan): Promise[]>;
+ update(tableName: string, query: QueryPlan, updates: Record): Promise;
+ delete(tableName: string, query: QueryPlan): Promise;
+ count(tableName: string, query?: QueryPlan): Promise;
+ clear(tableName: string): Promise;
+ private ensureDir;
+ private writeTableData;
+ private readTableData;
+ /** 从 OPFS 加载表数据到内存缓存 */
+ loadTableIntoMemory(tableName: string, schema: TableSchema): Promise;
+}
+
+/**
+ * metona-sqlark Hybrid Engine — 内存 + 磁盘混合存储引擎
+ * @module hybrid/index
+ *
+ * 采用 write-through 策略:
+ * - 所有写操作同时写入内存和磁盘
+ * - 所有读操作直接从内存返回
+ * - 数据库打开时从磁盘加载数据到内存
+ */
+
+declare class HybridEngine implements IStorageEngine {
+ readonly name = "hybrid";
+ private memoryEngine;
+ private diskEngine;
+ private diskEngineType;
+ constructor(diskEngine?: DiskEngine);
+ open(dbName: string, version: number): Promise;
+ close(): Promise;
+ isOpen(): boolean;
+ createTable(schema: TableSchema): Promise;
+ dropTable(tableName: string): Promise;
+ hasTable(tableName: string): Promise;
+ getTableNames(): Promise;
+ getTableSchema(tableName: string): Promise;
+ insert(tableName: string, rows: Record[]): Promise;
+ find(tableName: string, query: QueryPlan): Promise[]>;
+ update(tableName: string, query: QueryPlan, updates: Record): Promise;
+ delete(tableName: string, query: QueryPlan): Promise;
+ count(tableName: string, query?: QueryPlan): Promise;
+ clear(tableName: string): Promise;
+ /** 获取磁盘引擎类型 */
+ getDiskEngineType(): DiskEngine;
+ /** 获取内存引擎(供内部使用) */
+ getMemoryEngine(): MemoryEngine;
+}
+
+/**
+ * metona-sqlark SQL Parser — 递归下降语法分析器
+ * @module sql/parser
+ *
+ * Token 流 → AST Statement。
+ * 支持的语法是标准 SQL 的子集。
+ */
+
+/** 解析 SQL 字符串为 AST Statement */
+declare function parse(sql: string): Statement;
+
+/**
+ * metona-sqlark SQL Token Types — 词法单元定义
+ * @module sql/tokens
+ */
+declare enum TokenType {
+ SELECT = "SELECT",
+ FROM = "FROM",
+ WHERE = "WHERE",
+ INSERT = "INSERT",
+ INTO = "INTO",
+ VALUES = "VALUES",
+ UPDATE = "UPDATE",
+ SET = "SET",
+ DELETE = "DELETE",
+ CREATE = "CREATE",
+ TABLE = "TABLE",
+ DROP = "DROP",
+ ORDER = "ORDER",
+ BY = "BY",
+ ASC = "ASC",
+ DESC = "DESC",
+ LIMIT = "LIMIT",
+ OFFSET = "OFFSET",
+ AND = "AND",
+ OR = "OR",
+ NOT = "NOT",
+ LIKE = "LIKE",
+ IN = "IN",
+ PRIMARY = "PRIMARY",
+ KEY = "KEY",
+ UNIQUE = "UNIQUE",
+ DEFAULT = "DEFAULT",
+ NULL = "NULL",
+ TRUE = "TRUE",
+ FALSE = "FALSE",
+ INNER = "INNER",
+ LEFT = "LEFT",
+ RIGHT = "RIGHT",
+ CROSS = "CROSS",
+ JOIN = "JOIN",
+ ON = "ON",
+ AS = "AS",
+ OUTER = "OUTER",
+ GROUP = "GROUP",
+ HAVING = "HAVING",
+ COUNT = "COUNT",
+ SUM = "SUM",
+ AVG = "AVG",
+ MIN = "MIN",
+ MAX = "MAX",
+ DISTINCT = "DISTINCT",
+ IDENTIFIER = "IDENTIFIER",
+ STRING = "STRING",
+ NUMBER = "NUMBER",
+ COMMA = "COMMA",
+ LPAREN = "LPAREN",
+ RPAREN = "RPAREN",
+ SEMICOLON = "SEMICOLON",
+ EQ = "EQ",
+ NEQ = "NEQ",
+ GT = "GT",
+ GTE = "GTE",
+ LT = "LT",
+ LTE = "LTE",
+ STAR = "STAR",
+ DOT = "DOT",
+ EOF = "EOF",
+ ILLEGAL = "ILLEGAL"
+}
+interface Token {
+ type: TokenType;
+ value: string;
+ position: number;
+}
+
+/**
+ * metona-sqlark SQL Lexer — 词法分析器
+ * @module sql/lexer
+ *
+ * 将 SQL 字符串切分为 Token 流。
+ */
+
+/** 将 SQL 字符串解析为 Token 列表 */
+declare function tokenize(sql: string): Token[];
+
+/**
+ * metona-sqlark — 入口文件
+ * @module metona-sqlark
+ * @version 0.1.12
+ *
+ * 前端关系型数据库,内存与磁盘双模式。
+ * 支持 Query Builder 链式 API 和 SQL 字符串查询。
+ */
+
+/**
+ * 创建数据库实例并初始化
+ *
+ * @example
+ * ```ts
+ * const db = await MetonaSqlark.create({
+ * name: 'my-app',
+ * mode: 'hybrid',
+ * });
+ *
+ * await db.defineTable('users', {
+ * id: { type: 'string', primaryKey: true },
+ * name: { type: 'string', required: true },
+ * });
+ *
+ * await db.table('users').insert({ id: '1', name: 'Alice' });
+ * const results = await db.query('SELECT * FROM users');
+ * ```
+ */
+declare function create(config: DatabaseConfig): Promise;
+declare const api: {
+ VERSION: string;
+ version: string;
+ create: typeof create;
+ MetonaSqlark: typeof MetonaSqlark;
+ MeSqlark: typeof MetonaSqlark;
+};
+declare global {
+ interface Window {
+ MetonaSqlark: typeof api;
+ MeSqlark: typeof api;
+ }
+}
+
+declare const MeSqlark: typeof MetonaSqlark;
+
+export { ColumnDef, DatabaseConfig, DeleteStatement, DiskEngine, FieldType, HybridEngine, IStorageEngine, IndexedDBEngine, InsertStatement, MeSqlark, MemoryEngine, MetonaSqlark, OPFSEngine, SelectStatement, Statement, StorageMode, Table, TableSchema, UpdateStatement, VERSION, api, create, api as default, parse, tokenize };
diff --git a/dist/metona-sqlark.esm.js b/dist/metona-sqlark.esm.js
new file mode 100644
index 0000000..c620b28
--- /dev/null
+++ b/dist/metona-sqlark.esm.js
@@ -0,0 +1,2716 @@
+/**
+ * metona-sqlark Constants — 类型定义 / 默认配置 / 枚举
+ * @module constants
+ */
+/** 所有存储模式 */
+/** 所有字段类型 */
+const FIELD_TYPES = ['string', 'number', 'boolean', 'date', 'json'];
+/** 数据库默认配置 */
+const DB_DEFAULTS = Object.freeze({
+ name: 'metona-sqlark',
+ mode: 'hybrid',
+ diskEngine: 'indexeddb',
+ version: 1,
+});
+// ---------------------------------------------------------------------------
+// 错误类型
+// ---------------------------------------------------------------------------
+/** 数据库错误 */
+class DatabaseError extends Error {
+ constructor(message, code, details) {
+ super(message);
+ this.code = code;
+ this.details = details;
+ this.name = 'DatabaseError';
+ }
+}
+// ---------------------------------------------------------------------------
+// 版本
+// ---------------------------------------------------------------------------
+const VERSION = '0.1.12';
+
+/**
+ * metona-sqlark Shared WHERE Matcher — 统一的条件匹配逻辑
+ * @module query/where-matcher
+ *
+ * MemoryEngine / IndexedDBEngine / QueryExecutor 共享此模块,
+ * 消除 220+ 行重复代码,统一 $and/$or/$not/$col 行为。
+ */
+// ---------------------------------------------------------------------------
+// LIKE 正则缓存
+// ---------------------------------------------------------------------------
+const likeCache = new Map();
+function compileLikeRegex(pattern) {
+ const cached = likeCache.get(pattern);
+ if (cached)
+ return cached;
+ const escaped = pattern
+ .replace(/[.+^${}()|[\]\\]/g, '\\$&')
+ .replace(/%/g, '.*')
+ .replace(/_/g, '.');
+ const regex = new RegExp(`^${escaped}$`, 'i');
+ likeCache.set(pattern, regex);
+ return regex;
+}
+// ---------------------------------------------------------------------------
+// WHERE 匹配(顶层入口)
+// ---------------------------------------------------------------------------
+/**
+ * 匹配完整 WHERE 条件
+ * @param row 当前数据行
+ * @param where WHERE 条件对象
+ * @param options.$col 是否启用 $col 列引用解析
+ */
+function matchWhere(row, where, options = {}) {
+ for (const [field, condition] of Object.entries(where)) {
+ // 顶层 $and
+ if (field === '$and') {
+ const subs = condition;
+ if (!subs.every((sub) => matchWhere(row, sub, options)))
+ return false;
+ continue;
+ }
+ // 顶层 $or
+ if (field === '$or') {
+ const subs = condition;
+ if (!subs.some((sub) => matchWhere(row, sub, options)))
+ return false;
+ continue;
+ }
+ if (!matchField(row[field], condition, row, options))
+ return false;
+ }
+ return true;
+}
+// ---------------------------------------------------------------------------
+// 字段匹配
+// ---------------------------------------------------------------------------
+function matchField(value, condition, row, options) {
+ // 嵌套 $and
+ if (typeof condition === 'object' && condition !== null && '$and' in condition) {
+ const subs = condition.$and;
+ return subs.every((sub) => matchWhere(row, sub, options));
+ }
+ // 嵌套 $or
+ if (typeof condition === 'object' && condition !== null && '$or' in condition) {
+ const subs = condition.$or;
+ return subs.some((sub) => matchWhere(row, sub, options));
+ }
+ // $not
+ if (typeof condition === 'object' && condition !== null && '$not' in condition) {
+ return !matchField(value, condition.$not, row, options);
+ }
+ // 简单值 => $eq
+ if (typeof condition !== 'object' || condition === null || Array.isArray(condition)) {
+ return value === condition;
+ }
+ const ops = condition;
+ // $col 简写: { $col: name } === { $eq: { $col: name } }(仅 JOIN ON 场景)
+ if (options.$col && '$col' in ops && Object.keys(ops).length === 1) {
+ return value === row[ops.$col];
+ }
+ // 遍历操作符
+ for (const [op, operand] of Object.entries(ops)) {
+ let actualOperand = operand;
+ // $col 列引用解析
+ if (options.$col && typeof operand === 'object' && operand !== null && '$col' in operand) {
+ actualOperand = row[operand.$col];
+ }
+ if (!matchOperator(value, op, actualOperand))
+ return false;
+ }
+ return true;
+}
+// ---------------------------------------------------------------------------
+// 操作符匹配
+// ---------------------------------------------------------------------------
+function matchOperator(value, op, operand) {
+ switch (op) {
+ case '$eq': return value === operand;
+ case '$ne': return value !== operand;
+ case '$gt': return value > operand;
+ case '$gte': return value >= operand;
+ case '$lt': return value < operand;
+ case '$lte': return value <= operand;
+ case '$in': return Array.isArray(operand) && operand.includes(value);
+ case '$nin': return Array.isArray(operand) && !operand.includes(value);
+ case '$like': return compileLikeRegex(String(operand)).test(String(value));
+ default: return true;
+ }
+}
+// ---------------------------------------------------------------------------
+// 排序
+// ---------------------------------------------------------------------------
+function applyOrderBy(rows, orderBy) {
+ return [...rows].sort((a, b) => {
+ for (const { column, direction } of orderBy) {
+ const cmp = compare(a[column], b[column]);
+ if (cmp !== 0)
+ return direction === 'desc' ? -cmp : cmp;
+ }
+ return 0;
+ });
+}
+function compare(a, b) {
+ if (a === b)
+ return 0;
+ if (a === null || a === undefined)
+ return 1;
+ if (b === null || b === undefined)
+ return -1;
+ if (typeof a === 'string' && typeof b === 'string')
+ return a.localeCompare(b);
+ if (typeof a === 'number' && typeof b === 'number')
+ return a - b;
+ return String(a).localeCompare(String(b));
+}
+// ---------------------------------------------------------------------------
+// 列投影
+// ---------------------------------------------------------------------------
+function projectColumns(row, columns) {
+ const projected = {};
+ for (const col of columns) {
+ if (col in row) {
+ projected[col] = row[col];
+ }
+ else {
+ for (const key of Object.keys(row)) {
+ if (key.endsWith(`.${col}`) || key === col) {
+ projected[col] = row[key];
+ break;
+ }
+ }
+ }
+ }
+ return projected;
+}
+
+/**
+ * metona-sqlark Memory Engine — 基于 Map 的内存存储引擎
+ * @module engine/memory
+ */
+class MemoryEngine {
+ constructor() {
+ this.name = 'memory';
+ this.tables = new Map();
+ this.schemas = new Map();
+ this.indexes = new Map();
+ this.opened = false;
+ }
+ // ---- 生命周期 ----
+ async open(_dbName, _version) { this.opened = true; }
+ async close() {
+ this.tables.clear();
+ this.schemas.clear();
+ this.indexes.clear();
+ this.opened = false;
+ }
+ isOpen() { return this.opened; }
+ // ---- 表管理 ----
+ async createTable(schema) {
+ if (this.schemas.has(schema.name))
+ throw new DatabaseError(`Table "${schema.name}" already exists`, 'TABLE_EXISTS');
+ this.schemas.set(schema.name, schema);
+ this.tables.set(schema.name, new Map());
+ const tableIndexes = new Map();
+ for (const [colName, colDef] of Object.entries(schema.columns)) {
+ if (colDef.index || colDef.unique)
+ tableIndexes.set(colName, new Map());
+ }
+ this.indexes.set(schema.name, tableIndexes);
+ }
+ async dropTable(tableName) {
+ this.ensureTable(tableName);
+ this.schemas.delete(tableName);
+ this.tables.delete(tableName);
+ this.indexes.delete(tableName);
+ }
+ async hasTable(tableName) { return this.schemas.has(tableName); }
+ async getTableNames() { return Array.from(this.schemas.keys()); }
+ async getTableSchema(tableName) { return this.schemas.get(tableName) ?? null; }
+ // ---- CRUD ----
+ async insert(tableName, rows) {
+ this.ensureTable(tableName);
+ const schema = this.schemas.get(tableName);
+ const table = this.tables.get(tableName);
+ const pkColumn = this.getPrimaryKey(schema);
+ const pks = [];
+ for (const row of rows) {
+ const validatedRow = this.validateRow(schema, row);
+ const pkValue = String(validatedRow[pkColumn]);
+ if (table.has(pkValue))
+ throw new DatabaseError(`Duplicate primary key "${pkValue}" in table "${tableName}"`, 'DUPLICATE_KEY');
+ this.checkUniqueness(schema, validatedRow);
+ table.set(pkValue, validatedRow);
+ this.updateIndexes(tableName, validatedRow, pkValue);
+ pks.push(pkValue);
+ }
+ return pks;
+ }
+ async find(tableName, query) {
+ this.ensureTable(tableName);
+ const table = this.tables.get(tableName);
+ let results = this.tryIndexLookup(tableName, table, query);
+ if (query.where && Object.keys(query.where).length > 0) {
+ results = results.filter((row) => matchWhere(row, query.where));
+ }
+ if (query.orderBy && query.orderBy.length > 0) {
+ results = applyOrderBy(results, query.orderBy);
+ }
+ const offset = query.offset ?? 0;
+ const limit = query.limit ?? results.length;
+ results = results.slice(offset, offset + limit);
+ if (query.columns && query.columns.length > 0 && query.columns[0] !== '*') {
+ results = results.map((row) => projectColumns(row, query.columns));
+ }
+ return results;
+ }
+ async update(tableName, query, updates) {
+ this.ensureTable(tableName);
+ const schema = this.schemas.get(tableName);
+ const table = this.tables.get(tableName);
+ let count = 0;
+ for (const [pk, row] of table) {
+ if (!query.where || Object.keys(query.where).length === 0 || matchWhere(row, query.where)) {
+ const updated = { ...row, ...updates };
+ this.validateRow(schema, updated);
+ table.set(pk, updated);
+ count++;
+ }
+ }
+ return count;
+ }
+ async delete(tableName, query) {
+ this.ensureTable(tableName);
+ const table = this.tables.get(tableName);
+ const toDelete = [];
+ for (const [pk, row] of table) {
+ if (!query.where || Object.keys(query.where).length === 0 || matchWhere(row, query.where)) {
+ toDelete.push(pk);
+ }
+ }
+ for (const pk of toDelete)
+ table.delete(pk);
+ return toDelete.length;
+ }
+ async count(tableName, query) {
+ this.ensureTable(tableName);
+ const table = this.tables.get(tableName);
+ if (!query?.where || Object.keys(query.where).length === 0)
+ return table.size;
+ let result = 0;
+ for (const row of table.values()) {
+ if (matchWhere(row, query.where))
+ result++;
+ }
+ return result;
+ }
+ async clear(tableName) {
+ this.ensureTable(tableName);
+ this.tables.get(tableName).clear();
+ const tableIndexes = this.indexes.get(tableName);
+ if (tableIndexes)
+ for (const colIndex of tableIndexes.values())
+ colIndex.clear();
+ }
+ // ---- 内部辅助 ----
+ ensureTable(tableName) {
+ if (!this.tables.has(tableName))
+ throw new DatabaseError(`Table "${tableName}" does not exist`, 'TABLE_NOT_FOUND');
+ }
+ getPrimaryKey(schema) {
+ for (const [name, col] of Object.entries(schema.columns)) {
+ if (col.primaryKey)
+ return name;
+ }
+ return Object.keys(schema.columns)[0];
+ }
+ validateRow(schema, row) {
+ const validated = {};
+ for (const [colName, colDef] of Object.entries(schema.columns)) {
+ let value = row[colName];
+ if (value === undefined && colDef.default !== undefined)
+ value = colDef.default;
+ if (colDef.required && (value === undefined || value === null)) {
+ throw new DatabaseError(`Column "${colName}" is required in table "${schema.name}"`, 'VALIDATION_ERROR');
+ }
+ if (value !== undefined && value !== null)
+ this.checkType(colName, colDef.type, value);
+ if (value !== undefined)
+ validated[colName] = value;
+ }
+ return validated;
+ }
+ checkType(colName, type, value) {
+ const jsType = typeof value;
+ switch (type) {
+ case 'string':
+ if (jsType !== 'string')
+ throw new DatabaseError(`Column "${colName}" expects string, got ${jsType}`, 'TYPE_ERROR');
+ break;
+ case 'number':
+ if (jsType !== 'number')
+ throw new DatabaseError(`Column "${colName}" expects number, got ${jsType}`, 'TYPE_ERROR');
+ break;
+ case 'boolean':
+ if (jsType !== 'boolean')
+ throw new DatabaseError(`Column "${colName}" expects boolean, got ${jsType}`, 'TYPE_ERROR');
+ break;
+ case 'date':
+ if (jsType !== 'string' || isNaN(Date.parse(value)))
+ throw new DatabaseError(`Column "${colName}" expects valid date`, 'TYPE_ERROR');
+ break;
+ case 'json':
+ if (jsType !== 'object')
+ throw new DatabaseError(`Column "${colName}" expects object/array, got ${jsType}`, 'TYPE_ERROR');
+ break;
+ }
+ }
+ /** O(1) 唯一性检查:利用哈希索引 */
+ checkUniqueness(schema, row) {
+ const tableIndexes = this.indexes.get(schema.name);
+ if (!tableIndexes)
+ return;
+ for (const [colName, colDef] of Object.entries(schema.columns)) {
+ if (!colDef.unique || row[colName] === undefined || row[colName] === null)
+ continue;
+ const colIndex = tableIndexes.get(colName);
+ if (colIndex && colIndex.has(row[colName])) {
+ throw new DatabaseError(`Unique constraint violation on column "${colName}" in table "${schema.name}"`, 'UNIQUE_VIOLATION');
+ }
+ }
+ }
+ /** 索引查找 */
+ tryIndexLookup(tableName, table, query) {
+ const tableIndexes = this.indexes.get(tableName);
+ if (!tableIndexes || !query.where)
+ return Array.from(table.values());
+ for (const [col, condition] of Object.entries(query.where)) {
+ if (typeof condition !== 'object' || condition === null) {
+ const colIndex = tableIndexes.get(col);
+ if (colIndex) {
+ const pks = colIndex.get(condition);
+ if (pks) {
+ const result = [];
+ for (const pk of pks) {
+ const r = table.get(pk);
+ if (r)
+ result.push(r);
+ }
+ return result;
+ }
+ return [];
+ }
+ }
+ }
+ return Array.from(table.values());
+ }
+ /** 更新索引 */
+ updateIndexes(tableName, row, pk) {
+ const tableIndexes = this.indexes.get(tableName);
+ if (!tableIndexes)
+ return;
+ for (const [colName, colIndex] of tableIndexes) {
+ const value = row[colName];
+ if (value !== undefined && value !== null) {
+ if (!colIndex.has(value))
+ colIndex.set(value, new Set());
+ colIndex.get(value).add(pk);
+ }
+ }
+ }
+}
+
+/**
+ * metona-sqlark IndexedDB Engine — 基于 IndexedDB 的持久化存储引擎
+ * @module engine/indexeddb
+ */
+class IndexedDBEngine {
+ constructor() {
+ this.name = 'indexeddb';
+ this.db = null;
+ this.dbName = '';
+ this.version = 1;
+ this.memoryCache = new MemoryEngine();
+ }
+ async open(dbName, version) {
+ this.dbName = dbName;
+ this.version = version;
+ await this.memoryCache.open(dbName, version);
+ return new Promise((resolve, reject) => {
+ const request = indexedDB.open(dbName, version);
+ request.onsuccess = () => { this.db = request.result; resolve(); };
+ request.onerror = () => reject(new DatabaseError(`Failed to open IndexedDB "${dbName}"`, 'IDB_OPEN_ERROR', request.error));
+ request.onblocked = () => reject(new DatabaseError(`IndexedDB "${dbName}" is blocked`, 'IDB_BLOCKED'));
+ });
+ }
+ async close() {
+ if (this.db) {
+ this.db.close();
+ this.db = null;
+ }
+ await this.memoryCache.close();
+ }
+ isOpen() { return this.db !== null; }
+ // ---- 表管理 ----
+ async createTable(schema) {
+ await this.memoryCache.createTable(schema);
+ const db = this.ensureDB();
+ return new Promise((resolve, reject) => {
+ const newVersion = db.version + 1;
+ db.close();
+ const request = indexedDB.open(this.dbName, newVersion);
+ request.onupgradeneeded = (event) => {
+ const db = event.target.result;
+ const pkColumn = Object.entries(schema.columns).find(([, c]) => c.primaryKey)?.[0] ?? Object.keys(schema.columns)[0];
+ const store = db.createObjectStore(schema.name, { keyPath: pkColumn });
+ for (const [colName, colDef] of Object.entries(schema.columns)) {
+ if (colDef.index && colName !== pkColumn) {
+ store.createIndex(`idx_${colName}`, colName, { unique: colDef.unique ?? false });
+ }
+ }
+ };
+ request.onsuccess = () => { this.db = request.result; resolve(); };
+ request.onerror = () => reject(new DatabaseError(`Failed to create table "${schema.name}"`, 'IDB_UPGRADE_ERROR', request.error));
+ });
+ }
+ async dropTable(tableName) {
+ await this.memoryCache.dropTable(tableName);
+ const db = this.ensureDB();
+ return new Promise((resolve, reject) => {
+ const newVersion = db.version + 1;
+ db.close();
+ const request = indexedDB.open(this.dbName, newVersion);
+ request.onupgradeneeded = (event) => {
+ const db = event.target.result;
+ if (db.objectStoreNames.contains(tableName))
+ db.deleteObjectStore(tableName);
+ };
+ request.onsuccess = () => { this.db = request.result; resolve(); };
+ request.onerror = () => reject(new DatabaseError(`Failed to drop table "${tableName}"`, 'IDB_UPGRADE_ERROR', request.error));
+ });
+ }
+ async hasTable(tableName) { return this.ensureDB().objectStoreNames.contains(tableName); }
+ async getTableNames() { return Array.from(this.ensureDB().objectStoreNames); }
+ async getTableSchema(tableName) { return this.memoryCache.getTableSchema(tableName); }
+ // ---- CRUD ----
+ async insert(tableName, rows) {
+ await this.memoryCache.insert(tableName, rows);
+ const db = this.ensureDB();
+ return new Promise((resolve, reject) => {
+ const tx = db.transaction(tableName, 'readwrite');
+ const store = tx.objectStore(tableName);
+ const pks = [];
+ for (const row of rows) {
+ const req = store.add(row);
+ req.onsuccess = () => pks.push(String(req.result));
+ req.onerror = () => { }; // 内存层已校验,忽略 IDB 重复键
+ }
+ tx.oncomplete = () => resolve(pks);
+ tx.onerror = () => reject(new DatabaseError(`Insert failed for "${tableName}"`, 'IDB_TX_ERROR', tx.error));
+ });
+ }
+ async find(tableName, query) {
+ const db = this.ensureDB();
+ return new Promise((resolve, reject) => {
+ const tx = db.transaction(tableName, 'readonly');
+ const req = tx.objectStore(tableName).getAll();
+ req.onsuccess = () => {
+ let results = req.result ?? [];
+ if (query.where && Object.keys(query.where).length > 0) {
+ results = results.filter((row) => matchWhere(row, query.where));
+ }
+ if (query.orderBy && query.orderBy.length > 0) {
+ results = applyOrderBy(results, query.orderBy);
+ }
+ const offset = query.offset ?? 0;
+ const limit = query.limit ?? results.length;
+ results = results.slice(offset, offset + limit);
+ if (query.columns && query.columns.length > 0 && query.columns[0] !== '*') {
+ results = results.map((r) => projectColumns(r, query.columns));
+ }
+ resolve(results);
+ };
+ req.onerror = () => reject(new DatabaseError(`Find failed for "${tableName}"`, 'IDB_READ_ERROR', req.error));
+ });
+ }
+ async update(tableName, query, updates) {
+ await this.memoryCache.update(tableName, query, updates);
+ const db = this.ensureDB();
+ return new Promise((resolve, reject) => {
+ const tx = db.transaction(tableName, 'readwrite');
+ const store = tx.objectStore(tableName);
+ const getAllReq = store.getAll();
+ let count = 0;
+ getAllReq.onsuccess = () => {
+ for (const row of getAllReq.result ?? []) {
+ if (!query.where || Object.keys(query.where).length === 0 || matchWhere(row, query.where)) {
+ Object.assign(row, updates);
+ store.put(row);
+ count++;
+ }
+ }
+ };
+ tx.oncomplete = () => resolve(count);
+ tx.onerror = () => reject(new DatabaseError(`Update failed for "${tableName}"`, 'IDB_TX_ERROR', tx.error));
+ });
+ }
+ async delete(tableName, query) {
+ await this.memoryCache.delete(tableName, query);
+ const db = this.ensureDB();
+ const schema = await this.memoryCache.getTableSchema(tableName);
+ if (!schema)
+ throw new DatabaseError(`Table "${tableName}" not found`, 'TABLE_NOT_FOUND');
+ const pkColumn = Object.entries(schema.columns).find(([, c]) => c.primaryKey)?.[0] ?? Object.keys(schema.columns)[0];
+ return new Promise((resolve, reject) => {
+ const tx = db.transaction(tableName, 'readwrite');
+ const store = tx.objectStore(tableName);
+ const getAllReq = store.getAll();
+ let count = 0;
+ getAllReq.onsuccess = () => {
+ for (const row of getAllReq.result ?? []) {
+ if (!query.where || Object.keys(query.where).length === 0 || matchWhere(row, query.where)) {
+ store.delete(row[pkColumn]);
+ count++;
+ }
+ }
+ };
+ tx.oncomplete = () => resolve(count);
+ tx.onerror = () => reject(new DatabaseError(`Delete failed for "${tableName}"`, 'IDB_TX_ERROR', tx.error));
+ });
+ }
+ async count(tableName, query) {
+ const results = await this.find(tableName, { table: tableName, where: query?.where ?? {} });
+ return results.length;
+ }
+ async clear(tableName) {
+ await this.memoryCache.clear(tableName);
+ const db = this.ensureDB();
+ return new Promise((resolve, reject) => {
+ const tx = db.transaction(tableName, 'readwrite');
+ tx.objectStore(tableName).clear();
+ tx.oncomplete = () => resolve();
+ tx.onerror = () => reject(new DatabaseError(`Clear failed for "${tableName}"`, 'IDB_TX_ERROR', tx.error));
+ });
+ }
+ ensureDB() {
+ if (!this.db)
+ throw new DatabaseError('Database not opened', 'DB_NOT_OPEN');
+ return this.db;
+ }
+}
+
+/**
+ * metona-sqlark OPFS Engine — 基于 Origin Private File System 的持久化存储引擎
+ * @module engine/opfs
+ *
+ * 使用 JSON-per-table 文件存储方案。
+ * 目录结构:{dbName}/tables/{tableName}.json
+ */
+// ---------------------------------------------------------------------------
+// OPFSEngine
+// ---------------------------------------------------------------------------
+class OPFSEngine {
+ constructor() {
+ this.name = 'opfs';
+ this.root = null;
+ this.tablesDir = null;
+ this.dbName = '';
+ // 运行时内存缓存(OPFS 文件读写有延迟)
+ this.memoryCache = new MemoryEngine();
+ }
+ // ---- 生命周期 ----
+ async open(dbName, version) {
+ this.dbName = dbName;
+ await this.memoryCache.open(dbName, version);
+ // 获取 OPFS 根目录
+ this.root = await navigator.storage.getDirectory();
+ // 创建数据库目录
+ this.tablesDir = await this.root.getDirectoryHandle(dbName, { create: true });
+ }
+ async close() {
+ this.root = null;
+ this.tablesDir = null;
+ await this.memoryCache.close();
+ }
+ isOpen() {
+ return this.tablesDir !== null;
+ }
+ // ---- 表管理 ----
+ async createTable(schema) {
+ await this.memoryCache.createTable(schema);
+ // OPFS 中表以空 JSON 数组文件形式存在
+ await this.writeTableData(schema.name, []);
+ }
+ async dropTable(tableName) {
+ await this.memoryCache.dropTable(tableName);
+ if (this.tablesDir) {
+ try {
+ await this.tablesDir.removeEntry(`${tableName}.json`);
+ }
+ catch {
+ // 文件不存在则忽略
+ }
+ }
+ }
+ async hasTable(tableName) {
+ if (!this.tablesDir)
+ return false;
+ try {
+ await this.tablesDir.getFileHandle(`${tableName}.json`);
+ return true;
+ }
+ catch {
+ return false;
+ }
+ }
+ async getTableNames() {
+ if (!this.tablesDir)
+ return [];
+ const names = [];
+ for await (const [name] of this.tablesDir.entries()) {
+ if (name.endsWith('.json')) {
+ names.push(name.replace('.json', ''));
+ }
+ }
+ return names;
+ }
+ async getTableSchema(tableName) {
+ return this.memoryCache.getTableSchema(tableName);
+ }
+ // ---- CRUD ----
+ async insert(tableName, rows) {
+ const pks = await this.memoryCache.insert(tableName, rows);
+ // 持久化到 OPFS
+ const allRows = await this.memoryCache.find(tableName, { table: tableName });
+ await this.writeTableData(tableName, allRows);
+ return pks;
+ }
+ async find(tableName, query) {
+ return this.memoryCache.find(tableName, query);
+ }
+ async update(tableName, query, updates) {
+ const count = await this.memoryCache.update(tableName, query, updates);
+ const allRows = await this.memoryCache.find(tableName, { table: tableName });
+ await this.writeTableData(tableName, allRows);
+ return count;
+ }
+ async delete(tableName, query) {
+ const count = await this.memoryCache.delete(tableName, query);
+ const allRows = await this.memoryCache.find(tableName, { table: tableName });
+ await this.writeTableData(tableName, allRows);
+ return count;
+ }
+ async count(tableName, query) {
+ return this.memoryCache.count(tableName, query);
+ }
+ async clear(tableName) {
+ await this.memoryCache.clear(tableName);
+ await this.writeTableData(tableName, []);
+ }
+ // ---- 内部辅助 ----
+ ensureDir() {
+ if (!this.tablesDir) {
+ throw new DatabaseError('Database not opened', 'DB_NOT_OPEN');
+ }
+ return this.tablesDir;
+ }
+ async writeTableData(tableName, data) {
+ const dir = this.ensureDir();
+ const fileName = `${tableName}.json`;
+ const fileHandle = await dir.getFileHandle(fileName, { create: true });
+ const writable = await fileHandle.createWritable();
+ await writable.write(JSON.stringify(data));
+ await writable.close();
+ }
+ async readTableData(tableName) {
+ const dir = this.ensureDir();
+ const fileName = `${tableName}.json`;
+ try {
+ const fileHandle = await dir.getFileHandle(fileName);
+ const file = await fileHandle.getFile();
+ const text = await file.text();
+ return JSON.parse(text);
+ }
+ catch {
+ return [];
+ }
+ }
+ /** 从 OPFS 加载表数据到内存缓存 */
+ async loadTableIntoMemory(tableName, schema) {
+ await this.memoryCache.createTable(schema);
+ const rows = await this.readTableData(tableName);
+ if (rows.length > 0) {
+ // 直接用 Map 设置绕过 insert 校验
+ for (const row of rows) {
+ await this.memoryCache.insert(tableName, [row]);
+ }
+ }
+ }
+}
+
+/**
+ * metona-sqlark Hybrid Engine — 内存 + 磁盘混合存储引擎
+ * @module hybrid/index
+ *
+ * 采用 write-through 策略:
+ * - 所有写操作同时写入内存和磁盘
+ * - 所有读操作直接从内存返回
+ * - 数据库打开时从磁盘加载数据到内存
+ */
+// ---------------------------------------------------------------------------
+// HybridEngine
+// ---------------------------------------------------------------------------
+class HybridEngine {
+ constructor(diskEngine = 'indexeddb') {
+ this.name = 'hybrid';
+ this.memoryEngine = new MemoryEngine();
+ this.diskEngineType = diskEngine;
+ this.diskEngine = diskEngine === 'opfs' ? new OPFSEngine() : new IndexedDBEngine();
+ }
+ // ---- 生命周期 ----
+ async open(dbName, version) {
+ // 先打开磁盘引擎
+ await this.diskEngine.open(dbName, version);
+ // 再打开内存引擎
+ await this.memoryEngine.open(dbName, version);
+ // 从磁盘加载现存表
+ const tableNames = await this.diskEngine.getTableNames();
+ for (const tableName of tableNames) {
+ const schema = await this.diskEngine.getTableSchema(tableName);
+ if (!schema)
+ continue;
+ // 在内存中创建表
+ await this.memoryEngine.createTable(schema);
+ // 从磁盘加载数据到内存
+ const rows = await this.diskEngine.find(tableName, { table: tableName });
+ if (rows.length > 0) {
+ try {
+ await this.memoryEngine.insert(tableName, rows);
+ }
+ catch (e) {
+ // eslint-disable-next-line no-console
+ console.warn(`[metona-sqlark] Failed to load table "${tableName}" data from disk:`, e);
+ }
+ }
+ }
+ }
+ async close() {
+ await this.memoryEngine.close();
+ await this.diskEngine.close();
+ }
+ isOpen() {
+ return this.memoryEngine.isOpen() && this.diskEngine.isOpen();
+ }
+ // ---- 表管理 ----
+ async createTable(schema) {
+ await this.memoryEngine.createTable(schema);
+ await this.diskEngine.createTable(schema);
+ }
+ async dropTable(tableName) {
+ await this.memoryEngine.dropTable(tableName);
+ await this.diskEngine.dropTable(tableName);
+ }
+ async hasTable(tableName) {
+ return this.memoryEngine.hasTable(tableName);
+ }
+ async getTableNames() {
+ return this.memoryEngine.getTableNames();
+ }
+ async getTableSchema(tableName) {
+ return this.memoryEngine.getTableSchema(tableName);
+ }
+ // ---- CRUD(write-through 策略) ----
+ async insert(tableName, rows) {
+ const pks = await this.memoryEngine.insert(tableName, rows);
+ // write-through: 同步写入磁盘
+ await this.diskEngine.insert(tableName, rows);
+ return pks;
+ }
+ async find(tableName, query) {
+ // 直接从内存读取
+ return this.memoryEngine.find(tableName, query);
+ }
+ async update(tableName, query, updates) {
+ const count = await this.memoryEngine.update(tableName, query, updates);
+ // write-through: 同步更新磁盘
+ await this.diskEngine.update(tableName, query, updates);
+ return count;
+ }
+ async delete(tableName, query) {
+ const count = await this.memoryEngine.delete(tableName, query);
+ // write-through: 同步删除磁盘
+ await this.diskEngine.delete(tableName, query);
+ return count;
+ }
+ async count(tableName, query) {
+ return this.memoryEngine.count(tableName, query);
+ }
+ async clear(tableName) {
+ await this.memoryEngine.clear(tableName);
+ await this.diskEngine.clear(tableName);
+ }
+ // ---- 引擎信息 ----
+ /** 获取磁盘引擎类型 */
+ getDiskEngineType() {
+ return this.diskEngineType;
+ }
+ /** 获取内存引擎(供内部使用) */
+ getMemoryEngine() {
+ return this.memoryEngine;
+ }
+}
+
+/**
+ * metona-sqlark Query Builder — 链式查询构建器
+ * @module query/builder
+ *
+ * 链式调用 → 构建 AST → 执行引擎操作。
+ * 支持 JOIN(需要 Executor)。
+ */
+// ---------------------------------------------------------------------------
+// SelectQueryBuilder
+// ---------------------------------------------------------------------------
+class SelectQueryBuilder {
+ constructor(engine, tableName, _columns = ['*'], executor) {
+ this.engine = engine;
+ this.tableName = tableName;
+ this._columns = _columns;
+ this._where = {};
+ this._orderBy = [];
+ this._joins = [];
+ this._executor = executor;
+ }
+ /** 主表别名 */
+ as(alias) {
+ this._alias = alias;
+ return this;
+ }
+ /** INNER JOIN */
+ innerJoin(table, on, alias) {
+ return this._addJoin('INNER', table, on, alias);
+ }
+ /** LEFT JOIN */
+ leftJoin(table, on, alias) {
+ return this._addJoin('LEFT', table, on, alias);
+ }
+ /** RIGHT JOIN */
+ rightJoin(table, on, alias) {
+ return this._addJoin('RIGHT', table, on, alias);
+ }
+ /** CROSS JOIN */
+ crossJoin(table, alias) {
+ return this._addJoin('CROSS', table, {}, alias);
+ }
+ /** 通用 JOIN */
+ join(table, on, alias) {
+ return this._addJoin('INNER', table, on, alias);
+ }
+ _addJoin(type, table, on, alias) {
+ this._joins.push({ type, table, on, alias });
+ return this;
+ }
+ /** 添加过滤条件 */
+ where(condition) {
+ this._where = { ...this._where, ...condition };
+ return this;
+ }
+ /** 排序 */
+ orderBy(column, direction = 'asc') {
+ this._orderBy.push({ column, direction });
+ return this;
+ }
+ /** 限制返回条数 */
+ limit(n) {
+ this._limit = n;
+ return this;
+ }
+ /** 偏移量 */
+ offset(n) {
+ this._offset = n;
+ return this;
+ }
+ /** 执行查询 */
+ async execute() {
+ // 有 JOIN → 通过 Executor 执行
+ if (this._joins.length > 0 && this._executor) {
+ const ast = this.toAST();
+ return this._executor.execute(ast);
+ }
+ // 无 JOIN → 直接调用引擎
+ return this.engine.find(this.tableName, {
+ table: this.tableName,
+ columns: this._columns,
+ where: this._where,
+ orderBy: this._orderBy.length > 0 ? this._orderBy : undefined,
+ limit: this._limit,
+ offset: this._offset,
+ });
+ }
+ /** 获取 AST */
+ toAST() {
+ return {
+ type: 'SELECT',
+ columns: this._columns,
+ from: this.tableName,
+ alias: this._alias,
+ joins: this._joins.length > 0 ? [...this._joins] : undefined,
+ where: this._where,
+ orderBy: this._orderBy.length > 0 ? this._orderBy : undefined,
+ limit: this._limit,
+ offset: this._offset,
+ };
+ }
+}
+// ---------------------------------------------------------------------------
+// UpdateQueryBuilder
+// ---------------------------------------------------------------------------
+class UpdateQueryBuilder {
+ constructor(engine, tableName, _updates) {
+ this.engine = engine;
+ this.tableName = tableName;
+ this._updates = _updates;
+ this._where = {};
+ }
+ where(condition) {
+ this._where = { ...this._where, ...condition };
+ return this;
+ }
+ async execute() {
+ return this.engine.update(this.tableName, { table: this.tableName, where: this._where }, this._updates);
+ }
+ toAST() {
+ return { type: 'UPDATE', table: this.tableName, sets: this._updates, where: this._where };
+ }
+}
+// ---------------------------------------------------------------------------
+// DeleteQueryBuilder
+// ---------------------------------------------------------------------------
+class DeleteQueryBuilder {
+ constructor(engine, tableName) {
+ this.engine = engine;
+ this.tableName = tableName;
+ this._where = {};
+ }
+ where(condition) {
+ this._where = { ...this._where, ...condition };
+ return this;
+ }
+ async execute() {
+ return this.engine.delete(this.tableName, { table: this.tableName, where: this._where });
+ }
+ toAST() {
+ return { type: 'DELETE', from: this.tableName, where: this._where };
+ }
+}
+
+/**
+ * metona-sqlark Table — 表操作 API
+ * @module table/table
+ */
+// ---------------------------------------------------------------------------
+// Table
+// ---------------------------------------------------------------------------
+class Table {
+ constructor(engine, tableName, executor) {
+ this.schema = null;
+ this.engine = engine;
+ this.name = tableName;
+ this.executor = executor;
+ }
+ // ---- Schema ----
+ async getSchema() {
+ if (!this.schema) {
+ const s = await this.engine.getTableSchema(this.name);
+ if (!s)
+ throw new DatabaseError(`Table "${this.name}" does not exist`, 'TABLE_NOT_FOUND');
+ this.schema = s;
+ }
+ return this.schema;
+ }
+ // ---- 插入 ----
+ async insert(row) {
+ const pks = await this.engine.insert(this.name, [row]);
+ return pks[0];
+ }
+ async insertMany(rows) {
+ return this.engine.insert(this.name, rows);
+ }
+ // ---- 查询 ----
+ select(columns = ['*']) {
+ return new SelectQueryBuilder(this.engine, this.name, columns, this.executor);
+ }
+ // ---- 更新 ----
+ update(updates) {
+ return new UpdateQueryBuilder(this.engine, this.name, updates);
+ }
+ // ---- 删除 ----
+ delete() {
+ return new DeleteQueryBuilder(this.engine, this.name);
+ }
+ // ---- 聚合 ----
+ async count(where) {
+ return this.engine.count(this.name, where ? { table: this.name, where } : undefined);
+ }
+ // ---- 管理 ----
+ async clear() {
+ return this.engine.clear(this.name);
+ }
+ async drop() {
+ return this.engine.dropTable(this.name);
+ }
+}
+
+/**
+ * metona-sqlark Schema — 表结构定义与校验
+ * @module table/schema
+ */
+// ---------------------------------------------------------------------------
+// Schema 工具
+// ---------------------------------------------------------------------------
+/** 从列定义创建 TableSchema */
+function createSchema(name, columns) {
+ validateColumns(columns);
+ return { name, columns };
+}
+/** 校验列定义 */
+function validateColumns(columns) {
+ const colNames = Object.keys(columns);
+ if (colNames.length === 0) {
+ throw new DatabaseError('Table must have at least one column', 'SCHEMA_ERROR');
+ }
+ let primaryKeyCount = 0;
+ for (const [colName, colDef] of Object.entries(columns)) {
+ // 类型校验
+ if (!FIELD_TYPES.includes(colDef.type)) {
+ throw new DatabaseError(`Invalid type "${colDef.type}" for column "${colName}". Valid types: ${FIELD_TYPES.join(', ')}`, 'SCHEMA_ERROR');
+ }
+ // 主键计数
+ if (colDef.primaryKey) {
+ primaryKeyCount++;
+ }
+ }
+ // 至少需要一个主键
+ if (primaryKeyCount === 0) {
+ throw new DatabaseError('Table must have at least one primary key column', 'SCHEMA_ERROR');
+ }
+}
+/** 将 AST 列定义转换为 ColumnDef */
+function astColumnToColumnDef(astCol) {
+ return {
+ type: astCol.type,
+ primaryKey: astCol.primaryKey,
+ unique: astCol.unique,
+ required: astCol.required,
+ default: astCol.default,
+ index: astCol.index,
+ maxLength: astCol.maxLength,
+ min: astCol.min,
+ max: astCol.max,
+ };
+}
+
+/**
+ * metona-sqlark Query Compiler — AST → 查询计划
+ * @module query/compiler
+ *
+ * 将 AST 语句编译为引擎可执行的 QueryPlan。
+ * v0.0.1: 简单直接映射,未来可加入索引选择、过滤下推等优化。
+ */
+// ---------------------------------------------------------------------------
+// 编译 AST → QueryPlan
+// ---------------------------------------------------------------------------
+/**
+ * 编译 SELECT / DELETE / UPDATE 语句为 QueryPlan。
+ * INSERT 和 DDL 语句不需要 QueryPlan。
+ */
+function compileStatement(stmt) {
+ switch (stmt.type) {
+ case 'SELECT':
+ return compileSelect(stmt);
+ case 'DELETE':
+ return compileDelete(stmt);
+ case 'UPDATE':
+ return compileUpdate(stmt);
+ default:
+ throw new DatabaseError(`Cannot compile statement type "${stmt.type}" to QueryPlan`, 'COMPILE_ERROR');
+ }
+}
+function compileSelect(stmt) {
+ return {
+ table: stmt.from,
+ columns: stmt.columns,
+ where: stmt.where,
+ orderBy: stmt.orderBy?.length ? stmt.orderBy : undefined,
+ limit: stmt.limit,
+ offset: stmt.offset,
+ };
+}
+function compileDelete(stmt) {
+ return {
+ table: stmt.from,
+ where: stmt.where,
+ };
+}
+function compileUpdate(stmt) {
+ return {
+ table: stmt.table,
+ where: stmt.where,
+ };
+}
+
+/**
+ * metona-sqlark Query Executor — AST 执行器
+ * @module query/executor
+ *
+ * JOIN / GROUP BY / DISTINCT 逻辑在此层处理。
+ */
+// ---------------------------------------------------------------------------
+// Executor
+// ---------------------------------------------------------------------------
+class QueryExecutor {
+ constructor(engine) {
+ this.engine = engine;
+ }
+ async execute(stmt) {
+ switch (stmt.type) {
+ case 'SELECT': return this.executeSelect(stmt);
+ case 'INSERT': return this.executeInsert(stmt);
+ case 'UPDATE': return this.executeUpdate(stmt);
+ case 'DELETE': return this.executeDelete(stmt);
+ case 'CREATE_TABLE': return this.executeCreateTable(stmt);
+ case 'DROP_TABLE': return this.executeDropTable(stmt);
+ default: throw new DatabaseError('Unknown statement type', 'UNKNOWN_STATEMENT');
+ }
+ }
+ // ===================================================================
+ // SELECT
+ // ===================================================================
+ async executeSelect(stmt) {
+ const hasGroupBy = !!(stmt.groupBy && stmt.groupBy.length > 0);
+ let rows;
+ if (!stmt.joins || stmt.joins.length === 0) {
+ const plan = compileStatement(hasGroupBy ? { ...stmt, columns: ['*'] } : stmt);
+ rows = await this.engine.find(plan.table, plan);
+ }
+ else {
+ rows = await this.executeJoinSelect(stmt);
+ }
+ if (hasGroupBy)
+ rows = this.executeGroupBy(rows, stmt);
+ if (stmt.distinct)
+ rows = this.executeDistinct(rows);
+ if (stmt.having && Object.keys(stmt.having).length > 0) {
+ rows = rows.filter((row) => matchWhere(row, stmt.having));
+ }
+ if (stmt.orderBy && stmt.orderBy.length > 0)
+ rows = applyOrderBy(rows, stmt.orderBy);
+ const offset = stmt.offset ?? 0;
+ const limit = stmt.limit ?? rows.length;
+ rows = rows.slice(offset, offset + limit);
+ if (!hasGroupBy && stmt.columns.length > 0 && stmt.columns[0] !== '*') {
+ rows = rows.map((row) => projectColumns(row, stmt.columns));
+ }
+ return rows;
+ }
+ // ---- JOIN ----
+ async executeJoinSelect(stmt) {
+ const mainAlias = stmt.alias ?? stmt.from;
+ const mainRows = (await this.engine.find(stmt.from, { table: stmt.from }))
+ .map((row) => this.prefixRow(row, mainAlias));
+ let resultRows = mainRows;
+ for (const join of stmt.joins) {
+ const joinAlias = join.alias ?? join.table;
+ const joinRows = (await this.engine.find(join.table, { table: join.table }))
+ .map((row) => this.prefixRow(row, joinAlias));
+ resultRows = this.joinRows(resultRows, joinRows, join);
+ }
+ if (stmt.where && Object.keys(stmt.where).length > 0) {
+ resultRows = resultRows.filter((row) => matchWhere(row, stmt.where));
+ }
+ return resultRows;
+ }
+ prefixRow(row, alias) {
+ const prefixed = {};
+ for (const [key, value] of Object.entries(row))
+ prefixed[`${alias}.${key}`] = value;
+ return prefixed;
+ }
+ /** 嵌套循环连接(优化:避免 ON 时对象扩散) */
+ joinRows(leftRows, rightRows, join) {
+ if (join.type === 'CROSS') {
+ const result = [];
+ for (const l of leftRows)
+ for (const r of rightRows)
+ result.push({ ...l, ...r });
+ return result;
+ }
+ const result = [];
+ for (const l of leftRows) {
+ let matched = false;
+ for (const r of rightRows) {
+ // 合并后匹配 ON(避免创建临时对象再丢弃)
+ const merged = { ...l, ...r };
+ if (matchWhere(merged, join.on, { $col: true })) {
+ result.push(merged);
+ matched = true;
+ }
+ }
+ if (!matched && join.type === 'LEFT') {
+ const nullRight = {};
+ for (const key of Object.keys(rightRows[0] ?? {}))
+ nullRight[key] = null;
+ result.push({ ...l, ...nullRight });
+ }
+ }
+ if (join.type === 'RIGHT') {
+ for (const r of rightRows) {
+ const isMatched = leftRows.some((l) => {
+ const merged = { ...l, ...r };
+ return matchWhere(merged, join.on, { $col: true });
+ });
+ if (!isMatched) {
+ const nullLeft = {};
+ for (const key of Object.keys(leftRows[0] ?? {}))
+ nullLeft[key] = null;
+ result.push({ ...nullLeft, ...r });
+ }
+ }
+ }
+ return result;
+ }
+ // ---- GROUP BY ----
+ executeGroupBy(rows, stmt) {
+ const groups = new Map();
+ for (const row of rows) {
+ const key = stmt.groupBy.map((col) => String(row[col] ?? 'null')).join('|');
+ if (!groups.has(key))
+ groups.set(key, []);
+ groups.get(key).push(row);
+ }
+ const result = [];
+ for (const groupRows of groups.values()) {
+ const aggregated = {};
+ for (const col of stmt.groupBy)
+ aggregated[col] = groupRows[0][col];
+ for (const colExpr of stmt.columns) {
+ if (colExpr === '*')
+ continue;
+ const m = colExpr.match(/^(COUNT|SUM|AVG|MIN|MAX)\((.+?)\)(?:\s+AS\s+(\w+))?$/i);
+ if (m) {
+ const [, func, arg, alias] = m;
+ aggregated[alias || colExpr] = this.computeAggregate(func.toUpperCase(), groupRows, arg.trim());
+ }
+ else if (!stmt.groupBy.includes(colExpr)) {
+ aggregated[colExpr] = groupRows[0][colExpr];
+ }
+ }
+ result.push(aggregated);
+ }
+ return result;
+ }
+ computeAggregate(func, rows, col) {
+ const nums = rows.map((r) => r[col]).filter((v) => v !== null && v !== undefined).map(Number);
+ switch (func) {
+ case 'COUNT': return col === '*' ? rows.length : nums.length;
+ case 'SUM': return nums.reduce((a, b) => a + b, 0);
+ case 'AVG': return nums.length === 0 ? 0 : nums.reduce((a, b) => a + b, 0) / nums.length;
+ case 'MIN': return nums.length === 0 ? 0 : Math.min(...nums);
+ case 'MAX': return nums.length === 0 ? 0 : Math.max(...nums);
+ default: return 0;
+ }
+ }
+ // ---- DISTINCT(优化:列值拼接代替 JSON.stringify) ----
+ executeDistinct(rows) {
+ const seen = new Set();
+ return rows.filter((row) => {
+ const key = Object.values(row).map((v) => String(v ?? '\0')).join('\x1f');
+ if (seen.has(key))
+ return false;
+ seen.add(key);
+ return true;
+ });
+ }
+ // ===================================================================
+ // 其他语句
+ // ===================================================================
+ async executeInsert(stmt) {
+ const schema = await this.engine.getTableSchema(stmt.into);
+ if (!schema)
+ throw new DatabaseError(`Table "${stmt.into}" does not exist`, 'TABLE_NOT_FOUND');
+ const colNames = stmt.columns ?? Object.keys(schema.columns);
+ const rows = stmt.values.map((vals) => {
+ const row = {};
+ for (let i = 0; i < colNames.length; i++) {
+ if (i < vals.length)
+ row[colNames[i]] = vals[i];
+ }
+ return row;
+ });
+ return this.engine.insert(stmt.into, rows);
+ }
+ async executeUpdate(stmt) {
+ const plan = compileStatement(stmt);
+ return this.engine.update(plan.table, plan, stmt.sets);
+ }
+ async executeDelete(stmt) {
+ const plan = compileStatement(stmt);
+ return this.engine.delete(plan.table, plan);
+ }
+ async executeCreateTable(stmt) {
+ const columns = {};
+ for (const col of stmt.columns)
+ columns[col.name] = astColumnToColumnDef(col);
+ return this.engine.createTable(createSchema(stmt.name, columns));
+ }
+ async executeDropTable(stmt) {
+ return this.engine.dropTable(stmt.name);
+ }
+ getEngine() { return this.engine; }
+}
+
+/**
+ * metona-sqlark SQL Token Types — 词法单元定义
+ * @module sql/tokens
+ */
+// ---------------------------------------------------------------------------
+// Token 类型枚举
+// ---------------------------------------------------------------------------
+var TokenType;
+(function (TokenType) {
+ // 关键字
+ TokenType["SELECT"] = "SELECT";
+ TokenType["FROM"] = "FROM";
+ TokenType["WHERE"] = "WHERE";
+ TokenType["INSERT"] = "INSERT";
+ TokenType["INTO"] = "INTO";
+ TokenType["VALUES"] = "VALUES";
+ TokenType["UPDATE"] = "UPDATE";
+ TokenType["SET"] = "SET";
+ TokenType["DELETE"] = "DELETE";
+ TokenType["CREATE"] = "CREATE";
+ TokenType["TABLE"] = "TABLE";
+ TokenType["DROP"] = "DROP";
+ TokenType["ORDER"] = "ORDER";
+ TokenType["BY"] = "BY";
+ TokenType["ASC"] = "ASC";
+ TokenType["DESC"] = "DESC";
+ TokenType["LIMIT"] = "LIMIT";
+ TokenType["OFFSET"] = "OFFSET";
+ TokenType["AND"] = "AND";
+ TokenType["OR"] = "OR";
+ TokenType["NOT"] = "NOT";
+ TokenType["LIKE"] = "LIKE";
+ TokenType["IN"] = "IN";
+ TokenType["PRIMARY"] = "PRIMARY";
+ TokenType["KEY"] = "KEY";
+ TokenType["UNIQUE"] = "UNIQUE";
+ TokenType["DEFAULT"] = "DEFAULT";
+ TokenType["NULL"] = "NULL";
+ TokenType["TRUE"] = "TRUE";
+ TokenType["FALSE"] = "FALSE";
+ // JOIN 相关
+ TokenType["INNER"] = "INNER";
+ TokenType["LEFT"] = "LEFT";
+ TokenType["RIGHT"] = "RIGHT";
+ TokenType["CROSS"] = "CROSS";
+ TokenType["JOIN"] = "JOIN";
+ TokenType["ON"] = "ON";
+ TokenType["AS"] = "AS";
+ TokenType["OUTER"] = "OUTER";
+ // 聚合
+ TokenType["GROUP"] = "GROUP";
+ TokenType["HAVING"] = "HAVING";
+ TokenType["COUNT"] = "COUNT";
+ TokenType["SUM"] = "SUM";
+ TokenType["AVG"] = "AVG";
+ TokenType["MIN"] = "MIN";
+ TokenType["MAX"] = "MAX";
+ TokenType["DISTINCT"] = "DISTINCT";
+ // 标识符 & 字面量
+ TokenType["IDENTIFIER"] = "IDENTIFIER";
+ TokenType["STRING"] = "STRING";
+ TokenType["NUMBER"] = "NUMBER";
+ // 运算符 & 分隔符
+ TokenType["COMMA"] = "COMMA";
+ TokenType["LPAREN"] = "LPAREN";
+ TokenType["RPAREN"] = "RPAREN";
+ TokenType["SEMICOLON"] = "SEMICOLON";
+ TokenType["EQ"] = "EQ";
+ TokenType["NEQ"] = "NEQ";
+ TokenType["GT"] = "GT";
+ TokenType["GTE"] = "GTE";
+ TokenType["LT"] = "LT";
+ TokenType["LTE"] = "LTE";
+ TokenType["STAR"] = "STAR";
+ TokenType["DOT"] = "DOT";
+ // 特殊
+ TokenType["EOF"] = "EOF";
+ TokenType["ILLEGAL"] = "ILLEGAL";
+})(TokenType || (TokenType = {}));
+// ---------------------------------------------------------------------------
+// 关键字映射
+// ---------------------------------------------------------------------------
+const KEYWORDS = {
+ 'SELECT': TokenType.SELECT,
+ 'FROM': TokenType.FROM,
+ 'WHERE': TokenType.WHERE,
+ 'INSERT': TokenType.INSERT,
+ 'INTO': TokenType.INTO,
+ 'VALUES': TokenType.VALUES,
+ 'UPDATE': TokenType.UPDATE,
+ 'SET': TokenType.SET,
+ 'DELETE': TokenType.DELETE,
+ 'CREATE': TokenType.CREATE,
+ 'TABLE': TokenType.TABLE,
+ 'DROP': TokenType.DROP,
+ 'ORDER': TokenType.ORDER,
+ 'BY': TokenType.BY,
+ 'ASC': TokenType.ASC,
+ 'DESC': TokenType.DESC,
+ 'LIMIT': TokenType.LIMIT,
+ 'OFFSET': TokenType.OFFSET,
+ 'AND': TokenType.AND,
+ 'OR': TokenType.OR,
+ 'NOT': TokenType.NOT,
+ 'LIKE': TokenType.LIKE,
+ 'IN': TokenType.IN,
+ 'PRIMARY': TokenType.PRIMARY,
+ 'KEY': TokenType.KEY,
+ 'UNIQUE': TokenType.UNIQUE,
+ 'DEFAULT': TokenType.DEFAULT,
+ 'NULL': TokenType.NULL,
+ 'TRUE': TokenType.TRUE,
+ 'FALSE': TokenType.FALSE,
+ // JOIN
+ 'INNER': TokenType.INNER,
+ 'LEFT': TokenType.LEFT,
+ 'RIGHT': TokenType.RIGHT,
+ 'CROSS': TokenType.CROSS,
+ 'JOIN': TokenType.JOIN,
+ 'ON': TokenType.ON,
+ 'AS': TokenType.AS,
+ 'OUTER': TokenType.OUTER,
+ // 聚合
+ 'GROUP': TokenType.GROUP,
+ 'HAVING': TokenType.HAVING,
+ 'COUNT': TokenType.COUNT,
+ 'SUM': TokenType.SUM,
+ 'AVG': TokenType.AVG,
+ 'MIN': TokenType.MIN,
+ 'MAX': TokenType.MAX,
+ 'DISTINCT': TokenType.DISTINCT,
+};
+
+/**
+ * metona-sqlark SQL Lexer — 词法分析器
+ * @module sql/lexer
+ *
+ * 将 SQL 字符串切分为 Token 流。
+ */
+// ---------------------------------------------------------------------------
+// Lexer
+// ---------------------------------------------------------------------------
+class Lexer {
+ constructor(input) {
+ this.position = 0;
+ this.readPosition = 0;
+ this.ch = '';
+ this.input = input;
+ this.readChar();
+ }
+ /** 读取下一个 Token */
+ nextToken() {
+ this.skipWhitespace();
+ let tok;
+ switch (this.ch) {
+ case ',':
+ tok = this.makeToken(TokenType.COMMA, ',');
+ break;
+ case '(':
+ tok = this.makeToken(TokenType.LPAREN, '(');
+ break;
+ case ')':
+ tok = this.makeToken(TokenType.RPAREN, ')');
+ break;
+ case ';':
+ tok = this.makeToken(TokenType.SEMICOLON, ';');
+ break;
+ case '*':
+ tok = this.makeToken(TokenType.STAR, '*');
+ break;
+ case '.':
+ tok = this.makeToken(TokenType.DOT, '.');
+ break;
+ case '=':
+ tok = this.makeToken(TokenType.EQ, '=');
+ break;
+ case '!':
+ if (this.peekChar() === '=') {
+ this.readChar();
+ tok = this.makeToken(TokenType.NEQ, '!=');
+ }
+ else {
+ tok = this.makeToken(TokenType.ILLEGAL, '!');
+ }
+ break;
+ case '>':
+ if (this.peekChar() === '=') {
+ this.readChar();
+ tok = this.makeToken(TokenType.GTE, '>=');
+ }
+ else {
+ tok = this.makeToken(TokenType.GT, '>');
+ }
+ break;
+ case '<':
+ if (this.peekChar() === '=') {
+ this.readChar();
+ tok = this.makeToken(TokenType.LTE, '<=');
+ }
+ else if (this.peekChar() === '>') {
+ this.readChar();
+ tok = this.makeToken(TokenType.NEQ, '<>');
+ }
+ else {
+ tok = this.makeToken(TokenType.LT, '<');
+ }
+ break;
+ case "'":
+ case '"':
+ tok = this.readString(this.ch);
+ break;
+ case '':
+ tok = { type: TokenType.EOF, value: '', position: this.position };
+ break;
+ default:
+ if (this.isLetter(this.ch)) {
+ const ident = this.readIdentifier();
+ const keyword = KEYWORDS[ident.toUpperCase()];
+ tok = {
+ type: keyword ?? TokenType.IDENTIFIER,
+ value: ident,
+ position: this.position - ident.length,
+ };
+ return tok; // 已读取完毕,不需要再 readChar
+ }
+ else if (this.isDigit(this.ch) || (this.ch === '-' && this.isDigit(this.peekChar()))) {
+ const num = this.readNumber();
+ tok = {
+ type: TokenType.NUMBER,
+ value: num,
+ position: this.position - num.length,
+ };
+ return tok;
+ }
+ else {
+ tok = this.makeToken(TokenType.ILLEGAL, this.ch);
+ }
+ break;
+ }
+ this.readChar();
+ return tok;
+ }
+ // ---- 内部 ----
+ readChar() {
+ if (this.readPosition >= this.input.length) {
+ this.ch = '';
+ }
+ else {
+ this.ch = this.input[this.readPosition];
+ }
+ this.position = this.readPosition;
+ this.readPosition++;
+ }
+ peekChar() {
+ if (this.readPosition >= this.input.length)
+ return '';
+ return this.input[this.readPosition];
+ }
+ skipWhitespace() {
+ while (this.ch === ' ' || this.ch === '\t' || this.ch === '\n' || this.ch === '\r') {
+ this.readChar();
+ }
+ }
+ readIdentifier() {
+ const start = this.position;
+ while (this.isLetter(this.ch) || this.isDigit(this.ch) || this.ch === '_') {
+ this.readChar();
+ }
+ return this.input.slice(start, this.position);
+ }
+ readNumber() {
+ const start = this.position;
+ // 负号
+ if (this.ch === '-')
+ this.readChar();
+ while (this.isDigit(this.ch)) {
+ this.readChar();
+ }
+ // 小数点
+ if (this.ch === '.' && this.isDigit(this.peekChar())) {
+ this.readChar();
+ while (this.isDigit(this.ch)) {
+ this.readChar();
+ }
+ }
+ return this.input.slice(start, this.position);
+ }
+ readString(quote) {
+ const start = this.position + 1; // 跳过一个引号
+ this.readChar(); // 跳过开始引号
+ let value = '';
+ while (this.ch !== quote && this.ch !== '') {
+ // 处理转义
+ if (this.ch === '\\' && this.peekChar() === quote) {
+ this.readChar();
+ value += quote;
+ }
+ else {
+ value += this.ch;
+ }
+ this.readChar();
+ }
+ // 跳过结束引号(在 readChar 之后才会调用,所以这里不需要处理)
+ return {
+ type: TokenType.STRING,
+ value,
+ position: start,
+ };
+ }
+ isLetter(ch) {
+ return /[a-zA-Z_]/.test(ch);
+ }
+ isDigit(ch) {
+ return /[0-9]/.test(ch);
+ }
+ makeToken(type, value) {
+ return { type, value, position: this.position };
+ }
+}
+// ---------------------------------------------------------------------------
+// 便捷方法:一次性词法分析
+// ---------------------------------------------------------------------------
+/** 将 SQL 字符串解析为 Token 列表 */
+function tokenize(sql) {
+ const lexer = new Lexer(sql);
+ const tokens = [];
+ let tok = lexer.nextToken();
+ while (tok.type !== TokenType.EOF) {
+ tokens.push(tok);
+ tok = lexer.nextToken();
+ }
+ tokens.push(tok); // EOF
+ return tokens;
+}
+
+/**
+ * metona-sqlark SQL Parser — 递归下降语法分析器
+ * @module sql/parser
+ *
+ * Token 流 → AST Statement。
+ * 支持的语法是标准 SQL 的子集。
+ */
+// ---------------------------------------------------------------------------
+// Parser
+// ---------------------------------------------------------------------------
+class Parser {
+ constructor(sql) {
+ this.lexer = new Lexer(sql);
+ // 预读两个 token
+ this.nextToken();
+ this.nextToken();
+ }
+ /** 解析完整 SQL 语句 */
+ parseStatement() {
+ switch (this.curToken.type) {
+ case TokenType.SELECT:
+ return this.parseSelect();
+ case TokenType.INSERT:
+ return this.parseInsert();
+ case TokenType.UPDATE:
+ return this.parseUpdate();
+ case TokenType.DELETE:
+ return this.parseDelete();
+ case TokenType.CREATE:
+ return this.parseCreateTable();
+ case TokenType.DROP:
+ return this.parseDropTable();
+ default:
+ throw this.error(`Unexpected token "${this.curToken.value}"`);
+ }
+ }
+ // ===================================================================
+ // SELECT
+ // ===================================================================
+ parseSelect() {
+ this.expect(TokenType.SELECT);
+ // DISTINCT(可选)
+ let distinct = false;
+ if (this.curTokenIs(TokenType.DISTINCT)) {
+ distinct = true;
+ this.nextToken();
+ }
+ // 列
+ const columns = [];
+ if (this.curTokenIs(TokenType.STAR)) {
+ columns.push('*');
+ this.nextToken();
+ }
+ else {
+ columns.push(...this.parseColumnList());
+ }
+ // FROM
+ this.expect(TokenType.FROM);
+ const tableName = this.expectIdentifier('table name');
+ // 表别名(可选)
+ let alias;
+ if (this.curTokenIs(TokenType.AS)) {
+ this.nextToken();
+ alias = this.expectIdentifier('alias');
+ }
+ else if (this.curToken.type === TokenType.IDENTIFIER && !this._isReservedAfterFrom()) {
+ alias = this.curToken.value;
+ this.nextToken();
+ }
+ const stmt = {
+ type: 'SELECT',
+ columns,
+ distinct: distinct || undefined,
+ from: tableName,
+ alias,
+ where: {},
+ };
+ // JOIN 子句(可选,支持多个)
+ const joins = this.parseJoinClauses();
+ if (joins.length > 0) {
+ stmt.joins = joins;
+ }
+ // WHERE(可选)
+ if (this.curTokenIs(TokenType.WHERE)) {
+ this.nextToken();
+ stmt.where = this.parseCondition();
+ }
+ // GROUP BY(可选)
+ if (this.curTokenIs(TokenType.GROUP)) {
+ this.nextToken();
+ this.expect(TokenType.BY);
+ stmt.groupBy = this.parseIdentifierList();
+ }
+ // HAVING(可选)
+ if (this.curTokenIs(TokenType.HAVING)) {
+ this.nextToken();
+ stmt.having = this.parseCondition();
+ }
+ // ORDER BY(可选)
+ if (this.curTokenIs(TokenType.ORDER)) {
+ this.nextToken();
+ this.expect(TokenType.BY);
+ stmt.orderBy = this.parseOrderByList();
+ }
+ // LIMIT(可选)
+ if (this.curTokenIs(TokenType.LIMIT)) {
+ this.nextToken();
+ stmt.limit = this.expectNumber('LIMIT value');
+ }
+ // OFFSET(可选)
+ if (this.curTokenIs(TokenType.OFFSET)) {
+ this.nextToken();
+ stmt.offset = this.expectNumber('OFFSET value');
+ }
+ return stmt;
+ }
+ /** 解析 JOIN 子句列表 */
+ parseJoinClauses() {
+ const joins = [];
+ while (this._isJoinKeyword()) {
+ joins.push(this.parseJoinClause());
+ }
+ return joins;
+ }
+ _isJoinKeyword() {
+ return (this.curTokenIs(TokenType.INNER) ||
+ this.curTokenIs(TokenType.LEFT) ||
+ this.curTokenIs(TokenType.RIGHT) ||
+ this.curTokenIs(TokenType.CROSS) ||
+ this.curTokenIs(TokenType.JOIN));
+ }
+ /** 解析单个 JOIN 子句 */
+ parseJoinClause() {
+ let type = 'INNER';
+ if (this.curTokenIs(TokenType.INNER)) {
+ type = 'INNER';
+ this.nextToken();
+ }
+ else if (this.curTokenIs(TokenType.LEFT)) {
+ type = 'LEFT';
+ this.nextToken();
+ if (this.curTokenIs(TokenType.OUTER))
+ this.nextToken(); // 可选 OUTER
+ }
+ else if (this.curTokenIs(TokenType.RIGHT)) {
+ type = 'RIGHT';
+ this.nextToken();
+ if (this.curTokenIs(TokenType.OUTER))
+ this.nextToken();
+ }
+ else if (this.curTokenIs(TokenType.CROSS)) {
+ type = 'CROSS';
+ this.nextToken();
+ }
+ this.expect(TokenType.JOIN);
+ const tableName = this.expectIdentifier('table name');
+ // JOIN 表别名(可选)
+ let alias;
+ if (this.curTokenIs(TokenType.AS)) {
+ this.nextToken();
+ alias = this.expectIdentifier('alias');
+ }
+ else if (this.curToken.type === TokenType.IDENTIFIER && !this._isJoinReserved()) {
+ alias = this.curToken.value;
+ this.nextToken();
+ }
+ // ON 条件(CROSS JOIN 不需要 ON)
+ let on = {};
+ if (type !== 'CROSS' && this.curTokenIs(TokenType.ON)) {
+ this.nextToken();
+ on = this.parseCondition();
+ }
+ return { type, table: tableName, alias, on };
+ }
+ /** 判断当前 token 是否为 FROM 之后的保留字 */
+ _isReservedAfterFrom() {
+ return (this.curTokenIs(TokenType.WHERE) ||
+ this.curTokenIs(TokenType.ORDER) ||
+ this.curTokenIs(TokenType.LIMIT) ||
+ this.curTokenIs(TokenType.OFFSET) ||
+ this.curTokenIs(TokenType.GROUP) ||
+ this._isJoinKeyword());
+ }
+ _isJoinReserved() {
+ return (this.curTokenIs(TokenType.ON) ||
+ this.curTokenIs(TokenType.WHERE) ||
+ this.curTokenIs(TokenType.ORDER) ||
+ this.curTokenIs(TokenType.LIMIT) ||
+ this._isJoinKeyword());
+ }
+ // ===================================================================
+ // INSERT
+ // ===================================================================
+ parseInsert() {
+ this.expect(TokenType.INSERT);
+ this.expect(TokenType.INTO);
+ const tableName = this.expectIdentifier('table name');
+ // 列名(可选)
+ let columns;
+ if (this.curTokenIs(TokenType.LPAREN)) {
+ this.nextToken();
+ columns = this.parseIdentifierList();
+ this.expect(TokenType.RPAREN);
+ }
+ // VALUES
+ this.expect(TokenType.VALUES);
+ // 值列表
+ const values = [];
+ do {
+ if (this.curTokenIs(TokenType.COMMA)) {
+ this.nextToken();
+ }
+ this.expect(TokenType.LPAREN);
+ const rowValues = this.parseValueList();
+ this.expect(TokenType.RPAREN);
+ values.push(rowValues);
+ } while (this.curTokenIs(TokenType.COMMA));
+ return {
+ type: 'INSERT',
+ into: tableName,
+ columns,
+ values,
+ };
+ }
+ // ===================================================================
+ // UPDATE
+ // ===================================================================
+ parseUpdate() {
+ this.expect(TokenType.UPDATE);
+ const tableName = this.expectIdentifier('table name');
+ this.expect(TokenType.SET);
+ // SET col=val, ...
+ const sets = {};
+ do {
+ if (this.curTokenIs(TokenType.COMMA))
+ this.nextToken();
+ const col = this.expectIdentifier('column name');
+ this.expect(TokenType.EQ);
+ sets[col] = this.parseValue();
+ } while (this.curTokenIs(TokenType.COMMA));
+ let where = {};
+ if (this.curTokenIs(TokenType.WHERE)) {
+ this.nextToken();
+ where = this.parseCondition();
+ }
+ return { type: 'UPDATE', table: tableName, sets, where };
+ }
+ // ===================================================================
+ // DELETE
+ // ===================================================================
+ parseDelete() {
+ this.expect(TokenType.DELETE);
+ this.expect(TokenType.FROM);
+ const tableName = this.expectIdentifier('table name');
+ let where = {};
+ if (this.curTokenIs(TokenType.WHERE)) {
+ this.nextToken();
+ where = this.parseCondition();
+ }
+ return { type: 'DELETE', from: tableName, where };
+ }
+ // ===================================================================
+ // CREATE TABLE
+ // ===================================================================
+ parseCreateTable() {
+ this.expect(TokenType.CREATE);
+ this.expect(TokenType.TABLE);
+ const tableName = this.expectIdentifier('table name');
+ this.expect(TokenType.LPAREN);
+ const columns = [];
+ do {
+ if (this.curTokenIs(TokenType.COMMA))
+ this.nextToken();
+ columns.push(this.parseColumnDef());
+ } while (this.curTokenIs(TokenType.COMMA));
+ this.expect(TokenType.RPAREN);
+ return { type: 'CREATE_TABLE', name: tableName, columns };
+ }
+ parseColumnDef() {
+ const name = this.expectIdentifier('column name');
+ const type = this.expectIdentifier('column type').toLowerCase();
+ const col = { name, type };
+ // 修饰符
+ while (this.curTokenIs(TokenType.PRIMARY) ||
+ this.curTokenIs(TokenType.UNIQUE) ||
+ this.curTokenIs(TokenType.NOT) ||
+ this.curTokenIs(TokenType.DEFAULT)) {
+ if (this.curTokenIs(TokenType.PRIMARY)) {
+ this.nextToken();
+ this.expect(TokenType.KEY);
+ col.primaryKey = true;
+ }
+ else if (this.curTokenIs(TokenType.UNIQUE)) {
+ this.nextToken();
+ col.unique = true;
+ }
+ else if (this.curTokenIs(TokenType.NOT)) {
+ this.nextToken();
+ // 支持 NOT NULL → required
+ this.expect(TokenType.NULL);
+ col.required = true;
+ }
+ else if (this.curTokenIs(TokenType.DEFAULT)) {
+ this.nextToken();
+ col.default = this.parseValue();
+ }
+ else {
+ break;
+ }
+ }
+ return col;
+ }
+ // ===================================================================
+ // DROP TABLE
+ // ===================================================================
+ parseDropTable() {
+ this.expect(TokenType.DROP);
+ this.expect(TokenType.TABLE);
+ const tableName = this.expectIdentifier('table name');
+ return { type: 'DROP_TABLE', name: tableName };
+ }
+ // ===================================================================
+ // 条件表达式
+ // ===================================================================
+ /** condition → simple_cond ((AND|OR) simple_cond)* */
+ parseCondition() {
+ let left = this.parseSimpleCondition();
+ while (this.curTokenIs(TokenType.AND) || this.curTokenIs(TokenType.OR)) {
+ const isAnd = this.curTokenIs(TokenType.AND);
+ this.nextToken();
+ const right = this.parseSimpleCondition();
+ if (isAnd) {
+ // 合并到 $and
+ left = { $and: [left, right] };
+ }
+ else {
+ left = { $or: [left, right] };
+ }
+ }
+ return left;
+ }
+ /** simple_cond → column op value | column IS [NOT] NULL | column [NOT] LIKE pattern
+ * | column [NOT] IN (values) | NOT condition | (condition) */
+ parseSimpleCondition() {
+ // NOT expr
+ if (this.curTokenIs(TokenType.NOT)) {
+ this.nextToken();
+ const inner = this.parseSimpleCondition();
+ return { $not: inner };
+ }
+ // (condition)
+ if (this.curTokenIs(TokenType.LPAREN)) {
+ this.nextToken();
+ const inner = this.parseCondition();
+ this.expect(TokenType.RPAREN);
+ return inner;
+ }
+ // column
+ const column = this.parseColumnRef();
+ // IS NULL / IS NOT NULL
+ if (this.curTokenIs(TokenType.IDENTIFIER) && this.curToken.value.toUpperCase() === 'IS') {
+ this.nextToken();
+ const isNot = this.curTokenIs(TokenType.NOT);
+ if (isNot)
+ this.nextToken();
+ this.expect(TokenType.NULL);
+ const result = {};
+ result[column] = isNot ? { $ne: null } : { $eq: null };
+ return result;
+ }
+ // LIKE
+ if (this.curTokenIs(TokenType.LIKE)) {
+ this.nextToken();
+ const pattern = this.parseValue();
+ const result = {};
+ result[column] = { $like: pattern };
+ return result;
+ }
+ // IN
+ if (this.curTokenIs(TokenType.IN)) {
+ this.nextToken();
+ this.expect(TokenType.LPAREN);
+ const values = this.parseValueList();
+ this.expect(TokenType.RPAREN);
+ const result = {};
+ result[column] = { $in: values };
+ return result;
+ }
+ // 比较运算符
+ const op = this.parseComparisonOp();
+ // 尝试解析列引用(identifier DOT identifier 格式)
+ let value;
+ if ((this.curToken.type === TokenType.IDENTIFIER || this._isKeywordAsIdent()) &&
+ this.peekTokenIs(TokenType.DOT)) {
+ const colRef = this.parseColumnRef();
+ value = { $col: colRef };
+ }
+ else {
+ value = this.parseValue();
+ }
+ const result = {};
+ result[column] = { [op]: value };
+ return result;
+ }
+ peekTokenIs(type) {
+ return this.peekToken.type === type;
+ }
+ parseComparisonOp() {
+ switch (this.curToken.type) {
+ case TokenType.EQ:
+ this.nextToken();
+ return '$eq';
+ case TokenType.NEQ:
+ this.nextToken();
+ return '$ne';
+ case TokenType.GT:
+ this.nextToken();
+ return '$gt';
+ case TokenType.GTE:
+ this.nextToken();
+ return '$gte';
+ case TokenType.LT:
+ this.nextToken();
+ return '$lt';
+ case TokenType.LTE:
+ this.nextToken();
+ return '$lte';
+ default:
+ throw this.error(`Expected comparison operator, got "${this.curToken.value}"`);
+ }
+ }
+ // ===================================================================
+ // 辅助解析
+ // ===================================================================
+ parseColumnList() {
+ const cols = [];
+ cols.push(this.parseColumnRef());
+ while (this.curTokenIs(TokenType.COMMA)) {
+ this.nextToken();
+ cols.push(this.parseColumnRef());
+ }
+ return cols;
+ }
+ /** 解析列引用:支持 'col'、'table.col' 和 'COUNT(*)'/'SUM(col)' 等 */
+ parseColumnRef() {
+ // 聚合函数?
+ if (this.curTokenIs(TokenType.COUNT) ||
+ this.curTokenIs(TokenType.SUM) ||
+ this.curTokenIs(TokenType.AVG) ||
+ this.curTokenIs(TokenType.MIN) ||
+ this.curTokenIs(TokenType.MAX)) {
+ return this.parseAggregateCall();
+ }
+ const first = this.expectIdentifier('column name');
+ if (this.curTokenIs(TokenType.DOT)) {
+ this.nextToken();
+ const second = this.expectIdentifier('column name');
+ return `${first}.${second}`;
+ }
+ return first;
+ }
+ /** 解析聚合函数调用: COUNT(*), SUM(col), AVG(col), MIN(col), MAX(col) */
+ parseAggregateCall() {
+ const func = this.curToken.value.toUpperCase();
+ this.nextToken();
+ this.expect(TokenType.LPAREN);
+ let arg;
+ if (this.curTokenIs(TokenType.STAR)) {
+ arg = '*';
+ this.nextToken();
+ }
+ else {
+ arg = this.parseColumnRef();
+ }
+ this.expect(TokenType.RPAREN);
+ // 可选别名: AS alias
+ let alias = '';
+ if (this.curTokenIs(TokenType.AS)) {
+ this.nextToken();
+ alias = this.expectIdentifier('alias');
+ }
+ else if (this.curToken.type === TokenType.IDENTIFIER && this._isAggregateAlias()) {
+ alias = this.curToken.value;
+ this.nextToken();
+ }
+ if (alias) {
+ return `${func}(${arg}) AS ${alias}`;
+ }
+ return `${func}(${arg})`;
+ }
+ _isAggregateAlias() {
+ return !this._isReservedAfterFrom() && !this._isJoinKeyword();
+ }
+ parseIdentifierList() {
+ const ids = [];
+ ids.push(this.expectIdentifier('identifier'));
+ while (this.curTokenIs(TokenType.COMMA)) {
+ this.nextToken();
+ ids.push(this.expectIdentifier('identifier'));
+ }
+ return ids;
+ }
+ parseValueList() {
+ const vals = [];
+ vals.push(this.parseValue());
+ while (this.curTokenIs(TokenType.COMMA)) {
+ this.nextToken();
+ vals.push(this.parseValue());
+ }
+ return vals;
+ }
+ parseOrderByList() {
+ const list = [];
+ list.push(this.parseOrderBy());
+ while (this.curTokenIs(TokenType.COMMA)) {
+ this.nextToken();
+ list.push(this.parseOrderBy());
+ }
+ return list;
+ }
+ parseOrderBy() {
+ const column = this.expectIdentifier('column name');
+ let direction = 'asc';
+ if (this.curTokenIs(TokenType.ASC)) {
+ this.nextToken();
+ }
+ else if (this.curTokenIs(TokenType.DESC)) {
+ direction = 'desc';
+ this.nextToken();
+ }
+ return { column, direction };
+ }
+ /** 解析字面量值 */
+ parseValue() {
+ switch (this.curToken.type) {
+ case TokenType.STRING: {
+ const val = this.curToken.value;
+ this.nextToken();
+ return val;
+ }
+ case TokenType.NUMBER: {
+ const val = Number(this.curToken.value);
+ this.nextToken();
+ return val;
+ }
+ case TokenType.TRUE:
+ this.nextToken();
+ return true;
+ case TokenType.FALSE:
+ this.nextToken();
+ return false;
+ case TokenType.NULL:
+ this.nextToken();
+ return null;
+ default:
+ throw this.error(`Expected value, got "${this.curToken.value}"`);
+ }
+ }
+ // ===================================================================
+ // Token 操作
+ // ===================================================================
+ nextToken() {
+ this.curToken = this.peekToken;
+ this.peekToken = this.lexer.nextToken();
+ }
+ curTokenIs(type) {
+ return this.curToken.type === type;
+ }
+ expect(type) {
+ if (this.curTokenIs(type)) {
+ this.nextToken();
+ return;
+ }
+ throw this.error(`Expected ${type}, got "${this.curToken.value}"`);
+ }
+ expectIdentifier(context) {
+ if (this.curToken.type === TokenType.IDENTIFIER || this._isKeywordAsIdent()) {
+ const val = this.curToken.value;
+ this.nextToken();
+ return val;
+ }
+ throw this.error(`Expected ${context}, got "${this.curToken.value}"`);
+ }
+ /** 关键字可以作为标识符(如列名等于关键字) */
+ _isKeywordAsIdent() {
+ return (this.curToken.type !== TokenType.EOF &&
+ this.curToken.type !== TokenType.ILLEGAL &&
+ this.curToken.type !== TokenType.STRING &&
+ this.curToken.type !== TokenType.NUMBER &&
+ this.curToken.type !== TokenType.COMMA &&
+ this.curToken.type !== TokenType.LPAREN &&
+ this.curToken.type !== TokenType.RPAREN &&
+ this.curToken.type !== TokenType.SEMICOLON &&
+ this.curToken.type !== TokenType.EQ &&
+ this.curToken.type !== TokenType.NEQ &&
+ this.curToken.type !== TokenType.GT &&
+ this.curToken.type !== TokenType.GTE &&
+ this.curToken.type !== TokenType.LT &&
+ this.curToken.type !== TokenType.LTE &&
+ this.curToken.type !== TokenType.DOT &&
+ this.curToken.type !== TokenType.STAR);
+ }
+ expectNumber(context) {
+ if (this.curToken.type === TokenType.NUMBER) {
+ const val = Number(this.curToken.value);
+ this.nextToken();
+ return val;
+ }
+ throw this.error(`Expected ${context}, got "${this.curToken.value}"`);
+ }
+ error(msg) {
+ return new DatabaseError(`Parse error at position ${this.curToken.position}: ${msg}`, 'PARSE_ERROR');
+ }
+}
+// ---------------------------------------------------------------------------
+// 便捷方法
+// ---------------------------------------------------------------------------
+/** 解析 SQL 字符串为 AST Statement */
+function parse(sql) {
+ const parser = new Parser(sql);
+ const stmt = parser.parseStatement();
+ return stmt;
+}
+
+/**
+ * metona-sqlark Transaction — 事务管理
+ * @module transaction
+ *
+ * 封装多操作事务,保证原子性。
+ * v0.0.1: 基于引擎层操作实现,IndexedDB 引擎利用原生事务。
+ */
+// ---------------------------------------------------------------------------
+// Transaction
+// ---------------------------------------------------------------------------
+class Transaction {
+ constructor(engine) {
+ this.tables = new Map();
+ this.completed = false;
+ this.engine = engine;
+ }
+ /** 获取表操作对象 */
+ table(tableName) {
+ let t = this.tables.get(tableName);
+ if (!t) {
+ t = new Table(this.engine, tableName);
+ this.tables.set(tableName, t);
+ }
+ return t;
+ }
+ /** 标记事务完成(由 TransactionManager 调用) */
+ _markCompleted() {
+ this.completed = true;
+ }
+ /** 是否已完成 */
+ isCompleted() {
+ return this.completed;
+ }
+}
+// ---------------------------------------------------------------------------
+// TransactionManager
+// ---------------------------------------------------------------------------
+class TransactionManager {
+ constructor(engine) {
+ this.engine = engine;
+ }
+ /** 执行事务 */
+ async execute(fn) {
+ const trx = new Transaction(this.engine);
+ try {
+ const result = await fn(trx);
+ trx._markCompleted();
+ return result;
+ }
+ catch (error) {
+ if (error instanceof DatabaseError)
+ throw error;
+ throw new DatabaseError(`Transaction failed: ${error.message}`, 'TRANSACTION_ERROR', error);
+ }
+ }
+}
+
+/**
+ * metona-sqlark Plugin — 插件系统
+ * @module plugin
+ *
+ * 管理插件的注册、生命周期和钩子调度。
+ */
+// ---------------------------------------------------------------------------
+// PluginManager
+// ---------------------------------------------------------------------------
+class PluginManager {
+ constructor() {
+ this.plugins = [];
+ this.hooks = new Map();
+ }
+ /** 注册插件 */
+ register(plugin) {
+ // 按优先级插入
+ const priority = plugin.priority ?? 0;
+ const insertIndex = this.plugins.findIndex((p) => (p.priority ?? 0) < priority);
+ if (insertIndex === -1) {
+ this.plugins.push(plugin);
+ }
+ else {
+ this.plugins.splice(insertIndex, 0, plugin);
+ }
+ // 安装
+ plugin.install(null); // 实际引用由 MetonaSqlark 注入
+ }
+ /** 卸载插件 */
+ unregister(pluginName) {
+ const idx = this.plugins.findIndex((p) => p.name === pluginName);
+ if (idx !== -1) {
+ this.plugins[idx].destroy();
+ this.plugins.splice(idx, 1);
+ }
+ }
+ /** 获取所有已注册插件 */
+ getPlugins() {
+ return [...this.plugins];
+ }
+ /** 添加钩子回调 */
+ on(hook, callback) {
+ const callbacks = this.hooks.get(hook) ?? [];
+ callbacks.push(callback);
+ this.hooks.set(hook, callbacks);
+ }
+ /** 移除钩子回调 */
+ off(hook, callback) {
+ const callbacks = this.hooks.get(hook);
+ if (callbacks) {
+ const idx = callbacks.indexOf(callback);
+ if (idx !== -1)
+ callbacks.splice(idx, 1);
+ }
+ }
+ /** 触发钩子 */
+ async trigger(hook, ...args) {
+ const callbacks = this.hooks.get(hook);
+ if (callbacks) {
+ for (const cb of callbacks) {
+ await cb(...args);
+ }
+ }
+ }
+ /** 销毁所有插件 */
+ destroy() {
+ for (const plugin of this.plugins) {
+ try {
+ plugin.destroy();
+ }
+ catch (e) {
+ // eslint-disable-next-line no-console
+ console.warn(`[metona-sqlark] Plugin "${plugin.name}" destroy error:`, e);
+ }
+ }
+ this.plugins = [];
+ this.hooks.clear();
+ }
+}
+
+/**
+ * metona-sqlark Core — 数据库主类
+ * @module core
+ *
+ * 管理数据库生命周期、引擎调度、表操作、SQL 查询、事务和插件。
+ */
+// ---------------------------------------------------------------------------
+// MetonaSqlark
+// ---------------------------------------------------------------------------
+class MetonaSqlark {
+ /** 获取版本号 */
+ get version() { return this._version; }
+ constructor(config) {
+ this.ready = false;
+ this.tableCache = new Map();
+ // ---- 发布订阅 ----
+ this.listeners = new Map();
+ // ---- 迁移 ----
+ this.migrations = new Map();
+ this.config = config;
+ this.name = config.name ?? DB_DEFAULTS.name;
+ this.mode = config.mode ?? DB_DEFAULTS.mode;
+ this._version = config.version ?? DB_DEFAULTS.version;
+ this.pluginManager = new PluginManager();
+ }
+ // ---- 初始化 ----
+ /** 初始化数据库(创建引擎、打开连接) */
+ async init() {
+ // 创建引擎
+ this.engine = this.createEngine();
+ // 打开连接
+ await this.engine.open(this.name, this.version);
+ // 初始化执行器和事务管理器
+ this.executor = new QueryExecutor(this.engine);
+ this.transactionManager = new TransactionManager(this.engine);
+ // 注册插件
+ if (this.config.plugins) {
+ for (const plugin of this.config.plugins) {
+ this.pluginManager.register(plugin);
+ }
+ }
+ this.ready = true;
+ // 回调
+ if (this.config.onReady) {
+ this.config.onReady(this);
+ }
+ }
+ /** 检查是否就绪 */
+ isReady() {
+ return this.ready;
+ }
+ // ---- 表管理 ----
+ /** 创建表 */
+ async defineTable(name, columns) {
+ this.ensureReady();
+ const schema = createSchema(name, columns);
+ await this.pluginManager.trigger('beforeCreateTable', schema);
+ await this.engine.createTable(schema);
+ await this.pluginManager.trigger('afterCreateTable', schema);
+ // 清除缓存
+ this.tableCache.delete(name);
+ }
+ /** 获取表操作对象 */
+ table(name) {
+ this.ensureReady();
+ let t = this.tableCache.get(name);
+ if (!t) {
+ t = new Table(this.engine, name, this.executor);
+ this.tableCache.set(name, t);
+ }
+ return t;
+ }
+ /** 删除表 */
+ async dropTable(name) {
+ this.ensureReady();
+ await this.pluginManager.trigger('beforeDropTable', name);
+ await this.engine.dropTable(name);
+ await this.pluginManager.trigger('afterDropTable', name);
+ this.tableCache.delete(name);
+ }
+ /** 获取所有表名 */
+ async getTableNames() {
+ this.ensureReady();
+ return this.engine.getTableNames();
+ }
+ // ---- SQL 查询 ----
+ /** 执行 SQL 字符串查询 */
+ async query(sql) {
+ this.ensureReady();
+ await this.pluginManager.trigger('beforeQuery', sql);
+ const stmt = parse(sql);
+ const result = await this.executor.execute(stmt);
+ await this.pluginManager.trigger('afterQuery', sql, result);
+ return result;
+ }
+ // ---- 事务 ----
+ /** 执行事务 */
+ async transaction(fn) {
+ this.ensureReady();
+ await this.pluginManager.trigger('beforeTransaction');
+ const result = await this.transactionManager.execute(fn);
+ await this.pluginManager.trigger('afterTransaction');
+ return result;
+ }
+ // ---- 导入导出 ----
+ /** 导出表数据为 JSON */
+ async exportTable(tableName) {
+ this.ensureReady();
+ return this.engine.find(tableName, { table: tableName });
+ }
+ /** 导入 JSON 数据到表 */
+ async importTable(tableName, data) {
+ this.ensureReady();
+ return this.engine.insert(tableName, data);
+ }
+ /** 导出整个数据库为 JSON */
+ async exportAll() {
+ this.ensureReady();
+ const result = {};
+ const names = await this.engine.getTableNames();
+ for (const name of names) {
+ result[name] = await this.engine.find(name, { table: name });
+ }
+ return result;
+ }
+ /** 订阅表变更 */
+ subscribe(tableName, callback) {
+ const key = `change:${tableName}`;
+ if (!this.listeners.has(key))
+ this.listeners.set(key, new Set());
+ this.listeners.get(key).add(callback);
+ return () => this.listeners.get(key)?.delete(callback);
+ }
+ /** 触发变更事件 */
+ emit(tableName, event) {
+ const key = `change:${tableName}`;
+ this.listeners.get(key)?.forEach((cb) => cb(event));
+ }
+ /** 注册迁移 */
+ addMigration(version, up) {
+ this.migrations.set(version, up);
+ }
+ /** 执行迁移到指定版本 */
+ async migrateTo(targetVersion) {
+ this.ensureReady();
+ for (const [version, up] of [...this.migrations.entries()].sort((a, b) => a[0] - b[0])) {
+ if (version <= targetVersion && version > this.version) {
+ await up(this);
+ this._version = version;
+ }
+ }
+ }
+ // ---- 插件 ----
+ /** 获取插件管理器 */
+ getPluginManager() {
+ return this.pluginManager;
+ }
+ /** 注册钩子 */
+ on(hook, callback) {
+ this.pluginManager.on(hook, callback);
+ }
+ // ---- 生命周期 ----
+ /** 关闭数据库 */
+ async close() {
+ this.pluginManager.destroy();
+ await this.engine.close();
+ this.tableCache.clear();
+ this.ready = false;
+ }
+ /** 获取底层引擎 */
+ getEngine() {
+ return this.engine;
+ }
+ // ---- 内部 ----
+ createEngine() {
+ const mode = this.mode;
+ const diskEngine = this.config.diskEngine ?? 'indexeddb';
+ switch (mode) {
+ case 'memory':
+ return new MemoryEngine();
+ case 'disk':
+ return diskEngine === 'opfs' ? new OPFSEngine() : new IndexedDBEngine();
+ case 'hybrid':
+ return new HybridEngine(diskEngine);
+ default:
+ throw new DatabaseError(`Unknown storage mode: ${mode}`, 'CONFIG_ERROR');
+ }
+ }
+ ensureReady() {
+ if (!this.ready) {
+ throw new DatabaseError('Database not initialized. Call await db.init() first.', 'DB_NOT_READY');
+ }
+ }
+}
+
+/**
+ * metona-sqlark — 入口文件
+ * @module metona-sqlark
+ * @version 0.1.12
+ *
+ * 前端关系型数据库,内存与磁盘双模式。
+ * 支持 Query Builder 链式 API 和 SQL 字符串查询。
+ */
+// ---------------------------------------------------------------------------
+// 工厂函数
+// ---------------------------------------------------------------------------
+/**
+ * 创建数据库实例并初始化
+ *
+ * @example
+ * ```ts
+ * const db = await MetonaSqlark.create({
+ * name: 'my-app',
+ * mode: 'hybrid',
+ * });
+ *
+ * await db.defineTable('users', {
+ * id: { type: 'string', primaryKey: true },
+ * name: { type: 'string', required: true },
+ * });
+ *
+ * await db.table('users').insert({ id: '1', name: 'Alice' });
+ * const results = await db.query('SELECT * FROM users');
+ * ```
+ */
+async function create(config) {
+ const db = new MetonaSqlark(config);
+ await db.init();
+ return db;
+}
+// ---------------------------------------------------------------------------
+// 全局 API
+// ---------------------------------------------------------------------------
+const api = {
+ VERSION,
+ version: VERSION,
+ create,
+ MetonaSqlark,
+ MeSqlark: MetonaSqlark,
+};
+if (typeof window !== 'undefined') {
+ window.MetonaSqlark = api;
+ window.MeSqlark = api;
+}
+// 别名
+const MeSqlark = MetonaSqlark;
+
+export { HybridEngine, IndexedDBEngine, MeSqlark, MemoryEngine, MetonaSqlark, OPFSEngine, Table, VERSION, api, create, api as default, parse, tokenize };
+//# sourceMappingURL=metona-sqlark.esm.js.map
diff --git a/dist/metona-sqlark.esm.js.map b/dist/metona-sqlark.esm.js.map
new file mode 100644
index 0000000..735bdbd
--- /dev/null
+++ b/dist/metona-sqlark.esm.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"metona-sqlark.esm.js","sources":["../src/constants.ts","../src/query/where-matcher.ts","../src/engine/memory.ts","../src/engine/indexeddb.ts","../src/engine/opfs.ts","../src/hybrid/index.ts","../src/query/builder.ts","../src/table/table.ts","../src/table/schema.ts","../src/query/compiler.ts","../src/query/executor.ts","../src/sql/tokens.ts","../src/sql/lexer.ts","../src/sql/parser.ts","../src/transaction/index.ts","../src/plugin/index.ts","../src/core.ts","../src/index.ts"],"sourcesContent":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/dist/metona-sqlark.js b/dist/metona-sqlark.js
new file mode 100644
index 0000000..d425aa1
--- /dev/null
+++ b/dist/metona-sqlark.js
@@ -0,0 +1,2738 @@
+(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
+ typeof define === 'function' && define.amd ? define(['exports'], factory) :
+ (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.MetonaSqlark = {}));
+})(this, (function (exports) { 'use strict';
+
+ /**
+ * metona-sqlark Constants — 类型定义 / 默认配置 / 枚举
+ * @module constants
+ */
+ /** 所有存储模式 */
+ /** 所有字段类型 */
+ const FIELD_TYPES = ['string', 'number', 'boolean', 'date', 'json'];
+ /** 数据库默认配置 */
+ const DB_DEFAULTS = Object.freeze({
+ name: 'metona-sqlark',
+ mode: 'hybrid',
+ diskEngine: 'indexeddb',
+ version: 1,
+ });
+ // ---------------------------------------------------------------------------
+ // 错误类型
+ // ---------------------------------------------------------------------------
+ /** 数据库错误 */
+ class DatabaseError extends Error {
+ constructor(message, code, details) {
+ super(message);
+ this.code = code;
+ this.details = details;
+ this.name = 'DatabaseError';
+ }
+ }
+ // ---------------------------------------------------------------------------
+ // 版本
+ // ---------------------------------------------------------------------------
+ const VERSION = '0.1.12';
+
+ /**
+ * metona-sqlark Shared WHERE Matcher — 统一的条件匹配逻辑
+ * @module query/where-matcher
+ *
+ * MemoryEngine / IndexedDBEngine / QueryExecutor 共享此模块,
+ * 消除 220+ 行重复代码,统一 $and/$or/$not/$col 行为。
+ */
+ // ---------------------------------------------------------------------------
+ // LIKE 正则缓存
+ // ---------------------------------------------------------------------------
+ const likeCache = new Map();
+ function compileLikeRegex(pattern) {
+ const cached = likeCache.get(pattern);
+ if (cached)
+ return cached;
+ const escaped = pattern
+ .replace(/[.+^${}()|[\]\\]/g, '\\$&')
+ .replace(/%/g, '.*')
+ .replace(/_/g, '.');
+ const regex = new RegExp(`^${escaped}$`, 'i');
+ likeCache.set(pattern, regex);
+ return regex;
+ }
+ // ---------------------------------------------------------------------------
+ // WHERE 匹配(顶层入口)
+ // ---------------------------------------------------------------------------
+ /**
+ * 匹配完整 WHERE 条件
+ * @param row 当前数据行
+ * @param where WHERE 条件对象
+ * @param options.$col 是否启用 $col 列引用解析
+ */
+ function matchWhere(row, where, options = {}) {
+ for (const [field, condition] of Object.entries(where)) {
+ // 顶层 $and
+ if (field === '$and') {
+ const subs = condition;
+ if (!subs.every((sub) => matchWhere(row, sub, options)))
+ return false;
+ continue;
+ }
+ // 顶层 $or
+ if (field === '$or') {
+ const subs = condition;
+ if (!subs.some((sub) => matchWhere(row, sub, options)))
+ return false;
+ continue;
+ }
+ if (!matchField(row[field], condition, row, options))
+ return false;
+ }
+ return true;
+ }
+ // ---------------------------------------------------------------------------
+ // 字段匹配
+ // ---------------------------------------------------------------------------
+ function matchField(value, condition, row, options) {
+ // 嵌套 $and
+ if (typeof condition === 'object' && condition !== null && '$and' in condition) {
+ const subs = condition.$and;
+ return subs.every((sub) => matchWhere(row, sub, options));
+ }
+ // 嵌套 $or
+ if (typeof condition === 'object' && condition !== null && '$or' in condition) {
+ const subs = condition.$or;
+ return subs.some((sub) => matchWhere(row, sub, options));
+ }
+ // $not
+ if (typeof condition === 'object' && condition !== null && '$not' in condition) {
+ return !matchField(value, condition.$not, row, options);
+ }
+ // 简单值 => $eq
+ if (typeof condition !== 'object' || condition === null || Array.isArray(condition)) {
+ return value === condition;
+ }
+ const ops = condition;
+ // $col 简写: { $col: name } === { $eq: { $col: name } }(仅 JOIN ON 场景)
+ if (options.$col && '$col' in ops && Object.keys(ops).length === 1) {
+ return value === row[ops.$col];
+ }
+ // 遍历操作符
+ for (const [op, operand] of Object.entries(ops)) {
+ let actualOperand = operand;
+ // $col 列引用解析
+ if (options.$col && typeof operand === 'object' && operand !== null && '$col' in operand) {
+ actualOperand = row[operand.$col];
+ }
+ if (!matchOperator(value, op, actualOperand))
+ return false;
+ }
+ return true;
+ }
+ // ---------------------------------------------------------------------------
+ // 操作符匹配
+ // ---------------------------------------------------------------------------
+ function matchOperator(value, op, operand) {
+ switch (op) {
+ case '$eq': return value === operand;
+ case '$ne': return value !== operand;
+ case '$gt': return value > operand;
+ case '$gte': return value >= operand;
+ case '$lt': return value < operand;
+ case '$lte': return value <= operand;
+ case '$in': return Array.isArray(operand) && operand.includes(value);
+ case '$nin': return Array.isArray(operand) && !operand.includes(value);
+ case '$like': return compileLikeRegex(String(operand)).test(String(value));
+ default: return true;
+ }
+ }
+ // ---------------------------------------------------------------------------
+ // 排序
+ // ---------------------------------------------------------------------------
+ function applyOrderBy(rows, orderBy) {
+ return [...rows].sort((a, b) => {
+ for (const { column, direction } of orderBy) {
+ const cmp = compare(a[column], b[column]);
+ if (cmp !== 0)
+ return direction === 'desc' ? -cmp : cmp;
+ }
+ return 0;
+ });
+ }
+ function compare(a, b) {
+ if (a === b)
+ return 0;
+ if (a === null || a === undefined)
+ return 1;
+ if (b === null || b === undefined)
+ return -1;
+ if (typeof a === 'string' && typeof b === 'string')
+ return a.localeCompare(b);
+ if (typeof a === 'number' && typeof b === 'number')
+ return a - b;
+ return String(a).localeCompare(String(b));
+ }
+ // ---------------------------------------------------------------------------
+ // 列投影
+ // ---------------------------------------------------------------------------
+ function projectColumns(row, columns) {
+ const projected = {};
+ for (const col of columns) {
+ if (col in row) {
+ projected[col] = row[col];
+ }
+ else {
+ for (const key of Object.keys(row)) {
+ if (key.endsWith(`.${col}`) || key === col) {
+ projected[col] = row[key];
+ break;
+ }
+ }
+ }
+ }
+ return projected;
+ }
+
+ /**
+ * metona-sqlark Memory Engine — 基于 Map 的内存存储引擎
+ * @module engine/memory
+ */
+ class MemoryEngine {
+ constructor() {
+ this.name = 'memory';
+ this.tables = new Map();
+ this.schemas = new Map();
+ this.indexes = new Map();
+ this.opened = false;
+ }
+ // ---- 生命周期 ----
+ async open(_dbName, _version) { this.opened = true; }
+ async close() {
+ this.tables.clear();
+ this.schemas.clear();
+ this.indexes.clear();
+ this.opened = false;
+ }
+ isOpen() { return this.opened; }
+ // ---- 表管理 ----
+ async createTable(schema) {
+ if (this.schemas.has(schema.name))
+ throw new DatabaseError(`Table "${schema.name}" already exists`, 'TABLE_EXISTS');
+ this.schemas.set(schema.name, schema);
+ this.tables.set(schema.name, new Map());
+ const tableIndexes = new Map();
+ for (const [colName, colDef] of Object.entries(schema.columns)) {
+ if (colDef.index || colDef.unique)
+ tableIndexes.set(colName, new Map());
+ }
+ this.indexes.set(schema.name, tableIndexes);
+ }
+ async dropTable(tableName) {
+ this.ensureTable(tableName);
+ this.schemas.delete(tableName);
+ this.tables.delete(tableName);
+ this.indexes.delete(tableName);
+ }
+ async hasTable(tableName) { return this.schemas.has(tableName); }
+ async getTableNames() { return Array.from(this.schemas.keys()); }
+ async getTableSchema(tableName) { return this.schemas.get(tableName) ?? null; }
+ // ---- CRUD ----
+ async insert(tableName, rows) {
+ this.ensureTable(tableName);
+ const schema = this.schemas.get(tableName);
+ const table = this.tables.get(tableName);
+ const pkColumn = this.getPrimaryKey(schema);
+ const pks = [];
+ for (const row of rows) {
+ const validatedRow = this.validateRow(schema, row);
+ const pkValue = String(validatedRow[pkColumn]);
+ if (table.has(pkValue))
+ throw new DatabaseError(`Duplicate primary key "${pkValue}" in table "${tableName}"`, 'DUPLICATE_KEY');
+ this.checkUniqueness(schema, validatedRow);
+ table.set(pkValue, validatedRow);
+ this.updateIndexes(tableName, validatedRow, pkValue);
+ pks.push(pkValue);
+ }
+ return pks;
+ }
+ async find(tableName, query) {
+ this.ensureTable(tableName);
+ const table = this.tables.get(tableName);
+ let results = this.tryIndexLookup(tableName, table, query);
+ if (query.where && Object.keys(query.where).length > 0) {
+ results = results.filter((row) => matchWhere(row, query.where));
+ }
+ if (query.orderBy && query.orderBy.length > 0) {
+ results = applyOrderBy(results, query.orderBy);
+ }
+ const offset = query.offset ?? 0;
+ const limit = query.limit ?? results.length;
+ results = results.slice(offset, offset + limit);
+ if (query.columns && query.columns.length > 0 && query.columns[0] !== '*') {
+ results = results.map((row) => projectColumns(row, query.columns));
+ }
+ return results;
+ }
+ async update(tableName, query, updates) {
+ this.ensureTable(tableName);
+ const schema = this.schemas.get(tableName);
+ const table = this.tables.get(tableName);
+ let count = 0;
+ for (const [pk, row] of table) {
+ if (!query.where || Object.keys(query.where).length === 0 || matchWhere(row, query.where)) {
+ const updated = { ...row, ...updates };
+ this.validateRow(schema, updated);
+ table.set(pk, updated);
+ count++;
+ }
+ }
+ return count;
+ }
+ async delete(tableName, query) {
+ this.ensureTable(tableName);
+ const table = this.tables.get(tableName);
+ const toDelete = [];
+ for (const [pk, row] of table) {
+ if (!query.where || Object.keys(query.where).length === 0 || matchWhere(row, query.where)) {
+ toDelete.push(pk);
+ }
+ }
+ for (const pk of toDelete)
+ table.delete(pk);
+ return toDelete.length;
+ }
+ async count(tableName, query) {
+ this.ensureTable(tableName);
+ const table = this.tables.get(tableName);
+ if (!query?.where || Object.keys(query.where).length === 0)
+ return table.size;
+ let result = 0;
+ for (const row of table.values()) {
+ if (matchWhere(row, query.where))
+ result++;
+ }
+ return result;
+ }
+ async clear(tableName) {
+ this.ensureTable(tableName);
+ this.tables.get(tableName).clear();
+ const tableIndexes = this.indexes.get(tableName);
+ if (tableIndexes)
+ for (const colIndex of tableIndexes.values())
+ colIndex.clear();
+ }
+ // ---- 内部辅助 ----
+ ensureTable(tableName) {
+ if (!this.tables.has(tableName))
+ throw new DatabaseError(`Table "${tableName}" does not exist`, 'TABLE_NOT_FOUND');
+ }
+ getPrimaryKey(schema) {
+ for (const [name, col] of Object.entries(schema.columns)) {
+ if (col.primaryKey)
+ return name;
+ }
+ return Object.keys(schema.columns)[0];
+ }
+ validateRow(schema, row) {
+ const validated = {};
+ for (const [colName, colDef] of Object.entries(schema.columns)) {
+ let value = row[colName];
+ if (value === undefined && colDef.default !== undefined)
+ value = colDef.default;
+ if (colDef.required && (value === undefined || value === null)) {
+ throw new DatabaseError(`Column "${colName}" is required in table "${schema.name}"`, 'VALIDATION_ERROR');
+ }
+ if (value !== undefined && value !== null)
+ this.checkType(colName, colDef.type, value);
+ if (value !== undefined)
+ validated[colName] = value;
+ }
+ return validated;
+ }
+ checkType(colName, type, value) {
+ const jsType = typeof value;
+ switch (type) {
+ case 'string':
+ if (jsType !== 'string')
+ throw new DatabaseError(`Column "${colName}" expects string, got ${jsType}`, 'TYPE_ERROR');
+ break;
+ case 'number':
+ if (jsType !== 'number')
+ throw new DatabaseError(`Column "${colName}" expects number, got ${jsType}`, 'TYPE_ERROR');
+ break;
+ case 'boolean':
+ if (jsType !== 'boolean')
+ throw new DatabaseError(`Column "${colName}" expects boolean, got ${jsType}`, 'TYPE_ERROR');
+ break;
+ case 'date':
+ if (jsType !== 'string' || isNaN(Date.parse(value)))
+ throw new DatabaseError(`Column "${colName}" expects valid date`, 'TYPE_ERROR');
+ break;
+ case 'json':
+ if (jsType !== 'object')
+ throw new DatabaseError(`Column "${colName}" expects object/array, got ${jsType}`, 'TYPE_ERROR');
+ break;
+ }
+ }
+ /** O(1) 唯一性检查:利用哈希索引 */
+ checkUniqueness(schema, row) {
+ const tableIndexes = this.indexes.get(schema.name);
+ if (!tableIndexes)
+ return;
+ for (const [colName, colDef] of Object.entries(schema.columns)) {
+ if (!colDef.unique || row[colName] === undefined || row[colName] === null)
+ continue;
+ const colIndex = tableIndexes.get(colName);
+ if (colIndex && colIndex.has(row[colName])) {
+ throw new DatabaseError(`Unique constraint violation on column "${colName}" in table "${schema.name}"`, 'UNIQUE_VIOLATION');
+ }
+ }
+ }
+ /** 索引查找 */
+ tryIndexLookup(tableName, table, query) {
+ const tableIndexes = this.indexes.get(tableName);
+ if (!tableIndexes || !query.where)
+ return Array.from(table.values());
+ for (const [col, condition] of Object.entries(query.where)) {
+ if (typeof condition !== 'object' || condition === null) {
+ const colIndex = tableIndexes.get(col);
+ if (colIndex) {
+ const pks = colIndex.get(condition);
+ if (pks) {
+ const result = [];
+ for (const pk of pks) {
+ const r = table.get(pk);
+ if (r)
+ result.push(r);
+ }
+ return result;
+ }
+ return [];
+ }
+ }
+ }
+ return Array.from(table.values());
+ }
+ /** 更新索引 */
+ updateIndexes(tableName, row, pk) {
+ const tableIndexes = this.indexes.get(tableName);
+ if (!tableIndexes)
+ return;
+ for (const [colName, colIndex] of tableIndexes) {
+ const value = row[colName];
+ if (value !== undefined && value !== null) {
+ if (!colIndex.has(value))
+ colIndex.set(value, new Set());
+ colIndex.get(value).add(pk);
+ }
+ }
+ }
+ }
+
+ /**
+ * metona-sqlark IndexedDB Engine — 基于 IndexedDB 的持久化存储引擎
+ * @module engine/indexeddb
+ */
+ class IndexedDBEngine {
+ constructor() {
+ this.name = 'indexeddb';
+ this.db = null;
+ this.dbName = '';
+ this.version = 1;
+ this.memoryCache = new MemoryEngine();
+ }
+ async open(dbName, version) {
+ this.dbName = dbName;
+ this.version = version;
+ await this.memoryCache.open(dbName, version);
+ return new Promise((resolve, reject) => {
+ const request = indexedDB.open(dbName, version);
+ request.onsuccess = () => { this.db = request.result; resolve(); };
+ request.onerror = () => reject(new DatabaseError(`Failed to open IndexedDB "${dbName}"`, 'IDB_OPEN_ERROR', request.error));
+ request.onblocked = () => reject(new DatabaseError(`IndexedDB "${dbName}" is blocked`, 'IDB_BLOCKED'));
+ });
+ }
+ async close() {
+ if (this.db) {
+ this.db.close();
+ this.db = null;
+ }
+ await this.memoryCache.close();
+ }
+ isOpen() { return this.db !== null; }
+ // ---- 表管理 ----
+ async createTable(schema) {
+ await this.memoryCache.createTable(schema);
+ const db = this.ensureDB();
+ return new Promise((resolve, reject) => {
+ const newVersion = db.version + 1;
+ db.close();
+ const request = indexedDB.open(this.dbName, newVersion);
+ request.onupgradeneeded = (event) => {
+ const db = event.target.result;
+ const pkColumn = Object.entries(schema.columns).find(([, c]) => c.primaryKey)?.[0] ?? Object.keys(schema.columns)[0];
+ const store = db.createObjectStore(schema.name, { keyPath: pkColumn });
+ for (const [colName, colDef] of Object.entries(schema.columns)) {
+ if (colDef.index && colName !== pkColumn) {
+ store.createIndex(`idx_${colName}`, colName, { unique: colDef.unique ?? false });
+ }
+ }
+ };
+ request.onsuccess = () => { this.db = request.result; resolve(); };
+ request.onerror = () => reject(new DatabaseError(`Failed to create table "${schema.name}"`, 'IDB_UPGRADE_ERROR', request.error));
+ });
+ }
+ async dropTable(tableName) {
+ await this.memoryCache.dropTable(tableName);
+ const db = this.ensureDB();
+ return new Promise((resolve, reject) => {
+ const newVersion = db.version + 1;
+ db.close();
+ const request = indexedDB.open(this.dbName, newVersion);
+ request.onupgradeneeded = (event) => {
+ const db = event.target.result;
+ if (db.objectStoreNames.contains(tableName))
+ db.deleteObjectStore(tableName);
+ };
+ request.onsuccess = () => { this.db = request.result; resolve(); };
+ request.onerror = () => reject(new DatabaseError(`Failed to drop table "${tableName}"`, 'IDB_UPGRADE_ERROR', request.error));
+ });
+ }
+ async hasTable(tableName) { return this.ensureDB().objectStoreNames.contains(tableName); }
+ async getTableNames() { return Array.from(this.ensureDB().objectStoreNames); }
+ async getTableSchema(tableName) { return this.memoryCache.getTableSchema(tableName); }
+ // ---- CRUD ----
+ async insert(tableName, rows) {
+ await this.memoryCache.insert(tableName, rows);
+ const db = this.ensureDB();
+ return new Promise((resolve, reject) => {
+ const tx = db.transaction(tableName, 'readwrite');
+ const store = tx.objectStore(tableName);
+ const pks = [];
+ for (const row of rows) {
+ const req = store.add(row);
+ req.onsuccess = () => pks.push(String(req.result));
+ req.onerror = () => { }; // 内存层已校验,忽略 IDB 重复键
+ }
+ tx.oncomplete = () => resolve(pks);
+ tx.onerror = () => reject(new DatabaseError(`Insert failed for "${tableName}"`, 'IDB_TX_ERROR', tx.error));
+ });
+ }
+ async find(tableName, query) {
+ const db = this.ensureDB();
+ return new Promise((resolve, reject) => {
+ const tx = db.transaction(tableName, 'readonly');
+ const req = tx.objectStore(tableName).getAll();
+ req.onsuccess = () => {
+ let results = req.result ?? [];
+ if (query.where && Object.keys(query.where).length > 0) {
+ results = results.filter((row) => matchWhere(row, query.where));
+ }
+ if (query.orderBy && query.orderBy.length > 0) {
+ results = applyOrderBy(results, query.orderBy);
+ }
+ const offset = query.offset ?? 0;
+ const limit = query.limit ?? results.length;
+ results = results.slice(offset, offset + limit);
+ if (query.columns && query.columns.length > 0 && query.columns[0] !== '*') {
+ results = results.map((r) => projectColumns(r, query.columns));
+ }
+ resolve(results);
+ };
+ req.onerror = () => reject(new DatabaseError(`Find failed for "${tableName}"`, 'IDB_READ_ERROR', req.error));
+ });
+ }
+ async update(tableName, query, updates) {
+ await this.memoryCache.update(tableName, query, updates);
+ const db = this.ensureDB();
+ return new Promise((resolve, reject) => {
+ const tx = db.transaction(tableName, 'readwrite');
+ const store = tx.objectStore(tableName);
+ const getAllReq = store.getAll();
+ let count = 0;
+ getAllReq.onsuccess = () => {
+ for (const row of getAllReq.result ?? []) {
+ if (!query.where || Object.keys(query.where).length === 0 || matchWhere(row, query.where)) {
+ Object.assign(row, updates);
+ store.put(row);
+ count++;
+ }
+ }
+ };
+ tx.oncomplete = () => resolve(count);
+ tx.onerror = () => reject(new DatabaseError(`Update failed for "${tableName}"`, 'IDB_TX_ERROR', tx.error));
+ });
+ }
+ async delete(tableName, query) {
+ await this.memoryCache.delete(tableName, query);
+ const db = this.ensureDB();
+ const schema = await this.memoryCache.getTableSchema(tableName);
+ if (!schema)
+ throw new DatabaseError(`Table "${tableName}" not found`, 'TABLE_NOT_FOUND');
+ const pkColumn = Object.entries(schema.columns).find(([, c]) => c.primaryKey)?.[0] ?? Object.keys(schema.columns)[0];
+ return new Promise((resolve, reject) => {
+ const tx = db.transaction(tableName, 'readwrite');
+ const store = tx.objectStore(tableName);
+ const getAllReq = store.getAll();
+ let count = 0;
+ getAllReq.onsuccess = () => {
+ for (const row of getAllReq.result ?? []) {
+ if (!query.where || Object.keys(query.where).length === 0 || matchWhere(row, query.where)) {
+ store.delete(row[pkColumn]);
+ count++;
+ }
+ }
+ };
+ tx.oncomplete = () => resolve(count);
+ tx.onerror = () => reject(new DatabaseError(`Delete failed for "${tableName}"`, 'IDB_TX_ERROR', tx.error));
+ });
+ }
+ async count(tableName, query) {
+ const results = await this.find(tableName, { table: tableName, where: query?.where ?? {} });
+ return results.length;
+ }
+ async clear(tableName) {
+ await this.memoryCache.clear(tableName);
+ const db = this.ensureDB();
+ return new Promise((resolve, reject) => {
+ const tx = db.transaction(tableName, 'readwrite');
+ tx.objectStore(tableName).clear();
+ tx.oncomplete = () => resolve();
+ tx.onerror = () => reject(new DatabaseError(`Clear failed for "${tableName}"`, 'IDB_TX_ERROR', tx.error));
+ });
+ }
+ ensureDB() {
+ if (!this.db)
+ throw new DatabaseError('Database not opened', 'DB_NOT_OPEN');
+ return this.db;
+ }
+ }
+
+ /**
+ * metona-sqlark OPFS Engine — 基于 Origin Private File System 的持久化存储引擎
+ * @module engine/opfs
+ *
+ * 使用 JSON-per-table 文件存储方案。
+ * 目录结构:{dbName}/tables/{tableName}.json
+ */
+ // ---------------------------------------------------------------------------
+ // OPFSEngine
+ // ---------------------------------------------------------------------------
+ class OPFSEngine {
+ constructor() {
+ this.name = 'opfs';
+ this.root = null;
+ this.tablesDir = null;
+ this.dbName = '';
+ // 运行时内存缓存(OPFS 文件读写有延迟)
+ this.memoryCache = new MemoryEngine();
+ }
+ // ---- 生命周期 ----
+ async open(dbName, version) {
+ this.dbName = dbName;
+ await this.memoryCache.open(dbName, version);
+ // 获取 OPFS 根目录
+ this.root = await navigator.storage.getDirectory();
+ // 创建数据库目录
+ this.tablesDir = await this.root.getDirectoryHandle(dbName, { create: true });
+ }
+ async close() {
+ this.root = null;
+ this.tablesDir = null;
+ await this.memoryCache.close();
+ }
+ isOpen() {
+ return this.tablesDir !== null;
+ }
+ // ---- 表管理 ----
+ async createTable(schema) {
+ await this.memoryCache.createTable(schema);
+ // OPFS 中表以空 JSON 数组文件形式存在
+ await this.writeTableData(schema.name, []);
+ }
+ async dropTable(tableName) {
+ await this.memoryCache.dropTable(tableName);
+ if (this.tablesDir) {
+ try {
+ await this.tablesDir.removeEntry(`${tableName}.json`);
+ }
+ catch {
+ // 文件不存在则忽略
+ }
+ }
+ }
+ async hasTable(tableName) {
+ if (!this.tablesDir)
+ return false;
+ try {
+ await this.tablesDir.getFileHandle(`${tableName}.json`);
+ return true;
+ }
+ catch {
+ return false;
+ }
+ }
+ async getTableNames() {
+ if (!this.tablesDir)
+ return [];
+ const names = [];
+ for await (const [name] of this.tablesDir.entries()) {
+ if (name.endsWith('.json')) {
+ names.push(name.replace('.json', ''));
+ }
+ }
+ return names;
+ }
+ async getTableSchema(tableName) {
+ return this.memoryCache.getTableSchema(tableName);
+ }
+ // ---- CRUD ----
+ async insert(tableName, rows) {
+ const pks = await this.memoryCache.insert(tableName, rows);
+ // 持久化到 OPFS
+ const allRows = await this.memoryCache.find(tableName, { table: tableName });
+ await this.writeTableData(tableName, allRows);
+ return pks;
+ }
+ async find(tableName, query) {
+ return this.memoryCache.find(tableName, query);
+ }
+ async update(tableName, query, updates) {
+ const count = await this.memoryCache.update(tableName, query, updates);
+ const allRows = await this.memoryCache.find(tableName, { table: tableName });
+ await this.writeTableData(tableName, allRows);
+ return count;
+ }
+ async delete(tableName, query) {
+ const count = await this.memoryCache.delete(tableName, query);
+ const allRows = await this.memoryCache.find(tableName, { table: tableName });
+ await this.writeTableData(tableName, allRows);
+ return count;
+ }
+ async count(tableName, query) {
+ return this.memoryCache.count(tableName, query);
+ }
+ async clear(tableName) {
+ await this.memoryCache.clear(tableName);
+ await this.writeTableData(tableName, []);
+ }
+ // ---- 内部辅助 ----
+ ensureDir() {
+ if (!this.tablesDir) {
+ throw new DatabaseError('Database not opened', 'DB_NOT_OPEN');
+ }
+ return this.tablesDir;
+ }
+ async writeTableData(tableName, data) {
+ const dir = this.ensureDir();
+ const fileName = `${tableName}.json`;
+ const fileHandle = await dir.getFileHandle(fileName, { create: true });
+ const writable = await fileHandle.createWritable();
+ await writable.write(JSON.stringify(data));
+ await writable.close();
+ }
+ async readTableData(tableName) {
+ const dir = this.ensureDir();
+ const fileName = `${tableName}.json`;
+ try {
+ const fileHandle = await dir.getFileHandle(fileName);
+ const file = await fileHandle.getFile();
+ const text = await file.text();
+ return JSON.parse(text);
+ }
+ catch {
+ return [];
+ }
+ }
+ /** 从 OPFS 加载表数据到内存缓存 */
+ async loadTableIntoMemory(tableName, schema) {
+ await this.memoryCache.createTable(schema);
+ const rows = await this.readTableData(tableName);
+ if (rows.length > 0) {
+ // 直接用 Map 设置绕过 insert 校验
+ for (const row of rows) {
+ await this.memoryCache.insert(tableName, [row]);
+ }
+ }
+ }
+ }
+
+ /**
+ * metona-sqlark Hybrid Engine — 内存 + 磁盘混合存储引擎
+ * @module hybrid/index
+ *
+ * 采用 write-through 策略:
+ * - 所有写操作同时写入内存和磁盘
+ * - 所有读操作直接从内存返回
+ * - 数据库打开时从磁盘加载数据到内存
+ */
+ // ---------------------------------------------------------------------------
+ // HybridEngine
+ // ---------------------------------------------------------------------------
+ class HybridEngine {
+ constructor(diskEngine = 'indexeddb') {
+ this.name = 'hybrid';
+ this.memoryEngine = new MemoryEngine();
+ this.diskEngineType = diskEngine;
+ this.diskEngine = diskEngine === 'opfs' ? new OPFSEngine() : new IndexedDBEngine();
+ }
+ // ---- 生命周期 ----
+ async open(dbName, version) {
+ // 先打开磁盘引擎
+ await this.diskEngine.open(dbName, version);
+ // 再打开内存引擎
+ await this.memoryEngine.open(dbName, version);
+ // 从磁盘加载现存表
+ const tableNames = await this.diskEngine.getTableNames();
+ for (const tableName of tableNames) {
+ const schema = await this.diskEngine.getTableSchema(tableName);
+ if (!schema)
+ continue;
+ // 在内存中创建表
+ await this.memoryEngine.createTable(schema);
+ // 从磁盘加载数据到内存
+ const rows = await this.diskEngine.find(tableName, { table: tableName });
+ if (rows.length > 0) {
+ try {
+ await this.memoryEngine.insert(tableName, rows);
+ }
+ catch (e) {
+ // eslint-disable-next-line no-console
+ console.warn(`[metona-sqlark] Failed to load table "${tableName}" data from disk:`, e);
+ }
+ }
+ }
+ }
+ async close() {
+ await this.memoryEngine.close();
+ await this.diskEngine.close();
+ }
+ isOpen() {
+ return this.memoryEngine.isOpen() && this.diskEngine.isOpen();
+ }
+ // ---- 表管理 ----
+ async createTable(schema) {
+ await this.memoryEngine.createTable(schema);
+ await this.diskEngine.createTable(schema);
+ }
+ async dropTable(tableName) {
+ await this.memoryEngine.dropTable(tableName);
+ await this.diskEngine.dropTable(tableName);
+ }
+ async hasTable(tableName) {
+ return this.memoryEngine.hasTable(tableName);
+ }
+ async getTableNames() {
+ return this.memoryEngine.getTableNames();
+ }
+ async getTableSchema(tableName) {
+ return this.memoryEngine.getTableSchema(tableName);
+ }
+ // ---- CRUD(write-through 策略) ----
+ async insert(tableName, rows) {
+ const pks = await this.memoryEngine.insert(tableName, rows);
+ // write-through: 同步写入磁盘
+ await this.diskEngine.insert(tableName, rows);
+ return pks;
+ }
+ async find(tableName, query) {
+ // 直接从内存读取
+ return this.memoryEngine.find(tableName, query);
+ }
+ async update(tableName, query, updates) {
+ const count = await this.memoryEngine.update(tableName, query, updates);
+ // write-through: 同步更新磁盘
+ await this.diskEngine.update(tableName, query, updates);
+ return count;
+ }
+ async delete(tableName, query) {
+ const count = await this.memoryEngine.delete(tableName, query);
+ // write-through: 同步删除磁盘
+ await this.diskEngine.delete(tableName, query);
+ return count;
+ }
+ async count(tableName, query) {
+ return this.memoryEngine.count(tableName, query);
+ }
+ async clear(tableName) {
+ await this.memoryEngine.clear(tableName);
+ await this.diskEngine.clear(tableName);
+ }
+ // ---- 引擎信息 ----
+ /** 获取磁盘引擎类型 */
+ getDiskEngineType() {
+ return this.diskEngineType;
+ }
+ /** 获取内存引擎(供内部使用) */
+ getMemoryEngine() {
+ return this.memoryEngine;
+ }
+ }
+
+ /**
+ * metona-sqlark Query Builder — 链式查询构建器
+ * @module query/builder
+ *
+ * 链式调用 → 构建 AST → 执行引擎操作。
+ * 支持 JOIN(需要 Executor)。
+ */
+ // ---------------------------------------------------------------------------
+ // SelectQueryBuilder
+ // ---------------------------------------------------------------------------
+ class SelectQueryBuilder {
+ constructor(engine, tableName, _columns = ['*'], executor) {
+ this.engine = engine;
+ this.tableName = tableName;
+ this._columns = _columns;
+ this._where = {};
+ this._orderBy = [];
+ this._joins = [];
+ this._executor = executor;
+ }
+ /** 主表别名 */
+ as(alias) {
+ this._alias = alias;
+ return this;
+ }
+ /** INNER JOIN */
+ innerJoin(table, on, alias) {
+ return this._addJoin('INNER', table, on, alias);
+ }
+ /** LEFT JOIN */
+ leftJoin(table, on, alias) {
+ return this._addJoin('LEFT', table, on, alias);
+ }
+ /** RIGHT JOIN */
+ rightJoin(table, on, alias) {
+ return this._addJoin('RIGHT', table, on, alias);
+ }
+ /** CROSS JOIN */
+ crossJoin(table, alias) {
+ return this._addJoin('CROSS', table, {}, alias);
+ }
+ /** 通用 JOIN */
+ join(table, on, alias) {
+ return this._addJoin('INNER', table, on, alias);
+ }
+ _addJoin(type, table, on, alias) {
+ this._joins.push({ type, table, on, alias });
+ return this;
+ }
+ /** 添加过滤条件 */
+ where(condition) {
+ this._where = { ...this._where, ...condition };
+ return this;
+ }
+ /** 排序 */
+ orderBy(column, direction = 'asc') {
+ this._orderBy.push({ column, direction });
+ return this;
+ }
+ /** 限制返回条数 */
+ limit(n) {
+ this._limit = n;
+ return this;
+ }
+ /** 偏移量 */
+ offset(n) {
+ this._offset = n;
+ return this;
+ }
+ /** 执行查询 */
+ async execute() {
+ // 有 JOIN → 通过 Executor 执行
+ if (this._joins.length > 0 && this._executor) {
+ const ast = this.toAST();
+ return this._executor.execute(ast);
+ }
+ // 无 JOIN → 直接调用引擎
+ return this.engine.find(this.tableName, {
+ table: this.tableName,
+ columns: this._columns,
+ where: this._where,
+ orderBy: this._orderBy.length > 0 ? this._orderBy : undefined,
+ limit: this._limit,
+ offset: this._offset,
+ });
+ }
+ /** 获取 AST */
+ toAST() {
+ return {
+ type: 'SELECT',
+ columns: this._columns,
+ from: this.tableName,
+ alias: this._alias,
+ joins: this._joins.length > 0 ? [...this._joins] : undefined,
+ where: this._where,
+ orderBy: this._orderBy.length > 0 ? this._orderBy : undefined,
+ limit: this._limit,
+ offset: this._offset,
+ };
+ }
+ }
+ // ---------------------------------------------------------------------------
+ // UpdateQueryBuilder
+ // ---------------------------------------------------------------------------
+ class UpdateQueryBuilder {
+ constructor(engine, tableName, _updates) {
+ this.engine = engine;
+ this.tableName = tableName;
+ this._updates = _updates;
+ this._where = {};
+ }
+ where(condition) {
+ this._where = { ...this._where, ...condition };
+ return this;
+ }
+ async execute() {
+ return this.engine.update(this.tableName, { table: this.tableName, where: this._where }, this._updates);
+ }
+ toAST() {
+ return { type: 'UPDATE', table: this.tableName, sets: this._updates, where: this._where };
+ }
+ }
+ // ---------------------------------------------------------------------------
+ // DeleteQueryBuilder
+ // ---------------------------------------------------------------------------
+ class DeleteQueryBuilder {
+ constructor(engine, tableName) {
+ this.engine = engine;
+ this.tableName = tableName;
+ this._where = {};
+ }
+ where(condition) {
+ this._where = { ...this._where, ...condition };
+ return this;
+ }
+ async execute() {
+ return this.engine.delete(this.tableName, { table: this.tableName, where: this._where });
+ }
+ toAST() {
+ return { type: 'DELETE', from: this.tableName, where: this._where };
+ }
+ }
+
+ /**
+ * metona-sqlark Table — 表操作 API
+ * @module table/table
+ */
+ // ---------------------------------------------------------------------------
+ // Table
+ // ---------------------------------------------------------------------------
+ class Table {
+ constructor(engine, tableName, executor) {
+ this.schema = null;
+ this.engine = engine;
+ this.name = tableName;
+ this.executor = executor;
+ }
+ // ---- Schema ----
+ async getSchema() {
+ if (!this.schema) {
+ const s = await this.engine.getTableSchema(this.name);
+ if (!s)
+ throw new DatabaseError(`Table "${this.name}" does not exist`, 'TABLE_NOT_FOUND');
+ this.schema = s;
+ }
+ return this.schema;
+ }
+ // ---- 插入 ----
+ async insert(row) {
+ const pks = await this.engine.insert(this.name, [row]);
+ return pks[0];
+ }
+ async insertMany(rows) {
+ return this.engine.insert(this.name, rows);
+ }
+ // ---- 查询 ----
+ select(columns = ['*']) {
+ return new SelectQueryBuilder(this.engine, this.name, columns, this.executor);
+ }
+ // ---- 更新 ----
+ update(updates) {
+ return new UpdateQueryBuilder(this.engine, this.name, updates);
+ }
+ // ---- 删除 ----
+ delete() {
+ return new DeleteQueryBuilder(this.engine, this.name);
+ }
+ // ---- 聚合 ----
+ async count(where) {
+ return this.engine.count(this.name, where ? { table: this.name, where } : undefined);
+ }
+ // ---- 管理 ----
+ async clear() {
+ return this.engine.clear(this.name);
+ }
+ async drop() {
+ return this.engine.dropTable(this.name);
+ }
+ }
+
+ /**
+ * metona-sqlark Schema — 表结构定义与校验
+ * @module table/schema
+ */
+ // ---------------------------------------------------------------------------
+ // Schema 工具
+ // ---------------------------------------------------------------------------
+ /** 从列定义创建 TableSchema */
+ function createSchema(name, columns) {
+ validateColumns(columns);
+ return { name, columns };
+ }
+ /** 校验列定义 */
+ function validateColumns(columns) {
+ const colNames = Object.keys(columns);
+ if (colNames.length === 0) {
+ throw new DatabaseError('Table must have at least one column', 'SCHEMA_ERROR');
+ }
+ let primaryKeyCount = 0;
+ for (const [colName, colDef] of Object.entries(columns)) {
+ // 类型校验
+ if (!FIELD_TYPES.includes(colDef.type)) {
+ throw new DatabaseError(`Invalid type "${colDef.type}" for column "${colName}". Valid types: ${FIELD_TYPES.join(', ')}`, 'SCHEMA_ERROR');
+ }
+ // 主键计数
+ if (colDef.primaryKey) {
+ primaryKeyCount++;
+ }
+ }
+ // 至少需要一个主键
+ if (primaryKeyCount === 0) {
+ throw new DatabaseError('Table must have at least one primary key column', 'SCHEMA_ERROR');
+ }
+ }
+ /** 将 AST 列定义转换为 ColumnDef */
+ function astColumnToColumnDef(astCol) {
+ return {
+ type: astCol.type,
+ primaryKey: astCol.primaryKey,
+ unique: astCol.unique,
+ required: astCol.required,
+ default: astCol.default,
+ index: astCol.index,
+ maxLength: astCol.maxLength,
+ min: astCol.min,
+ max: astCol.max,
+ };
+ }
+
+ /**
+ * metona-sqlark Query Compiler — AST → 查询计划
+ * @module query/compiler
+ *
+ * 将 AST 语句编译为引擎可执行的 QueryPlan。
+ * v0.0.1: 简单直接映射,未来可加入索引选择、过滤下推等优化。
+ */
+ // ---------------------------------------------------------------------------
+ // 编译 AST → QueryPlan
+ // ---------------------------------------------------------------------------
+ /**
+ * 编译 SELECT / DELETE / UPDATE 语句为 QueryPlan。
+ * INSERT 和 DDL 语句不需要 QueryPlan。
+ */
+ function compileStatement(stmt) {
+ switch (stmt.type) {
+ case 'SELECT':
+ return compileSelect(stmt);
+ case 'DELETE':
+ return compileDelete(stmt);
+ case 'UPDATE':
+ return compileUpdate(stmt);
+ default:
+ throw new DatabaseError(`Cannot compile statement type "${stmt.type}" to QueryPlan`, 'COMPILE_ERROR');
+ }
+ }
+ function compileSelect(stmt) {
+ return {
+ table: stmt.from,
+ columns: stmt.columns,
+ where: stmt.where,
+ orderBy: stmt.orderBy?.length ? stmt.orderBy : undefined,
+ limit: stmt.limit,
+ offset: stmt.offset,
+ };
+ }
+ function compileDelete(stmt) {
+ return {
+ table: stmt.from,
+ where: stmt.where,
+ };
+ }
+ function compileUpdate(stmt) {
+ return {
+ table: stmt.table,
+ where: stmt.where,
+ };
+ }
+
+ /**
+ * metona-sqlark Query Executor — AST 执行器
+ * @module query/executor
+ *
+ * JOIN / GROUP BY / DISTINCT 逻辑在此层处理。
+ */
+ // ---------------------------------------------------------------------------
+ // Executor
+ // ---------------------------------------------------------------------------
+ class QueryExecutor {
+ constructor(engine) {
+ this.engine = engine;
+ }
+ async execute(stmt) {
+ switch (stmt.type) {
+ case 'SELECT': return this.executeSelect(stmt);
+ case 'INSERT': return this.executeInsert(stmt);
+ case 'UPDATE': return this.executeUpdate(stmt);
+ case 'DELETE': return this.executeDelete(stmt);
+ case 'CREATE_TABLE': return this.executeCreateTable(stmt);
+ case 'DROP_TABLE': return this.executeDropTable(stmt);
+ default: throw new DatabaseError('Unknown statement type', 'UNKNOWN_STATEMENT');
+ }
+ }
+ // ===================================================================
+ // SELECT
+ // ===================================================================
+ async executeSelect(stmt) {
+ const hasGroupBy = !!(stmt.groupBy && stmt.groupBy.length > 0);
+ let rows;
+ if (!stmt.joins || stmt.joins.length === 0) {
+ const plan = compileStatement(hasGroupBy ? { ...stmt, columns: ['*'] } : stmt);
+ rows = await this.engine.find(plan.table, plan);
+ }
+ else {
+ rows = await this.executeJoinSelect(stmt);
+ }
+ if (hasGroupBy)
+ rows = this.executeGroupBy(rows, stmt);
+ if (stmt.distinct)
+ rows = this.executeDistinct(rows);
+ if (stmt.having && Object.keys(stmt.having).length > 0) {
+ rows = rows.filter((row) => matchWhere(row, stmt.having));
+ }
+ if (stmt.orderBy && stmt.orderBy.length > 0)
+ rows = applyOrderBy(rows, stmt.orderBy);
+ const offset = stmt.offset ?? 0;
+ const limit = stmt.limit ?? rows.length;
+ rows = rows.slice(offset, offset + limit);
+ if (!hasGroupBy && stmt.columns.length > 0 && stmt.columns[0] !== '*') {
+ rows = rows.map((row) => projectColumns(row, stmt.columns));
+ }
+ return rows;
+ }
+ // ---- JOIN ----
+ async executeJoinSelect(stmt) {
+ const mainAlias = stmt.alias ?? stmt.from;
+ const mainRows = (await this.engine.find(stmt.from, { table: stmt.from }))
+ .map((row) => this.prefixRow(row, mainAlias));
+ let resultRows = mainRows;
+ for (const join of stmt.joins) {
+ const joinAlias = join.alias ?? join.table;
+ const joinRows = (await this.engine.find(join.table, { table: join.table }))
+ .map((row) => this.prefixRow(row, joinAlias));
+ resultRows = this.joinRows(resultRows, joinRows, join);
+ }
+ if (stmt.where && Object.keys(stmt.where).length > 0) {
+ resultRows = resultRows.filter((row) => matchWhere(row, stmt.where));
+ }
+ return resultRows;
+ }
+ prefixRow(row, alias) {
+ const prefixed = {};
+ for (const [key, value] of Object.entries(row))
+ prefixed[`${alias}.${key}`] = value;
+ return prefixed;
+ }
+ /** 嵌套循环连接(优化:避免 ON 时对象扩散) */
+ joinRows(leftRows, rightRows, join) {
+ if (join.type === 'CROSS') {
+ const result = [];
+ for (const l of leftRows)
+ for (const r of rightRows)
+ result.push({ ...l, ...r });
+ return result;
+ }
+ const result = [];
+ for (const l of leftRows) {
+ let matched = false;
+ for (const r of rightRows) {
+ // 合并后匹配 ON(避免创建临时对象再丢弃)
+ const merged = { ...l, ...r };
+ if (matchWhere(merged, join.on, { $col: true })) {
+ result.push(merged);
+ matched = true;
+ }
+ }
+ if (!matched && join.type === 'LEFT') {
+ const nullRight = {};
+ for (const key of Object.keys(rightRows[0] ?? {}))
+ nullRight[key] = null;
+ result.push({ ...l, ...nullRight });
+ }
+ }
+ if (join.type === 'RIGHT') {
+ for (const r of rightRows) {
+ const isMatched = leftRows.some((l) => {
+ const merged = { ...l, ...r };
+ return matchWhere(merged, join.on, { $col: true });
+ });
+ if (!isMatched) {
+ const nullLeft = {};
+ for (const key of Object.keys(leftRows[0] ?? {}))
+ nullLeft[key] = null;
+ result.push({ ...nullLeft, ...r });
+ }
+ }
+ }
+ return result;
+ }
+ // ---- GROUP BY ----
+ executeGroupBy(rows, stmt) {
+ const groups = new Map();
+ for (const row of rows) {
+ const key = stmt.groupBy.map((col) => String(row[col] ?? 'null')).join('|');
+ if (!groups.has(key))
+ groups.set(key, []);
+ groups.get(key).push(row);
+ }
+ const result = [];
+ for (const groupRows of groups.values()) {
+ const aggregated = {};
+ for (const col of stmt.groupBy)
+ aggregated[col] = groupRows[0][col];
+ for (const colExpr of stmt.columns) {
+ if (colExpr === '*')
+ continue;
+ const m = colExpr.match(/^(COUNT|SUM|AVG|MIN|MAX)\((.+?)\)(?:\s+AS\s+(\w+))?$/i);
+ if (m) {
+ const [, func, arg, alias] = m;
+ aggregated[alias || colExpr] = this.computeAggregate(func.toUpperCase(), groupRows, arg.trim());
+ }
+ else if (!stmt.groupBy.includes(colExpr)) {
+ aggregated[colExpr] = groupRows[0][colExpr];
+ }
+ }
+ result.push(aggregated);
+ }
+ return result;
+ }
+ computeAggregate(func, rows, col) {
+ const nums = rows.map((r) => r[col]).filter((v) => v !== null && v !== undefined).map(Number);
+ switch (func) {
+ case 'COUNT': return col === '*' ? rows.length : nums.length;
+ case 'SUM': return nums.reduce((a, b) => a + b, 0);
+ case 'AVG': return nums.length === 0 ? 0 : nums.reduce((a, b) => a + b, 0) / nums.length;
+ case 'MIN': return nums.length === 0 ? 0 : Math.min(...nums);
+ case 'MAX': return nums.length === 0 ? 0 : Math.max(...nums);
+ default: return 0;
+ }
+ }
+ // ---- DISTINCT(优化:列值拼接代替 JSON.stringify) ----
+ executeDistinct(rows) {
+ const seen = new Set();
+ return rows.filter((row) => {
+ const key = Object.values(row).map((v) => String(v ?? '\0')).join('\x1f');
+ if (seen.has(key))
+ return false;
+ seen.add(key);
+ return true;
+ });
+ }
+ // ===================================================================
+ // 其他语句
+ // ===================================================================
+ async executeInsert(stmt) {
+ const schema = await this.engine.getTableSchema(stmt.into);
+ if (!schema)
+ throw new DatabaseError(`Table "${stmt.into}" does not exist`, 'TABLE_NOT_FOUND');
+ const colNames = stmt.columns ?? Object.keys(schema.columns);
+ const rows = stmt.values.map((vals) => {
+ const row = {};
+ for (let i = 0; i < colNames.length; i++) {
+ if (i < vals.length)
+ row[colNames[i]] = vals[i];
+ }
+ return row;
+ });
+ return this.engine.insert(stmt.into, rows);
+ }
+ async executeUpdate(stmt) {
+ const plan = compileStatement(stmt);
+ return this.engine.update(plan.table, plan, stmt.sets);
+ }
+ async executeDelete(stmt) {
+ const plan = compileStatement(stmt);
+ return this.engine.delete(plan.table, plan);
+ }
+ async executeCreateTable(stmt) {
+ const columns = {};
+ for (const col of stmt.columns)
+ columns[col.name] = astColumnToColumnDef(col);
+ return this.engine.createTable(createSchema(stmt.name, columns));
+ }
+ async executeDropTable(stmt) {
+ return this.engine.dropTable(stmt.name);
+ }
+ getEngine() { return this.engine; }
+ }
+
+ /**
+ * metona-sqlark SQL Token Types — 词法单元定义
+ * @module sql/tokens
+ */
+ // ---------------------------------------------------------------------------
+ // Token 类型枚举
+ // ---------------------------------------------------------------------------
+ var TokenType;
+ (function (TokenType) {
+ // 关键字
+ TokenType["SELECT"] = "SELECT";
+ TokenType["FROM"] = "FROM";
+ TokenType["WHERE"] = "WHERE";
+ TokenType["INSERT"] = "INSERT";
+ TokenType["INTO"] = "INTO";
+ TokenType["VALUES"] = "VALUES";
+ TokenType["UPDATE"] = "UPDATE";
+ TokenType["SET"] = "SET";
+ TokenType["DELETE"] = "DELETE";
+ TokenType["CREATE"] = "CREATE";
+ TokenType["TABLE"] = "TABLE";
+ TokenType["DROP"] = "DROP";
+ TokenType["ORDER"] = "ORDER";
+ TokenType["BY"] = "BY";
+ TokenType["ASC"] = "ASC";
+ TokenType["DESC"] = "DESC";
+ TokenType["LIMIT"] = "LIMIT";
+ TokenType["OFFSET"] = "OFFSET";
+ TokenType["AND"] = "AND";
+ TokenType["OR"] = "OR";
+ TokenType["NOT"] = "NOT";
+ TokenType["LIKE"] = "LIKE";
+ TokenType["IN"] = "IN";
+ TokenType["PRIMARY"] = "PRIMARY";
+ TokenType["KEY"] = "KEY";
+ TokenType["UNIQUE"] = "UNIQUE";
+ TokenType["DEFAULT"] = "DEFAULT";
+ TokenType["NULL"] = "NULL";
+ TokenType["TRUE"] = "TRUE";
+ TokenType["FALSE"] = "FALSE";
+ // JOIN 相关
+ TokenType["INNER"] = "INNER";
+ TokenType["LEFT"] = "LEFT";
+ TokenType["RIGHT"] = "RIGHT";
+ TokenType["CROSS"] = "CROSS";
+ TokenType["JOIN"] = "JOIN";
+ TokenType["ON"] = "ON";
+ TokenType["AS"] = "AS";
+ TokenType["OUTER"] = "OUTER";
+ // 聚合
+ TokenType["GROUP"] = "GROUP";
+ TokenType["HAVING"] = "HAVING";
+ TokenType["COUNT"] = "COUNT";
+ TokenType["SUM"] = "SUM";
+ TokenType["AVG"] = "AVG";
+ TokenType["MIN"] = "MIN";
+ TokenType["MAX"] = "MAX";
+ TokenType["DISTINCT"] = "DISTINCT";
+ // 标识符 & 字面量
+ TokenType["IDENTIFIER"] = "IDENTIFIER";
+ TokenType["STRING"] = "STRING";
+ TokenType["NUMBER"] = "NUMBER";
+ // 运算符 & 分隔符
+ TokenType["COMMA"] = "COMMA";
+ TokenType["LPAREN"] = "LPAREN";
+ TokenType["RPAREN"] = "RPAREN";
+ TokenType["SEMICOLON"] = "SEMICOLON";
+ TokenType["EQ"] = "EQ";
+ TokenType["NEQ"] = "NEQ";
+ TokenType["GT"] = "GT";
+ TokenType["GTE"] = "GTE";
+ TokenType["LT"] = "LT";
+ TokenType["LTE"] = "LTE";
+ TokenType["STAR"] = "STAR";
+ TokenType["DOT"] = "DOT";
+ // 特殊
+ TokenType["EOF"] = "EOF";
+ TokenType["ILLEGAL"] = "ILLEGAL";
+ })(TokenType || (TokenType = {}));
+ // ---------------------------------------------------------------------------
+ // 关键字映射
+ // ---------------------------------------------------------------------------
+ const KEYWORDS = {
+ 'SELECT': TokenType.SELECT,
+ 'FROM': TokenType.FROM,
+ 'WHERE': TokenType.WHERE,
+ 'INSERT': TokenType.INSERT,
+ 'INTO': TokenType.INTO,
+ 'VALUES': TokenType.VALUES,
+ 'UPDATE': TokenType.UPDATE,
+ 'SET': TokenType.SET,
+ 'DELETE': TokenType.DELETE,
+ 'CREATE': TokenType.CREATE,
+ 'TABLE': TokenType.TABLE,
+ 'DROP': TokenType.DROP,
+ 'ORDER': TokenType.ORDER,
+ 'BY': TokenType.BY,
+ 'ASC': TokenType.ASC,
+ 'DESC': TokenType.DESC,
+ 'LIMIT': TokenType.LIMIT,
+ 'OFFSET': TokenType.OFFSET,
+ 'AND': TokenType.AND,
+ 'OR': TokenType.OR,
+ 'NOT': TokenType.NOT,
+ 'LIKE': TokenType.LIKE,
+ 'IN': TokenType.IN,
+ 'PRIMARY': TokenType.PRIMARY,
+ 'KEY': TokenType.KEY,
+ 'UNIQUE': TokenType.UNIQUE,
+ 'DEFAULT': TokenType.DEFAULT,
+ 'NULL': TokenType.NULL,
+ 'TRUE': TokenType.TRUE,
+ 'FALSE': TokenType.FALSE,
+ // JOIN
+ 'INNER': TokenType.INNER,
+ 'LEFT': TokenType.LEFT,
+ 'RIGHT': TokenType.RIGHT,
+ 'CROSS': TokenType.CROSS,
+ 'JOIN': TokenType.JOIN,
+ 'ON': TokenType.ON,
+ 'AS': TokenType.AS,
+ 'OUTER': TokenType.OUTER,
+ // 聚合
+ 'GROUP': TokenType.GROUP,
+ 'HAVING': TokenType.HAVING,
+ 'COUNT': TokenType.COUNT,
+ 'SUM': TokenType.SUM,
+ 'AVG': TokenType.AVG,
+ 'MIN': TokenType.MIN,
+ 'MAX': TokenType.MAX,
+ 'DISTINCT': TokenType.DISTINCT,
+ };
+
+ /**
+ * metona-sqlark SQL Lexer — 词法分析器
+ * @module sql/lexer
+ *
+ * 将 SQL 字符串切分为 Token 流。
+ */
+ // ---------------------------------------------------------------------------
+ // Lexer
+ // ---------------------------------------------------------------------------
+ class Lexer {
+ constructor(input) {
+ this.position = 0;
+ this.readPosition = 0;
+ this.ch = '';
+ this.input = input;
+ this.readChar();
+ }
+ /** 读取下一个 Token */
+ nextToken() {
+ this.skipWhitespace();
+ let tok;
+ switch (this.ch) {
+ case ',':
+ tok = this.makeToken(TokenType.COMMA, ',');
+ break;
+ case '(':
+ tok = this.makeToken(TokenType.LPAREN, '(');
+ break;
+ case ')':
+ tok = this.makeToken(TokenType.RPAREN, ')');
+ break;
+ case ';':
+ tok = this.makeToken(TokenType.SEMICOLON, ';');
+ break;
+ case '*':
+ tok = this.makeToken(TokenType.STAR, '*');
+ break;
+ case '.':
+ tok = this.makeToken(TokenType.DOT, '.');
+ break;
+ case '=':
+ tok = this.makeToken(TokenType.EQ, '=');
+ break;
+ case '!':
+ if (this.peekChar() === '=') {
+ this.readChar();
+ tok = this.makeToken(TokenType.NEQ, '!=');
+ }
+ else {
+ tok = this.makeToken(TokenType.ILLEGAL, '!');
+ }
+ break;
+ case '>':
+ if (this.peekChar() === '=') {
+ this.readChar();
+ tok = this.makeToken(TokenType.GTE, '>=');
+ }
+ else {
+ tok = this.makeToken(TokenType.GT, '>');
+ }
+ break;
+ case '<':
+ if (this.peekChar() === '=') {
+ this.readChar();
+ tok = this.makeToken(TokenType.LTE, '<=');
+ }
+ else if (this.peekChar() === '>') {
+ this.readChar();
+ tok = this.makeToken(TokenType.NEQ, '<>');
+ }
+ else {
+ tok = this.makeToken(TokenType.LT, '<');
+ }
+ break;
+ case "'":
+ case '"':
+ tok = this.readString(this.ch);
+ break;
+ case '':
+ tok = { type: TokenType.EOF, value: '', position: this.position };
+ break;
+ default:
+ if (this.isLetter(this.ch)) {
+ const ident = this.readIdentifier();
+ const keyword = KEYWORDS[ident.toUpperCase()];
+ tok = {
+ type: keyword ?? TokenType.IDENTIFIER,
+ value: ident,
+ position: this.position - ident.length,
+ };
+ return tok; // 已读取完毕,不需要再 readChar
+ }
+ else if (this.isDigit(this.ch) || (this.ch === '-' && this.isDigit(this.peekChar()))) {
+ const num = this.readNumber();
+ tok = {
+ type: TokenType.NUMBER,
+ value: num,
+ position: this.position - num.length,
+ };
+ return tok;
+ }
+ else {
+ tok = this.makeToken(TokenType.ILLEGAL, this.ch);
+ }
+ break;
+ }
+ this.readChar();
+ return tok;
+ }
+ // ---- 内部 ----
+ readChar() {
+ if (this.readPosition >= this.input.length) {
+ this.ch = '';
+ }
+ else {
+ this.ch = this.input[this.readPosition];
+ }
+ this.position = this.readPosition;
+ this.readPosition++;
+ }
+ peekChar() {
+ if (this.readPosition >= this.input.length)
+ return '';
+ return this.input[this.readPosition];
+ }
+ skipWhitespace() {
+ while (this.ch === ' ' || this.ch === '\t' || this.ch === '\n' || this.ch === '\r') {
+ this.readChar();
+ }
+ }
+ readIdentifier() {
+ const start = this.position;
+ while (this.isLetter(this.ch) || this.isDigit(this.ch) || this.ch === '_') {
+ this.readChar();
+ }
+ return this.input.slice(start, this.position);
+ }
+ readNumber() {
+ const start = this.position;
+ // 负号
+ if (this.ch === '-')
+ this.readChar();
+ while (this.isDigit(this.ch)) {
+ this.readChar();
+ }
+ // 小数点
+ if (this.ch === '.' && this.isDigit(this.peekChar())) {
+ this.readChar();
+ while (this.isDigit(this.ch)) {
+ this.readChar();
+ }
+ }
+ return this.input.slice(start, this.position);
+ }
+ readString(quote) {
+ const start = this.position + 1; // 跳过一个引号
+ this.readChar(); // 跳过开始引号
+ let value = '';
+ while (this.ch !== quote && this.ch !== '') {
+ // 处理转义
+ if (this.ch === '\\' && this.peekChar() === quote) {
+ this.readChar();
+ value += quote;
+ }
+ else {
+ value += this.ch;
+ }
+ this.readChar();
+ }
+ // 跳过结束引号(在 readChar 之后才会调用,所以这里不需要处理)
+ return {
+ type: TokenType.STRING,
+ value,
+ position: start,
+ };
+ }
+ isLetter(ch) {
+ return /[a-zA-Z_]/.test(ch);
+ }
+ isDigit(ch) {
+ return /[0-9]/.test(ch);
+ }
+ makeToken(type, value) {
+ return { type, value, position: this.position };
+ }
+ }
+ // ---------------------------------------------------------------------------
+ // 便捷方法:一次性词法分析
+ // ---------------------------------------------------------------------------
+ /** 将 SQL 字符串解析为 Token 列表 */
+ function tokenize(sql) {
+ const lexer = new Lexer(sql);
+ const tokens = [];
+ let tok = lexer.nextToken();
+ while (tok.type !== TokenType.EOF) {
+ tokens.push(tok);
+ tok = lexer.nextToken();
+ }
+ tokens.push(tok); // EOF
+ return tokens;
+ }
+
+ /**
+ * metona-sqlark SQL Parser — 递归下降语法分析器
+ * @module sql/parser
+ *
+ * Token 流 → AST Statement。
+ * 支持的语法是标准 SQL 的子集。
+ */
+ // ---------------------------------------------------------------------------
+ // Parser
+ // ---------------------------------------------------------------------------
+ class Parser {
+ constructor(sql) {
+ this.lexer = new Lexer(sql);
+ // 预读两个 token
+ this.nextToken();
+ this.nextToken();
+ }
+ /** 解析完整 SQL 语句 */
+ parseStatement() {
+ switch (this.curToken.type) {
+ case TokenType.SELECT:
+ return this.parseSelect();
+ case TokenType.INSERT:
+ return this.parseInsert();
+ case TokenType.UPDATE:
+ return this.parseUpdate();
+ case TokenType.DELETE:
+ return this.parseDelete();
+ case TokenType.CREATE:
+ return this.parseCreateTable();
+ case TokenType.DROP:
+ return this.parseDropTable();
+ default:
+ throw this.error(`Unexpected token "${this.curToken.value}"`);
+ }
+ }
+ // ===================================================================
+ // SELECT
+ // ===================================================================
+ parseSelect() {
+ this.expect(TokenType.SELECT);
+ // DISTINCT(可选)
+ let distinct = false;
+ if (this.curTokenIs(TokenType.DISTINCT)) {
+ distinct = true;
+ this.nextToken();
+ }
+ // 列
+ const columns = [];
+ if (this.curTokenIs(TokenType.STAR)) {
+ columns.push('*');
+ this.nextToken();
+ }
+ else {
+ columns.push(...this.parseColumnList());
+ }
+ // FROM
+ this.expect(TokenType.FROM);
+ const tableName = this.expectIdentifier('table name');
+ // 表别名(可选)
+ let alias;
+ if (this.curTokenIs(TokenType.AS)) {
+ this.nextToken();
+ alias = this.expectIdentifier('alias');
+ }
+ else if (this.curToken.type === TokenType.IDENTIFIER && !this._isReservedAfterFrom()) {
+ alias = this.curToken.value;
+ this.nextToken();
+ }
+ const stmt = {
+ type: 'SELECT',
+ columns,
+ distinct: distinct || undefined,
+ from: tableName,
+ alias,
+ where: {},
+ };
+ // JOIN 子句(可选,支持多个)
+ const joins = this.parseJoinClauses();
+ if (joins.length > 0) {
+ stmt.joins = joins;
+ }
+ // WHERE(可选)
+ if (this.curTokenIs(TokenType.WHERE)) {
+ this.nextToken();
+ stmt.where = this.parseCondition();
+ }
+ // GROUP BY(可选)
+ if (this.curTokenIs(TokenType.GROUP)) {
+ this.nextToken();
+ this.expect(TokenType.BY);
+ stmt.groupBy = this.parseIdentifierList();
+ }
+ // HAVING(可选)
+ if (this.curTokenIs(TokenType.HAVING)) {
+ this.nextToken();
+ stmt.having = this.parseCondition();
+ }
+ // ORDER BY(可选)
+ if (this.curTokenIs(TokenType.ORDER)) {
+ this.nextToken();
+ this.expect(TokenType.BY);
+ stmt.orderBy = this.parseOrderByList();
+ }
+ // LIMIT(可选)
+ if (this.curTokenIs(TokenType.LIMIT)) {
+ this.nextToken();
+ stmt.limit = this.expectNumber('LIMIT value');
+ }
+ // OFFSET(可选)
+ if (this.curTokenIs(TokenType.OFFSET)) {
+ this.nextToken();
+ stmt.offset = this.expectNumber('OFFSET value');
+ }
+ return stmt;
+ }
+ /** 解析 JOIN 子句列表 */
+ parseJoinClauses() {
+ const joins = [];
+ while (this._isJoinKeyword()) {
+ joins.push(this.parseJoinClause());
+ }
+ return joins;
+ }
+ _isJoinKeyword() {
+ return (this.curTokenIs(TokenType.INNER) ||
+ this.curTokenIs(TokenType.LEFT) ||
+ this.curTokenIs(TokenType.RIGHT) ||
+ this.curTokenIs(TokenType.CROSS) ||
+ this.curTokenIs(TokenType.JOIN));
+ }
+ /** 解析单个 JOIN 子句 */
+ parseJoinClause() {
+ let type = 'INNER';
+ if (this.curTokenIs(TokenType.INNER)) {
+ type = 'INNER';
+ this.nextToken();
+ }
+ else if (this.curTokenIs(TokenType.LEFT)) {
+ type = 'LEFT';
+ this.nextToken();
+ if (this.curTokenIs(TokenType.OUTER))
+ this.nextToken(); // 可选 OUTER
+ }
+ else if (this.curTokenIs(TokenType.RIGHT)) {
+ type = 'RIGHT';
+ this.nextToken();
+ if (this.curTokenIs(TokenType.OUTER))
+ this.nextToken();
+ }
+ else if (this.curTokenIs(TokenType.CROSS)) {
+ type = 'CROSS';
+ this.nextToken();
+ }
+ this.expect(TokenType.JOIN);
+ const tableName = this.expectIdentifier('table name');
+ // JOIN 表别名(可选)
+ let alias;
+ if (this.curTokenIs(TokenType.AS)) {
+ this.nextToken();
+ alias = this.expectIdentifier('alias');
+ }
+ else if (this.curToken.type === TokenType.IDENTIFIER && !this._isJoinReserved()) {
+ alias = this.curToken.value;
+ this.nextToken();
+ }
+ // ON 条件(CROSS JOIN 不需要 ON)
+ let on = {};
+ if (type !== 'CROSS' && this.curTokenIs(TokenType.ON)) {
+ this.nextToken();
+ on = this.parseCondition();
+ }
+ return { type, table: tableName, alias, on };
+ }
+ /** 判断当前 token 是否为 FROM 之后的保留字 */
+ _isReservedAfterFrom() {
+ return (this.curTokenIs(TokenType.WHERE) ||
+ this.curTokenIs(TokenType.ORDER) ||
+ this.curTokenIs(TokenType.LIMIT) ||
+ this.curTokenIs(TokenType.OFFSET) ||
+ this.curTokenIs(TokenType.GROUP) ||
+ this._isJoinKeyword());
+ }
+ _isJoinReserved() {
+ return (this.curTokenIs(TokenType.ON) ||
+ this.curTokenIs(TokenType.WHERE) ||
+ this.curTokenIs(TokenType.ORDER) ||
+ this.curTokenIs(TokenType.LIMIT) ||
+ this._isJoinKeyword());
+ }
+ // ===================================================================
+ // INSERT
+ // ===================================================================
+ parseInsert() {
+ this.expect(TokenType.INSERT);
+ this.expect(TokenType.INTO);
+ const tableName = this.expectIdentifier('table name');
+ // 列名(可选)
+ let columns;
+ if (this.curTokenIs(TokenType.LPAREN)) {
+ this.nextToken();
+ columns = this.parseIdentifierList();
+ this.expect(TokenType.RPAREN);
+ }
+ // VALUES
+ this.expect(TokenType.VALUES);
+ // 值列表
+ const values = [];
+ do {
+ if (this.curTokenIs(TokenType.COMMA)) {
+ this.nextToken();
+ }
+ this.expect(TokenType.LPAREN);
+ const rowValues = this.parseValueList();
+ this.expect(TokenType.RPAREN);
+ values.push(rowValues);
+ } while (this.curTokenIs(TokenType.COMMA));
+ return {
+ type: 'INSERT',
+ into: tableName,
+ columns,
+ values,
+ };
+ }
+ // ===================================================================
+ // UPDATE
+ // ===================================================================
+ parseUpdate() {
+ this.expect(TokenType.UPDATE);
+ const tableName = this.expectIdentifier('table name');
+ this.expect(TokenType.SET);
+ // SET col=val, ...
+ const sets = {};
+ do {
+ if (this.curTokenIs(TokenType.COMMA))
+ this.nextToken();
+ const col = this.expectIdentifier('column name');
+ this.expect(TokenType.EQ);
+ sets[col] = this.parseValue();
+ } while (this.curTokenIs(TokenType.COMMA));
+ let where = {};
+ if (this.curTokenIs(TokenType.WHERE)) {
+ this.nextToken();
+ where = this.parseCondition();
+ }
+ return { type: 'UPDATE', table: tableName, sets, where };
+ }
+ // ===================================================================
+ // DELETE
+ // ===================================================================
+ parseDelete() {
+ this.expect(TokenType.DELETE);
+ this.expect(TokenType.FROM);
+ const tableName = this.expectIdentifier('table name');
+ let where = {};
+ if (this.curTokenIs(TokenType.WHERE)) {
+ this.nextToken();
+ where = this.parseCondition();
+ }
+ return { type: 'DELETE', from: tableName, where };
+ }
+ // ===================================================================
+ // CREATE TABLE
+ // ===================================================================
+ parseCreateTable() {
+ this.expect(TokenType.CREATE);
+ this.expect(TokenType.TABLE);
+ const tableName = this.expectIdentifier('table name');
+ this.expect(TokenType.LPAREN);
+ const columns = [];
+ do {
+ if (this.curTokenIs(TokenType.COMMA))
+ this.nextToken();
+ columns.push(this.parseColumnDef());
+ } while (this.curTokenIs(TokenType.COMMA));
+ this.expect(TokenType.RPAREN);
+ return { type: 'CREATE_TABLE', name: tableName, columns };
+ }
+ parseColumnDef() {
+ const name = this.expectIdentifier('column name');
+ const type = this.expectIdentifier('column type').toLowerCase();
+ const col = { name, type };
+ // 修饰符
+ while (this.curTokenIs(TokenType.PRIMARY) ||
+ this.curTokenIs(TokenType.UNIQUE) ||
+ this.curTokenIs(TokenType.NOT) ||
+ this.curTokenIs(TokenType.DEFAULT)) {
+ if (this.curTokenIs(TokenType.PRIMARY)) {
+ this.nextToken();
+ this.expect(TokenType.KEY);
+ col.primaryKey = true;
+ }
+ else if (this.curTokenIs(TokenType.UNIQUE)) {
+ this.nextToken();
+ col.unique = true;
+ }
+ else if (this.curTokenIs(TokenType.NOT)) {
+ this.nextToken();
+ // 支持 NOT NULL → required
+ this.expect(TokenType.NULL);
+ col.required = true;
+ }
+ else if (this.curTokenIs(TokenType.DEFAULT)) {
+ this.nextToken();
+ col.default = this.parseValue();
+ }
+ else {
+ break;
+ }
+ }
+ return col;
+ }
+ // ===================================================================
+ // DROP TABLE
+ // ===================================================================
+ parseDropTable() {
+ this.expect(TokenType.DROP);
+ this.expect(TokenType.TABLE);
+ const tableName = this.expectIdentifier('table name');
+ return { type: 'DROP_TABLE', name: tableName };
+ }
+ // ===================================================================
+ // 条件表达式
+ // ===================================================================
+ /** condition → simple_cond ((AND|OR) simple_cond)* */
+ parseCondition() {
+ let left = this.parseSimpleCondition();
+ while (this.curTokenIs(TokenType.AND) || this.curTokenIs(TokenType.OR)) {
+ const isAnd = this.curTokenIs(TokenType.AND);
+ this.nextToken();
+ const right = this.parseSimpleCondition();
+ if (isAnd) {
+ // 合并到 $and
+ left = { $and: [left, right] };
+ }
+ else {
+ left = { $or: [left, right] };
+ }
+ }
+ return left;
+ }
+ /** simple_cond → column op value | column IS [NOT] NULL | column [NOT] LIKE pattern
+ * | column [NOT] IN (values) | NOT condition | (condition) */
+ parseSimpleCondition() {
+ // NOT expr
+ if (this.curTokenIs(TokenType.NOT)) {
+ this.nextToken();
+ const inner = this.parseSimpleCondition();
+ return { $not: inner };
+ }
+ // (condition)
+ if (this.curTokenIs(TokenType.LPAREN)) {
+ this.nextToken();
+ const inner = this.parseCondition();
+ this.expect(TokenType.RPAREN);
+ return inner;
+ }
+ // column
+ const column = this.parseColumnRef();
+ // IS NULL / IS NOT NULL
+ if (this.curTokenIs(TokenType.IDENTIFIER) && this.curToken.value.toUpperCase() === 'IS') {
+ this.nextToken();
+ const isNot = this.curTokenIs(TokenType.NOT);
+ if (isNot)
+ this.nextToken();
+ this.expect(TokenType.NULL);
+ const result = {};
+ result[column] = isNot ? { $ne: null } : { $eq: null };
+ return result;
+ }
+ // LIKE
+ if (this.curTokenIs(TokenType.LIKE)) {
+ this.nextToken();
+ const pattern = this.parseValue();
+ const result = {};
+ result[column] = { $like: pattern };
+ return result;
+ }
+ // IN
+ if (this.curTokenIs(TokenType.IN)) {
+ this.nextToken();
+ this.expect(TokenType.LPAREN);
+ const values = this.parseValueList();
+ this.expect(TokenType.RPAREN);
+ const result = {};
+ result[column] = { $in: values };
+ return result;
+ }
+ // 比较运算符
+ const op = this.parseComparisonOp();
+ // 尝试解析列引用(identifier DOT identifier 格式)
+ let value;
+ if ((this.curToken.type === TokenType.IDENTIFIER || this._isKeywordAsIdent()) &&
+ this.peekTokenIs(TokenType.DOT)) {
+ const colRef = this.parseColumnRef();
+ value = { $col: colRef };
+ }
+ else {
+ value = this.parseValue();
+ }
+ const result = {};
+ result[column] = { [op]: value };
+ return result;
+ }
+ peekTokenIs(type) {
+ return this.peekToken.type === type;
+ }
+ parseComparisonOp() {
+ switch (this.curToken.type) {
+ case TokenType.EQ:
+ this.nextToken();
+ return '$eq';
+ case TokenType.NEQ:
+ this.nextToken();
+ return '$ne';
+ case TokenType.GT:
+ this.nextToken();
+ return '$gt';
+ case TokenType.GTE:
+ this.nextToken();
+ return '$gte';
+ case TokenType.LT:
+ this.nextToken();
+ return '$lt';
+ case TokenType.LTE:
+ this.nextToken();
+ return '$lte';
+ default:
+ throw this.error(`Expected comparison operator, got "${this.curToken.value}"`);
+ }
+ }
+ // ===================================================================
+ // 辅助解析
+ // ===================================================================
+ parseColumnList() {
+ const cols = [];
+ cols.push(this.parseColumnRef());
+ while (this.curTokenIs(TokenType.COMMA)) {
+ this.nextToken();
+ cols.push(this.parseColumnRef());
+ }
+ return cols;
+ }
+ /** 解析列引用:支持 'col'、'table.col' 和 'COUNT(*)'/'SUM(col)' 等 */
+ parseColumnRef() {
+ // 聚合函数?
+ if (this.curTokenIs(TokenType.COUNT) ||
+ this.curTokenIs(TokenType.SUM) ||
+ this.curTokenIs(TokenType.AVG) ||
+ this.curTokenIs(TokenType.MIN) ||
+ this.curTokenIs(TokenType.MAX)) {
+ return this.parseAggregateCall();
+ }
+ const first = this.expectIdentifier('column name');
+ if (this.curTokenIs(TokenType.DOT)) {
+ this.nextToken();
+ const second = this.expectIdentifier('column name');
+ return `${first}.${second}`;
+ }
+ return first;
+ }
+ /** 解析聚合函数调用: COUNT(*), SUM(col), AVG(col), MIN(col), MAX(col) */
+ parseAggregateCall() {
+ const func = this.curToken.value.toUpperCase();
+ this.nextToken();
+ this.expect(TokenType.LPAREN);
+ let arg;
+ if (this.curTokenIs(TokenType.STAR)) {
+ arg = '*';
+ this.nextToken();
+ }
+ else {
+ arg = this.parseColumnRef();
+ }
+ this.expect(TokenType.RPAREN);
+ // 可选别名: AS alias
+ let alias = '';
+ if (this.curTokenIs(TokenType.AS)) {
+ this.nextToken();
+ alias = this.expectIdentifier('alias');
+ }
+ else if (this.curToken.type === TokenType.IDENTIFIER && this._isAggregateAlias()) {
+ alias = this.curToken.value;
+ this.nextToken();
+ }
+ if (alias) {
+ return `${func}(${arg}) AS ${alias}`;
+ }
+ return `${func}(${arg})`;
+ }
+ _isAggregateAlias() {
+ return !this._isReservedAfterFrom() && !this._isJoinKeyword();
+ }
+ parseIdentifierList() {
+ const ids = [];
+ ids.push(this.expectIdentifier('identifier'));
+ while (this.curTokenIs(TokenType.COMMA)) {
+ this.nextToken();
+ ids.push(this.expectIdentifier('identifier'));
+ }
+ return ids;
+ }
+ parseValueList() {
+ const vals = [];
+ vals.push(this.parseValue());
+ while (this.curTokenIs(TokenType.COMMA)) {
+ this.nextToken();
+ vals.push(this.parseValue());
+ }
+ return vals;
+ }
+ parseOrderByList() {
+ const list = [];
+ list.push(this.parseOrderBy());
+ while (this.curTokenIs(TokenType.COMMA)) {
+ this.nextToken();
+ list.push(this.parseOrderBy());
+ }
+ return list;
+ }
+ parseOrderBy() {
+ const column = this.expectIdentifier('column name');
+ let direction = 'asc';
+ if (this.curTokenIs(TokenType.ASC)) {
+ this.nextToken();
+ }
+ else if (this.curTokenIs(TokenType.DESC)) {
+ direction = 'desc';
+ this.nextToken();
+ }
+ return { column, direction };
+ }
+ /** 解析字面量值 */
+ parseValue() {
+ switch (this.curToken.type) {
+ case TokenType.STRING: {
+ const val = this.curToken.value;
+ this.nextToken();
+ return val;
+ }
+ case TokenType.NUMBER: {
+ const val = Number(this.curToken.value);
+ this.nextToken();
+ return val;
+ }
+ case TokenType.TRUE:
+ this.nextToken();
+ return true;
+ case TokenType.FALSE:
+ this.nextToken();
+ return false;
+ case TokenType.NULL:
+ this.nextToken();
+ return null;
+ default:
+ throw this.error(`Expected value, got "${this.curToken.value}"`);
+ }
+ }
+ // ===================================================================
+ // Token 操作
+ // ===================================================================
+ nextToken() {
+ this.curToken = this.peekToken;
+ this.peekToken = this.lexer.nextToken();
+ }
+ curTokenIs(type) {
+ return this.curToken.type === type;
+ }
+ expect(type) {
+ if (this.curTokenIs(type)) {
+ this.nextToken();
+ return;
+ }
+ throw this.error(`Expected ${type}, got "${this.curToken.value}"`);
+ }
+ expectIdentifier(context) {
+ if (this.curToken.type === TokenType.IDENTIFIER || this._isKeywordAsIdent()) {
+ const val = this.curToken.value;
+ this.nextToken();
+ return val;
+ }
+ throw this.error(`Expected ${context}, got "${this.curToken.value}"`);
+ }
+ /** 关键字可以作为标识符(如列名等于关键字) */
+ _isKeywordAsIdent() {
+ return (this.curToken.type !== TokenType.EOF &&
+ this.curToken.type !== TokenType.ILLEGAL &&
+ this.curToken.type !== TokenType.STRING &&
+ this.curToken.type !== TokenType.NUMBER &&
+ this.curToken.type !== TokenType.COMMA &&
+ this.curToken.type !== TokenType.LPAREN &&
+ this.curToken.type !== TokenType.RPAREN &&
+ this.curToken.type !== TokenType.SEMICOLON &&
+ this.curToken.type !== TokenType.EQ &&
+ this.curToken.type !== TokenType.NEQ &&
+ this.curToken.type !== TokenType.GT &&
+ this.curToken.type !== TokenType.GTE &&
+ this.curToken.type !== TokenType.LT &&
+ this.curToken.type !== TokenType.LTE &&
+ this.curToken.type !== TokenType.DOT &&
+ this.curToken.type !== TokenType.STAR);
+ }
+ expectNumber(context) {
+ if (this.curToken.type === TokenType.NUMBER) {
+ const val = Number(this.curToken.value);
+ this.nextToken();
+ return val;
+ }
+ throw this.error(`Expected ${context}, got "${this.curToken.value}"`);
+ }
+ error(msg) {
+ return new DatabaseError(`Parse error at position ${this.curToken.position}: ${msg}`, 'PARSE_ERROR');
+ }
+ }
+ // ---------------------------------------------------------------------------
+ // 便捷方法
+ // ---------------------------------------------------------------------------
+ /** 解析 SQL 字符串为 AST Statement */
+ function parse(sql) {
+ const parser = new Parser(sql);
+ const stmt = parser.parseStatement();
+ return stmt;
+ }
+
+ /**
+ * metona-sqlark Transaction — 事务管理
+ * @module transaction
+ *
+ * 封装多操作事务,保证原子性。
+ * v0.0.1: 基于引擎层操作实现,IndexedDB 引擎利用原生事务。
+ */
+ // ---------------------------------------------------------------------------
+ // Transaction
+ // ---------------------------------------------------------------------------
+ class Transaction {
+ constructor(engine) {
+ this.tables = new Map();
+ this.completed = false;
+ this.engine = engine;
+ }
+ /** 获取表操作对象 */
+ table(tableName) {
+ let t = this.tables.get(tableName);
+ if (!t) {
+ t = new Table(this.engine, tableName);
+ this.tables.set(tableName, t);
+ }
+ return t;
+ }
+ /** 标记事务完成(由 TransactionManager 调用) */
+ _markCompleted() {
+ this.completed = true;
+ }
+ /** 是否已完成 */
+ isCompleted() {
+ return this.completed;
+ }
+ }
+ // ---------------------------------------------------------------------------
+ // TransactionManager
+ // ---------------------------------------------------------------------------
+ class TransactionManager {
+ constructor(engine) {
+ this.engine = engine;
+ }
+ /** 执行事务 */
+ async execute(fn) {
+ const trx = new Transaction(this.engine);
+ try {
+ const result = await fn(trx);
+ trx._markCompleted();
+ return result;
+ }
+ catch (error) {
+ if (error instanceof DatabaseError)
+ throw error;
+ throw new DatabaseError(`Transaction failed: ${error.message}`, 'TRANSACTION_ERROR', error);
+ }
+ }
+ }
+
+ /**
+ * metona-sqlark Plugin — 插件系统
+ * @module plugin
+ *
+ * 管理插件的注册、生命周期和钩子调度。
+ */
+ // ---------------------------------------------------------------------------
+ // PluginManager
+ // ---------------------------------------------------------------------------
+ class PluginManager {
+ constructor() {
+ this.plugins = [];
+ this.hooks = new Map();
+ }
+ /** 注册插件 */
+ register(plugin) {
+ // 按优先级插入
+ const priority = plugin.priority ?? 0;
+ const insertIndex = this.plugins.findIndex((p) => (p.priority ?? 0) < priority);
+ if (insertIndex === -1) {
+ this.plugins.push(plugin);
+ }
+ else {
+ this.plugins.splice(insertIndex, 0, plugin);
+ }
+ // 安装
+ plugin.install(null); // 实际引用由 MetonaSqlark 注入
+ }
+ /** 卸载插件 */
+ unregister(pluginName) {
+ const idx = this.plugins.findIndex((p) => p.name === pluginName);
+ if (idx !== -1) {
+ this.plugins[idx].destroy();
+ this.plugins.splice(idx, 1);
+ }
+ }
+ /** 获取所有已注册插件 */
+ getPlugins() {
+ return [...this.plugins];
+ }
+ /** 添加钩子回调 */
+ on(hook, callback) {
+ const callbacks = this.hooks.get(hook) ?? [];
+ callbacks.push(callback);
+ this.hooks.set(hook, callbacks);
+ }
+ /** 移除钩子回调 */
+ off(hook, callback) {
+ const callbacks = this.hooks.get(hook);
+ if (callbacks) {
+ const idx = callbacks.indexOf(callback);
+ if (idx !== -1)
+ callbacks.splice(idx, 1);
+ }
+ }
+ /** 触发钩子 */
+ async trigger(hook, ...args) {
+ const callbacks = this.hooks.get(hook);
+ if (callbacks) {
+ for (const cb of callbacks) {
+ await cb(...args);
+ }
+ }
+ }
+ /** 销毁所有插件 */
+ destroy() {
+ for (const plugin of this.plugins) {
+ try {
+ plugin.destroy();
+ }
+ catch (e) {
+ // eslint-disable-next-line no-console
+ console.warn(`[metona-sqlark] Plugin "${plugin.name}" destroy error:`, e);
+ }
+ }
+ this.plugins = [];
+ this.hooks.clear();
+ }
+ }
+
+ /**
+ * metona-sqlark Core — 数据库主类
+ * @module core
+ *
+ * 管理数据库生命周期、引擎调度、表操作、SQL 查询、事务和插件。
+ */
+ // ---------------------------------------------------------------------------
+ // MetonaSqlark
+ // ---------------------------------------------------------------------------
+ class MetonaSqlark {
+ /** 获取版本号 */
+ get version() { return this._version; }
+ constructor(config) {
+ this.ready = false;
+ this.tableCache = new Map();
+ // ---- 发布订阅 ----
+ this.listeners = new Map();
+ // ---- 迁移 ----
+ this.migrations = new Map();
+ this.config = config;
+ this.name = config.name ?? DB_DEFAULTS.name;
+ this.mode = config.mode ?? DB_DEFAULTS.mode;
+ this._version = config.version ?? DB_DEFAULTS.version;
+ this.pluginManager = new PluginManager();
+ }
+ // ---- 初始化 ----
+ /** 初始化数据库(创建引擎、打开连接) */
+ async init() {
+ // 创建引擎
+ this.engine = this.createEngine();
+ // 打开连接
+ await this.engine.open(this.name, this.version);
+ // 初始化执行器和事务管理器
+ this.executor = new QueryExecutor(this.engine);
+ this.transactionManager = new TransactionManager(this.engine);
+ // 注册插件
+ if (this.config.plugins) {
+ for (const plugin of this.config.plugins) {
+ this.pluginManager.register(plugin);
+ }
+ }
+ this.ready = true;
+ // 回调
+ if (this.config.onReady) {
+ this.config.onReady(this);
+ }
+ }
+ /** 检查是否就绪 */
+ isReady() {
+ return this.ready;
+ }
+ // ---- 表管理 ----
+ /** 创建表 */
+ async defineTable(name, columns) {
+ this.ensureReady();
+ const schema = createSchema(name, columns);
+ await this.pluginManager.trigger('beforeCreateTable', schema);
+ await this.engine.createTable(schema);
+ await this.pluginManager.trigger('afterCreateTable', schema);
+ // 清除缓存
+ this.tableCache.delete(name);
+ }
+ /** 获取表操作对象 */
+ table(name) {
+ this.ensureReady();
+ let t = this.tableCache.get(name);
+ if (!t) {
+ t = new Table(this.engine, name, this.executor);
+ this.tableCache.set(name, t);
+ }
+ return t;
+ }
+ /** 删除表 */
+ async dropTable(name) {
+ this.ensureReady();
+ await this.pluginManager.trigger('beforeDropTable', name);
+ await this.engine.dropTable(name);
+ await this.pluginManager.trigger('afterDropTable', name);
+ this.tableCache.delete(name);
+ }
+ /** 获取所有表名 */
+ async getTableNames() {
+ this.ensureReady();
+ return this.engine.getTableNames();
+ }
+ // ---- SQL 查询 ----
+ /** 执行 SQL 字符串查询 */
+ async query(sql) {
+ this.ensureReady();
+ await this.pluginManager.trigger('beforeQuery', sql);
+ const stmt = parse(sql);
+ const result = await this.executor.execute(stmt);
+ await this.pluginManager.trigger('afterQuery', sql, result);
+ return result;
+ }
+ // ---- 事务 ----
+ /** 执行事务 */
+ async transaction(fn) {
+ this.ensureReady();
+ await this.pluginManager.trigger('beforeTransaction');
+ const result = await this.transactionManager.execute(fn);
+ await this.pluginManager.trigger('afterTransaction');
+ return result;
+ }
+ // ---- 导入导出 ----
+ /** 导出表数据为 JSON */
+ async exportTable(tableName) {
+ this.ensureReady();
+ return this.engine.find(tableName, { table: tableName });
+ }
+ /** 导入 JSON 数据到表 */
+ async importTable(tableName, data) {
+ this.ensureReady();
+ return this.engine.insert(tableName, data);
+ }
+ /** 导出整个数据库为 JSON */
+ async exportAll() {
+ this.ensureReady();
+ const result = {};
+ const names = await this.engine.getTableNames();
+ for (const name of names) {
+ result[name] = await this.engine.find(name, { table: name });
+ }
+ return result;
+ }
+ /** 订阅表变更 */
+ subscribe(tableName, callback) {
+ const key = `change:${tableName}`;
+ if (!this.listeners.has(key))
+ this.listeners.set(key, new Set());
+ this.listeners.get(key).add(callback);
+ return () => this.listeners.get(key)?.delete(callback);
+ }
+ /** 触发变更事件 */
+ emit(tableName, event) {
+ const key = `change:${tableName}`;
+ this.listeners.get(key)?.forEach((cb) => cb(event));
+ }
+ /** 注册迁移 */
+ addMigration(version, up) {
+ this.migrations.set(version, up);
+ }
+ /** 执行迁移到指定版本 */
+ async migrateTo(targetVersion) {
+ this.ensureReady();
+ for (const [version, up] of [...this.migrations.entries()].sort((a, b) => a[0] - b[0])) {
+ if (version <= targetVersion && version > this.version) {
+ await up(this);
+ this._version = version;
+ }
+ }
+ }
+ // ---- 插件 ----
+ /** 获取插件管理器 */
+ getPluginManager() {
+ return this.pluginManager;
+ }
+ /** 注册钩子 */
+ on(hook, callback) {
+ this.pluginManager.on(hook, callback);
+ }
+ // ---- 生命周期 ----
+ /** 关闭数据库 */
+ async close() {
+ this.pluginManager.destroy();
+ await this.engine.close();
+ this.tableCache.clear();
+ this.ready = false;
+ }
+ /** 获取底层引擎 */
+ getEngine() {
+ return this.engine;
+ }
+ // ---- 内部 ----
+ createEngine() {
+ const mode = this.mode;
+ const diskEngine = this.config.diskEngine ?? 'indexeddb';
+ switch (mode) {
+ case 'memory':
+ return new MemoryEngine();
+ case 'disk':
+ return diskEngine === 'opfs' ? new OPFSEngine() : new IndexedDBEngine();
+ case 'hybrid':
+ return new HybridEngine(diskEngine);
+ default:
+ throw new DatabaseError(`Unknown storage mode: ${mode}`, 'CONFIG_ERROR');
+ }
+ }
+ ensureReady() {
+ if (!this.ready) {
+ throw new DatabaseError('Database not initialized. Call await db.init() first.', 'DB_NOT_READY');
+ }
+ }
+ }
+
+ /**
+ * metona-sqlark — 入口文件
+ * @module metona-sqlark
+ * @version 0.1.12
+ *
+ * 前端关系型数据库,内存与磁盘双模式。
+ * 支持 Query Builder 链式 API 和 SQL 字符串查询。
+ */
+ // ---------------------------------------------------------------------------
+ // 工厂函数
+ // ---------------------------------------------------------------------------
+ /**
+ * 创建数据库实例并初始化
+ *
+ * @example
+ * ```ts
+ * const db = await MetonaSqlark.create({
+ * name: 'my-app',
+ * mode: 'hybrid',
+ * });
+ *
+ * await db.defineTable('users', {
+ * id: { type: 'string', primaryKey: true },
+ * name: { type: 'string', required: true },
+ * });
+ *
+ * await db.table('users').insert({ id: '1', name: 'Alice' });
+ * const results = await db.query('SELECT * FROM users');
+ * ```
+ */
+ async function create(config) {
+ const db = new MetonaSqlark(config);
+ await db.init();
+ return db;
+ }
+ // ---------------------------------------------------------------------------
+ // 全局 API
+ // ---------------------------------------------------------------------------
+ const api = {
+ VERSION,
+ version: VERSION,
+ create,
+ MetonaSqlark,
+ MeSqlark: MetonaSqlark,
+ };
+ if (typeof window !== 'undefined') {
+ window.MetonaSqlark = api;
+ window.MeSqlark = api;
+ }
+ // 别名
+ const MeSqlark = MetonaSqlark;
+
+ exports.HybridEngine = HybridEngine;
+ exports.IndexedDBEngine = IndexedDBEngine;
+ exports.MeSqlark = MeSqlark;
+ exports.MemoryEngine = MemoryEngine;
+ exports.MetonaSqlark = MetonaSqlark;
+ exports.OPFSEngine = OPFSEngine;
+ exports.Table = Table;
+ exports.VERSION = VERSION;
+ exports.api = api;
+ exports.create = create;
+ exports.default = api;
+ exports.parse = parse;
+ exports.tokenize = tokenize;
+
+ Object.defineProperty(exports, '__esModule', { value: true });
+
+}));
+//# sourceMappingURL=metona-sqlark.js.map
diff --git a/dist/metona-sqlark.js.map b/dist/metona-sqlark.js.map
new file mode 100644
index 0000000..ee5c39c
--- /dev/null
+++ b/dist/metona-sqlark.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"metona-sqlark.js","sources":["../src/constants.ts","../src/query/where-matcher.ts","../src/engine/memory.ts","../src/engine/indexeddb.ts","../src/engine/opfs.ts","../src/hybrid/index.ts","../src/query/builder.ts","../src/table/table.ts","../src/table/schema.ts","../src/query/compiler.ts","../src/query/executor.ts","../src/sql/tokens.ts","../src/sql/lexer.ts","../src/sql/parser.ts","../src/transaction/index.ts","../src/plugin/index.ts","../src/core.ts","../src/index.ts"],"sourcesContent":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/dist/metona-sqlark.min.js b/dist/metona-sqlark.min.js
new file mode 100644
index 0000000..e7c88cd
--- /dev/null
+++ b/dist/metona-sqlark.min.js
@@ -0,0 +1 @@
+!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).MetonaSqlark={})}(this,function(e){"use strict";const t=["string","number","boolean","date","json"],s=Object.freeze({name:"metona-sqlark",mode:"hybrid",diskEngine:"indexeddb",version:1});class n extends Error{constructor(e,t,s){super(e),this.code=t,this.details=s,this.name="DatabaseError"}}const i="0.1.12",r=new Map;function o(e,t,s={}){for(const[n,i]of Object.entries(t))if("$and"!==n){if("$or"!==n){if(!a(e[n],i,e,s))return!1}else if(!i.some(t=>o(e,t,s)))return!1}else if(!i.every(t=>o(e,t,s)))return!1;return!0}function a(e,t,s,n){if("object"==typeof t&&null!==t&&"$and"in t)return t.$and.every(e=>o(s,e,n));if("object"==typeof t&&null!==t&&"$or"in t)return t.$or.some(e=>o(s,e,n));if("object"==typeof t&&null!==t&&"$not"in t)return!a(e,t.$not,s,n);if("object"!=typeof t||null===t||Array.isArray(t))return e===t;const i=t;if(n.$col&&"$col"in i&&1===Object.keys(i).length)return e===s[i.$col];for(const[t,r]of Object.entries(i)){let i=r;if(n.$col&&"object"==typeof r&&null!==r&&"$col"in r&&(i=s[r.$col]),!h(e,t,i))return!1}return!0}function h(e,t,s){switch(t){case"$eq":return e===s;case"$ne":return e!==s;case"$gt":return e>s;case"$gte":return e>=s;case"$lt":return e{for(const{column:n,direction:i}of t){const t=u(e[n],s[n]);if(0!==t)return"desc"===i?-t:t}return 0})}function u(e,t){return e===t?0:null==e?1:null==t?-1:"string"==typeof e&&"string"==typeof t?e.localeCompare(t):"number"==typeof e&&"number"==typeof t?e-t:String(e).localeCompare(String(t))}function l(e,t){const s={};for(const n of t)if(n in e)s[n]=e[n];else for(const t of Object.keys(e))if(t.endsWith(`.${n}`)||t===n){s[n]=e[t];break}return s}class T{constructor(){this.name="memory",this.tables=new Map,this.schemas=new Map,this.indexes=new Map,this.opened=!1}async open(e,t){this.opened=!0}async close(){this.tables.clear(),this.schemas.clear(),this.indexes.clear(),this.opened=!1}isOpen(){return this.opened}async createTable(e){if(this.schemas.has(e.name))throw new n(`Table "${e.name}" already exists`,"TABLE_EXISTS");this.schemas.set(e.name,e),this.tables.set(e.name,new Map);const t=new Map;for(const[s,n]of Object.entries(e.columns))(n.index||n.unique)&&t.set(s,new Map);this.indexes.set(e.name,t)}async dropTable(e){this.ensureTable(e),this.schemas.delete(e),this.tables.delete(e),this.indexes.delete(e)}async hasTable(e){return this.schemas.has(e)}async getTableNames(){return Array.from(this.schemas.keys())}async getTableSchema(e){return this.schemas.get(e)??null}async insert(e,t){this.ensureTable(e);const s=this.schemas.get(e),i=this.tables.get(e),r=this.getPrimaryKey(s),o=[];for(const a of t){const t=this.validateRow(s,a),h=String(t[r]);if(i.has(h))throw new n(`Duplicate primary key "${h}" in table "${e}"`,"DUPLICATE_KEY");this.checkUniqueness(s,t),i.set(h,t),this.updateIndexes(e,t,h),o.push(h)}return o}async find(e,t){this.ensureTable(e);const s=this.tables.get(e);let n=this.tryIndexLookup(e,s,t);t.where&&Object.keys(t.where).length>0&&(n=n.filter(e=>o(e,t.where))),t.orderBy&&t.orderBy.length>0&&(n=c(n,t.orderBy));const i=t.offset??0,r=t.limit??n.length;return n=n.slice(i,i+r),t.columns&&t.columns.length>0&&"*"!==t.columns[0]&&(n=n.map(e=>l(e,t.columns))),n}async update(e,t,s){this.ensureTable(e);const n=this.schemas.get(e),i=this.tables.get(e);let r=0;for(const[e,a]of i)if(!t.where||0===Object.keys(t.where).length||o(a,t.where)){const t={...a,...s};this.validateRow(n,t),i.set(e,t),r++}return r}async delete(e,t){this.ensureTable(e);const s=this.tables.get(e),n=[];for(const[e,i]of s)t.where&&0!==Object.keys(t.where).length&&!o(i,t.where)||n.push(e);for(const e of n)s.delete(e);return n.length}async count(e,t){this.ensureTable(e);const s=this.tables.get(e);if(!t?.where||0===Object.keys(t.where).length)return s.size;let n=0;for(const e of s.values())o(e,t.where)&&n++;return n}async clear(e){this.ensureTable(e),this.tables.get(e).clear();const t=this.indexes.get(e);if(t)for(const e of t.values())e.clear()}ensureTable(e){if(!this.tables.has(e))throw new n(`Table "${e}" does not exist`,"TABLE_NOT_FOUND")}getPrimaryKey(e){for(const[t,s]of Object.entries(e.columns))if(s.primaryKey)return t;return Object.keys(e.columns)[0]}validateRow(e,t){const s={};for(const[i,r]of Object.entries(e.columns)){let o=t[i];if(void 0===o&&void 0!==r.default&&(o=r.default),r.required&&null==o)throw new n(`Column "${i}" is required in table "${e.name}"`,"VALIDATION_ERROR");null!=o&&this.checkType(i,r.type,o),void 0!==o&&(s[i]=o)}return s}checkType(e,t,s){const i=typeof s;switch(t){case"string":if("string"!==i)throw new n(`Column "${e}" expects string, got ${i}`,"TYPE_ERROR");break;case"number":if("number"!==i)throw new n(`Column "${e}" expects number, got ${i}`,"TYPE_ERROR");break;case"boolean":if("boolean"!==i)throw new n(`Column "${e}" expects boolean, got ${i}`,"TYPE_ERROR");break;case"date":if("string"!==i||isNaN(Date.parse(s)))throw new n(`Column "${e}" expects valid date`,"TYPE_ERROR");break;case"json":if("object"!==i)throw new n(`Column "${e}" expects object/array, got ${i}`,"TYPE_ERROR")}}checkUniqueness(e,t){const s=this.indexes.get(e.name);if(s)for(const[i,r]of Object.entries(e.columns)){if(!r.unique||void 0===t[i]||null===t[i])continue;const o=s.get(i);if(o&&o.has(t[i]))throw new n(`Unique constraint violation on column "${i}" in table "${e.name}"`,"UNIQUE_VIOLATION")}}tryIndexLookup(e,t,s){const n=this.indexes.get(e);if(!n||!s.where)return Array.from(t.values());for(const[e,i]of Object.entries(s.where))if("object"!=typeof i||null===i){const s=n.get(e);if(s){const e=s.get(i);if(e){const s=[];for(const n of e){const e=t.get(n);e&&s.push(e)}return s}return[]}}return Array.from(t.values())}updateIndexes(e,t,s){const n=this.indexes.get(e);if(n)for(const[e,i]of n){const n=t[e];null!=n&&(i.has(n)||i.set(n,new Set),i.get(n).add(s))}}}class p{constructor(){this.name="indexeddb",this.db=null,this.dbName="",this.version=1,this.memoryCache=new T}async open(e,t){return this.dbName=e,this.version=t,await this.memoryCache.open(e,t),new Promise((s,i)=>{const r=indexedDB.open(e,t);r.onsuccess=()=>{this.db=r.result,s()},r.onerror=()=>i(new n(`Failed to open IndexedDB "${e}"`,"IDB_OPEN_ERROR",r.error)),r.onblocked=()=>i(new n(`IndexedDB "${e}" is blocked`,"IDB_BLOCKED"))})}async close(){this.db&&(this.db.close(),this.db=null),await this.memoryCache.close()}isOpen(){return null!==this.db}async createTable(e){await this.memoryCache.createTable(e);const t=this.ensureDB();return new Promise((s,i)=>{const r=t.version+1;t.close();const o=indexedDB.open(this.dbName,r);o.onupgradeneeded=t=>{const s=t.target.result,n=Object.entries(e.columns).find(([,e])=>e.primaryKey)?.[0]??Object.keys(e.columns)[0],i=s.createObjectStore(e.name,{keyPath:n});for(const[t,s]of Object.entries(e.columns))s.index&&t!==n&&i.createIndex(`idx_${t}`,t,{unique:s.unique??!1})},o.onsuccess=()=>{this.db=o.result,s()},o.onerror=()=>i(new n(`Failed to create table "${e.name}"`,"IDB_UPGRADE_ERROR",o.error))})}async dropTable(e){await this.memoryCache.dropTable(e);const t=this.ensureDB();return new Promise((s,i)=>{const r=t.version+1;t.close();const o=indexedDB.open(this.dbName,r);o.onupgradeneeded=t=>{const s=t.target.result;s.objectStoreNames.contains(e)&&s.deleteObjectStore(e)},o.onsuccess=()=>{this.db=o.result,s()},o.onerror=()=>i(new n(`Failed to drop table "${e}"`,"IDB_UPGRADE_ERROR",o.error))})}async hasTable(e){return this.ensureDB().objectStoreNames.contains(e)}async getTableNames(){return Array.from(this.ensureDB().objectStoreNames)}async getTableSchema(e){return this.memoryCache.getTableSchema(e)}async insert(e,t){await this.memoryCache.insert(e,t);const s=this.ensureDB();return new Promise((i,r)=>{const o=s.transaction(e,"readwrite"),a=o.objectStore(e),h=[];for(const e of t){const t=a.add(e);t.onsuccess=()=>h.push(String(t.result)),t.onerror=()=>{}}o.oncomplete=()=>i(h),o.onerror=()=>r(new n(`Insert failed for "${e}"`,"IDB_TX_ERROR",o.error))})}async find(e,t){const s=this.ensureDB();return new Promise((i,r)=>{const a=s.transaction(e,"readonly").objectStore(e).getAll();a.onsuccess=()=>{let e=a.result??[];t.where&&Object.keys(t.where).length>0&&(e=e.filter(e=>o(e,t.where))),t.orderBy&&t.orderBy.length>0&&(e=c(e,t.orderBy));const s=t.offset??0,n=t.limit??e.length;e=e.slice(s,s+n),t.columns&&t.columns.length>0&&"*"!==t.columns[0]&&(e=e.map(e=>l(e,t.columns))),i(e)},a.onerror=()=>r(new n(`Find failed for "${e}"`,"IDB_READ_ERROR",a.error))})}async update(e,t,s){await this.memoryCache.update(e,t,s);const i=this.ensureDB();return new Promise((r,a)=>{const h=i.transaction(e,"readwrite"),c=h.objectStore(e),u=c.getAll();let l=0;u.onsuccess=()=>{for(const e of u.result??[])t.where&&0!==Object.keys(t.where).length&&!o(e,t.where)||(Object.assign(e,s),c.put(e),l++)},h.oncomplete=()=>r(l),h.onerror=()=>a(new n(`Update failed for "${e}"`,"IDB_TX_ERROR",h.error))})}async delete(e,t){await this.memoryCache.delete(e,t);const s=this.ensureDB(),i=await this.memoryCache.getTableSchema(e);if(!i)throw new n(`Table "${e}" not found`,"TABLE_NOT_FOUND");const r=Object.entries(i.columns).find(([,e])=>e.primaryKey)?.[0]??Object.keys(i.columns)[0];return new Promise((i,a)=>{const h=s.transaction(e,"readwrite"),c=h.objectStore(e),u=c.getAll();let l=0;u.onsuccess=()=>{for(const e of u.result??[])t.where&&0!==Object.keys(t.where).length&&!o(e,t.where)||(c.delete(e[r]),l++)},h.oncomplete=()=>i(l),h.onerror=()=>a(new n(`Delete failed for "${e}"`,"IDB_TX_ERROR",h.error))})}async count(e,t){return(await this.find(e,{table:e,where:t?.where??{}})).length}async clear(e){await this.memoryCache.clear(e);const t=this.ensureDB();return new Promise((s,i)=>{const r=t.transaction(e,"readwrite");r.objectStore(e).clear(),r.oncomplete=()=>s(),r.onerror=()=>i(new n(`Clear failed for "${e}"`,"IDB_TX_ERROR",r.error))})}ensureDB(){if(!this.db)throw new n("Database not opened","DB_NOT_OPEN");return this.db}}class d{constructor(){this.name="opfs",this.root=null,this.tablesDir=null,this.dbName="",this.memoryCache=new T}async open(e,t){this.dbName=e,await this.memoryCache.open(e,t),this.root=await navigator.storage.getDirectory(),this.tablesDir=await this.root.getDirectoryHandle(e,{create:!0})}async close(){this.root=null,this.tablesDir=null,await this.memoryCache.close()}isOpen(){return null!==this.tablesDir}async createTable(e){await this.memoryCache.createTable(e),await this.writeTableData(e.name,[])}async dropTable(e){if(await this.memoryCache.dropTable(e),this.tablesDir)try{await this.tablesDir.removeEntry(`${e}.json`)}catch{}}async hasTable(e){if(!this.tablesDir)return!1;try{return await this.tablesDir.getFileHandle(`${e}.json`),!0}catch{return!1}}async getTableNames(){if(!this.tablesDir)return[];const e=[];for await(const[t]of this.tablesDir.entries())t.endsWith(".json")&&e.push(t.replace(".json",""));return e}async getTableSchema(e){return this.memoryCache.getTableSchema(e)}async insert(e,t){const s=await this.memoryCache.insert(e,t),n=await this.memoryCache.find(e,{table:e});return await this.writeTableData(e,n),s}async find(e,t){return this.memoryCache.find(e,t)}async update(e,t,s){const n=await this.memoryCache.update(e,t,s),i=await this.memoryCache.find(e,{table:e});return await this.writeTableData(e,i),n}async delete(e,t){const s=await this.memoryCache.delete(e,t),n=await this.memoryCache.find(e,{table:e});return await this.writeTableData(e,n),s}async count(e,t){return this.memoryCache.count(e,t)}async clear(e){await this.memoryCache.clear(e),await this.writeTableData(e,[])}ensureDir(){if(!this.tablesDir)throw new n("Database not opened","DB_NOT_OPEN");return this.tablesDir}async writeTableData(e,t){const s=this.ensureDir(),n=`${e}.json`,i=await s.getFileHandle(n,{create:!0}),r=await i.createWritable();await r.write(JSON.stringify(t)),await r.close()}async readTableData(e){const t=this.ensureDir(),s=`${e}.json`;try{const e=await t.getFileHandle(s),n=await e.getFile(),i=await n.text();return JSON.parse(i)}catch{return[]}}async loadTableIntoMemory(e,t){await this.memoryCache.createTable(t);const s=await this.readTableData(e);if(s.length>0)for(const t of s)await this.memoryCache.insert(e,[t])}}class m{constructor(e="indexeddb"){this.name="hybrid",this.memoryEngine=new T,this.diskEngineType=e,this.diskEngine="opfs"===e?new d:new p}async open(e,t){await this.diskEngine.open(e,t),await this.memoryEngine.open(e,t);const s=await this.diskEngine.getTableNames();for(const e of s){const t=await this.diskEngine.getTableSchema(e);if(!t)continue;await this.memoryEngine.createTable(t);const s=await this.diskEngine.find(e,{table:e});if(s.length>0)try{await this.memoryEngine.insert(e,s)}catch(e){}}}async close(){await this.memoryEngine.close(),await this.diskEngine.close()}isOpen(){return this.memoryEngine.isOpen()&&this.diskEngine.isOpen()}async createTable(e){await this.memoryEngine.createTable(e),await this.diskEngine.createTable(e)}async dropTable(e){await this.memoryEngine.dropTable(e),await this.diskEngine.dropTable(e)}async hasTable(e){return this.memoryEngine.hasTable(e)}async getTableNames(){return this.memoryEngine.getTableNames()}async getTableSchema(e){return this.memoryEngine.getTableSchema(e)}async insert(e,t){const s=await this.memoryEngine.insert(e,t);return await this.diskEngine.insert(e,t),s}async find(e,t){return this.memoryEngine.find(e,t)}async update(e,t,s){const n=await this.memoryEngine.update(e,t,s);return await this.diskEngine.update(e,t,s),n}async delete(e,t){const s=await this.memoryEngine.delete(e,t);return await this.diskEngine.delete(e,t),s}async count(e,t){return this.memoryEngine.count(e,t)}async clear(e){await this.memoryEngine.clear(e),await this.diskEngine.clear(e)}getDiskEngineType(){return this.diskEngineType}getMemoryEngine(){return this.memoryEngine}}class f{constructor(e,t,s=["*"],n){this.engine=e,this.tableName=t,this._columns=s,this._where={},this._orderBy=[],this._joins=[],this._executor=n}as(e){return this._alias=e,this}innerJoin(e,t,s){return this._addJoin("INNER",e,t,s)}leftJoin(e,t,s){return this._addJoin("LEFT",e,t,s)}rightJoin(e,t,s){return this._addJoin("RIGHT",e,t,s)}crossJoin(e,t){return this._addJoin("CROSS",e,{},t)}join(e,t,s){return this._addJoin("INNER",e,t,s)}_addJoin(e,t,s,n){return this._joins.push({type:e,table:t,on:s,alias:n}),this}where(e){return this._where={...this._where,...e},this}orderBy(e,t="asc"){return this._orderBy.push({column:e,direction:t}),this}limit(e){return this._limit=e,this}offset(e){return this._offset=e,this}async execute(){if(this._joins.length>0&&this._executor){const e=this.toAST();return this._executor.execute(e)}return this.engine.find(this.tableName,{table:this.tableName,columns:this._columns,where:this._where,orderBy:this._orderBy.length>0?this._orderBy:void 0,limit:this._limit,offset:this._offset})}toAST(){return{type:"SELECT",columns:this._columns,from:this.tableName,alias:this._alias,joins:this._joins.length>0?[...this._joins]:void 0,where:this._where,orderBy:this._orderBy.length>0?this._orderBy:void 0,limit:this._limit,offset:this._offset}}}class E{constructor(e,t,s){this.engine=e,this.tableName=t,this._updates=s,this._where={}}where(e){return this._where={...this._where,...e},this}async execute(){return this.engine.update(this.tableName,{table:this.tableName,where:this._where},this._updates)}toAST(){return{type:"UPDATE",table:this.tableName,sets:this._updates,where:this._where}}}class y{constructor(e,t){this.engine=e,this.tableName=t,this._where={}}where(e){return this._where={...this._where,...e},this}async execute(){return this.engine.delete(this.tableName,{table:this.tableName,where:this._where})}toAST(){return{type:"DELETE",from:this.tableName,where:this._where}}}class g{constructor(e,t,s){this.schema=null,this.engine=e,this.name=t,this.executor=s}async getSchema(){if(!this.schema){const e=await this.engine.getTableSchema(this.name);if(!e)throw new n(`Table "${this.name}" does not exist`,"TABLE_NOT_FOUND");this.schema=e}return this.schema}async insert(e){return(await this.engine.insert(this.name,[e]))[0]}async insertMany(e){return this.engine.insert(this.name,e)}select(e=["*"]){return new f(this.engine,this.name,e,this.executor)}update(e){return new E(this.engine,this.name,e)}delete(){return new y(this.engine,this.name)}async count(e){return this.engine.count(this.name,e?{table:this.name,where:e}:void 0)}async clear(){return this.engine.clear(this.name)}async drop(){return this.engine.dropTable(this.name)}}function k(e,s){return function(e){if(0===Object.keys(e).length)throw new n("Table must have at least one column","SCHEMA_ERROR");let s=0;for(const[i,r]of Object.entries(e)){if(!t.includes(r.type))throw new n(`Invalid type "${r.type}" for column "${i}". Valid types: ${t.join(", ")}`,"SCHEMA_ERROR");r.primaryKey&&s++}if(0===s)throw new n("Table must have at least one primary key column","SCHEMA_ERROR")}(s),{name:e,columns:s}}function w(e){return{type:e.type,primaryKey:e.primaryKey,unique:e.unique,required:e.required,default:e.default,index:e.index,maxLength:e.maxLength,min:e.min,max:e.max}}function b(e){switch(e.type){case"SELECT":return function(e){return{table:e.from,columns:e.columns,where:e.where,orderBy:e.orderBy?.length?e.orderBy:void 0,limit:e.limit,offset:e.offset}}(e);case"DELETE":return function(e){return{table:e.from,where:e.where}}(e);case"UPDATE":return function(e){return{table:e.table,where:e.where}}(e);default:throw new n(`Cannot compile statement type "${e.type}" to QueryPlan`,"COMPILE_ERROR")}}class I{constructor(e){this.engine=e}async execute(e){switch(e.type){case"SELECT":return this.executeSelect(e);case"INSERT":return this.executeInsert(e);case"UPDATE":return this.executeUpdate(e);case"DELETE":return this.executeDelete(e);case"CREATE_TABLE":return this.executeCreateTable(e);case"DROP_TABLE":return this.executeDropTable(e);default:throw new n("Unknown statement type","UNKNOWN_STATEMENT")}}async executeSelect(e){const t=!!(e.groupBy&&e.groupBy.length>0);let s;if(e.joins&&0!==e.joins.length)s=await this.executeJoinSelect(e);else{const n=b(t?{...e,columns:["*"]}:e);s=await this.engine.find(n.table,n)}t&&(s=this.executeGroupBy(s,e)),e.distinct&&(s=this.executeDistinct(s)),e.having&&Object.keys(e.having).length>0&&(s=s.filter(t=>o(t,e.having))),e.orderBy&&e.orderBy.length>0&&(s=c(s,e.orderBy));const n=e.offset??0,i=e.limit??s.length;return s=s.slice(n,n+i),!t&&e.columns.length>0&&"*"!==e.columns[0]&&(s=s.map(t=>l(t,e.columns))),s}async executeJoinSelect(e){const t=e.alias??e.from;let s=(await this.engine.find(e.from,{table:e.from})).map(e=>this.prefixRow(e,t));for(const t of e.joins){const e=t.alias??t.table,n=(await this.engine.find(t.table,{table:t.table})).map(t=>this.prefixRow(t,e));s=this.joinRows(s,n,t)}return e.where&&Object.keys(e.where).length>0&&(s=s.filter(t=>o(t,e.where))),s}prefixRow(e,t){const s={};for(const[n,i]of Object.entries(e))s[`${t}.${n}`]=i;return s}joinRows(e,t,s){if("CROSS"===s.type){const s=[];for(const n of e)for(const e of t)s.push({...n,...e});return s}const n=[];for(const i of e){let e=!1;for(const r of t){const t={...i,...r};o(t,s.on,{$col:!0})&&(n.push(t),e=!0)}if(!e&&"LEFT"===s.type){const e={};for(const s of Object.keys(t[0]??{}))e[s]=null;n.push({...i,...e})}}if("RIGHT"===s.type)for(const i of t)if(!e.some(e=>o({...e,...i},s.on,{$col:!0}))){const t={};for(const s of Object.keys(e[0]??{}))t[s]=null;n.push({...t,...i})}return n}executeGroupBy(e,t){const s=new Map;for(const n of e){const e=t.groupBy.map(e=>String(n[e]??"null")).join("|");s.has(e)||s.set(e,[]),s.get(e).push(n)}const n=[];for(const e of s.values()){const s={};for(const n of t.groupBy)s[n]=e[0][n];for(const n of t.columns){if("*"===n)continue;const i=n.match(/^(COUNT|SUM|AVG|MIN|MAX)\((.+?)\)(?:\s+AS\s+(\w+))?$/i);if(i){const[,t,r,o]=i;s[o||n]=this.computeAggregate(t.toUpperCase(),e,r.trim())}else t.groupBy.includes(n)||(s[n]=e[0][n])}n.push(s)}return n}computeAggregate(e,t,s){const n=t.map(e=>e[s]).filter(e=>null!=e).map(Number);switch(e){case"COUNT":return"*"===s?t.length:n.length;case"SUM":return n.reduce((e,t)=>e+t,0);case"AVG":return 0===n.length?0:n.reduce((e,t)=>e+t,0)/n.length;case"MIN":return 0===n.length?0:Math.min(...n);case"MAX":return 0===n.length?0:Math.max(...n);default:return 0}}executeDistinct(e){const t=new Set;return e.filter(e=>{const s=Object.values(e).map(e=>String(e??"\0")).join("");return!t.has(s)&&(t.add(s),!0)})}async executeInsert(e){const t=await this.engine.getTableSchema(e.into);if(!t)throw new n(`Table "${e.into}" does not exist`,"TABLE_NOT_FOUND");const s=e.columns??Object.keys(t.columns),i=e.values.map(e=>{const t={};for(let n=0;n":"="===this.peekChar()?(this.readChar(),e=this.makeToken(R.GTE,">=")):e=this.makeToken(R.GT,">");break;case"<":"="===this.peekChar()?(this.readChar(),e=this.makeToken(R.LTE,"<=")):">"===this.peekChar()?(this.readChar(),e=this.makeToken(R.NEQ,"<>")):e=this.makeToken(R.LT,"<");break;case"'":case'"':e=this.readString(this.ch);break;case"":e={type:R.EOF,value:"",position:this.position};break;default:if(this.isLetter(this.ch)){const t=this.readIdentifier();return e={type:x[t.toUpperCase()]??R.IDENTIFIER,value:t,position:this.position-t.length},e}if(this.isDigit(this.ch)||"-"===this.ch&&this.isDigit(this.peekChar())){const t=this.readNumber();return e={type:R.NUMBER,value:t,position:this.position-t.length},e}e=this.makeToken(R.ILLEGAL,this.ch)}return this.readChar(),e}readChar(){this.readPosition>=this.input.length?this.ch="":this.ch=this.input[this.readPosition],this.position=this.readPosition,this.readPosition++}peekChar(){return this.readPosition>=this.input.length?"":this.input[this.readPosition]}skipWhitespace(){for(;" "===this.ch||"\t"===this.ch||"\n"===this.ch||"\r"===this.ch;)this.readChar()}readIdentifier(){const e=this.position;for(;this.isLetter(this.ch)||this.isDigit(this.ch)||"_"===this.ch;)this.readChar();return this.input.slice(e,this.position)}readNumber(){const e=this.position;for("-"===this.ch&&this.readChar();this.isDigit(this.ch);)this.readChar();if("."===this.ch&&this.isDigit(this.peekChar()))for(this.readChar();this.isDigit(this.ch);)this.readChar();return this.input.slice(e,this.position)}readString(e){const t=this.position+1;this.readChar();let s="";for(;this.ch!==e&&""!==this.ch;)"\\"===this.ch&&this.peekChar()===e?(this.readChar(),s+=e):s+=this.ch,this.readChar();return{type:R.STRING,value:s,position:t}}isLetter(e){return/[a-zA-Z_]/.test(e)}isDigit(e){return/[0-9]/.test(e)}makeToken(e,t){return{type:e,value:t,position:this.position}}}class O{constructor(e){this.lexer=new N(e),this.nextToken(),this.nextToken()}parseStatement(){switch(this.curToken.type){case R.SELECT:return this.parseSelect();case R.INSERT:return this.parseInsert();case R.UPDATE:return this.parseUpdate();case R.DELETE:return this.parseDelete();case R.CREATE:return this.parseCreateTable();case R.DROP:return this.parseDropTable();default:throw this.error(`Unexpected token "${this.curToken.value}"`)}}parseSelect(){this.expect(R.SELECT);let e=!1;this.curTokenIs(R.DISTINCT)&&(e=!0,this.nextToken());const t=[];this.curTokenIs(R.STAR)?(t.push("*"),this.nextToken()):t.push(...this.parseColumnList()),this.expect(R.FROM);const s=this.expectIdentifier("table name");let n;this.curTokenIs(R.AS)?(this.nextToken(),n=this.expectIdentifier("alias")):this.curToken.type!==R.IDENTIFIER||this._isReservedAfterFrom()||(n=this.curToken.value,this.nextToken());const i={type:"SELECT",columns:t,distinct:e||void 0,from:s,alias:n,where:{}},r=this.parseJoinClauses();return r.length>0&&(i.joins=r),this.curTokenIs(R.WHERE)&&(this.nextToken(),i.where=this.parseCondition()),this.curTokenIs(R.GROUP)&&(this.nextToken(),this.expect(R.BY),i.groupBy=this.parseIdentifierList()),this.curTokenIs(R.HAVING)&&(this.nextToken(),i.having=this.parseCondition()),this.curTokenIs(R.ORDER)&&(this.nextToken(),this.expect(R.BY),i.orderBy=this.parseOrderByList()),this.curTokenIs(R.LIMIT)&&(this.nextToken(),i.limit=this.expectNumber("LIMIT value")),this.curTokenIs(R.OFFSET)&&(this.nextToken(),i.offset=this.expectNumber("OFFSET value")),i}parseJoinClauses(){const e=[];for(;this._isJoinKeyword();)e.push(this.parseJoinClause());return e}_isJoinKeyword(){return this.curTokenIs(R.INNER)||this.curTokenIs(R.LEFT)||this.curTokenIs(R.RIGHT)||this.curTokenIs(R.CROSS)||this.curTokenIs(R.JOIN)}parseJoinClause(){let e="INNER";this.curTokenIs(R.INNER)?(e="INNER",this.nextToken()):this.curTokenIs(R.LEFT)?(e="LEFT",this.nextToken(),this.curTokenIs(R.OUTER)&&this.nextToken()):this.curTokenIs(R.RIGHT)?(e="RIGHT",this.nextToken(),this.curTokenIs(R.OUTER)&&this.nextToken()):this.curTokenIs(R.CROSS)&&(e="CROSS",this.nextToken()),this.expect(R.JOIN);const t=this.expectIdentifier("table name");let s;this.curTokenIs(R.AS)?(this.nextToken(),s=this.expectIdentifier("alias")):this.curToken.type!==R.IDENTIFIER||this._isJoinReserved()||(s=this.curToken.value,this.nextToken());let n={};return"CROSS"!==e&&this.curTokenIs(R.ON)&&(this.nextToken(),n=this.parseCondition()),{type:e,table:t,alias:s,on:n}}_isReservedAfterFrom(){return this.curTokenIs(R.WHERE)||this.curTokenIs(R.ORDER)||this.curTokenIs(R.LIMIT)||this.curTokenIs(R.OFFSET)||this.curTokenIs(R.GROUP)||this._isJoinKeyword()}_isJoinReserved(){return this.curTokenIs(R.ON)||this.curTokenIs(R.WHERE)||this.curTokenIs(R.ORDER)||this.curTokenIs(R.LIMIT)||this._isJoinKeyword()}parseInsert(){this.expect(R.INSERT),this.expect(R.INTO);const e=this.expectIdentifier("table name");let t;this.curTokenIs(R.LPAREN)&&(this.nextToken(),t=this.parseIdentifierList(),this.expect(R.RPAREN)),this.expect(R.VALUES);const s=[];do{this.curTokenIs(R.COMMA)&&this.nextToken(),this.expect(R.LPAREN);const e=this.parseValueList();this.expect(R.RPAREN),s.push(e)}while(this.curTokenIs(R.COMMA));return{type:"INSERT",into:e,columns:t,values:s}}parseUpdate(){this.expect(R.UPDATE);const e=this.expectIdentifier("table name");this.expect(R.SET);const t={};do{this.curTokenIs(R.COMMA)&&this.nextToken();const e=this.expectIdentifier("column name");this.expect(R.EQ),t[e]=this.parseValue()}while(this.curTokenIs(R.COMMA));let s={};return this.curTokenIs(R.WHERE)&&(this.nextToken(),s=this.parseCondition()),{type:"UPDATE",table:e,sets:t,where:s}}parseDelete(){this.expect(R.DELETE),this.expect(R.FROM);const e=this.expectIdentifier("table name");let t={};return this.curTokenIs(R.WHERE)&&(this.nextToken(),t=this.parseCondition()),{type:"DELETE",from:e,where:t}}parseCreateTable(){this.expect(R.CREATE),this.expect(R.TABLE);const e=this.expectIdentifier("table name");this.expect(R.LPAREN);const t=[];do{this.curTokenIs(R.COMMA)&&this.nextToken(),t.push(this.parseColumnDef())}while(this.curTokenIs(R.COMMA));return this.expect(R.RPAREN),{type:"CREATE_TABLE",name:e,columns:t}}parseColumnDef(){const e={name:this.expectIdentifier("column name"),type:this.expectIdentifier("column type").toLowerCase()};for(;this.curTokenIs(R.PRIMARY)||this.curTokenIs(R.UNIQUE)||this.curTokenIs(R.NOT)||this.curTokenIs(R.DEFAULT);)if(this.curTokenIs(R.PRIMARY))this.nextToken(),this.expect(R.KEY),e.primaryKey=!0;else if(this.curTokenIs(R.UNIQUE))this.nextToken(),e.unique=!0;else if(this.curTokenIs(R.NOT))this.nextToken(),this.expect(R.NULL),e.required=!0;else{if(!this.curTokenIs(R.DEFAULT))break;this.nextToken(),e.default=this.parseValue()}return e}parseDropTable(){return this.expect(R.DROP),this.expect(R.TABLE),{type:"DROP_TABLE",name:this.expectIdentifier("table name")}}parseCondition(){let e=this.parseSimpleCondition();for(;this.curTokenIs(R.AND)||this.curTokenIs(R.OR);){const t=this.curTokenIs(R.AND);this.nextToken();const s=this.parseSimpleCondition();e=t?{$and:[e,s]}:{$or:[e,s]}}return e}parseSimpleCondition(){if(this.curTokenIs(R.NOT))return this.nextToken(),{$not:this.parseSimpleCondition()};if(this.curTokenIs(R.LPAREN)){this.nextToken();const e=this.parseCondition();return this.expect(R.RPAREN),e}const e=this.parseColumnRef();if(this.curTokenIs(R.IDENTIFIER)&&"IS"===this.curToken.value.toUpperCase()){this.nextToken();const t=this.curTokenIs(R.NOT);t&&this.nextToken(),this.expect(R.NULL);const s={};return s[e]=t?{$ne:null}:{$eq:null},s}if(this.curTokenIs(R.LIKE)){this.nextToken();const t=this.parseValue(),s={};return s[e]={$like:t},s}if(this.curTokenIs(R.IN)){this.nextToken(),this.expect(R.LPAREN);const t=this.parseValueList();this.expect(R.RPAREN);const s={};return s[e]={$in:t},s}const t=this.parseComparisonOp();let s;s=(this.curToken.type===R.IDENTIFIER||this._isKeywordAsIdent())&&this.peekTokenIs(R.DOT)?{$col:this.parseColumnRef()}:this.parseValue();const n={};return n[e]={[t]:s},n}peekTokenIs(e){return this.peekToken.type===e}parseComparisonOp(){switch(this.curToken.type){case R.EQ:return this.nextToken(),"$eq";case R.NEQ:return this.nextToken(),"$ne";case R.GT:return this.nextToken(),"$gt";case R.GTE:return this.nextToken(),"$gte";case R.LT:return this.nextToken(),"$lt";case R.LTE:return this.nextToken(),"$lte";default:throw this.error(`Expected comparison operator, got "${this.curToken.value}"`)}}parseColumnList(){const e=[];for(e.push(this.parseColumnRef());this.curTokenIs(R.COMMA);)this.nextToken(),e.push(this.parseColumnRef());return e}parseColumnRef(){if(this.curTokenIs(R.COUNT)||this.curTokenIs(R.SUM)||this.curTokenIs(R.AVG)||this.curTokenIs(R.MIN)||this.curTokenIs(R.MAX))return this.parseAggregateCall();const e=this.expectIdentifier("column name");return this.curTokenIs(R.DOT)?(this.nextToken(),`${e}.${this.expectIdentifier("column name")}`):e}parseAggregateCall(){const e=this.curToken.value.toUpperCase();let t;this.nextToken(),this.expect(R.LPAREN),this.curTokenIs(R.STAR)?(t="*",this.nextToken()):t=this.parseColumnRef(),this.expect(R.RPAREN);let s="";return this.curTokenIs(R.AS)?(this.nextToken(),s=this.expectIdentifier("alias")):this.curToken.type===R.IDENTIFIER&&this._isAggregateAlias()&&(s=this.curToken.value,this.nextToken()),s?`${e}(${t}) AS ${s}`:`${e}(${t})`}_isAggregateAlias(){return!this._isReservedAfterFrom()&&!this._isJoinKeyword()}parseIdentifierList(){const e=[];for(e.push(this.expectIdentifier("identifier"));this.curTokenIs(R.COMMA);)this.nextToken(),e.push(this.expectIdentifier("identifier"));return e}parseValueList(){const e=[];for(e.push(this.parseValue());this.curTokenIs(R.COMMA);)this.nextToken(),e.push(this.parseValue());return e}parseOrderByList(){const e=[];for(e.push(this.parseOrderBy());this.curTokenIs(R.COMMA);)this.nextToken(),e.push(this.parseOrderBy());return e}parseOrderBy(){const e=this.expectIdentifier("column name");let t="asc";return this.curTokenIs(R.ASC)?this.nextToken():this.curTokenIs(R.DESC)&&(t="desc",this.nextToken()),{column:e,direction:t}}parseValue(){switch(this.curToken.type){case R.STRING:{const e=this.curToken.value;return this.nextToken(),e}case R.NUMBER:{const e=Number(this.curToken.value);return this.nextToken(),e}case R.TRUE:return this.nextToken(),!0;case R.FALSE:return this.nextToken(),!1;case R.NULL:return this.nextToken(),null;default:throw this.error(`Expected value, got "${this.curToken.value}"`)}}nextToken(){this.curToken=this.peekToken,this.peekToken=this.lexer.nextToken()}curTokenIs(e){return this.curToken.type===e}expect(e){if(!this.curTokenIs(e))throw this.error(`Expected ${e}, got "${this.curToken.value}"`);this.nextToken()}expectIdentifier(e){if(this.curToken.type===R.IDENTIFIER||this._isKeywordAsIdent()){const e=this.curToken.value;return this.nextToken(),e}throw this.error(`Expected ${e}, got "${this.curToken.value}"`)}_isKeywordAsIdent(){return this.curToken.type!==R.EOF&&this.curToken.type!==R.ILLEGAL&&this.curToken.type!==R.STRING&&this.curToken.type!==R.NUMBER&&this.curToken.type!==R.COMMA&&this.curToken.type!==R.LPAREN&&this.curToken.type!==R.RPAREN&&this.curToken.type!==R.SEMICOLON&&this.curToken.type!==R.EQ&&this.curToken.type!==R.NEQ&&this.curToken.type!==R.GT&&this.curToken.type!==R.GTE&&this.curToken.type!==R.LT&&this.curToken.type!==R.LTE&&this.curToken.type!==R.DOT&&this.curToken.type!==R.STAR}expectNumber(e){if(this.curToken.type===R.NUMBER){const e=Number(this.curToken.value);return this.nextToken(),e}throw this.error(`Expected ${e}, got "${this.curToken.value}"`)}error(e){return new n(`Parse error at position ${this.curToken.position}: ${e}`,"PARSE_ERROR")}}function C(e){return new O(e).parseStatement()}class A{constructor(e){this.tables=new Map,this.completed=!1,this.engine=e}table(e){let t=this.tables.get(e);return t||(t=new g(this.engine,e),this.tables.set(e,t)),t}_markCompleted(){this.completed=!0}isCompleted(){return this.completed}}class S{constructor(e){this.engine=e}async execute(e){const t=new A(this.engine);try{const s=await e(t);return t._markCompleted(),s}catch(e){if(e instanceof n)throw e;throw new n(`Transaction failed: ${e.message}`,"TRANSACTION_ERROR",e)}}}class D{constructor(){this.plugins=[],this.hooks=new Map}register(e){const t=e.priority??0,s=this.plugins.findIndex(e=>(e.priority??0)t.name===e);-1!==t&&(this.plugins[t].destroy(),this.plugins.splice(t,1))}getPlugins(){return[...this.plugins]}on(e,t){const s=this.hooks.get(e)??[];s.push(t),this.hooks.set(e,s)}off(e,t){const s=this.hooks.get(e);if(s){const e=s.indexOf(t);-1!==e&&s.splice(e,1)}}async trigger(e,...t){const s=this.hooks.get(e);if(s)for(const e of s)await e(...t)}destroy(){for(const e of this.plugins)try{e.destroy()}catch(e){}this.plugins=[],this.hooks.clear()}}class L{get version(){return this._version}constructor(e){this.ready=!1,this.tableCache=new Map,this.listeners=new Map,this.migrations=new Map,this.config=e,this.name=e.name??s.name,this.mode=e.mode??s.mode,this._version=e.version??s.version,this.pluginManager=new D}async init(){if(this.engine=this.createEngine(),await this.engine.open(this.name,this.version),this.executor=new I(this.engine),this.transactionManager=new S(this.engine),this.config.plugins)for(const e of this.config.plugins)this.pluginManager.register(e);this.ready=!0,this.config.onReady&&this.config.onReady(this)}isReady(){return this.ready}async defineTable(e,t){this.ensureReady();const s=k(e,t);await this.pluginManager.trigger("beforeCreateTable",s),await this.engine.createTable(s),await this.pluginManager.trigger("afterCreateTable",s),this.tableCache.delete(e)}table(e){this.ensureReady();let t=this.tableCache.get(e);return t||(t=new g(this.engine,e,this.executor),this.tableCache.set(e,t)),t}async dropTable(e){this.ensureReady(),await this.pluginManager.trigger("beforeDropTable",e),await this.engine.dropTable(e),await this.pluginManager.trigger("afterDropTable",e),this.tableCache.delete(e)}async getTableNames(){return this.ensureReady(),this.engine.getTableNames()}async query(e){this.ensureReady(),await this.pluginManager.trigger("beforeQuery",e);const t=C(e),s=await this.executor.execute(t);return await this.pluginManager.trigger("afterQuery",e,s),s}async transaction(e){this.ensureReady(),await this.pluginManager.trigger("beforeTransaction");const t=await this.transactionManager.execute(e);return await this.pluginManager.trigger("afterTransaction"),t}async exportTable(e){return this.ensureReady(),this.engine.find(e,{table:e})}async importTable(e,t){return this.ensureReady(),this.engine.insert(e,t)}async exportAll(){this.ensureReady();const e={},t=await this.engine.getTableNames();for(const s of t)e[s]=await this.engine.find(s,{table:s});return e}subscribe(e,t){const s=`change:${e}`;return this.listeners.has(s)||this.listeners.set(s,new Set),this.listeners.get(s).add(t),()=>this.listeners.get(s)?.delete(t)}emit(e,t){const s=`change:${e}`;this.listeners.get(s)?.forEach(e=>e(t))}addMigration(e,t){this.migrations.set(e,t)}async migrateTo(e){this.ensureReady();for(const[t,s]of[...this.migrations.entries()].sort((e,t)=>e[0]-t[0]))t<=e&&t>this.version&&(await s(this),this._version=t)}getPluginManager(){return this.pluginManager}on(e,t){this.pluginManager.on(e,t)}async close(){this.pluginManager.destroy(),await this.engine.close(),this.tableCache.clear(),this.ready=!1}getEngine(){return this.engine}createEngine(){const e=this.mode,t=this.config.diskEngine??"indexeddb";switch(e){case"memory":return new T;case"disk":return"opfs"===t?new d:new p;case"hybrid":return new m(t);default:throw new n(`Unknown storage mode: ${e}`,"CONFIG_ERROR")}}ensureReady(){if(!this.ready)throw new n("Database not initialized. Call await db.init() first.","DB_NOT_READY")}}async function M(e){const t=new L(e);return await t.init(),t}const _={VERSION:i,version:i,create:M,MetonaSqlark:L,MeSqlark:L};"undefined"!=typeof window&&(window.MetonaSqlark=_,window.MeSqlark=_);const $=L;e.HybridEngine=m,e.IndexedDBEngine=p,e.MeSqlark=$,e.MemoryEngine=T,e.MetonaSqlark=L,e.OPFSEngine=d,e.Table=g,e.VERSION=i,e.api=_,e.create=M,e.default=_,e.parse=C,e.tokenize=function(e){const t=new N(e),s=[];let n=t.nextToken();for(;n.type!==R.EOF;)s.push(n),n=t.nextToken();return s.push(n),s},Object.defineProperty(e,"__esModule",{value:!0})});
diff --git a/package.json b/package.json
index a402b08..27a9692 100644
--- a/package.json
+++ b/package.json
@@ -34,7 +34,7 @@
},
"repository": {
"type": "git",
- "url": "git+https://git.metona.cn/MetonaTeam/metona-sqlark.git"
+ "url": "git+https://git.metona.cn/MetonaTeam/MetonaSqlark.git"
},
"keywords": [
"database",
@@ -49,9 +49,9 @@
"author": "thzxx",
"license": "MIT",
"bugs": {
- "url": "https://git.metona.cn/MetonaTeam/metona-sqlark/issues"
+ "url": "https://git.metona.cn/MetonaTeam/MetonaSqlark/issues"
},
- "homepage": "https://git.metona.cn/MetonaTeam/metona-sqlark#readme",
+ "homepage": "https://git.metona.cn/MetonaTeam/MetonaSqlark#readme",
"devDependencies": {
"@babel/core": "^7.22.0",
"@babel/plugin-transform-modules-commonjs": "^7.22.0",
diff --git a/site/demo.html b/site/demo.html
index 0847597..6e3f3df 100644
--- a/site/demo.html
+++ b/site/demo.html
@@ -3,7 +3,7 @@
-在线演示 — metona-sqlark
+在线演示 — MetonaSqlark