Add tests for package json edits

This commit is contained in:
Sheetal Nandi
2022-08-02 10:47:55 -07:00
parent 7de47805fe
commit 5c11252b71
17 changed files with 50446 additions and 4 deletions

View File

@@ -10,6 +10,7 @@ import {
getFsWithMultipleProjects,
getFsWithNode16,
getFsWithOut,
getFsWithPackageJsonEdits,
getFsWithSameResolutionFromMultiplePlaces,
getPkgImportContent,
getPkgTypeRefContent,
@@ -213,4 +214,53 @@ describe("unittests:: tsbuild:: cacheResolutions::", () => {
},
]
});
verifyTsc({
scenario: "cacheResolutions",
subScenario: "packageJson edited",
commandLineArgs: ["--b", "/src/projects/project/src", "--explainFiles"],
fs: getFsWithPackageJsonEdits,
baselineModulesAndTypeRefs: true,
edits: [
{
caption: "random edit",
edit: fs => appendText(fs, "/src/projects/project/src/randomFile.ts", `export const y = 10;`),
},
{
caption: "Modify package json file to add type module",
edit: fs => fs.writeFileSync(`/src/projects/project/package.json`, JSON.stringify({ name: "app", version: "1.0.0", type: "module" })),
},
{
caption: "Modify package.json file to remove type module and randmon edit",
edit: fs => {
fs.writeFileSync(`/src/projects/project/package.json`, JSON.stringify({ name: "app", version: "1.0.0" }));
appendText(fs, "/src/projects/project/src/randomFile.ts", `export const z = 10;`);
},
discrepancyExplanation: () => [
`Clean build and incremental build differ in emit signature and latestChangedDtsFile since incremental persists it from previous build and clean has errors`
]
},
{
caption: "Delete package.json",
edit: fs => fs.unlinkSync(`/src/projects/project/package.json`),
discrepancyExplanation: () => [
`Clean build and incremental build differ in emit signature and latestChangedDtsFile since incremental persists it from previous build and clean has errors`
]
},
{
caption: "Add package json file with type module",
edit: fs => fs.writeFileSync(`/src/projects/project/package.json`, JSON.stringify({ name: "app", version: "1.0.0", type: "module" })),
},
{
caption: "Delete package.json and random edit",
edit: fs => {
fs.unlinkSync(`/src/projects/project/package.json`);
appendText(fs, "/src/projects/project/src/randomFile.ts", `export const k = 10;`);
},
discrepancyExplanation: () => [
`Clean build and incremental build differ in emit signature and latestChangedDtsFile since incremental persists it from previous build and clean has errors`
]
},
],
});
});

View File

