Handle module node found error reporting in incremental and watch scneario (#54115)

This commit is contained in:
Sheetal Nandi
2023-05-09 13:42:26 -07:00
committed by GitHub
parent a4009a335a
commit 8b825f7aaa
16 changed files with 10019 additions and 116 deletions

View File

@@ -110,6 +110,7 @@ import "./unittests/tsc/forceConsistentCasingInFileNames";
import "./unittests/tsc/incremental";
import "./unittests/tsc/libraryResolution";
import "./unittests/tsc/listFilesOnly";
import "./unittests/tsc/moduleResolution";
import "./unittests/tsc/projectReferences";
import "./unittests/tsc/projectReferencesConfig";
import "./unittests/tsc/redirect";

View File

@@ -0,0 +1,85 @@
import { dedent } from "../../_namespaces/Utils";
import { FsContents } from "./contents";
import { libFile } from "./virtualFileSystemWithWatch";
export function getFsConentsForNode10ResultAtTypesPackageJson(packageName: string, addTypesCondition: boolean) {
return JSON.stringify({
name: `@types/${packageName}`,
version: "1.0.0",
types: "index.d.ts",
exports: {
".": {
...(addTypesCondition ? { types: "./index.d.ts" } : {}),
require: "./index.d.ts"
}
}
}, undefined, " ");
}
export function getFsContentsForNode10ResultPackageJson(packageName: string, addTypes: boolean, addTypesCondition: boolean) {
return JSON.stringify({
name: packageName,
version: "1.0.0",
main: "index.js",
...(addTypes ? { types: "index.d.ts" } : {}),
exports: {
".": {
...(addTypesCondition ? { types: "./index.d.ts" } : {}),
import: "./index.mjs",
require: "./index.js"
}
}
}, undefined, " ");
}
export function getFsContentsForNode10ResultDts(packageName: string) {
return `export declare const ${packageName}: number;`;
}
function js(packageName: string) {
return `module.exports = { ${packageName}: 1 };`;
}
function mjs(packageName: string) {
return `export const ${packageName} = 1;`;
}
export function getFsContentsForNode10Result(): FsContents {
return {
"/home/src/projects/project/node_modules/@types/bar/package.json": getFsConentsForNode10ResultAtTypesPackageJson("bar", /*addTypesCondition*/ false),
"/home/src/projects/project/node_modules/@types/bar/index.d.ts": getFsContentsForNode10ResultDts("bar"),
"/home/src/projects/project/node_modules/bar/package.json": getFsContentsForNode10ResultPackageJson("bar", /*addTypes*/ false, /*addTypesCondition*/ false),
"/home/src/projects/project/node_modules/bar/index.js": js("bar"),
"/home/src/projects/project/node_modules/bar/index.mjs": mjs("bar"),
"/home/src/projects/project/node_modules/foo/package.json": getFsContentsForNode10ResultPackageJson("foo", /*addTypes*/ true, /*addTypesCondition*/ false),
"/home/src/projects/project/node_modules/foo/index.js": js("foo"),
"/home/src/projects/project/node_modules/foo/index.mjs": mjs("foo"),
"/home/src/projects/project/node_modules/foo/index.d.ts": getFsContentsForNode10ResultDts("foo"),
"/home/src/projects/project/node_modules/@types/bar2/package.json": getFsConentsForNode10ResultAtTypesPackageJson("bar2", /*addTypesCondition*/ true),
"/home/src/projects/project/node_modules/@types/bar2/index.d.ts": getFsContentsForNode10ResultDts("bar2"),
"/home/src/projects/project/node_modules/bar2/package.json": getFsContentsForNode10ResultPackageJson("bar2", /*addTypes*/ false, /*addTypesCondition*/ false),
"/home/src/projects/project/node_modules/bar2/index.js": js("bar2"),
"/home/src/projects/project/node_modules/bar2/index.mjs": mjs("bar2"),
"/home/src/projects/project/node_modules/foo2/package.json": getFsContentsForNode10ResultPackageJson("foo2", /*addTypes*/ true, /*addTypesCondition*/ true),
"/home/src/projects/project/node_modules/foo2/index.js": js("foo2"),
"/home/src/projects/project/node_modules/foo2/index.mjs": mjs("foo2"),
"/home/src/projects/project/node_modules/foo2/index.d.ts": getFsContentsForNode10ResultDts("foo2"),
"/home/src/projects/project/index.mts": dedent`
import { foo } from "foo";
import { bar } from "bar";
import { foo2 } from "foo2";
import { bar2 } from "bar2";
`,
"/home/src/projects/project/tsconfig.json": JSON.stringify({
compilerOptions: {
moduleResolution: "node16",
traceResolution: true,
incremental: true,
strict: true,
types: [],
},
files: ["index.mts"]
}),
[libFile.path]: libFile.content,
};
}

View File

@@ -0,0 +1,63 @@
import { getFsConentsForNode10ResultAtTypesPackageJson, getFsContentsForNode10Result, getFsContentsForNode10ResultDts, getFsContentsForNode10ResultPackageJson } from "../helpers/node10Result";
import { verifyTsc } from "../helpers/tsc";
import { loadProjectFromFiles } from "../helpers/vfs";
describe("unittests:: tsc:: moduleResolution::", () => {
verifyTsc({
scenario: "moduleResolution",
subScenario: "node10Result",
fs: () => loadProjectFromFiles(getFsContentsForNode10Result()),
commandLineArgs: ["-p", "/home/src/projects/project"],
baselinePrograms: true,
edits: [
{
caption: "delete the node10Result in @types",
edit: fs => fs.unlinkSync("/home/src/projects/project/node_modules/@types/bar/index.d.ts"),
},
{
caption: "delete the ndoe10Result in package/types",
edit: fs => fs.unlinkSync("/home/src/projects/project/node_modules/foo/index.d.ts"),
},
{
caption: "add the node10Result in @types",
edit: fs => fs.writeFileSync("/home/src/projects/project/node_modules/@types/bar/index.d.ts", getFsContentsForNode10ResultDts("bar")),
},
{
caption: "add the ndoe10Result in package/types",
edit: fs => fs.writeFileSync("/home/src/projects/project/node_modules/foo/index.d.ts", getFsContentsForNode10ResultDts("foo")),
},
{
caption: "update package.json from @types so error is fixed",
edit: fs => fs.writeFileSync("/home/src/projects/project/node_modules/@types/bar/package.json", getFsConentsForNode10ResultAtTypesPackageJson("bar", /*addTypesCondition*/ true)),
},
{
caption: "update package.json so error is fixed",
edit: fs => fs.writeFileSync("/home/src/projects/project/node_modules/foo/package.json", getFsContentsForNode10ResultPackageJson("foo", /*addTypes*/ true, /*addTypesCondition*/ true)),
},
{
caption: "update package.json from @types so error is introduced",
edit: fs => fs.writeFileSync("/home/src/projects/project/node_modules/@types/bar2/package.json", getFsConentsForNode10ResultAtTypesPackageJson("bar2", /*addTypesCondition*/ false)),
},
{
caption: "update package.json so error is introduced",
edit: fs => fs.writeFileSync("/home/src/projects/project/node_modules/foo2/package.json", getFsContentsForNode10ResultPackageJson("foo2", /*addTypes*/ true, /*addTypesCondition*/ false)),
},
{
caption: "delete the node10Result in @types",
edit: fs => fs.unlinkSync("/home/src/projects/project/node_modules/@types/bar2/index.d.ts"),
},
{
caption: "delete the ndoe10Result in package/types",
edit: fs => fs.unlinkSync("/home/src/projects/project/node_modules/foo2/index.d.ts"),
},
{
caption: "add the node10Result in @types",
edit: fs => fs.writeFileSync("/home/src/projects/project/node_modules/@types/bar2/index.d.ts", getFsContentsForNode10ResultDts("bar2")),
},
{
caption: "add the ndoe10Result in package/types",
edit: fs => fs.writeFileSync("/home/src/projects/project/node_modules/foo2/index.d.ts", getFsContentsForNode10ResultDts("foo2")),
},
]
});
});

View File

@@ -1,4 +1,5 @@
import * as Utils from "../../_namespaces/Utils";
import { getFsConentsForNode10ResultAtTypesPackageJson, getFsContentsForNode10Result, getFsContentsForNode10ResultDts, getFsContentsForNode10ResultPackageJson } from "../helpers/node10Result";
import { verifyTscWatch } from "../helpers/tscWatch";
import {
createWatchedSystem,
@@ -432,4 +433,109 @@ describe("unittests:: tsc-watch:: moduleResolution", () => {
}
]
});
verifyTscWatch({
scenario: "moduleResolution",
subScenario: "node10Result",
sys: () => createWatchedSystem(getFsContentsForNode10Result(), { currentDirectory: "/home/src/projects/project" }),
commandLineArgs: ["-w", "--extendedDiagnostics"],
edits: [
{
caption: "delete the node10Result in @types",
edit: sys => sys.deleteFile("/home/src/projects/project/node_modules/@types/bar/index.d.ts"),
timeouts: sys => {
sys.runQueuedTimeoutCallbacks();
sys.runQueuedTimeoutCallbacks();
},
},
{
caption: "delete the ndoe10Result in package/types",
edit: sys => sys.deleteFile("/home/src/projects/project/node_modules/foo/index.d.ts"),
timeouts: sys => {
sys.runQueuedTimeoutCallbacks();
sys.runQueuedTimeoutCallbacks();
},
},
{
caption: "add the node10Result in @types",
edit: sys => sys.writeFile("/home/src/projects/project/node_modules/@types/bar/index.d.ts", getFsContentsForNode10ResultDts("bar")),
timeouts: sys => {
sys.runQueuedTimeoutCallbacks();
sys.runQueuedTimeoutCallbacks();
},
},
{
caption: "add the ndoe10Result in package/types",
edit: sys => sys.writeFile("/home/src/projects/project/node_modules/foo/index.d.ts", getFsContentsForNode10ResultDts("foo")),
timeouts: sys => {
sys.runQueuedTimeoutCallbacks();
sys.runQueuedTimeoutCallbacks();
},
},
{
caption: "update package.json from @types so error is fixed",
edit: sys => sys.writeFile("/home/src/projects/project/node_modules/@types/bar/package.json", getFsConentsForNode10ResultAtTypesPackageJson("bar", /*addTypesCondition*/ true)),
timeouts: sys => {
sys.runQueuedTimeoutCallbacks();
sys.runQueuedTimeoutCallbacks();
},
},
{
caption: "update package.json so error is fixed",
edit: sys => sys.writeFile("/home/src/projects/project/node_modules/foo/package.json", getFsContentsForNode10ResultPackageJson("foo", /*addTypes*/ true, /*addTypesCondition*/ true)),
timeouts: sys => {
sys.runQueuedTimeoutCallbacks();
sys.runQueuedTimeoutCallbacks();
},
},
{
caption: "update package.json from @types so error is introduced",
edit: sys => sys.writeFile("/home/src/projects/project/node_modules/@types/bar2/package.json", getFsConentsForNode10ResultAtTypesPackageJson("bar2", /*addTypesCondition*/ false)),
timeouts: sys => {
sys.runQueuedTimeoutCallbacks();
sys.runQueuedTimeoutCallbacks();
},
},
{
caption: "update package.json so error is introduced",
edit: sys => sys.writeFile("/home/src/projects/project/node_modules/foo2/package.json", getFsContentsForNode10ResultPackageJson("foo2", /*addTypes*/ true, /*addTypesCondition*/ false)),
timeouts: sys => {
sys.runQueuedTimeoutCallbacks();
sys.runQueuedTimeoutCallbacks();
},
},
{
caption: "delete the node10Result in @types",
edit: sys => sys.deleteFile("/home/src/projects/project/node_modules/@types/bar2/index.d.ts"),
timeouts: sys => {
sys.runQueuedTimeoutCallbacks();
sys.runQueuedTimeoutCallbacks();
},
},
{
caption: "delete the ndoe10Result in package/types",
edit: sys => sys.deleteFile("/home/src/projects/project/node_modules/foo2/index.d.ts"),
timeouts: sys => {
sys.runQueuedTimeoutCallbacks();
sys.runQueuedTimeoutCallbacks();
},
},
{
caption: "add the node10Result in @types",
edit: sys => sys.writeFile("/home/src/projects/project/node_modules/@types/bar2/index.d.ts", getFsContentsForNode10ResultDts("bar2")),
timeouts: sys => {
sys.runQueuedTimeoutCallbacks();
sys.runQueuedTimeoutCallbacks();
},
},
{
caption: "add the ndoe10Result in package/types",
edit: sys => sys.writeFile("/home/src/projects/project/node_modules/foo2/index.d.ts", getFsContentsForNode10ResultDts("foo2")),
timeouts: sys => {
sys.runQueuedTimeoutCallbacks();
sys.runQueuedTimeoutCallbacks();
},
},
]
});
});

