From 4db98d3c2936bd990037b06d966040e96f703471 Mon Sep 17 00:00:00 2001 From: cluezhang Date: Sat, 11 May 2024 10:32:34 +0800 Subject: [PATCH 1/2] fix(compile-sfc): Support project reference with folder, fix #10907 --- .../compileScript/resolveType.spec.ts | 47 +++++++++++++++++++ .../compiler-sfc/src/script/resolveType.ts | 10 ++-- 2 files changed, 54 insertions(+), 3 deletions(-) diff --git a/packages/compiler-sfc/__tests__/compileScript/resolveType.spec.ts b/packages/compiler-sfc/__tests__/compileScript/resolveType.spec.ts index 98f5019a03d..50ca0b6ba5c 100644 --- a/packages/compiler-sfc/__tests__/compileScript/resolveType.spec.ts +++ b/packages/compiler-sfc/__tests__/compileScript/resolveType.spec.ts @@ -946,6 +946,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 bbed11baffe..fd96f412e0f 100644 --- a/packages/compiler-sfc/src/script/resolveType.ts +++ b/packages/compiler-sfc/src/script/resolveType.ts @@ -1009,7 +1009,7 @@ function resolveWithTS( const excluded: string[] = 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 && @@ -1080,8 +1080,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 From 1da219f6a6537815eaaac1f704c9af05e7408b27 Mon Sep 17 00:00:00 2001 From: cluezhang Date: Tue, 21 May 2024 11:07:58 +0800 Subject: [PATCH 2/2] chore(types): improve typings --- packages/compiler-sfc/src/script/resolveType.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/compiler-sfc/src/script/resolveType.ts b/packages/compiler-sfc/src/script/resolveType.ts index fd96f412e0f..a3176e7fea1 100644 --- a/packages/compiler-sfc/src/script/resolveType.ts +++ b/packages/compiler-sfc/src/script/resolveType.ts @@ -1005,8 +1005,8 @@ 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)))