用户报告"站点演示失败了",实测复现并定位根因: - 现象:直接双击 site/demo.html(file://)→ 点「🌲 Aria」→ "❌ 数据库初始化失败: Failed to open AriaEngine database "demo""(Memory 正常)。 - 根因:file:// 属不透明来源,Chromium 拒绝 navigator.storage.getDirectory() 并抛 SecurityError;此时 isSecureContext 仍为 true、API 也存在,无法提前探测。 引擎把它包成 ARIA_OPEN_ERROR 时丢掉了底层错误 → 消息对用户不可操作。 - 修复:OPFSBackend.open() 显式检查并抛 ARIA_OPFS_UNAVAILABLE,消息给出两条出路 (用 http(s) 打开 / 改用 mode:'memory'),原始 SecurityError 挂 cause; site/demo.html 额外用中文说明"为什么失败 + 怎么修"。 顺带修掉一个更普遍的问题:DatabaseError 的第三个参数只进 details,err.cause 恒为 undefined,而文档/注释多处写"底层错误作为 cause 保留"。现在两者都成立 (details 语义不变;cause 声明为公开字段并接入标准错误链)。 站点版本同步:demo.html(title / 状态栏 / SQL 预置脚本 / console 日志)与 benchmark.html(title)此前仍是 v0.7.4(日志甚至是 v0.4.2)→ 统一 v0.8.0; docs.html 的 AriaEngine 版本演进列表补上 v0.8.0 条目、错误码表补 ARIA_OPFS_UNAVAILABLE;README 补"OPFS 需要 http(s) 页面"的浏览器兼容说明。 回归与门禁:tests/engine/aria-opfs-unavailable.test.ts(5 项,含正常环境正控); 变异 R19 / R20 均被拦住(总计 42/42);93 套件 / 1985 用例;覆盖率 90.59 / 82.61 / 94.14 / 93.50(阈值 90/82/94/93);e2e 14/14;lint + 两份 tsc 干净; dist 重建(251,731 B / gzip 63,431 B)并已同步全部体积宣称。
63 lines
2.6 KiB
JavaScript
63 lines
2.6 KiB
JavaScript
module.exports = {
|
||
testEnvironment: 'jsdom',
|
||
setupFiles: ['./jest.setup.js'],
|
||
transform: {
|
||
'^.+\\.ts$': 'babel-jest',
|
||
},
|
||
transformIgnorePatterns: [
|
||
'/node_modules/(?!(@rollup)/)',
|
||
],
|
||
moduleFileExtensions: ['ts', 'js', 'json'],
|
||
// 默认 testMatch 不会发现 __tests__ 之外、名为 helpers/ 目录里的 .test.ts 文件,
|
||
// 因此显式声明匹配规则(v0.8.0:测试基座自身的自测放在 tests/helpers/ 下)。
|
||
testMatch: ['**/*.test.ts'],
|
||
// Playwright e2e(tests/e2e/)不属于 jest 单元测试
|
||
testPathIgnorePatterns: [
|
||
'/node_modules/',
|
||
'/tests/e2e/',
|
||
],
|
||
//
|
||
// v0.8.0 覆盖率口径修正(根治):
|
||
//
|
||
// 此前为 `'!src/**/index.ts'` —— 这条 glob 把 15 个文件整体排除,其中包含
|
||
// src/engine/aria/index.ts(AriaEngine 主实现 2282 行)、src/engine/kvstore/index.ts
|
||
// (KVStore 本体)、src/hybrid/index.ts、src/migration/index.ts 等**实现文件**,
|
||
// 而非桶文件。后果:发布的"90.1% 行覆盖率"只在约 75% 的可执行源码上成立,
|
||
// 且 v0.2.6 曾在 CHANGELOG 里承认过同类问题("91.0% 为排除 Aria 模块的陈旧数据")
|
||
// 后又在 v0.5.1 以另一种写法复发。
|
||
//
|
||
// 现在只排除**确实没有可执行语句**的文件(纯类型声明),并且逐个显式列出、
|
||
// 附理由 —— 新增文件默认纳入统计,不会再被 glob 静默吞掉。
|
||
//
|
||
collectCoverageFrom: [
|
||
'src/**/*.ts',
|
||
// 纯类型声明:可执行语句 0 行(接口/类型别名),纳入统计只会稀释分母
|
||
'!src/engine/interface.ts',
|
||
'!src/query/ast.ts',
|
||
],
|
||
coverageDirectory: 'coverage',
|
||
coverageReporters: ['text', 'lcov'],
|
||
//
|
||
// v0.8.0 覆盖率门禁(此前完全不存在:jest.config 与 CI 都没有任何阈值,
|
||
// 覆盖率从 90% 掉到 60% 也全绿)。
|
||
//
|
||
// 阈值 = 在**修正口径后**(不再排除实现文件)实测的真实基线,下取整到整数百分点。
|
||
// 历史基线(2026-08-15):Statements 90.66% / Branches 82.94% / Functions 94.36% / Lines 93.43%
|
||
// v0.8.0 收尾实测(2026-09-15,1985 用例):Statements 90.59% / Branches 82.61% /
|
||
// Functions 94.14% / Lines 93.50%
|
||
//
|
||
coverageThreshold: {
|
||
global: {
|
||
statements: 90,
|
||
branches: 82,
|
||
functions: 94,
|
||
lines: 93,
|
||
},
|
||
},
|
||
verbose: true,
|
||
// 注意:forceExit 会掩盖句柄/定时器泄漏。v0.8.0 保留它以便常规开发快速迭代,
|
||
// 但新增了独立的 `npm run test:leaks`(--detectOpenHandles 且不 forceExit)用于泄漏检查。
|
||
forceExit: true,
|
||
testTimeout: 15000,
|
||
};
|