fix(javascript): recover configuration file reads from fs/promises (#8446)

* fix(javascript): recover configuration file reads from fs/promises

* fix(javascript): disallow nonexistent readFileSync on fs/promises

---------

Co-authored-by: Tawhidul Islam <276017696+FhDBro@users.noreply.github.com>
This commit is contained in:
Tawhidul IslamandTawhidul Islam authored and GitHub committed 2026-11-04 19:23:52 +08:00
1 parent 4910e149ad
commit 703c11c90f
2 files changed
+65 -5

No files matched your search

@@ -677,3 +677,58 @@ it("retains an earlier captured function after its object method is replaced", (
{ kind: "acquire", method: "open" },
]);
});
it.each([
"import { readFile } from 'node:fs/promises'; readFile('config.json');",
"import fs from 'node:fs/promises'; fs.readFile('config.json');",
"import fs from 'node:fs'; fs.promises.readFile('config.json');",
"const { readFile } = require('fs/promises'); readFile('config.json');",
"const fsp = require('node:fs/promises'); fsp.readFile('config.json');",
"const fs = require('node:fs'); fs.promises.readFile('config.json');",
])(
"recovers configuration file reads from promise-based fs APIs: %s",
(source) => {
const ir = analyzeCommonJsSemanticFixture(source);
expect(ir.configurationOperations).toMatchObject([
{
kind: "file",
key: "config.json",
resolution: "complete",
},
]);
},
);
it("recovers partial configuration file reads from promise-based fs APIs with dynamic path", () => {
const ir = analyzeCommonJsSemanticFixture(
"import { readFile } from 'node:fs/promises'; readFile(getConfigPath());",
);
expect(ir.configurationOperations).toMatchObject([
{
kind: "file",
key: null,
resolution: "partial",
},
]);
});
it("invalidates promise-based configuration file reads after mutation", () => {
const ir = analyzeCommonJsSemanticFixture(
"const fs = require('fs'); fs.promises.readFile = custom; const fsp = require('fs/promises'); fsp.readFile('wrong');",
);
expect(ir.configurationOperations).toEqual([]);
});
it.each([
"const { readFileSync } = require('fs/promises'); readFileSync('config.json');",
"const { readFileSync } = require('node:fs/promises'); readFileSync('config.json');",
"import { readFileSync } from 'node:fs/promises'; readFileSync('config.json');",
"import fs from 'node:fs/promises'; fs.readFileSync('config.json');",
"const fs = require('node:fs'); fs.promises.readFileSync('config.json');",
])(
"does not treat nonexistent readFileSync on promise-based fs as configuration read: %s",
(source) => {
const ir = analyzeCommonJsSemanticFixture(source);
expect(ir.configurationOperations).toEqual([]);
},
);