@@ -361,4 +361,93 @@ export function getServerHostWithSameResolutionFromMultiplePlacesWithBuild() {
const system = getServerHostWithSameResolutionFromMultiplePlaces();
solutionBuildWithBaseline(system, ["/src/project"]);
return system;
}
function getFsMapWithPackageJsonEdits(): { [path: string]: string; } {
return {
"/src/projects/project/src/tsconfig.json": JSON.stringify({
compilerOptions: {
target: "es2016",
composite: true,
module: "node16",
outDir: "../out",
cacheResolutions: true,
traceResolution: true,
},
files: [
"fileA.ts",
"fileB.mts",
"randomFile.ts",
"a/randomFile.ts",
"b/ba/randomFile.ts",
"b/randomFile.ts",
"c/ca/randomFile.ts",
"c/ca/caa/randomFile.ts",
"c/ca/caa/caaa/randomFile.ts",
"c/cb/randomFile.ts",
"d/da/daa/daaa/x/y/z/randomFile.ts",
"d/da/daa/daaa/randomFile.ts",
"d/da/daa/randomFile.ts",
"d/da/randomFile.ts",
"e/ea/randomFile.ts",
"e/ea/eaa/randomFile.ts",
"e/ea/eaa/eaaa/randomFile.ts",
"e/ea/eaa/eaaa/x/y/z/randomFile.ts",
"f/fa/faa/x/y/z/randomFile.ts",
"f/fa/faa/faaa/randomFile.ts",
],
}),
"/src/projects/project/src/fileA.ts": Utils.dedent`
import { foo } from "./fileB.mjs";
foo();
`,
"/src/projects/project/src/fileB.mts": `export function foo() {}`,
"/src/projects/project/src/randomFile.ts": getRandomFileContent(),
"/src/projects/project/src/a/randomFile.ts": getRandomFileContent(),
"/src/projects/project/src/b/ba/randomFile.ts": getRandomFileContent(),
"/src/projects/project/src/b/randomFile.ts": getRandomFileContent(),
"/src/projects/project/src/c/ca/randomFile.ts": getRandomFileContent(),
"/src/projects/project/src/c/ca/caa/randomFile.ts": getRandomFileContent(),
"/src/projects/project/src/c/ca/caa/caaa/randomFile.ts": getRandomFileContent(),
"/src/projects/project/src/c/cb/randomFile.ts": getRandomFileContent(),
"/src/projects/project/src/d/da/daa/daaa/x/y/z/randomFile.ts": getRandomFileContent(),
"/src/projects/project/src/d/da/daa/daaa/randomFile.ts": getRandomFileContent(),
"/src/projects/project/src/d/da/daa/randomFile.ts": getRandomFileContent(),
"/src/projects/project/src/d/da/randomFile.ts": getRandomFileContent(),
"/src/projects/project/src/e/ea/randomFile.ts": getRandomFileContent(),
"/src/projects/project/src/e/ea/eaa/randomFile.ts": getRandomFileContent(),
"/src/projects/project/src/e/ea/eaa/eaaa/randomFile.ts": getRandomFileContent(),
"/src/projects/project/src/e/ea/eaa/eaaa/x/y/z/randomFile.ts": getRandomFileContent(),
"/src/projects/project/src/f/fa/faa/faaa/randomFile.ts": getRandomFileContent(),
"/src/projects/project/src/f/fa/faa/x/y/z/randomFile.ts": getRandomFileContent(),
"/src/projects/project/package.json": JSON.stringify({ name: "app", version: "1.0.0" }),
};
}
export function getFsWithPackageJsonEdits() {
return loadProjectFromFiles(getFsMapWithPackageJsonEdits(), /*libContentsToAppend*/ undefined, "/lib/lib.es2016.full.d.ts");
}
export function getWatchSystemWithPackageJsonEdits() {
const system = createWatchedSystem(getFsMapWithPackageJsonEdits(), { currentDirectory: "/src/projects/project" });
system.ensureFileOrFolder({ ...libFile, path: "/a/lib/lib.es2016.full.d.ts" });
return system;
}
export function getServerHostWithPackageJsonEdits() {
const system = createServerHost(getFsMapWithPackageJsonEdits(), { currentDirectory: "/src/projects/project" });
system.ensureFileOrFolder({ ...libFile, path: "/a/lib/lib.es2016.full.d.ts" });
return system;
}
export function getWatchSystemWithPackageJsonEditsWithBuild() {
const system = getWatchSystemWithPackageJsonEdits();
solutionBuildWithBaseline(system, ["/src/project/src"]);
return system;
}
export function getServerHostWithPackageJsonEditsWithBuild() {
const system = getServerHostWithPackageJsonEdits();
solutionBuildWithBaseline(system, ["/src/project/src"]);
return system;
}

View File

