1/*@internal*/ 2namespace ts.server { 3 export interface PackageJsonCache { 4 addOrUpdate(fileName: Path): void; 5 forEach(action: (info: ProjectPackageJsonInfo, fileName: Path) => void): void; 6 delete(fileName: Path): void; 7 get(fileName: Path): ProjectPackageJsonInfo | false | undefined; 8 getInDirectory(directory: Path): ProjectPackageJsonInfo | undefined; 9 directoryHasPackageJson(directory: Path): Ternary; 10 searchDirectoryAndAncestors(directory: Path): void; 11 } 12 13 export function createPackageJsonCache(host: ProjectService): PackageJsonCache { 14 const packageJsons = new Map<string, ProjectPackageJsonInfo>(); 15 const directoriesWithoutPackageJson = new Map<string, true>(); 16 return { 17 addOrUpdate, 18 forEach: packageJsons.forEach.bind(packageJsons), 19 get: packageJsons.get.bind(packageJsons), 20 delete: fileName => { 21 packageJsons.delete(fileName); 22 directoriesWithoutPackageJson.set(getDirectoryPath(fileName), true); 23 }, 24 getInDirectory: directory => { 25 return packageJsons.get(combinePaths(directory, "package.json")) || undefined; 26 }, 27 directoryHasPackageJson, 28 searchDirectoryAndAncestors: directory => { 29 forEachAncestorDirectory(directory, ancestor => { 30 if (directoryHasPackageJson(ancestor) !== Ternary.Maybe) { 31 return true; 32 } 33 const packageJsonFileName = host.toPath(combinePaths(ancestor, "package.json")); 34 if (tryFileExists(host, packageJsonFileName)) { 35 addOrUpdate(packageJsonFileName); 36 } 37 else { 38 directoriesWithoutPackageJson.set(ancestor, true); 39 } 40 }); 41 }, 42 }; 43 44 function addOrUpdate(fileName: Path) { 45 const packageJsonInfo = Debug.checkDefined(createPackageJsonInfo(fileName, host.host)); 46 packageJsons.set(fileName, packageJsonInfo); 47 directoriesWithoutPackageJson.delete(getDirectoryPath(fileName)); 48 } 49 50 function directoryHasPackageJson(directory: Path) { 51 return packageJsons.has(combinePaths(directory, "package.json")) ? Ternary.True : 52 directoriesWithoutPackageJson.has(directory) ? Ternary.False : 53 Ternary.Maybe; 54 } 55 } 56} 57