22
33import { readdirSync , readFileSync } from 'node:fs' ;
44import { createRequire } from 'node:module' ;
5- import { dirname , join , resolve } from 'node:path' ;
5+ import { join , resolve } from 'node:path' ;
6+
7+ import { createDefaultMapFromNodeModules } from '@typescript/vfs' ;
8+ import ts from 'typescript' ;
69
710const require = createRequire ( import . meta. url ) ;
811
912/**
1013 * Recursively collects all `.d.ts` files from a directory into the fsMap.
1114 *
12- * @param {Record <string, string> } fsMap The map to populate
15+ * @param {Map <string, string> } fsMap The map to populate
1316 * @param {string } dir The directory to walk
1417 * @param {string } virtualPrefix The virtual path prefix (e.g., "/node_modules/@types/node")
1518 * @param {string } baseDir The base directory for computing relative paths
@@ -28,7 +31,7 @@ function collectDtsFiles(fsMap, dir, virtualPrefix, baseDir) {
2831 const relativePath = fullPath . slice ( baseDir . length ) . replace ( / \\ / g, '/' ) ;
2932 const virtualPath = `${ virtualPrefix } ${ relativePath } ` ;
3033
31- fsMap [ virtualPath ] = readFileSync ( fullPath , 'utf8' ) ;
34+ fsMap . set ( virtualPath , readFileSync ( fullPath , 'utf8' ) ) ;
3235 }
3336 }
3437}
@@ -38,22 +41,12 @@ function collectDtsFiles(fsMap, dir, virtualPrefix, baseDir) {
3841 * declaration files and `@types/node` declarations needed for Twoslash
3942 * to run without real filesystem access (e.g., on Cloudflare Workers).
4043 *
41- * @returns {Record <string, string> } A map of virtual paths to file contents
44+ * @returns {Map <string, string> } A map of virtual paths to file contents
4245 */
4346export default function generateTwoslashFsMap ( ) {
44- const fsMap = { } ;
45-
46- // 1. Collect TypeScript lib .d.ts files
47- // These are keyed as "/lib.es5.d.ts", "/lib.dom.d.ts", etc.
48- // (matching the convention used by @typescript/vfs)
49- const tsLibDir = dirname ( require . resolve ( 'typescript/lib/lib.d.ts' ) ) ;
50- const tsLibFiles = readdirSync ( tsLibDir )
51- . filter ( f => f . startsWith ( 'lib.' ) && / \. d \. ( [ ^ . ] + \. ) ? [ c m ] ? t s $ / i. test ( f ) )
52- . sort ( ) ;
53-
54- for ( const file of tsLibFiles ) {
55- fsMap [ `/${ file } ` ] = readFileSync ( join ( tsLibDir , file ) , 'utf8' ) ;
56- }
47+ // 1. Collect TypeScript lib .d.ts files using @typescript/vfs
48+ // This returns a Map keyed as "/lib.es5.d.ts", "/lib.dom.d.ts", etc.
49+ const fsMap = createDefaultMapFromNodeModules ( { } , ts ) ;
5750
5851 // 2. Collect @types/node .d.ts files
5952 // These are keyed as "/node_modules/@types/node/index.d.ts", etc.
0 commit comments