mirror of
https://github.com/microsoft/TypeScript.git
synced 2026-04-13 18:14:48 -05:00
Add tests for package json edits
This commit is contained in:
@@ -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`
|
||||
]
|
||||
},
|
||||
],
|
||||
});
|
||||
});
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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(),
|
||||
},
|
||||
],
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
||||
@@ -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`)
|
||||
},
|
||||
],
|
||||
});
|
||||
});
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
},
|
||||
},
|
||||
],
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
||||
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user