diff --git a/packages/compiler-sfc/__tests__/compileScript/resolveType.spec.ts b/packages/compiler-sfc/__tests__/compileScript/resolveType.spec.ts index 5dd02a66d3f..93bd20879ae 100644 --- a/packages/compiler-sfc/__tests__/compileScript/resolveType.spec.ts +++ b/packages/compiler-sfc/__tests__/compileScript/resolveType.spec.ts @@ -1022,6 +1022,53 @@ describe('resolveType', () => { expect(deps && [...deps]).toStrictEqual(['/user.ts']) }) + test('ts module resolve w/ project reference folder', () => { + const files = { + '/tsconfig.json': JSON.stringify({ + references: [ + { + path: './web', + }, + { + path: './empty', + }, + { + path: './noexists-should-ignore', + }, + ], + }), + '/web/tsconfig.json': JSON.stringify({ + include: ['../**/*.ts', '../**/*.vue'], + compilerOptions: { + composite: true, + paths: { + bar: ['../user.ts'], + }, + }, + }), + // tsconfig with no include / paths defined, should match nothing + '/empty/tsconfig.json': JSON.stringify({ + compilerOptions: { + composite: true, + }, + }), + '/user.ts': 'export type User = { bar: string }', + } + + const { props, deps } = resolve( + ` + import { User } from 'bar' + defineProps() + `, + files, + ) + + expect(props).toStrictEqual({ + bar: ['String'], + }) + expect(deps && [...deps]).toStrictEqual(['/user.ts']) + }) + test('ts module resolve w/ path aliased vue file', () => { const files = { '/tsconfig.json': JSON.stringify({ diff --git a/packages/compiler-sfc/src/script/resolveType.ts b/packages/compiler-sfc/src/script/resolveType.ts index 5566744526a..a17598a82ef 100644 --- a/packages/compiler-sfc/src/script/resolveType.ts +++ b/packages/compiler-sfc/src/script/resolveType.ts @@ -1014,11 +1014,11 @@ function resolveWithTS( (c.config.options.pathsBasePath as string) || dirname(c.config.options.configFilePath as string), ) - const included: string[] = c.config.raw?.include - const excluded: string[] = c.config.raw?.exclude + const included: string[] | undefined = c.config.raw?.include + const excluded: string[] | undefined = c.config.raw?.exclude if ( (!included && (!base || containingFile.startsWith(base))) || - included.some(p => isMatch(containingFile, joinPaths(base, p))) + included?.some(p => isMatch(containingFile, joinPaths(base, p))) ) { if ( excluded && @@ -1089,8 +1089,12 @@ function loadTSConfig( const res = [config] if (config.projectReferences) { for (const ref of config.projectReferences) { - tsConfigRefMap.set(ref.path, configPath) - res.unshift(...loadTSConfig(ref.path, ts, fs)) + const refPath = ts.resolveProjectReferencePath(ref) + if (!fs.fileExists(refPath)) { + continue + } + tsConfigRefMap.set(refPath, configPath) + res.unshift(...loadTSConfig(refPath, ts, fs)) } } return res