import { readdirSync, readFileSync } from 'node:fs';
import { join } from 'node:path';

/**
 * `.swcrc` 的 exclude 必须是**锚定**正则。
 *
 * 踩过的坑:原本写成 `["node_modules", "dist"]`,看着像目录名,实际 swc 当**正则**去匹配
 * 整个文件路径 —— 于是新加的 `priority-distribution.service.ts` 因为文件名里含 "dist"
 * 被静默跳过。271 个源文件只编译出 270 个,swc **不报任何错**
 * ("Successfully compiled: 270 files"),直到进程启动才
 * `Cannot find module './priority-distribution.service'`。
 *
 * 同类地雷:任何文件名撞上 dist / node_modules 子串的都会中招(distinct、distance、
 * district、redistribute…)。而且只在 swc 构建路径(dev / `--builder swc`)复现,
 * `nest build` 走 tsc 一切正常 —— 两边表现不一致,极难排查。
 */
describe('.swcrc exclude 必须锚定', () => {
  const root = join(__dirname, '..');
  const swcrc = JSON.parse(readFileSync(join(root, '.swcrc'), 'utf8')) as { exclude?: string[] };
  const patterns = (swcrc.exclude ?? []).map((p) => new RegExp(p));

  test('⭐ 每条 exclude 都以 ^ 开头(否则会误伤文件名含该子串的源文件)', () => {
    const unanchored = (swcrc.exclude ?? []).filter((p) => !p.startsWith('^'));
    expect(unanchored).toEqual([]);
  });

  test('⭐ 现有源文件一个都不会被 exclude 误伤', () => {
    const files: string[] = [];
    const walk = (rel: string) => {
      for (const e of readdirSync(join(root, rel), { withFileTypes: true })) {
        const p = `${rel}/${e.name}`;
        if (e.isDirectory()) walk(p);
        else if (e.name.endsWith('.ts')) files.push(p);
      }
    };
    walk('src');
    const hit = files.filter((f) => patterns.some((re) => re.test(f)));
    expect(hit).toEqual([]);
  });
});
