Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions lib/tsc.js
Original file line number Diff line number Diff line change
Expand Up @@ -20154,11 +20154,13 @@ var ts;
};
ts.classPrivateFieldGetHelper = {
name: "typescript:classPrivateFieldGet",
importName: "__classPrivateFieldGet",
scoped: false,
text: "\n var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, privateMap) {\n if (!privateMap.has(receiver)) {\n throw new TypeError(\"attempted to get private field on non-instance\");\n }\n return privateMap.get(receiver);\n };"
};
ts.classPrivateFieldSetHelper = {
name: "typescript:classPrivateFieldSet",
importName: "__classPrivateFieldSet",
scoped: false,
text: "\n var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, privateMap, value) {\n if (!privateMap.has(receiver)) {\n throw new TypeError(\"attempted to set private field on non-instance\");\n }\n privateMap.set(receiver, value);\n return value;\n };"
};
Expand Down
30 changes: 14 additions & 16 deletions lib/tsserver.js
Original file line number Diff line number Diff line change
Expand Up @@ -25223,11 +25223,13 @@ var ts;
// Class fields helpers
ts.classPrivateFieldGetHelper = {
name: "typescript:classPrivateFieldGet",
importName: "__classPrivateFieldGet",
scoped: false,
text: "\n var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, privateMap) {\n if (!privateMap.has(receiver)) {\n throw new TypeError(\"attempted to get private field on non-instance\");\n }\n return privateMap.get(receiver);\n };"
};
ts.classPrivateFieldSetHelper = {
name: "typescript:classPrivateFieldSet",
importName: "__classPrivateFieldSet",
scoped: false,
text: "\n var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, privateMap, value) {\n if (!privateMap.has(receiver)) {\n throw new TypeError(\"attempted to set private field on non-instance\");\n }\n privateMap.set(receiver, value);\n return value;\n };"
};
Expand Down Expand Up @@ -113237,9 +113239,7 @@ var ts;
return undefined;
}
var dependencyKeys = ["dependencies", "devDependencies", "optionalDependencies", "peerDependencies"];
var stringContent = host.readFile(fileName);
if (!stringContent)
return undefined;
var stringContent = host.readFile(fileName) || "";
var content = tryParseJson(stringContent);
var info = {};
if (content) {
Expand Down Expand Up @@ -152444,13 +152444,12 @@ var ts;
};
/*@internal*/
ProjectService.prototype.getPackageJsonsVisibleToFile = function (fileName, rootDir) {
var _this = this;
var packageJsonCache = this.packageJsonCache;
var watchPackageJsonFile = this.watchPackageJsonFile.bind(this);
var toPath = this.toPath.bind(this);
var rootPath = rootDir && toPath(rootDir);
var filePath = toPath(fileName);
var rootPath = rootDir && this.toPath(rootDir);
var filePath = this.toPath(fileName);
var result = [];
ts.forEachAncestorDirectory(ts.getDirectoryPath(filePath), function processDirectory(directory) {
var processDirectory = function (directory) {
switch (packageJsonCache.directoryHasPackageJson(directory)) {
// Sync and check same directory again
case 1 /* Maybe */:
Expand All @@ -152459,15 +152458,16 @@ var ts;
// Check package.json
case -1 /* True */:
var packageJsonFileName = ts.combinePaths(directory, "package.json");
watchPackageJsonFile(packageJsonFileName);
_this.watchPackageJsonFile(packageJsonFileName);
var info = packageJsonCache.getInDirectory(directory);
if (info)
result.push(info);
}
if (rootPath && rootPath === toPath(directory)) {
if (rootPath && rootPath === _this.toPath(directory)) {
return true;
}
});
};
ts.forEachAncestorDirectory(ts.getDirectoryPath(filePath), processDirectory);
return result;
};
/*@internal*/
Expand Down Expand Up @@ -152572,11 +152572,9 @@ var ts;
},
};
function addOrUpdate(fileName) {
var packageJsonInfo = ts.createPackageJsonInfo(fileName, host.host);
if (packageJsonInfo !== undefined) {
packageJsons.set(fileName, packageJsonInfo);
directoriesWithoutPackageJson.delete(ts.getDirectoryPath(fileName));
}
var packageJsonInfo = ts.Debug.checkDefined(ts.createPackageJsonInfo(fileName, host.host));
packageJsons.set(fileName, packageJsonInfo);
directoriesWithoutPackageJson.delete(ts.getDirectoryPath(fileName));
}
function directoryHasPackageJson(directory) {
return packageJsons.has(ts.combinePaths(directory, "package.json")) ? -1 /* True */ :
Expand Down
30 changes: 14 additions & 16 deletions lib/tsserverlibrary.js
Original file line number Diff line number Diff line change
Expand Up @@ -25417,11 +25417,13 @@ var ts;
// Class fields helpers
ts.classPrivateFieldGetHelper = {
name: "typescript:classPrivateFieldGet",
importName: "__classPrivateFieldGet",
scoped: false,
text: "\n var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, privateMap) {\n if (!privateMap.has(receiver)) {\n throw new TypeError(\"attempted to get private field on non-instance\");\n }\n return privateMap.get(receiver);\n };"
};
ts.classPrivateFieldSetHelper = {
name: "typescript:classPrivateFieldSet",
importName: "__classPrivateFieldSet",
scoped: false,
text: "\n var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, privateMap, value) {\n if (!privateMap.has(receiver)) {\n throw new TypeError(\"attempted to set private field on non-instance\");\n }\n privateMap.set(receiver, value);\n return value;\n };"
};
Expand Down Expand Up @@ -113804,9 +113806,7 @@ var ts;
return undefined;
}
var dependencyKeys = ["dependencies", "devDependencies", "optionalDependencies", "peerDependencies"];
var stringContent = host.readFile(fileName);
if (!stringContent)
return undefined;
var stringContent = host.readFile(fileName) || "";
var content = tryParseJson(stringContent);
var info = {};
if (content) {
Expand Down Expand Up @@ -152638,13 +152638,12 @@ var ts;
};
/*@internal*/
ProjectService.prototype.getPackageJsonsVisibleToFile = function (fileName, rootDir) {
var _this = this;
var packageJsonCache = this.packageJsonCache;
var watchPackageJsonFile = this.watchPackageJsonFile.bind(this);
var toPath = this.toPath.bind(this);
var rootPath = rootDir && toPath(rootDir);
var filePath = toPath(fileName);
var rootPath = rootDir && this.toPath(rootDir);
var filePath = this.toPath(fileName);
var result = [];
ts.forEachAncestorDirectory(ts.getDirectoryPath(filePath), function processDirectory(directory) {
var processDirectory = function (directory) {
switch (packageJsonCache.directoryHasPackageJson(directory)) {
// Sync and check same directory again
case 1 /* Maybe */:
Expand All @@ -152653,15 +152652,16 @@ var ts;
// Check package.json
case -1 /* True */:
var packageJsonFileName = ts.combinePaths(directory, "package.json");
watchPackageJsonFile(packageJsonFileName);
_this.watchPackageJsonFile(packageJsonFileName);
var info = packageJsonCache.getInDirectory(directory);
if (info)
result.push(info);
}
if (rootPath && rootPath === toPath(directory)) {
if (rootPath && rootPath === _this.toPath(directory)) {
return true;
}
});
};
ts.forEachAncestorDirectory(ts.getDirectoryPath(filePath), processDirectory);
return result;
};
/*@internal*/
Expand Down Expand Up @@ -152766,11 +152766,9 @@ var ts;
},
};
function addOrUpdate(fileName) {
var packageJsonInfo = ts.createPackageJsonInfo(fileName, host.host);
if (packageJsonInfo !== undefined) {
packageJsons.set(fileName, packageJsonInfo);
directoriesWithoutPackageJson.delete(ts.getDirectoryPath(fileName));
}
var packageJsonInfo = ts.Debug.checkDefined(ts.createPackageJsonInfo(fileName, host.host));
packageJsons.set(fileName, packageJsonInfo);
directoriesWithoutPackageJson.delete(ts.getDirectoryPath(fileName));
}
function directoryHasPackageJson(directory) {
return packageJsons.has(ts.combinePaths(directory, "package.json")) ? -1 /* True */ :
Expand Down
6 changes: 3 additions & 3 deletions lib/typescript.js
Original file line number Diff line number Diff line change
Expand Up @@ -25417,11 +25417,13 @@ var ts;
// Class fields helpers
ts.classPrivateFieldGetHelper = {
name: "typescript:classPrivateFieldGet",
importName: "__classPrivateFieldGet",
scoped: false,
text: "\n var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, privateMap) {\n if (!privateMap.has(receiver)) {\n throw new TypeError(\"attempted to get private field on non-instance\");\n }\n return privateMap.get(receiver);\n };"
};
ts.classPrivateFieldSetHelper = {
name: "typescript:classPrivateFieldSet",
importName: "__classPrivateFieldSet",
scoped: false,
text: "\n var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, privateMap, value) {\n if (!privateMap.has(receiver)) {\n throw new TypeError(\"attempted to set private field on non-instance\");\n }\n privateMap.set(receiver, value);\n return value;\n };"
};
Expand Down Expand Up @@ -113804,9 +113806,7 @@ var ts;
return undefined;
}
var dependencyKeys = ["dependencies", "devDependencies", "optionalDependencies", "peerDependencies"];
var stringContent = host.readFile(fileName);
if (!stringContent)
return undefined;
var stringContent = host.readFile(fileName) || "";
var content = tryParseJson(stringContent);
var info = {};
if (content) {
Expand Down
6 changes: 3 additions & 3 deletions lib/typescriptServices.js
Original file line number Diff line number Diff line change
Expand Up @@ -25417,11 +25417,13 @@ var ts;
// Class fields helpers
ts.classPrivateFieldGetHelper = {
name: "typescript:classPrivateFieldGet",
importName: "__classPrivateFieldGet",
scoped: false,
text: "\n var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, privateMap) {\n if (!privateMap.has(receiver)) {\n throw new TypeError(\"attempted to get private field on non-instance\");\n }\n return privateMap.get(receiver);\n };"
};
ts.classPrivateFieldSetHelper = {
name: "typescript:classPrivateFieldSet",
importName: "__classPrivateFieldSet",
scoped: false,
text: "\n var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, privateMap, value) {\n if (!privateMap.has(receiver)) {\n throw new TypeError(\"attempted to set private field on non-instance\");\n }\n privateMap.set(receiver, value);\n return value;\n };"
};
Expand Down Expand Up @@ -113804,9 +113806,7 @@ var ts;
return undefined;
}
var dependencyKeys = ["dependencies", "devDependencies", "optionalDependencies", "peerDependencies"];
var stringContent = host.readFile(fileName);
if (!stringContent)
return undefined;
var stringContent = host.readFile(fileName) || "";
var content = tryParseJson(stringContent);
var info = {};
if (content) {
Expand Down
2 changes: 2 additions & 0 deletions lib/typingsInstaller.js
Original file line number Diff line number Diff line change
Expand Up @@ -25212,11 +25212,13 @@ var ts;
// Class fields helpers
ts.classPrivateFieldGetHelper = {
name: "typescript:classPrivateFieldGet",
importName: "__classPrivateFieldGet",
scoped: false,
text: "\n var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, privateMap) {\n if (!privateMap.has(receiver)) {\n throw new TypeError(\"attempted to get private field on non-instance\");\n }\n return privateMap.get(receiver);\n };"
};
ts.classPrivateFieldSetHelper = {
name: "typescript:classPrivateFieldSet",
importName: "__classPrivateFieldSet",
scoped: false,
text: "\n var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, privateMap, value) {\n if (!privateMap.has(receiver)) {\n throw new TypeError(\"attempted to set private field on non-instance\");\n }\n privateMap.set(receiver, value);\n return value;\n };"
};
Expand Down
15 changes: 7 additions & 8 deletions src/server/editorServices.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3774,12 +3774,10 @@ namespace ts.server {
/*@internal*/
getPackageJsonsVisibleToFile(fileName: string, rootDir?: string): readonly PackageJsonInfo[] {
const packageJsonCache = this.packageJsonCache;
const watchPackageJsonFile = this.watchPackageJsonFile.bind(this);
const toPath = this.toPath.bind(this);
const rootPath = rootDir && toPath(rootDir);
const filePath = toPath(fileName);
const rootPath = rootDir && this.toPath(rootDir);
const filePath = this.toPath(fileName);
const result: PackageJsonInfo[] = [];
forEachAncestorDirectory(getDirectoryPath(filePath), function processDirectory(directory): boolean | undefined {
const processDirectory = (directory: Path): boolean | undefined => {
switch (packageJsonCache.directoryHasPackageJson(directory)) {
// Sync and check same directory again
case Ternary.Maybe:
Expand All @@ -3788,15 +3786,16 @@ namespace ts.server {
// Check package.json
case Ternary.True:
const packageJsonFileName = combinePaths(directory, "package.json");
watchPackageJsonFile(packageJsonFileName);
this.watchPackageJsonFile(packageJsonFileName as Path);
const info = packageJsonCache.getInDirectory(directory);
if (info) result.push(info);
}
if (rootPath && rootPath === toPath(directory)) {
if (rootPath && rootPath === this.toPath(directory)) {
return true;
}
});
};

forEachAncestorDirectory(getDirectoryPath(filePath), processDirectory);
return result;
}

Expand Down
8 changes: 3 additions & 5 deletions src/server/packageJsonCache.ts
Original file line number Diff line number Diff line change
Expand Up @@ -42,11 +42,9 @@ namespace ts.server {
};

function addOrUpdate(fileName: Path) {
const packageJsonInfo = createPackageJsonInfo(fileName, host.host);
if (packageJsonInfo !== undefined) {
packageJsons.set(fileName, packageJsonInfo);
directoriesWithoutPackageJson.delete(getDirectoryPath(fileName));
}
const packageJsonInfo = Debug.checkDefined(createPackageJsonInfo(fileName, host.host));
packageJsons.set(fileName, packageJsonInfo);
directoriesWithoutPackageJson.delete(getDirectoryPath(fileName));
}

function directoryHasPackageJson(directory: Path) {
Expand Down
4 changes: 1 addition & 3 deletions src/services/utilities.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2735,9 +2735,7 @@ 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);
if (!stringContent) return undefined;

const stringContent = host.readFile(fileName) || "";
const content = tryParseJson(stringContent) as PackageJsonRaw | undefined;
const info: Pick<PackageJsonInfo, typeof dependencyKeys[number]> = {};
if (content) {
Expand Down
17 changes: 17 additions & 0 deletions src/testRunner/unittests/tsserver/packageJsonInfo.ts
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,23 @@ namespace ts.projectSystem {
assert.ok(packageJsonInfo2.peerDependencies);
assert.ok(packageJsonInfo2.optionalDependencies);
});

it("handles empty package.json", () => {
const packageJsonContent = "";
const { projectService, host } = setup([tsConfig, { path: packageJson.path, content: packageJsonContent }]);
projectService.getPackageJsonsVisibleToFile("/src/whatever/blah.ts" as Path);
const packageJsonInfo = projectService.packageJsonCache.getInDirectory("/" as Path)!;
assert.isFalse(packageJsonInfo.parseable);

host.writeFile(packageJson.path, packageJson.content);
projectService.getPackageJsonsVisibleToFile("/src/whatever/blah.ts" as Path);
const packageJsonInfo2 = projectService.packageJsonCache.getInDirectory("/" as Path)!;
assert.ok(packageJsonInfo2);
assert.ok(packageJsonInfo2.dependencies);
assert.ok(packageJsonInfo2.devDependencies);
assert.ok(packageJsonInfo2.peerDependencies);
assert.ok(packageJsonInfo2.optionalDependencies);
});
});

function setup(files: readonly File[] = [tsConfig, packageJson]) {
Expand Down