"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.createPackageJsonCache = void 0; function createPackageJsonCache(ts, host) { const { createPackageJsonInfo, getDirectoryPath, combinePaths, tryFileExists, forEachAncestorDirectory } = ts; const packageJsons = new Map(); const directoriesWithoutPackageJson = new Map(); return { addOrUpdate, forEach: packageJsons.forEach.bind(packageJsons), get: packageJsons.get.bind(packageJsons), delete: fileName => { packageJsons.delete(fileName); directoriesWithoutPackageJson.set(getDirectoryPath(fileName), true); }, getInDirectory: directory => { return packageJsons.get(combinePaths(directory, "package.json")) || undefined; }, directoryHasPackageJson, searchDirectoryAndAncestors: directory => { forEachAncestorDirectory(directory, (ancestor) => { if (directoryHasPackageJson(ancestor) !== 3 /* Ternary.Maybe */) { return true; } const packageJsonFileName = host.toPath(combinePaths(ancestor, "package.json")); if (tryFileExists(host, packageJsonFileName)) { addOrUpdate(packageJsonFileName); } else { directoriesWithoutPackageJson.set(ancestor, true); } }); }, }; function addOrUpdate(fileName) { const packageJsonInfo = // Debug.checkDefined( createPackageJsonInfo(fileName, host.host); // ); packageJsons.set(fileName, packageJsonInfo); directoriesWithoutPackageJson.delete(getDirectoryPath(fileName)); } function directoryHasPackageJson(directory) { return packageJsons.has(combinePaths(directory, "package.json")) ? -1 /* Ternary.True */ : directoriesWithoutPackageJson.has(directory) ? 0 /* Ternary.False */ : 3 /* Ternary.Maybe */; } } exports.createPackageJsonCache = createPackageJsonCache;