Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(compiler-sfc): malformed filename on windows using path.posix.join() #9478

Merged
merged 8 commits into from
Nov 13, 2023
Original file line number Diff line number Diff line change
Expand Up @@ -481,25 +481,28 @@ describe('resolveType', () => {

test.runIf(process.platform === 'win32')('relative ts on Windows', () => {
const files = {
'C:\\Test\\foo.ts': 'export type P = { foo: number }',
'C:\\Test\\bar.d.ts':
'C:\\Test\\FolderA\\foo.ts': 'export type P = { foo: number }',
'C:\\Test\\FolderA\\bar.d.ts':
'type X = { bar: string }; export { X as Y };' +
// verify that we can parse syntax that is only valid in d.ts
'export const baz: boolean'
'export const baz: boolean',
'C:\\Test\\FolderB\\buz.ts': 'export type Z = { buz: string }'
}
const { props, deps } = resolve(
`
import { P } from './foo'
import { Y as PP } from './bar'
defineProps<P & PP>()
import { Z as PPP } from '../FolderB/buz'
defineProps<P & PP & PPP>()
`,
files,
{},
'C:\\Test\\Test.vue'
'C:\\Test\\FolderA\\Test.vue'
)
expect(props).toStrictEqual({
foo: ['Number'],
bar: ['String']
bar: ['String'],
buz: ['String']
})
expect(deps && [...deps].map(normalize)).toStrictEqual(
Object.keys(files).map(normalize)
Expand Down
10 changes: 8 additions & 2 deletions packages/compiler-sfc/src/script/resolveType.ts
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,9 @@ import { parse as babelParse } from '@babel/parser'
import { parse } from '../parse'
import { createCache } from '../cache'
import type TS from 'typescript'
import { extname, dirname } from 'path'
import { extname, dirname, join } from 'path'
import { minimatch as isMatch } from 'minimatch'
import * as process from 'process'

/**
* TypeResolveContext is compatible with ScriptCompileContext
Expand Down Expand Up @@ -779,7 +780,12 @@ function importSourceToScope(

let resolved: string | undefined = scope.resolvedImportSources[source]
if (!resolved) {
if (source.startsWith('.')) {
if (source.startsWith('..')) {
const osSpecificJoinFn = process.platform === 'win32' ? join : joinPaths
b12k marked this conversation as resolved.
Show resolved Hide resolved

const filename = osSpecificJoinFn(dirname(scope.filename), source)
resolved = resolveExt(filename, fs)
} else if (source.startsWith('.')) {
// relative import - fast path
const filename = joinPaths(dirname(scope.filename), source)
resolved = resolveExt(filename, fs)
Expand Down