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, };