+import { normalize } from 'node:path'
import { Identifier } from '@babel/types'
import { SFCScriptCompileOptions, parse } from '../../src'
import { ScriptCompileContext } from '../../src/script/context'
expect(deps && [...deps]).toStrictEqual(Object.keys(files))
})
+ 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':
+ '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'
+ }
+ const { props, deps } = resolve(
+ `
+ import { P } from './foo'
+ import { Y as PP } from './bar'
+ defineProps<P & PP>()
+ `,
+ files,
+ {},
+ 'C:\\Test\\Test.vue'
+ )
+ expect(props).toStrictEqual({
+ foo: ['Number'],
+ bar: ['String']
+ })
+ expect(deps && [...deps].map(normalize)).toStrictEqual(
+ Object.keys(files).map(normalize)
+ )
+ })
+
// #8244
test('utility type in external file', () => {
const files = {
function resolve(
code: string,
files: Record<string, string> = {},
- options?: Partial<SFCScriptCompileOptions>
+ options?: Partial<SFCScriptCompileOptions>,
+ sourceFileName: string = '/Test.vue'
) {
const { descriptor } = parse(`<script setup lang="ts">\n${code}\n</script>`, {
- filename: '/Test.vue'
+ filename: sourceFileName
})
const ctx = new ScriptCompileContext(descriptor, {
id: 'test',
fs: {
fileExists(file) {
- return !!files[file]
+ return !!(files[file] ?? files[normalize(file)])
},
readFile(file) {
- return files[file]
+ return files[file] ?? files[normalize(file)]
}
},
...options
if (!resolved) {
if (source.startsWith('.')) {
// relative import - fast path
- const filename = joinPaths(scope.filename, '..', source)
+ const filename = joinPaths(dirname(scope.filename), source)
resolved = resolveExt(filename, fs)
} else {
// module or aliased import - use full TS resolution, only supported in Node