@@ -10,6 +10,8 @@ import {
getWatchSystemWithNode16WithBuild,
getWatchSystemWithOut,
getWatchSystemWithOutWithBuild,
getWatchSystemWithPackageJsonEdits,
getWatchSystemWithPackageJsonEditsWithBuild,
getWatchSystemWithSameResolutionFromMultiplePlaces,
getWatchSystemWithSameResolutionFromMultiplePlacesWithBuild,
} from "../tsbuild/cacheResolutionsHelper";
@@ -265,4 +267,56 @@ describe("unittests:: tsbuildWatch:: watchMode:: cacheResolutions::", () => {
});
}
});
describe("packageJson edited", () => {
verifyTscWatchPackageJsonEdits("packageJson edited", getWatchSystemWithPackageJsonEdits);
verifyTscWatchPackageJsonEdits("packageJson edited already built", getWatchSystemWithPackageJsonEditsWithBuild);
function verifyTscWatchPackageJsonEdits(subScenario: string, sys: () => TestServerHost) {
verifyTscWatch({
scenario: "cacheResolutions",
subScenario,
commandLineArgs: ["--b", "src", "-w", "--explainFiles", "--extendedDiagnostics"],
baselineModulesAndTypeRefs: true,
sys,
edits: [
{
caption: "random edit",
edit: sys => sys.appendFile("/src/projects/project/src/randomFile.ts", `export const y = 10;`),
timeouts: sys => sys.runQueuedTimeoutCallbacks(),
},
{
caption: "Modify package json file to add type module",
edit: sys => sys.writeFile(`/src/projects/project/package.json`, JSON.stringify({ name: "app", version: "1.0.0", type: "module" })),
timeouts: sys => sys.runQueuedTimeoutCallbacks(),
},
{
caption: "Modify package.json file to remove type module and random edit",
edit: sys => {
sys.writeFile(`/src/projects/project/package.json`, JSON.stringify({ name: "app", version: "1.0.0" }));
sys.appendFile("/src/projects/project/src/randomFile.ts", `export const z = 10;`);
},
timeouts: sys => sys.runQueuedTimeoutCallbacks(),
},
{
caption: "Delete package.json",
edit: sys => sys.deleteFile(`/src/projects/project/package.json`),
timeouts: sys => sys.runQueuedTimeoutCallbacks(),
},
{
caption: "Add package json file with type module",
edit: sys => sys.writeFile(`/src/projects/project/package.json`, JSON.stringify({ name: "app", version: "1.0.0", type: "module" })),
timeouts: sys => sys.runQueuedTimeoutCallbacks(),
},
{
caption: "Delete package.json and random edit and random edit",
edit: sys => {
sys.deleteFile(`/src/projects/project/package.json`);
sys.appendFile("/src/projects/project/src/randomFile.ts", `export const k = 10;`);
},
timeouts: sys => sys.runQueuedTimeoutCallbacks(),
},
],
});
}
});
});

View File

@@ -6,11 +6,13 @@ import {
import {
getFsWithNode16,
getFsWithOut,
getFsWithPackageJsonEdits,
getFsWithSameResolutionFromMultiplePlaces,
getPkgImportContent,
getPkgTypeRefContent,
} from "../tsbuild/cacheResolutionsHelper";
import {
appendText,
loadProjectFromFiles,
noChangeRun,
prependText,
@@ -298,4 +300,38 @@ describe("unittests:: tsc:: cacheResolutions::", () => {
},
]
});
verifyTsc({
scenario: "cacheResolutions",
subScenario: "packageJson edited",
commandLineArgs: ["--p", "/src/projects/project/src", "--explainFiles"],
baselineModulesAndTypeRefs: true,
fs: getFsWithPackageJsonEdits,
edits: [
{
caption: "random edit",
edit: fs => appendText(fs, "/src/projects/project/src/randomFile.ts", `export const y = 10;`),
},
{
caption: "Modify package json file to add type module",
edit: fs => fs.writeFileSync(`/src/projects/project/package.json`, JSON.stringify({ name: "app", version: "1.0.0", type: "module" })),
},
{
caption: "Modify package.json file to remove type module",
edit: fs => fs.writeFileSync(`/src/projects/project/package.json`, JSON.stringify({ name: "app", version: "1.0.0" })),
},
{
caption: "Delete package.json",
edit: fs => fs.unlinkSync(`/src/projects/project/package.json`),
},
{
caption: "Add package json file with type module",
edit: fs => fs.writeFileSync(`/src/projects/project/package.json`, JSON.stringify({ name: "app", version: "1.0.0", type: "module" })),
},
{
caption: "Delete package.json and random edit",
edit: fs => fs.unlinkSync(`/src/projects/project/package.json`)
},
],
});
});