View File

@@ -1,4 +1,5 @@
import * as Utils from "../../_namespaces/Utils";
import { getFsConentsForNode10ResultAtTypesPackageJson, getFsContentsForNode10Result, getFsContentsForNode10ResultDts, getFsContentsForNode10ResultPackageJson } from "../helpers/node10Result";
import {
baselineTsserverLogs,
createLoggerWithInMemoryLogs,
@@ -130,4 +131,49 @@ describe("unittests:: tsserver:: moduleResolution", () => {
baselineTsserverLogs("moduleResolution", "package json file is edited when package json with type module exists", session);
});
});
it("node10Result", () => {
const host = createServerHost(getFsContentsForNode10Result());
const session = createSession(host, { canUseEvents: true, logger: createLoggerWithInMemoryLogs(host) });
openFilesForSession(["/home/src/projects/project/index.mts"], session);
verifyGetErrRequest({
files: ["/home/src/projects/project/index.mts"],
session,
});
host.deleteFile("/home/src/projects/project/node_modules/@types/bar/index.d.ts");
verifyErrors();
host.deleteFile("/home/src/projects/project/node_modules/foo/index.d.ts");
verifyErrors();
host.writeFile("/home/src/projects/project/node_modules/@types/bar/index.d.ts", getFsContentsForNode10ResultDts("bar"));
verifyErrors();
host.writeFile("/home/src/projects/project/node_modules/foo/index.d.ts", getFsContentsForNode10ResultDts("foo"));
verifyErrors();
host.writeFile("/home/src/projects/project/node_modules/@types/bar/package.json", getFsConentsForNode10ResultAtTypesPackageJson("bar", /*addTypesCondition*/ true));
verifyErrors();
host.writeFile("/home/src/projects/project/node_modules/foo/package.json", getFsContentsForNode10ResultPackageJson("foo", /*addTypes*/ true, /*addTypesCondition*/ true));
verifyErrors();
host.writeFile("/home/src/projects/project/node_modules/@types/bar2/package.json", getFsConentsForNode10ResultAtTypesPackageJson("bar2", /*addTypesCondition*/ false));
verifyErrors();
host.writeFile("/home/src/projects/project/node_modules/foo2/package.json", getFsContentsForNode10ResultPackageJson("foo2", /*addTypes*/ true, /*addTypesCondition*/ false));
verifyErrors();
host.deleteFile("/home/src/projects/project/node_modules/@types/bar2/index.d.ts");
verifyErrors();
host.deleteFile("/home/src/projects/project/node_modules/foo2/index.d.ts");
verifyErrors();
host.writeFile("/home/src/projects/project/node_modules/@types/bar2/index.d.ts", getFsContentsForNode10ResultDts("bar2"));
verifyErrors();
host.writeFile("/home/src/projects/project/node_modules/foo2/index.d.ts", getFsContentsForNode10ResultDts("foo2"));
verifyErrors();
baselineTsserverLogs("moduleResolution", "node10Result", session);
function verifyErrors() {
host.runQueuedTimeoutCallbacks();
host.runQueuedImmediateCallbacks();
verifyGetErrRequest({
files: ["/home/src/projects/project/index.mts"],
session,
});
}
});
});