Lines 1-35javascript
1// packages/core/src/storage/index-db.ts
2// 用 createRequire 绕过 Vite 静态分析:`import { DatabaseSync } from "node:sqlite"`
3// 在 vitest 2.x 下会被 Vite resolver 拦截,报 `Failed to load url sqlite`
4// (stripping `node:` prefix)。createRequire 在运行时调用,Vite 无法静态解析,
5// 直接走 Node builtin resolver —— 同 test/storage/node-sqlite-smoke.test.ts 的 workaround。
7// 字符串拼接 `"node:" + "sqlite"` 进一步防止 Vite 把整个 require 调用静态化为
8// bare import 解析。type import 在编译时被擦除,不被 resolver 拦截,可以安全使用。
10// Schema 以内联 TS 字符串形式注入(而非 `index-db-schema.sql` 外部文件),
11// 避免 tsc 不会复制非 .ts 资源导致 dist 缺 schema 的 build-defect(曾使
12// 0.2.0 sqlite 默认在 npm 部署后静默 fallback 到 memory)。
13import { createRequire } from "node:module";
14import { decodeCursor } from "./index-db-cursor.js";
15import { internalError } from "../tools/error-schema.js";
16const require = createRequire(import.meta.url);
17const SQLITE_MODULE = "node:" + "sqlite";
MediumDynamic Require
Package source references dynamic require/import behavior.
dist/storage/index-db.jsView on unpkg · L15 18const sqliteModule = require(SQLITE_MODULE);
19const DatabaseSync = sqliteModule.DatabaseSync;
21 * 派生 SQLite 索引库的 schema 定义。
23 * 内联在此处而非外部 .sql 文件,确保 tsc emit 后 dist/ 自包含、无需额外资源复制步骤。
25 * 版本化:SCHEMA_VERSION 写入 schema_version 表。open() 时若磁盘版本与代码版本不符,
26 * 全量 DROP 后重建。SQLite 是纯派生数据(.md 文件才是真理源),DROP 后 cold-start
27 * rebuild 会在单个 transaction 里从 .md 灌回,语义上等价于"清缓存"。
28 * 这避免了 ALTER TABLE 增量迁移的复杂度与兼容包袱。
31-- 主表:engram 元数据 + DigestLine 完整投影
32CREATE TABLE IF NOT EXISTS engrams (