import { existsSync } from "node:fs"; import path from "node:path"; import { pathToFileURL } from "node:url"; import { describe, expect, it } from "vitest"; import { resolveRepoRoot } from "../../scripts/lib/ts-guard-utils.mjs"; /** * Regression tests for resolveRepoRoot(). * * The original implementation went up exactly two levels from the caller's * import.meta.url, which broke for scripts at scripts/*.mjs (one level below * root) — it overshot to the repo's parent directory. */ describe("resolveRepoRoot", () => { it("resolves correctly from a scripts/lib/*.mjs path (two levels below root)", () => { const fakeUrl = pathToFileURL(path.resolve("scripts", "lib", "some-guard-utils.mjs")).href; const root = resolveRepoRoot(fakeUrl); expect(existsSync(path.join(root, ".git"))).toBe(true); expect(existsSync(path.join(root, "package.json"))).toBe(true); }); it("resolves correctly from a scripts/*.mjs path (one level below root)", () => { const fakeUrl = pathToFileURL(path.resolve("scripts", "check-no-raw-channel-fetch.mjs")).href; const root = resolveRepoRoot(fakeUrl); expect(existsSync(path.join(root, ".git"))).toBe(true); expect(existsSync(path.join(root, "package.json"))).toBe(true); }); it("resolves correctly from a deeply nested extension path", () => { const fakeUrl = pathToFileURL( path.resolve("extensions", "qqbot", "src", "utils", "hypothetical.mjs"), ).href; const root = resolveRepoRoot(fakeUrl); expect(existsSync(path.join(root, ".git"))).toBe(true); expect(existsSync(path.join(root, "package.json"))).toBe(true); }); it("all caller depths resolve to the same root", () => { const fromLib = resolveRepoRoot(pathToFileURL(path.resolve("scripts", "lib", "a.mjs")).href); const fromScripts = resolveRepoRoot(pathToFileURL(path.resolve("scripts", "b.mjs")).href); const fromExtension = resolveRepoRoot( pathToFileURL(path.resolve("extensions", "qqbot", "c.mjs")).href, ); expect(fromLib).toBe(fromScripts); expect(fromScripts).toBe(fromExtension); }); });