mirror of
https://github.com/microsoft/TypeScript.git
synced 2026-05-30 01:04:49 -05:00
Handle module node found error reporting in incremental and watch scneario (#54115)
This commit is contained in:
@@ -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";
|
||||
|
||||
85
src/testRunner/unittests/helpers/node10Result.ts
Normal file
85
src/testRunner/unittests/helpers/node10Result.ts
Normal 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,
|
||||
};
|
||||
}
|
||||
63
src/testRunner/unittests/tsc/moduleResolution.ts
Normal file
63
src/testRunner/unittests/tsc/moduleResolution.ts
Normal 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")),
|
||||
},
|
||||
]
|
||||
});
|
||||
});
|
||||
@@ -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();
|
||||
},
|
||||
},
|
||||
]
|
||||
});
|
||||
});
|
||||
@@ -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,
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user