|  | 
| 1 |  | -import { readdir, stat as statAsync } from "fs/promises"; | 
|  | 1 | +import { readdir, stat as statAsync, readFile } from "fs/promises"; | 
| 2 | 2 | import { join, resolve } from "path"; | 
|  | 3 | +import { compilerInfoPartialPath } from "./constants"; | 
| 3 | 4 | 
 | 
| 4 | 5 | // Efficient parallel folder traversal to find node_modules directories | 
| 5 | 6 | async function findNodeModulesDirs( | 
| @@ -91,7 +92,19 @@ async function findRescriptRuntimeInAlternativeLayout( | 
| 91 | 92 |   return results; | 
| 92 | 93 | } | 
| 93 | 94 | 
 | 
| 94 |  | -async function findRuntimePath(project: string) { | 
|  | 95 | +async function findRuntimePath(project: string): Promise<string[]> { | 
|  | 96 | +  // Try a compiler-info.json file first | 
|  | 97 | +  const compilerInfo = resolve(project, compilerInfoPartialPath); | 
|  | 98 | +  try { | 
|  | 99 | +    const contents = await readFile(compilerInfo, "utf8"); | 
|  | 100 | +    const compileInfo: { runtime_path?: string } = JSON.parse(contents); | 
|  | 101 | +    if (compileInfo && compileInfo.runtime_path) { | 
|  | 102 | +      return [compileInfo.runtime_path]; | 
|  | 103 | +    } | 
|  | 104 | +  } catch { | 
|  | 105 | +    // Ignore errors, fallback to node_modules search | 
|  | 106 | +  } | 
|  | 107 | + | 
| 95 | 108 |   // Find all node_modules directories using efficient traversal | 
| 96 | 109 |   const node_modules = await findNodeModulesDirs(project); | 
| 97 | 110 | 
 | 
| @@ -136,7 +149,7 @@ async function findRuntimePath(project: string) { | 
| 136 | 149 |   return rescriptRuntimeDirs.map((runtime) => resolve(runtime)); | 
| 137 | 150 | } | 
| 138 | 151 | 
 | 
| 139 |  | -function findRuntimeCached() { | 
|  | 152 | +function findRuntimeCached(): (project: string) => Promise<string[]> { | 
| 140 | 153 |   const cache = new Map<string, string[]>(); | 
| 141 | 154 |   return async (project: string) => { | 
| 142 | 155 |     if (cache.has(project)) { | 
|  | 
0 commit comments