Skip to content

Commit 8d8ddd6

Browse files
committed
feat(compiler-sfc): expose type import deps on compiled script block
1 parent 075498c commit 8d8ddd6

File tree

4 files changed

+60
-49
lines changed

4 files changed

+60
-49
lines changed

packages/compiler-sfc/__tests__/compileScript/resolveType.spec.ts

+54-46
Original file line numberDiff line numberDiff line change
@@ -264,81 +264,85 @@ describe('resolveType', () => {
264264
})
265265

266266
describe('external type imports', () => {
267+
const files = {
268+
'/foo.ts': 'export type P = { foo: number }',
269+
'/bar.d.ts': 'type X = { bar: string }; export { X as Y }'
270+
}
267271
test('relative ts', () => {
268-
expect(
269-
resolve(
270-
`
272+
const { props, deps } = resolve(
273+
`
271274
import { P } from './foo'
272275
import { Y as PP } from './bar'
273276
defineProps<P & PP>()
274-
`,
275-
{
276-
'/foo.ts': 'export type P = { foo: number }',
277-
'/bar.d.ts': 'type X = { bar: string }; export { X as Y }'
278-
}
279-
).props
280-
).toStrictEqual({
277+
`,
278+
files
279+
)
280+
expect(props).toStrictEqual({
281281
foo: ['Number'],
282282
bar: ['String']
283283
})
284+
expect(deps && [...deps]).toStrictEqual(Object.keys(files))
284285
})
285286

286287
test('relative vue', () => {
287-
expect(
288-
resolve(
289-
`
288+
const files = {
289+
'/foo.vue':
290+
'<script lang="ts">export type P = { foo: number }</script>',
291+
'/bar.vue':
292+
'<script setup lang="tsx">export type P = { bar: string }</script>'
293+
}
294+
const { props, deps } = resolve(
295+
`
290296
import { P } from './foo.vue'
291297
import { P as PP } from './bar.vue'
292298
defineProps<P & PP>()
293-
`,
294-
{
295-
'/foo.vue':
296-
'<script lang="ts">export type P = { foo: number }</script>',
297-
'/bar.vue':
298-
'<script setup lang="tsx">export type P = { bar: string }</script>'
299-
}
300-
).props
301-
).toStrictEqual({
299+
`,
300+
files
301+
)
302+
expect(props).toStrictEqual({
302303
foo: ['Number'],
303304
bar: ['String']
304305
})
306+
expect(deps && [...deps]).toStrictEqual(Object.keys(files))
305307
})
306308

307309
test('relative (chained)', () => {
308-
expect(
309-
resolve(
310-
`
310+
const files = {
311+
'/foo.ts': `import type { P as PP } from './nested/bar.vue'
312+
export type P = { foo: number } & PP`,
313+
'/nested/bar.vue':
314+
'<script setup lang="ts">export type P = { bar: string }</script>'
315+
}
316+
const { props, deps } = resolve(
317+
`
311318
import { P } from './foo'
312319
defineProps<P>()
313-
`,
314-
{
315-
'/foo.ts': `import type { P as PP } from './nested/bar.vue'
316-
export type P = { foo: number } & PP`,
317-
'/nested/bar.vue':
318-
'<script setup lang="ts">export type P = { bar: string }</script>'
319-
}
320-
).props
321-
).toStrictEqual({
320+
`,
321+
files
322+
)
323+
expect(props).toStrictEqual({
322324
foo: ['Number'],
323325
bar: ['String']
324326
})
327+
expect(deps && [...deps]).toStrictEqual(Object.keys(files))
325328
})
326329

327330
test('relative (chained, re-export)', () => {
328-
expect(
329-
resolve(
330-
`
331+
const files = {
332+
'/foo.ts': `export { P as PP } from './bar'`,
333+
'/bar.ts': 'export type P = { bar: string }'
334+
}
335+
const { props, deps } = resolve(
336+
`
331337
import { PP as P } from './foo'
332338
defineProps<P>()
333-
`,
334-
{
335-
'/foo.ts': `export { P as PP } from './bar'`,
336-
'/bar.ts': 'export type P = { bar: string }'
337-
}
338-
).props
339-
).toStrictEqual({
339+
`,
340+
files
341+
)
342+
expect(props).toStrictEqual({
340343
bar: ['String']
341344
})
345+
expect(deps && [...deps]).toStrictEqual(Object.keys(files))
342346
})
343347

344348
test('ts module resolve', () => {
@@ -357,7 +361,7 @@ describe('resolveType', () => {
357361
'/pp.ts': 'export type PP = { bar: string }'
358362
}
359363

360-
const { props } = resolve(
364+
const { props, deps } = resolve(
361365
`
362366
import { P } from 'foo'
363367
import { PP } from 'bar'
@@ -370,6 +374,10 @@ describe('resolveType', () => {
370374
foo: ['Number'],
371375
bar: ['String']
372376
})
377+
expect(deps && [...deps]).toStrictEqual([
378+
'/node_modules/foo/index.d.ts',
379+
'/pp.ts'
380+
])
373381
})
374382
})
375383

@@ -447,6 +455,6 @@ function resolve(code: string, files: Record<string, string> = {}) {
447455
return {
448456
props,
449457
calls: raw.calls,
450-
raw
458+
deps: ctx.deps
451459
}
452460
}

packages/compiler-sfc/src/compileScript.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -1035,7 +1035,8 @@ export function compileScript(
10351035
}) as unknown as RawSourceMap)
10361036
: undefined,
10371037
scriptAst: scriptAst?.body,
1038-
scriptSetupAst: scriptSetupAst?.body
1038+
scriptSetupAst: scriptSetupAst?.body,
1039+
deps: ctx.deps ? [...ctx.deps] : undefined
10391040
}
10401041
}
10411042

packages/compiler-sfc/src/script/context.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ export class ScriptCompileContext {
6565
/**
6666
* to be exposed on compiled script block for HMR cache busting
6767
*/
68-
deps?: string[]
68+
deps?: Set<string>
6969

7070
constructor(
7171
public descriptor: SFCDescriptor,

packages/compiler-sfc/src/script/resolveType.ts

+3-1
Original file line numberDiff line numberDiff line change
@@ -547,7 +547,9 @@ function resolveTypeFromImport(
547547
}
548548

549549
if (resolved) {
550-
// TODO (hmr) register dependency file on ctx
550+
// (hmr) register dependency file on ctx
551+
;(ctx.deps || (ctx.deps = new Set())).add(resolved)
552+
551553
return resolveTypeReference(
552554
ctx,
553555
node,

0 commit comments

Comments
 (0)