1- import type { Manifest , ManifestChunk } from 'vite'
21import { withLeadingSlash } from 'ufo'
3- import { renderLinkToString , renderLinkToHeader , renderScriptToString , parseResource } from './utils '
4- import type { LinkAttributes , ParsedResource } from './utils'
2+ import type { Manifest , ResourceMeta } from './manifest '
3+ import { LinkAttributes , renderLinkToHeader , renderLinkToString , renderScriptToString } from './runtime /utils'
54
65export interface ModuleDependencies {
7- scripts : Record < string , ParsedResource >
8- styles : Record < string , ParsedResource >
9- preload : Record < string , ParsedResource >
10- prefetch : Record < string , ParsedResource >
6+ scripts : Record < string , ResourceMeta >
7+ styles : Record < string , ResourceMeta >
8+ preload : Record < string , ResourceMeta >
9+ prefetch : Record < string , ResourceMeta >
1110}
1211
1312export interface SSRContext {
@@ -24,22 +23,21 @@ export interface SSRContext {
2423}
2524
2625export interface RenderOptions {
27- shouldPrefetch ?: ( resource : ParsedResource ) => boolean
28- shouldPreload ?: ( resource : ParsedResource ) => boolean
26+ shouldPrefetch ?: ( resource : ResourceMeta ) => boolean
27+ shouldPreload ?: ( resource : ResourceMeta ) => boolean
2928 buildAssetsURL ?: ( id : string ) => string
3029 manifest : Manifest
3130}
3231
3332export interface RendererContext extends Required < RenderOptions > {
3433 _dependencies : Record < string , ModuleDependencies >
3534 _dependencySets : Record < string , ModuleDependencies >
36- _parsedResources : Record < string , ParsedResource >
3735 _entrypoints : string [ ]
3836 updateManifest : ( manifest : Manifest ) => void
3937}
4038
4139const defaultShouldPrefetch = ( ) => true
42- const defaultShouldPreload = ( resource : ParsedResource ) => [ 'module' , 'script' , 'style' ] . includes ( resource . asType || '' )
40+ const defaultShouldPreload = ( resource : ResourceMeta ) => [ 'module' , 'script' , 'style' ] . includes ( resource . resourceType || '' )
4341
4442export function createRendererContext ( { manifest, buildAssetsURL, shouldPrefetch, shouldPreload } : RenderOptions ) : RendererContext {
4543 const ctx : RendererContext = {
@@ -53,16 +51,14 @@ export function createRendererContext ({ manifest, buildAssetsURL, shouldPrefetc
5351 // Internal cache
5452 _dependencies : undefined ! ,
5553 _dependencySets : undefined ! ,
56- _parsedResources : undefined ! ,
5754 _entrypoints : undefined !
5855 }
5956
6057 function updateManifest ( manifest : Manifest ) {
61- const manifestEntries = Object . entries ( manifest ) as [ string , ManifestChunk ] [ ]
58+ const manifestEntries = Object . entries ( manifest ) as [ string , ResourceMeta ] [ ]
6259 ctx . manifest = manifest
6360 ctx . _dependencies = { }
6461 ctx . _dependencySets = { }
65- ctx . _parsedResources = { }
6662 ctx . _entrypoints = manifestEntries . filter ( e => e [ 1 ] . isEntry ) . map ( ( [ module ] ) => module )
6763 }
6864
@@ -92,16 +88,16 @@ export function getModuleDependencies (id: string, rendererContext: RendererCont
9288
9389 // Add to scripts + preload
9490 if ( meta . file ) {
95- dependencies . scripts [ id ] = dependencies . preload [ id ] = rendererContext . _parsedResources [ meta . file ] || parseResource ( meta . file )
91+ dependencies . scripts [ id ] = dependencies . preload [ id ] = rendererContext . manifest [ id ]
9692 }
9793
9894 // Add styles + preload
9995 for ( const css of meta . css || [ ] ) {
100- dependencies . styles [ css ] = dependencies . preload [ css ] = dependencies . prefetch [ css ] = rendererContext . _parsedResources [ css ] || parseResource ( css )
96+ dependencies . styles [ css ] = dependencies . preload [ css ] = dependencies . prefetch [ css ] = rendererContext . manifest [ css ]
10197 }
10298 // Add assets as preload
10399 for ( const asset of meta . assets || [ ] ) {
104- dependencies . preload [ asset ] = dependencies . prefetch [ asset ] = rendererContext . _parsedResources [ asset ] || parseResource ( asset )
100+ dependencies . preload [ asset ] = dependencies . prefetch [ asset ] = rendererContext . manifest [ asset ]
105101 }
106102 // Resolve nested dependencies and merge
107103 for ( const depId of meta . imports || [ ] ) {
@@ -194,7 +190,7 @@ export function getRequestDependencies (ssrContext: SSRContext, rendererContext:
194190export function renderStyles ( ssrContext : SSRContext , rendererContext : RendererContext ) : string {
195191 const { styles } = getRequestDependencies ( ssrContext , rendererContext )
196192 return Object . values ( styles ) . map ( resource =>
197- renderLinkToString ( { rel : 'stylesheet' , href : rendererContext . buildAssetsURL ( resource . path ) } )
193+ renderLinkToString ( { rel : 'stylesheet' , href : rendererContext . buildAssetsURL ( resource . file ) } )
198194 ) . join ( '' )
199195}
200196
@@ -216,31 +212,31 @@ export function getPreloadLinks (ssrContext: SSRContext, rendererContext: Render
216212 const { preload } = getRequestDependencies ( ssrContext , rendererContext )
217213 return Object . values ( preload )
218214 . map ( resource => ( {
219- rel : resource . isModule ? 'modulepreload' : 'preload' ,
220- as : resource . asType ,
221- type : resource . contentType ,
222- crossorigin : resource . asType === 'font' || resource . isModule ? '' : null ,
223- href : rendererContext . buildAssetsURL ( resource . path )
215+ rel : resource . module ? 'modulepreload' : 'preload' ,
216+ as : resource . resourceType ,
217+ type : resource . mimeType ?? null ,
218+ crossorigin : resource . resourceType === 'font' || resource . module ? '' : null ,
219+ href : rendererContext . buildAssetsURL ( resource . file )
224220 } ) )
225221}
226222
227223export function getPrefetchLinks ( ssrContext : SSRContext , rendererContext : RendererContext ) : LinkAttributes [ ] {
228224 const { prefetch } = getRequestDependencies ( ssrContext , rendererContext )
229225 return Object . values ( prefetch ) . map ( resource => ( {
230- rel : 'prefetch' + ( resource . asType === 'style' ? ' stylesheet' : '' ) ,
231- as : resource . asType !== 'style' ? resource . asType : null ,
232- type : resource . contentType ,
233- crossorigin : resource . asType === 'font' || resource . isModule ? '' : null ,
234- href : rendererContext . buildAssetsURL ( resource . path )
226+ rel : 'prefetch' + ( resource . resourceType === 'style' ? ' stylesheet' : '' ) ,
227+ as : resource . resourceType !== 'style' ? resource . resourceType : null ,
228+ type : resource . mimeType ?? null ,
229+ crossorigin : resource . resourceType === 'font' || resource . module ? '' : null ,
230+ href : rendererContext . buildAssetsURL ( resource . file )
235231 } ) )
236232}
237233
238234export function renderScripts ( ssrContext : SSRContext , rendererContext : RendererContext ) : string {
239235 const { scripts } = getRequestDependencies ( ssrContext , rendererContext )
240236 return Object . values ( scripts ) . map ( resource => renderScriptToString ( {
241- type : resource . isModule ? 'module' : null ,
242- src : rendererContext . buildAssetsURL ( resource . path ) ,
243- defer : resource . isModule ? null : '' ,
237+ type : resource . module ? 'module' : null ,
238+ src : rendererContext . buildAssetsURL ( resource . file ) ,
239+ defer : resource . module ? null : '' ,
244240 crossorigin : ''
245241 } ) ) . join ( '' )
246242}
0 commit comments