mirror of
https://github.com/microsoft/TypeScript.git
synced 2025-11-18 17:21:48 +00:00
304fcee09b
* Move package.json related utils to utilities * Add failing test * Make first test pass * Don’t filter when there’s no package.json, fix scoped package imports * Use type acquisition as a heuristic for whether a JS project is using node core * Make same fix in getCompletionDetails * Fix re-exporting * Change JS node core module heuristic to same-file utilization * Remove unused method * Remove other unused method * Remove unused triple-slash ref * Update comment * Refactor findAlias to forEachAlias to reduce iterations * Really fix re-exporting * Use getModuleSpecifier instead of custom hack * Fix offering auto imports to paths within node modules * Rename things and make comments better * Add another reexport test * Inline `symbolHasBeenSeen` * Simplify forEachAlias to findAlias * Add note that symbols is mutated * Symbol order doesn’t matter here * Style nits * Add test with nested package.jsons * Fix and add tests for export * re-exports * Don’t fail when alias isn’t found * Make some easy optimizations * Clean up memoization when done * Remove unnecessary semicolon * Make getSymbolsFromOtherSourceFileExports pure * Cache auto imports * Revert "Cache auto imports" This reverts commit8ea4829587. * Handle merged symbols through cache * Be safer with symbol declarations, add logging * Improve cache invalidation for imports and exports * Check symbol presence first * Only run cache invalidation logic if there’s something to clear * Consolidate cache invalidation logic * Fix reuseProgramStructure test * Add more logging * Only clear cache if symbols are different * Refactor ambient module handling * Start caching package.json stuff * Support package.json searching in fourslash * Move import suggestions cache to Project * Start making more module specifier work available without having the importing file * Going to backtrack some from here * Get rid of dumb cache, fix node core modules stuff * Start determining changes to a file have invalidated its own auto imports * Move package.json related utils to utilities * Add failing test * Make first test pass * Don’t filter when there’s no package.json, fix scoped package imports * Use type acquisition as a heuristic for whether a JS project is using node core * Make same fix in getCompletionDetails * Fix re-exporting * Change JS node core module heuristic to same-file utilization * Remove unused method * Remove other unused method * Remove unused triple-slash ref * Update comment * Refactor findAlias to forEachAlias to reduce iterations * Really fix re-exporting * Use getModuleSpecifier instead of custom hack * Fix offering auto imports to paths within node modules * Rename things and make comments better * Add another reexport test * Inline `symbolHasBeenSeen` * Simplify forEachAlias to findAlias * Add note that symbols is mutated * Symbol order doesn’t matter here * Style nits * Add test with nested package.jsons * Fix and add tests for export * re-exports * Don’t fail when alias isn’t found * Make some easy optimizations * Clean up memoization when done * Remove unnecessary semicolon * Make getSymbolsFromOtherSourceFileExports pure * Cache auto imports * Revert "Cache auto imports" This reverts commit8ea4829587. * Handle merged symbols through cache * Be safer with symbol declarations, add logging * Improve cache invalidation for imports and exports * Check symbol presence first * Only run cache invalidation logic if there’s something to clear * Consolidate cache invalidation logic * Fix reuseProgramStructure test * Add more logging * Only clear cache if symbols are different * Refactor ambient module handling * Finish(?) sourceFileHasChangedOwnImportSuggestions * Make package.json info model better * Fix misplaced paren * Use file structure cache for package.json detection when possible * Revert unnecessary changes in moduleSpecifiers * Revert more unnecessary changes * Don’t watch package.jsons inside node_modules, fix tests * Work around declaration emit bug * Sync submodules? * Delete unused type * Add server cache tests * Fix server fourslash editing * Fix packageJsonInfo tests * Add node core modules cache test and fix more fourslash * Clean up symlink caching * Improve logging * Function name doesn’t make any sense anymore * Move symlinks cache to host * Fix markFileAsDirty from ScriptInfo * Mark new Project members internal * Use Path instead of fileName * Rename AutoImportSuggestionsCache * Improve WatchType description * Remove entries() from packageJsonCache * Fix path/fileName bug * Also cache symlinks on Program for benefit of d.ts emit * Let language service use Program’s symlink cache
55 lines
2.3 KiB
TypeScript
55 lines
2.3 KiB
TypeScript
/*@internal*/
|
|
namespace ts.server {
|
|
export interface PackageJsonCache {
|
|
addOrUpdate(fileName: Path): void;
|
|
delete(fileName: Path): void;
|
|
getInDirectory(directory: Path): PackageJsonInfo | undefined;
|
|
directoryHasPackageJson(directory: Path): Ternary;
|
|
searchDirectoryAndAncestors(directory: Path): void;
|
|
}
|
|
|
|
export function createPackageJsonCache(project: Project): PackageJsonCache {
|
|
const packageJsons = createMap<PackageJsonInfo>();
|
|
const directoriesWithoutPackageJson = createMap<true>();
|
|
return {
|
|
addOrUpdate,
|
|
delete: fileName => {
|
|
packageJsons.delete(fileName);
|
|
directoriesWithoutPackageJson.set(getDirectoryPath(fileName), true);
|
|
},
|
|
getInDirectory: directory => {
|
|
return packageJsons.get(combinePaths(directory, "package.json"));
|
|
},
|
|
directoryHasPackageJson,
|
|
searchDirectoryAndAncestors: directory => {
|
|
forEachAncestorDirectory(directory, ancestor => {
|
|
if (directoryHasPackageJson(ancestor) !== Ternary.Maybe) {
|
|
return true;
|
|
}
|
|
const packageJsonFileName = project.toPath(combinePaths(ancestor, "package.json"));
|
|
if (tryFileExists(project, packageJsonFileName)) {
|
|
addOrUpdate(packageJsonFileName);
|
|
}
|
|
else {
|
|
directoriesWithoutPackageJson.set(ancestor, true);
|
|
}
|
|
});
|
|
},
|
|
};
|
|
|
|
function addOrUpdate(fileName: Path) {
|
|
const packageJsonInfo = createPackageJsonInfo(fileName, project);
|
|
if (packageJsonInfo) {
|
|
packageJsons.set(fileName, packageJsonInfo);
|
|
directoriesWithoutPackageJson.delete(getDirectoryPath(fileName));
|
|
}
|
|
}
|
|
|
|
function directoryHasPackageJson(directory: Path) {
|
|
return packageJsons.has(combinePaths(directory, "package.json")) ? Ternary.True :
|
|
directoriesWithoutPackageJson.has(directory) ? Ternary.False :
|
|
Ternary.Maybe;
|
|
}
|
|
}
|
|
}
|