From b36addd3bde07467e9ff5641bd1c2bdc3085944c Mon Sep 17 00:00:00 2001 From: Evan You Date: Wed, 17 May 2023 10:14:44 +0800 Subject: [PATCH] fix(compiler-sfc): handle ts files with relative imports with .js extension close #8339 --- .../compileScript/resolveType.spec.ts | 20 +++++++++++++++++++ .../compiler-sfc/src/script/resolveType.ts | 2 ++ 2 files changed, 22 insertions(+) diff --git a/packages/compiler-sfc/__tests__/compileScript/resolveType.spec.ts b/packages/compiler-sfc/__tests__/compileScript/resolveType.spec.ts index dd47ae269c6..3d238748199 100644 --- a/packages/compiler-sfc/__tests__/compileScript/resolveType.spec.ts +++ b/packages/compiler-sfc/__tests__/compileScript/resolveType.spec.ts @@ -592,6 +592,26 @@ describe('resolveType', () => { expect(deps && [...deps]).toStrictEqual(Object.keys(files)) }) + // #8339 + test('relative, .js import', () => { + const files = { + '/foo.d.ts': + 'import { PP } from "./bar.js"; export type P = { foo: PP }', + '/bar.d.ts': 'export type PP = "foo" | "bar"' + } + const { props, deps } = resolve( + ` + import { P } from './foo' + defineProps

() + `, + files + ) + expect(props).toStrictEqual({ + foo: ['String'] + }) + expect(deps && [...deps]).toStrictEqual(Object.keys(files)) + }) + test('ts module resolve', () => { const files = { '/node_modules/foo/package.json': JSON.stringify({ diff --git a/packages/compiler-sfc/src/script/resolveType.ts b/packages/compiler-sfc/src/script/resolveType.ts index e79d21f8419..35a80e1b186 100644 --- a/packages/compiler-sfc/src/script/resolveType.ts +++ b/packages/compiler-sfc/src/script/resolveType.ts @@ -785,6 +785,8 @@ function importSourceToScope( } function resolveExt(filename: string, fs: FS) { + // #8339 ts may import .js but we should resolve to corresponding ts or d.ts + filename = filename.replace(/\.js$/, '') const tryResolve = (filename: string) => { if (fs.fileExists(filename)) return filename }