View File

@@ -461,20 +461,21 @@ export function loadProjectFromDisk(
*/
export function loadProjectFromFiles(
files: vfs.FileSet,
libContentToAppend?: string
libContentToAppend?: string,
libPath?: string,
): vfs.FileSystem {
const fs = new vfs.FileSystem(/*ignoreCase*/ true, {
files,
cwd: "/",
meta: { defaultLibLocation: "/lib" },
});
addLibAndMakeReadonly(fs, libContentToAppend);
addLibAndMakeReadonly(fs, libContentToAppend, libPath);
return fs;
}
function addLibAndMakeReadonly(fs: vfs.FileSystem, libContentToAppend?: string) {
function addLibAndMakeReadonly(fs: vfs.FileSystem, libContentToAppend?: string, libPath?: string) {
fs.mkdirSync("/lib");
fs.writeFileSync("/lib/lib.d.ts", libContentToAppend ? `${libContent}${libContentToAppend}` : libContent);
fs.writeFileSync(libPath || "/lib/lib.d.ts", libContentToAppend ? `${libContent}${libContentToAppend}` : libContent);
fs.makeReadonly();
}

View File

@@ -6,6 +6,8 @@ import {
getWatchSystemWithNode16WithBuild,
getWatchSystemWithOut,
getWatchSystemWithOutWithBuild,
getWatchSystemWithPackageJsonEdits,
getWatchSystemWithPackageJsonEditsWithBuild,
getWatchSystemWithSameResolutionFromMultiplePlaces,
getWatchSystemWithSameResolutionFromMultiplePlacesWithBuild,
} from "../tsbuild/cacheResolutionsHelper";
@@ -278,4 +280,68 @@ describe("unittests:: tsc-watch:: cacheResolutions::", () => {
});
}
});
describe("packageJson edited", () => {
verifyTscWatchPackageJsonEdits("packageJson edited", getWatchSystemWithPackageJsonEdits);
verifyTscWatchPackageJsonEdits("packageJson edited already built", getWatchSystemWithPackageJsonEditsWithBuild);
function verifyTscWatchPackageJsonEdits(subScenario: string, sys: () => TestServerHost) {
verifyTscWatch({
scenario: "cacheResolutions",
subScenario,
commandLineArgs: ["--p", "src", "-w", "--explainFiles", "--extendedDiagnostics"],
baselineModulesAndTypeRefs: true,
sys,
edits: [
{
caption: "random edit",
edit: sys => sys.appendFile("/src/projects/project/src/randomFile.ts", `export const y = 10;`),
timeouts: sys => {
sys.runQueuedTimeoutCallbacks(); // Failed lookups
sys.runQueuedTimeoutCallbacks(); // actual update
},
},
{
caption: "Modify package json file to add type module",
edit: sys => sys.writeFile(`/src/projects/project/package.json`, JSON.stringify({ name: "app", version: "1.0.0", type: "module" })),
timeouts: sys => {
sys.runQueuedTimeoutCallbacks(); // Failed lookups
sys.runQueuedTimeoutCallbacks(); // actual update
},
},
{
caption: "Modify package.json file to remove type module",
edit: sys => sys.writeFile(`/src/projects/project/package.json`, JSON.stringify({ name: "app", version: "1.0.0" })),
timeouts: sys => {
sys.runQueuedTimeoutCallbacks(); // Failed lookups
sys.runQueuedTimeoutCallbacks(); // actual update
},
},
{
caption: "Delete package.json",
edit: sys => sys.deleteFile(`/src/projects/project/package.json`),
timeouts: sys => {
sys.runQueuedTimeoutCallbacks(); // Failed lookups
sys.runQueuedTimeoutCallbacks(); // actual update
},
},
{
caption: "Add package json file with type module",
edit: sys => sys.writeFile(`/src/projects/project/package.json`, JSON.stringify({ name: "app", version: "1.0.0", type: "module" })),
timeouts: sys => {
sys.runQueuedTimeoutCallbacks(); // Failed lookups
sys.runQueuedTimeoutCallbacks(); // actual update
},
},
{
caption: "Delete package.json",
edit: sys => sys.deleteFile(`/src/projects/project/package.json`),
timeouts: sys => {
sys.runQueuedTimeoutCallbacks(); // Failed lookups
sys.runQueuedTimeoutCallbacks(); // actual update
},
},
],
});
}
});
});

