diff --git a/.changeset/nextjs-manifest-fingerprint.md b/.changeset/nextjs-manifest-fingerprint.md new file mode 100644 index 000000000..c470775b8 --- /dev/null +++ b/.changeset/nextjs-manifest-fingerprint.md @@ -0,0 +1,5 @@ +--- +"oxlint-plugin-react-doctor": patch +--- + +Cache Next.js async dynamic API diagnostics against the owning package manifest. diff --git a/packages/oxlint-plugin-react-doctor/src/plugin/cross-file-dependencies.test.ts b/packages/oxlint-plugin-react-doctor/src/plugin/cross-file-dependencies.test.ts index 15623b409..9f8fcbf51 100644 --- a/packages/oxlint-plugin-react-doctor/src/plugin/cross-file-dependencies.test.ts +++ b/packages/oxlint-plugin-react-doctor/src/plugin/cross-file-dependencies.test.ts @@ -326,6 +326,30 @@ describe("forwarded Hook dependency collectors", () => { }); describe("nextjs collectors", () => { + it("records the owning package manifest for the async dynamic API wrapper gate", () => { + writeFixtureFile( + "package.json", + `{ "dependencies": { "next": "^15.0.0", "react": "^19.0.0" } }\n`, + ); + const pagePath = writeFixtureFile( + "app/page.tsx", + `import { cookies } from "next/headers"; +export default function Page() { + return cookies().get("session"); +} +`, + ); + + for (const trace of [ + collectFor(pagePath, ["nextjs-async-dynamic-api-not-awaited"]), + collectFor(pagePath, ["nextjs-async-dynamic-api-not-awaited"]), + ]) { + expect(trace).not.toBeNull(); + expect(trace?.contentPaths.has(fixturePath("package.json"))).toBe(true); + expect(trace?.existencePaths.has(fixturePath("app/package.json"))).toBe(true); + } + }); + it("records ancestor layout probes for a page file only", () => { writeFixtureFile("app/layout.tsx", "export default ({ children }) => children;\n"); const pagePath = writeFixtureFile("app/products/page.tsx", "export default () =>
;\n"); diff --git a/packages/oxlint-plugin-react-doctor/src/plugin/cross-file-dependencies.ts b/packages/oxlint-plugin-react-doctor/src/plugin/cross-file-dependencies.ts index bb8861002..467e52547 100644 --- a/packages/oxlint-plugin-react-doctor/src/plugin/cross-file-dependencies.ts +++ b/packages/oxlint-plugin-react-doctor/src/plugin/cross-file-dependencies.ts @@ -427,6 +427,7 @@ export const CROSS_FILE_DEPENDENCY_COLLECTORS: ReadonlyMap