diff --git a/scripts/dev-runner-paths.mjs b/scripts/dev-runner-paths.mjs new file mode 100644 index 00000000..274be549 --- /dev/null +++ b/scripts/dev-runner-paths.mjs @@ -0,0 +1,35 @@ +const testDirectoryNames = new Set([ + "__tests__", + "_tests", + "test", + "tests", +]); + +const ignoredTestConfigBasenames = new Set([ + "jest.config.cjs", + "jest.config.js", + "jest.config.mjs", + "jest.config.ts", + "playwright.config.ts", + "vitest.config.ts", +]); + +export function shouldTrackDevServerPath(relativePath) { + const normalizedPath = String(relativePath).replaceAll("\\", "/").replace(/^\.\/+/, ""); + if (normalizedPath.length === 0) return false; + + const segments = normalizedPath.split("/"); + const basename = segments.at(-1) ?? normalizedPath; + + if (ignoredTestConfigBasenames.has(basename)) { + return false; + } + if (segments.some((segment) => testDirectoryNames.has(segment))) { + return false; + } + if (/\.(test|spec)\.[^/]+$/i.test(basename)) { + return false; + } + + return true; +} diff --git a/scripts/dev-runner.mjs b/scripts/dev-runner.mjs index 7e13efef..091dbb19 100644 --- a/scripts/dev-runner.mjs +++ b/scripts/dev-runner.mjs @@ -5,6 +5,7 @@ import path from "node:path"; import { createInterface } from "node:readline/promises"; import { stdin, stdout } from "node:process"; import { fileURLToPath } from "node:url"; +import { shouldTrackDevServerPath } from "./dev-runner-paths.mjs"; const mode = process.argv[2] === "watch" ? "watch" : "dev"; const cliArgs = process.argv.slice(3); @@ -164,6 +165,7 @@ function readSignature(absolutePath) { function addFileToSnapshot(snapshot, absolutePath) { const relativePath = toRelativePath(absolutePath); if (ignoredRelativePaths.has(relativePath)) return; + if (!shouldTrackDevServerPath(relativePath)) return; snapshot.set(relativePath, readSignature(absolutePath)); } diff --git a/server/src/__tests__/dev-runner-paths.test.ts b/server/src/__tests__/dev-runner-paths.test.ts new file mode 100644 index 00000000..76b35203 --- /dev/null +++ b/server/src/__tests__/dev-runner-paths.test.ts @@ -0,0 +1,20 @@ +import { describe, expect, it } from "vitest"; +import { shouldTrackDevServerPath } from "../../../scripts/dev-runner-paths.mjs"; + +describe("shouldTrackDevServerPath", () => { + it("ignores common test file paths", () => { + expect(shouldTrackDevServerPath("server/src/__tests__/health.test.ts")).toBe(false); + expect(shouldTrackDevServerPath("packages/shared/src/lib/foo.test.ts")).toBe(false); + expect(shouldTrackDevServerPath("packages/shared/src/lib/foo.spec.tsx")).toBe(false); + expect(shouldTrackDevServerPath("packages/shared/_tests/helpers.ts")).toBe(false); + expect(shouldTrackDevServerPath("packages/shared/tests/helpers.ts")).toBe(false); + expect(shouldTrackDevServerPath("packages/shared/test/helpers.ts")).toBe(false); + expect(shouldTrackDevServerPath("vitest.config.ts")).toBe(false); + }); + + it("keeps runtime paths restart-relevant", () => { + expect(shouldTrackDevServerPath("server/src/routes/health.ts")).toBe(true); + expect(shouldTrackDevServerPath("packages/shared/src/index.ts")).toBe(true); + expect(shouldTrackDevServerPath("server/src/testing/runtime.ts")).toBe(true); + }); +});