From a823e8aaa6b8a6821a4f11f5a01f101aacff92cb Mon Sep 17 00:00:00 2001 From: Juergen Kunz Date: Tue, 30 Dec 2025 17:08:28 +0000 Subject: [PATCH] feat(editor): improve TypeScript IntelliSense and module resolution for Monaco editor --- .playwright-mcp/module-resolution-fixed.png | Bin 0 -> 44180 bytes changelog.md | 10 +++ ts_web/00_commitinfo_data.ts | 2 +- .../typescript-intellisense.ts | 81 ++++++++++++++++-- 4 files changed, 86 insertions(+), 7 deletions(-) create mode 100644 .playwright-mcp/module-resolution-fixed.png diff --git a/.playwright-mcp/module-resolution-fixed.png b/.playwright-mcp/module-resolution-fixed.png new file mode 100644 index 0000000000000000000000000000000000000000..6d182874f60a1c66e8ec0aef533cd95ddfc0174b GIT binary patch literal 44180 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: void; setDiagnosticsOptions(options: Record): void; - addExtraLib(content: string, filePath?: string): void; + addExtraLib(content: string, filePath?: string): IExtraLibDisposable; setEagerModelSync(value: boolean): void; }; ScriptTarget: { ES2020: number }; ModuleKind: { ESNext: number }; - ModuleResolutionKind: { NodeJs: number }; + ModuleResolutionKind: { NodeJs: number; Bundler?: number }; } /** @@ -23,6 +27,12 @@ export class TypeScriptIntelliSenseManager { private monacoInstance: typeof monaco | null = null; private executionEnvironment: IExecutionEnvironment | null = null; + // Cache of file contents for synchronous access and module resolution + private fileCache: Map = new Map(); + + // Track extra libs added for cleanup + private addedExtraLibs: Map = new Map(); + /** * Get TypeScript API with proper typing for Monaco 0.55+ */ @@ -60,7 +70,7 @@ export class TypeScriptIntelliSenseManager { if (!this.executionEnvironment) return; try { - const entries = await this.executionEnvironment.readdir(dirPath); + const entries = await this.executionEnvironment.readDir(dirPath); for (const entry of entries) { const fullPath = dirPath === '/' ? `/${entry.name}` : `${dirPath}/${entry.name}`; @@ -68,9 +78,9 @@ export class TypeScriptIntelliSenseManager { // Skip node_modules - too large and handled separately via addExtraLib if (entry.name === 'node_modules') continue; - if (entry.isDirectory()) { + if (entry.type === 'directory') { await this.loadFilesFromDirectory(fullPath); - } else if (entry.isFile()) { + } else if (entry.type === 'file') { const ext = entry.name.split('.').pop()?.toLowerCase(); if (ext === 'ts' || ext === 'tsx' || ext === 'js' || ext === 'jsx') { try { @@ -94,7 +104,8 @@ export class TypeScriptIntelliSenseManager { ts.typescriptDefaults.setCompilerOptions({ target: ts.ScriptTarget.ES2020, module: ts.ModuleKind.ESNext, - moduleResolution: ts.ModuleResolutionKind.NodeJs, + // Use Bundler resolution if available (Monaco 0.45+), fallback to NodeJs + moduleResolution: ts.ModuleResolutionKind.Bundler ?? ts.ModuleResolutionKind.NodeJs, allowSyntheticDefaultImports: true, esModuleInterop: true, strict: true, @@ -103,6 +114,12 @@ export class TypeScriptIntelliSenseManager { checkJs: false, allowNonTsExtensions: true, lib: ['es2020', 'dom', 'dom.iterable'], + // Set baseUrl to root for resolving absolute imports + baseUrl: '/', + // Allow importing .ts extensions directly (useful for some setups) + allowImportingTsExtensions: true, + // Resolve JSON modules + resolveJsonModule: true, }); ts.typescriptDefaults.setDiagnosticsOptions({ @@ -260,10 +277,15 @@ export class TypeScriptIntelliSenseManager { /** * Add a file model to Monaco for cross-file IntelliSense + * Also registers the file with TypeScript via addExtraLib for module resolution */ public addFileModel(path: string, content: string): void { if (!this.monacoInstance) return; + // Cache the content for sync access + this.fileCache.set(path, content); + + // Create/update the editor model const uri = this.monacoInstance.Uri.parse(`file://${path}`); const existingModel = this.monacoInstance.editor.getModel(uri); @@ -273,6 +295,53 @@ export class TypeScriptIntelliSenseManager { const language = this.getLanguageFromPath(path); this.monacoInstance.editor.createModel(content, language, uri); } + + // Also add as extra lib for TypeScript module resolution + // This is critical - TypeScript's resolver uses extra libs, not editor models + this.addFileAsExtraLib(path, content); + } + + /** + * Add a file as an extra lib for TypeScript module resolution. + * This enables TypeScript to resolve imports to project files. + */ + private addFileAsExtraLib(path: string, content: string): void { + const ts = this.tsApi; + if (!ts) return; + + // Dispose existing lib if present (for updates) + const existing = this.addedExtraLibs.get(path); + if (existing) { + existing.dispose(); + } + + // Add the file with its actual path + const filePath = `file://${path}`; + const disposable = ts.typescriptDefaults.addExtraLib(content, filePath); + this.addedExtraLibs.set(path, disposable); + + // For .ts files, also add with .js extension to handle ESM imports + // (e.g., import from './utils.js' should resolve to ./utils.ts) + if (path.endsWith('.ts') && !path.endsWith('.d.ts')) { + const jsPath = path.replace(/\.ts$/, '.js'); + const jsFilePath = `file://${jsPath}`; + const jsDisposable = ts.typescriptDefaults.addExtraLib(content, jsFilePath); + this.addedExtraLibs.set(jsPath, jsDisposable); + this.fileCache.set(jsPath, content); + } else if (path.endsWith('.tsx')) { + const jsxPath = path.replace(/\.tsx$/, '.jsx'); + const jsxFilePath = `file://${jsxPath}`; + const jsxDisposable = ts.typescriptDefaults.addExtraLib(content, jsxFilePath); + this.addedExtraLibs.set(jsxPath, jsxDisposable); + this.fileCache.set(jsxPath, content); + } + } + + /** + * Get cached file content for synchronous access + */ + public getFileContent(path: string): string | undefined { + return this.fileCache.get(path); } private getLanguageFromPath(path: string): string {