mirror of
https://github.com/microsoft/TypeScript.git
synced 2025-11-18 17:21:48 +00:00
Use empty object for invalid package json contents instead of undefined
Fixes #34726
This commit is contained in:
+13
-13
@@ -2218,22 +2218,22 @@ namespace ts {
|
||||
type PackageJsonRaw = Record<typeof dependencyKeys[number], Record<string, string> | undefined>;
|
||||
const dependencyKeys = ["dependencies", "devDependencies", "optionalDependencies", "peerDependencies"] as const;
|
||||
const stringContent = host.readFile(fileName);
|
||||
const content = stringContent && tryParseJson(stringContent) as PackageJsonRaw;
|
||||
if (!content) {
|
||||
return undefined;
|
||||
}
|
||||
if (!stringContent) return undefined;
|
||||
|
||||
const content = tryParseJson(stringContent) as PackageJsonRaw;
|
||||
const info: Pick<PackageJsonInfo, typeof dependencyKeys[number]> = {};
|
||||
for (const key of dependencyKeys) {
|
||||
const dependencies = content[key];
|
||||
if (!dependencies) {
|
||||
continue;
|
||||
if (content) {
|
||||
for (const key of dependencyKeys) {
|
||||
const dependencies = content[key];
|
||||
if (!dependencies) {
|
||||
continue;
|
||||
}
|
||||
const dependencyMap = createMap<string>();
|
||||
for (const packageName in dependencies) {
|
||||
dependencyMap.set(packageName, dependencies[packageName]);
|
||||
}
|
||||
info[key] = dependencyMap;
|
||||
}
|
||||
const dependencyMap = createMap<string>();
|
||||
for (const packageName in dependencies) {
|
||||
dependencyMap.set(packageName, dependencies[packageName]);
|
||||
}
|
||||
info[key] = dependencyMap;
|
||||
}
|
||||
|
||||
const dependencyGroups = [
|
||||
|
||||
@@ -71,6 +71,18 @@ namespace ts.projectSystem {
|
||||
assert.lengthOf(project.getPackageJsonsVisibleToFile("/a.ts" as Path), 1);
|
||||
assert.lengthOf(project.getPackageJsonsVisibleToFile("/src/b.ts" as Path), 2);
|
||||
});
|
||||
|
||||
it("handles errors in json parsing of package.json", () => {
|
||||
const packageJsonContent = `{ "mod" }`;
|
||||
const { project } = setup([tsConfig, { path: packageJson.path, content: packageJsonContent }]);
|
||||
project.getPackageJsonsVisibleToFile("/src/whatever/blah.ts" as Path);
|
||||
const packageJsonInfo = project.packageJsonCache.getInDirectory("/" as Path)!;
|
||||
assert.isObject(packageJsonInfo);
|
||||
assert.isUndefined(packageJsonInfo.dependencies);
|
||||
assert.isUndefined(packageJsonInfo.devDependencies);
|
||||
assert.isUndefined(packageJsonInfo.peerDependencies);
|
||||
assert.isUndefined(packageJsonInfo.optionalDependencies);
|
||||
});
|
||||
});
|
||||
|
||||
function setup(files: readonly File[] = [tsConfig, packageJson]) {
|
||||
|
||||
@@ -0,0 +1,57 @@
|
||||
/// <reference path="../fourslash.ts" />
|
||||
|
||||
// @Filename: /jsconfig.json
|
||||
////{
|
||||
//// "compilerOptions": {
|
||||
//// "module": "commonjs",
|
||||
//// },
|
||||
////}
|
||||
|
||||
// @Filename: /node_modules/@types/node/index.d.ts
|
||||
////declare module 'fs' {
|
||||
//// export function readFile(): void;
|
||||
////}
|
||||
////declare module 'util' {
|
||||
//// export function promisify(): void;
|
||||
////}
|
||||
|
||||
// @Filename: /package.json
|
||||
////{ "mod" }
|
||||
|
||||
// @Filename: /a.js
|
||||
////
|
||||
////readF/**/
|
||||
|
||||
verifyExcludes("readFile");
|
||||
edit.replaceLine(0, "import { promisify } from 'util';");
|
||||
verifyIncludes("readFile");
|
||||
edit.deleteLine(0);
|
||||
verifyExcludes("readFile");
|
||||
|
||||
function verifyIncludes(name: string) {
|
||||
goTo.marker("");
|
||||
verify.completions({
|
||||
includes: {
|
||||
name,
|
||||
source: "fs",
|
||||
hasAction: true,
|
||||
sortText: completion.SortText.AutoImportSuggestions,
|
||||
},
|
||||
preferences: {
|
||||
includeCompletionsForModuleExports: true,
|
||||
includeInsertTextCompletions: true,
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
function verifyExcludes(name: string) {
|
||||
goTo.marker("");
|
||||
verify.completions({
|
||||
excludes: name,
|
||||
preferences: {
|
||||
includeCompletionsForModuleExports: true,
|
||||
includeInsertTextCompletions: true,
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user