@mui/internal-docs-infra
Version:
MUI Infra - internal documentation creation tools.
134 lines • 5.69 kB
text/typescript
import ts, { type CompilerOptions } from 'typescript';
import type { PerformanceTracker } from "./performanceTracking.mjs";
export interface TypesMetaOptions {
/**
* Any additional options passed from the factory call
*/
[key: string]: any;
}
/**
* In-memory language service host that manages TypeScript files dynamically.
*
* Root files are replaced (not accumulated) on each call via `setRootFiles()`,
* so the TypeScript program only contains the dependencies of the component
* currently being analyzed. The file content cache (`files`) persists across
* calls, allowing the DocumentRegistry to reuse parsed SourceFiles.
*
* Implements `getProjectVersion()` so the language service can skip per-file
* version checks when nothing has changed.
*
* Uses filesystem watchers (one per directory) to detect changes efficiently
* during development, instead of re-reading every tracked file from disk.
*/
declare class InMemoryLanguageServiceHost implements ts.LanguageServiceHost {
/**
* Content and version cache for ALL files (entrypoints + transitive dependencies).
* Used by getScriptVersion and getScriptSnapshot to serve cached data.
* Persists across calls so the DocumentRegistry can reuse parsed SourceFiles.
*/
private files;
/**
* Current entrypoints for this call. Replaced (not accumulated) on each
* `createOptimizedProgram` invocation so the program only contains the
* dependencies of the component currently being analyzed.
*/
private rootFiles;
/**
* Monotonically increasing version string returned by `getProjectVersion()`.
* TypeScript's language service checks this first — if unchanged it skips
* per-file version checks entirely, avoiding O(n) `getScriptVersion` calls.
*/
private projectVersion;
private options;
private projectPath;
private getVersionCallCount;
private getSnapshotCallCount;
/** Set of file paths that have been flagged as changed by fs watchers */
private changedFiles;
/** Active directory watchers, keyed by directory path */
private dirWatchers;
/** Directories where watcher setup failed — these need polling fallback */
private unwatchedDirs;
constructor(projectPath: string, options: ts.CompilerOptions);
resetCallCounts(): void;
getCallCounts(): {
version: number;
snapshot: number;
};
/**
* Ensures a directory watcher exists for the given file's parent directory.
* When any file in that directory changes, all tracked files in that directory
* are added to the changedFiles set.
*
* If watcher setup fails, the directory is added to `unwatchedDirs` so
* `updateChangedFiles` can fall back to polling for files in that directory.
*/
private ensureWatcher;
/**
* Replaces the current root files with the given entrypoints.
* Only bumps the project version when entrypoints or their contents change,
* so the language service can skip per-file version checks on unchanged calls.
*/
setRootFiles(entrypoints: string[]): void;
/**
* Checks whether the given entrypoints match the current root files (same order).
*/
private rootFilesMatch;
getProjectVersion(): string;
getScriptFileNames(): string[];
getScriptVersion(fileName: string): string;
getScriptSnapshot(fileName: string): ts.IScriptSnapshot | undefined;
getCurrentDirectory(): string;
getCompilationSettings(): ts.CompilerOptions;
getDefaultLibFileName(options: ts.CompilerOptions): string;
fileExists(fileName: string): boolean;
readFile(fileName: string): string | undefined;
resolveModuleNames(moduleNames: string[], containingFile: string): (ts.ResolvedModule | undefined)[];
/**
* Updates files that have changed since the last call.
*
* For directories with active watchers, only re-reads files the OS flagged.
* For directories where watchers failed, polls all tracked files in those
* directories to detect changes (fallback behavior).
*/
updateChangedFiles(): {
updated: string[];
unchanged: number;
};
/**
* Closes all directory watchers. Call when the language service is no longer needed.
*/
closeWatchers(): void;
}
/**
* Singleton instance that manages a TypeScript language service across multiple calls
*/
interface LanguageServiceInstance {
host: InMemoryLanguageServiceHost;
service: ts.LanguageService;
projectPath: string;
compilerOptions: ts.CompilerOptions;
}
declare global {
var typesMetaLanguageService: LanguageServiceInstance | undefined;
}
/**
* Creates an optimized TypeScript program for component analysis using a global language service.
*
* This function uses a singleton language service that persists across calls:
* - Reuses the same language service and DocumentRegistry across calls
* - Sets root files to only the current entrypoints (not accumulated)
* - Caches file contents so the DocumentRegistry can reuse parsed SourceFiles
* - Components with heavy dependencies (e.g. date-fns) don't slow down other components
*
* @param projectPath - Path to the project directory
* @param compilerOptions - TypeScript compiler options
* @param entrypoints - Array of TypeScript files to analyze
* @param options - Additional configuration options
* @param tracker - Performance tracker for measurements
* @param functionName - Name for performance markers
* @param context - Context for performance markers
* @returns Optimized TypeScript program
*/
export declare function createOptimizedProgram(projectPath: string, compilerOptions: CompilerOptions, entrypoints: string[], _options?: TypesMetaOptions, tracker?: PerformanceTracker, functionName?: string, context?: string[]): ts.Program;
export {};