From 67edf8393d1077f433b4aab588a4300a6c7722c4 Mon Sep 17 00:00:00 2001 From: Filipp Bolshakov Date: Thu, 3 Oct 2024 19:03:13 +0300 Subject: [PATCH 1/2] fix: get tsconfig in each pkg for monorepos --- src/parser.ts | 40 +++++++++++++++++++++++++++++++++------- 1 file changed, 33 insertions(+), 7 deletions(-) diff --git a/src/parser.ts b/src/parser.ts index 27daa56..4a6dc17 100644 --- a/src/parser.ts +++ b/src/parser.ts @@ -123,6 +123,23 @@ async function parseTreeRecursive( }); } +function findPackageRoot(dirName: string, packageFileName = 'package.json') { + let currentDir = dirName; + while (currentDir !== path.dirname(currentDir)) { + const packageFilePath = path.join(currentDir, packageFileName); + if (fs.existsSync(packageFilePath)) { + return currentDir; + } + currentDir = path.dirname(currentDir); + } + return ''; +} +type CompilerOptionsByPkg = { + compilerOptions: ts.CompilerOptions; + host: ts.CompilerHost; +}; +const compilerOptionsByPkg = new Map(); + /** * @param entries - the entry glob list * @param options @@ -139,14 +156,23 @@ export async function parseDependencyTree( const fullOptions = normalizeOptions(options); let resolve = simpleResolver; if (options.tsconfig) { - const compilerOptions = ts.parseJsonConfigFileContent( - ts.readConfigFile(options.tsconfig, ts.sys.readFile).config, - ts.sys, - path.dirname(options.tsconfig), - ).options; - - const host = ts.createCompilerHost(compilerOptions); resolve = async (context, request, extensions) => { + const root = findPackageRoot(context); + if (!compilerOptionsByPkg.has(root)) { + let _compilerOptions = ts.parseJsonConfigFileContent( + ts.readConfigFile(path.join(root, 'tsconfig.json'), ts.sys.readFile) + .config, + ts.sys, + root, + ).options; + compilerOptionsByPkg.set(root, { + compilerOptions: _compilerOptions, + host: ts.createCompilerHost(_compilerOptions), + }); + } + const { compilerOptions, host } = compilerOptionsByPkg.get( + root, + ) as CompilerOptionsByPkg; const module = ts.resolveModuleName( request, path.join(context, 'index.ts'), From 5a27876ce4daa65ba7a7d2bed5ebc7387cbba9b0 Mon Sep 17 00:00:00 2001 From: Filipp Bolshakov Date: Mon, 7 Oct 2024 11:05:50 +0300 Subject: [PATCH 2/2] add fallback if tsconfig not exist in pkg --- src/parser.ts | 34 ++++++++++++++++++++++++---------- 1 file changed, 24 insertions(+), 10 deletions(-) diff --git a/src/parser.ts b/src/parser.ts index 4a6dc17..83d90ba 100644 --- a/src/parser.ts +++ b/src/parser.ts @@ -156,19 +156,33 @@ export async function parseDependencyTree( const fullOptions = normalizeOptions(options); let resolve = simpleResolver; if (options.tsconfig) { + const baseCompilerOptions = ts.parseJsonConfigFileContent( + ts.readConfigFile(options.tsconfig, ts.sys.readFile).config, + ts.sys, + path.dirname(options.tsconfig), + ).options; + + const baseHost = ts.createCompilerHost(baseCompilerOptions); resolve = async (context, request, extensions) => { const root = findPackageRoot(context); if (!compilerOptionsByPkg.has(root)) { - let _compilerOptions = ts.parseJsonConfigFileContent( - ts.readConfigFile(path.join(root, 'tsconfig.json'), ts.sys.readFile) - .config, - ts.sys, - root, - ).options; - compilerOptionsByPkg.set(root, { - compilerOptions: _compilerOptions, - host: ts.createCompilerHost(_compilerOptions), - }); + const tsconfigPath = path.join(root, 'tsconfig.json'); + if (fs.existsSync(tsconfigPath)) { + let _compilerOptions = ts.parseJsonConfigFileContent( + ts.readConfigFile(tsconfigPath, ts.sys.readFile).config, + ts.sys, + root, + ).options; + compilerOptionsByPkg.set(root, { + compilerOptions: _compilerOptions, + host: ts.createCompilerHost(_compilerOptions), + }); + } else { + compilerOptionsByPkg.set(root, { + compilerOptions: baseCompilerOptions, + host: baseHost, + }); + } } const { compilerOptions, host } = compilerOptionsByPkg.get( root,