• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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