Fix issue with trailing directory separator not present if symlink wasnt detected by program (#55865)

This commit is contained in:
Sheetal Nandi
2023-09-25 16:52:27 -07:00
committed by GitHub
parent d7b4cee7df
commit 4ec809da37
6 changed files with 2242 additions and 10 deletions

View File

@@ -109,7 +109,7 @@ export interface SymLink {
export type FileOrFolderOrSymLink = File | Folder | SymLink;
export interface FileOrFolderOrSymLinkMap {
[path: string]: string | Omit<FileOrFolderOrSymLink, "path">;
[path: string]: string | Omit<File, "path"> | Omit<SymLink, "path"> | undefined;
}
export function isFile(fileOrFolderOrSymLink: FileOrFolderOrSymLink): fileOrFolderOrSymLink is File {
return isString((fileOrFolderOrSymLink as File).content);

View File

@@ -1,15 +1,25 @@
import * as Utils from "../../_namespaces/Utils";
import * as ts from "../../_namespaces/ts";
import {
dedent,
} from "../../_namespaces/Utils";
import {
libContent,
} from "../helpers/contents";
import {
getFsConentsForNode10ResultAtTypesPackageJson,
getFsContentsForNode10Result,
getFsContentsForNode10ResultDts,
getFsContentsForNode10ResultPackageJson,
} from "../helpers/node10Result";
import {
solutionBuildWithBaseline,
} from "../helpers/solutionBuilder";
import {
baselineTsserverLogs,
createLoggerWithInMemoryLogs,
createSession,
openFilesForSession,
protocolTextSpanFromSubstring,
verifyGetErrRequest,
} from "../helpers/tsserver";
import {
@@ -38,14 +48,14 @@ describe("unittests:: tsserver:: moduleResolution", () => {
};
const fileA: File = {
path: `/user/username/projects/myproject/src/fileA.ts`,
content: Utils.dedent`
content: dedent`
import { foo } from "./fileB.mjs";
foo();
`,
};
const fileB: File = {
path: `/user/username/projects/myproject/src/fileB.mts`,
content: Utils.dedent`
content: dedent`
export function foo() {
}
`,
@@ -195,4 +205,116 @@ describe("unittests:: tsserver:: moduleResolution", () => {
});
}
});
describe("using referenced project", () => {
it("not built", () => {
verify();
});
it("built", () => {
verify(/*built*/ true);
});
function verify(built?: boolean) {
const indexContent = dedent`
import { FOO } from "package-a";
console.log(FOO);
`;
const host = createServerHost({
"/home/src/projects/project/packages/package-a/package.json": getPackageJson("package-a"),
"/home/src/projects/project/packages/package-a/tsconfig.json": getTsConfig(),
"/home/src/projects/project/packages/package-a/src/index.ts": `export * from "./subfolder";`,
"/home/src/projects/project/packages/package-a/src/subfolder/index.ts": `export const FOO = "bar";`,
"/home/src/projects/project/packages/package-b/package.json": getPackageJson("package-b"),
"/home/src/projects/project/packages/package-b/tsconfig.json": getTsConfig([{ path: "../package-a" }]),
"/home/src/projects/project/packages/package-b/src/index.ts": indexContent,
"/home/src/projects/project/node_modules/package-a": { symLink: "/home/src/projects/project/packages/package-a" },
"/home/src/projects/project/node_modules/package-b": { symLink: "/home/src/projects/project/packages/package-b" },
"/a/lib/lib.es2021.d.ts": libContent,
}, { currentDirectory: "/home/src/projects/project" });
if (built) {
solutionBuildWithBaseline(host, ["packages/package-b"]);
host.clearOutput();
}
const session = createSession(host, { logger: createLoggerWithInMemoryLogs(host), canUseEvents: true });
openFilesForSession(["/home/src/projects/project/packages/package-b/src/index.ts"], session);
verifyGetErrRequest({
session,
files: ["/home/src/projects/project/packages/package-b/src/index.ts"],
});
const { end } = protocolTextSpanFromSubstring(indexContent, "package-a");
session.executeCommandSeq<ts.server.protocol.UpdateOpenRequest>({
command: ts.server.protocol.CommandTypes.UpdateOpen,
arguments: {
changedFiles: [{
fileName: "/home/src/projects/project/packages/package-b/src/index.ts",
textChanges: [{
start: end,
end,
newText: "X",
}],
}],
},
});
verifyGetErrRequest({
session,
files: ["/home/src/projects/project/packages/package-b/src/index.ts"],
});
session.executeCommandSeq<ts.server.protocol.UpdateOpenRequest>({
command: ts.server.protocol.CommandTypes.UpdateOpen,
arguments: {
changedFiles: [{
fileName: "/home/src/projects/project/packages/package-b/src/index.ts",
textChanges: [{
start: end,
end: { ...end, offset: end.offset + 1 },
newText: "",
}],
}],
},
});
verifyGetErrRequest({
session,
files: ["/home/src/projects/project/packages/package-b/src/index.ts"],
});
baselineTsserverLogs("moduleResolution", `using referenced project${built ? " built" : ""}`, session);
}
function getPackageJson(packageName: string) {
return JSON.stringify(
{
name: packageName,
version: "1.0.0",
type: "module",
main: "build/index.js",
exports: {
".": "./build/index.js",
"./package.json": "./package.json",
"./*": ["./build/*/index.js", "./build/*.js"],
},
},
undefined,
" ",
);
}
function getTsConfig(references?: object[]) {
return JSON.stringify({
compilerOptions: {
allowSyntheticDefaultImports: true,
baseUrl: "./",
composite: true,
declarationMap: true,
esModuleInterop: true,
lib: ["es2021"],
module: "esnext",
moduleResolution: "bundler",
outDir: "build",
rootDir: "./src",
target: "ES2021",
traceResolution: true,
tsBuildInfoFile: "./build/tsconfig.tsbuildinfo",
},
include: ["./src/**/*.ts"],
references,
});
}
});
});