/**
 * Jest 配置 — CI 防漂移测试用。
 *
 * 测试目录:`tests/` (跟 src 平行,不混进 nest build 产物)
 *
 * 跑:
 *   pnpm test                       # 全跑
 *   pnpm test -- canonical-fact     # 只跑文件名含 canonical-fact 的
 *
 * 测试范围(CI 防漂移,canonical-fact-layer §二 闸 4):
 *   - FactType enum / FactContentSchemas / canonical-codes 一致性
 *   - data/<host>/assemblers/*.yaml enum_mapping 目标在 canonical-codes 闭集
 *   - data/<host>/assemblers/*.yaml emits.action/subjectType 在 Action/SubjectType enum
 */
module.exports = {
  rootDir: '.',
  preset: 'ts-jest',
  testEnvironment: 'node',
  testMatch: ['<rootDir>/tests/**/*.spec.ts'],
  moduleFileExtensions: ['ts', 'js', 'json'],
  moduleNameMapper: {
    '^@pac/types$': '<rootDir>/../../packages/types/src/index.ts',
    '^@pac/types/(.*)$': '<rootDir>/../../packages/types/src/$1',
  },
  transform: {
    /**
     * 🔴 `isolatedModules: true` —— **jest 不再做类型检查**,只做转译。
     *
     * ── 为什么(2026-08-06 实测)────────────────────────────────────
     * 默认 ts-jest 会在**每个 worker 里各跑一个完整的 TypeScript program**,
     * 而 `@pac/types` 在下面被映射到**源码**,于是每个 worker 都要把整个 types 包
     * 连同 src 一起类型检查一遍。16 核机器上 jest 默认开 15 个 worker,
     * 实测:15 个进程 × ~250MB,每个 75~100% CPU,**整机 16 核吃满**。
     *
     * 实测对比(同为热缓存,同一台 16 核 / 16GB):
     *   默认               27.8s  /  CPU 时间 251s
     *   +isolatedModules   ~10s
     *   +maxWorkers 50%     6.9s  /  CPU 时间 43s    ← 现在这套
     * 墙钟 4 倍,**CPU 时间 5.8 倍** —— 后者才是"跑测试时电脑卡"的直接原因。
     *
     * ⚠️⚠️ **代价:类型错误不会再让 jest 变红。**
     *   类型安全**只能**靠单独那一趟:
     *     pnpm exec tsc --noEmit -p tsconfig.typecheck.json
     *   ⛔ 谁要把这一趟从流程里去掉,必须先把这里改回来 —— 否则两道闸同时没了。
     *   (那份 typecheck 配置本身就是为"tests/ 从来没被类型检查过"补的,见其注释。)
     */
    /**
     * ⚠️ ts-jest 会提示「isolatedModules 已废弃,请写到 tsconfig 里」—— **这里不能照做**。
     *   `apps/pac-service/tsconfig.json` 明确把 `isolatedModules` 设成了 **false**
     *   (它同时是 nest build / swc 用的那份,那个 flag 会限制 const enum 等写法),
     *   ts-jest 读到 false 就退回全量类型检查。
     *   实测(2026-08-06):按提示挪进 tsconfig 后 → 18.1s / CPU 165s;
     *   保留在这里 → **6.0s / CPU 43s**。⇒ 以实测为准,留在这里,忍受那条 WARN。
     * ⛔ 想消 WARN 的话别去动 tsconfig 的 isolatedModules —— 那会改到编译产物。
     */
    '^.+\\.ts$': ['ts-jest', { tsconfig: '<rootDir>/tsconfig.json', isolatedModules: true }],
  },
  /**
   * ⚠️ 默认是 `cores - 1`(16 核 → 15 个 worker),本地开发时**整机没有余量**:
   * 还并行跑着 nest --watch、next dev、docker 里的 Postgres/Redis。
   * 50% 让出一半的核,墙钟只慢一点点,但机器还能用。
   * ⚠️ CI 上单独跑没有别的负载,可以用 `--maxWorkers=100%` 覆盖回来。
   */
  maxWorkers: '50%',
};