View File

@@ -25,6 +25,8 @@ import {
getServerHostWithNode16WithBuild,
getServerHostWithOut,
getServerHostWithOutWithBuild,
getServerHostWithPackageJsonEdits,
getServerHostWithPackageJsonEditsWithBuild,
getServerHostWithSameResolutionFromMultiplePlaces,
getServerHostWithSameResolutionFromMultiplePlacesWithBuild,
} from "../tsbuild/cacheResolutionsHelper";
@@ -411,6 +413,59 @@ describe("unittests:: tsserver:: cacheResolutions:: tsserverProjectSystem cachin
}
});
describe("packageJson edited", () => {
verifyTscWatchPackageJsonEdits("packageJson edited", getServerHostWithPackageJsonEdits);
verifyTscWatchPackageJsonEdits("packageJson edited already built", getServerHostWithPackageJsonEditsWithBuild);
function verifyTscWatchPackageJsonEdits(scenario: string, createHost: () => TestServerHost) {
it(scenario, () => {
const host = fakes.patchHostForBuildInfoReadWrite(createHost());
const session = createSession(host, { logger: createLoggerWithInMemoryLogs(host) });
openFilesForSession(["/src/projects/project/src/randomFile.ts"], session);
session.logger.info("random edit");
session.executeCommandSeq<ts.server.protocol.ChangeRequest>({
command: ts.server.protocol.CommandTypes.Change,
arguments: {
file: "/src/projects/project/src/randomFile.ts",
line: 1,
offset: 1,
endLine: 1,
endOffset: 1,
insertString: `export cont y = 10;\n`,
}
});
ts.server.updateProjectIfDirty(session.getProjectService().configuredProjects.get("/src/projects/project/src/tsconfig.json")!);
session.logger.info("Modify package json file to add type module");
host.writeFile(`/src/projects/project/package.json`, JSON.stringify({ name: "app", version: "1.0.0", type: "module" }));
host.runQueuedTimeoutCallbacks(); // failed lookup
host.runQueuedTimeoutCallbacks(); // actual update
session.logger.info("Modify package.json file to remove type module");
host.writeFile(`/src/projects/project/package.json`, JSON.stringify({ name: "app", version: "1.0.0" }));
host.runQueuedTimeoutCallbacks(); // failed lookup
host.runQueuedTimeoutCallbacks(); // actual update
session.logger.info("Delete package.json");
host.deleteFile(`/src/projects/project/package.json`);
host.runQueuedTimeoutCallbacks(); // failed lookup
host.runQueuedTimeoutCallbacks(); // actual update
session.logger.info("Add package json file with type module");
host.writeFile(`/src/projects/project/package.json`, JSON.stringify({ name: "app", version: "1.0.0", type: "module" }));
host.runQueuedTimeoutCallbacks(); // failed lookup
host.runQueuedTimeoutCallbacks(); // actual update
session.logger.info("Delete package.json");
host.deleteFile(`/src/projects/project/package.json`);
host.runQueuedTimeoutCallbacks(); // failed lookup
host.runQueuedTimeoutCallbacks(); // actual update
baselineTsserverLogs("cacheResolutions", scenario, session);
});
}
});
describe("different projects", () => {
describe("on sample project", () => {
function cacheResolutions(file: File) {