@@ -43,6 +43,7 @@ pub enum ReferencedAsset {
4343 Some ( Vc < Box < dyn EcmascriptChunkPlaceable > > ) ,
4444 External ( RcStr , ExternalType ) ,
4545 None ,
46+ Unresolveable ,
4647}
4748
4849impl ReferencedAsset {
@@ -52,7 +53,7 @@ impl ReferencedAsset {
5253 ReferencedAsset :: External ( request, ty) => Some ( magic_identifier:: mangle ( & format ! (
5354 "{ty} external {request}"
5455 ) ) ) ,
55- ReferencedAsset :: None => None ,
56+ ReferencedAsset :: None | ReferencedAsset :: Unresolveable => None ,
5657 } )
5758 }
5859
@@ -72,7 +73,11 @@ impl ReferencedAsset {
7273 #[ turbo_tasks:: function]
7374 pub async fn from_resolve_result ( resolve_result : Vc < ModuleResolveResult > ) -> Result < Vc < Self > > {
7475 // TODO handle multiple keyed results
75- for ( _key, result) in resolve_result. await ?. primary . iter ( ) {
76+ let result = resolve_result. await ?;
77+ if result. primary . is_empty ( ) {
78+ return Ok ( ReferencedAsset :: Unresolveable . cell ( ) ) ;
79+ }
80+ for ( _key, result) in result. primary . iter ( ) {
7681 match result {
7782 ModuleResolveResultItem :: External ( request, ty) => {
7883 return Ok ( ReferencedAsset :: External ( request. clone ( ) , * ty) . cell ( ) ) ;
@@ -82,14 +87,14 @@ impl ReferencedAsset {
8287 Vc :: try_resolve_downcast :: < Box < dyn EcmascriptChunkPlaceable > > ( module)
8388 . await ?
8489 {
85- return Ok ( ReferencedAsset :: cell ( ReferencedAsset :: Some ( placeable) ) ) ;
90+ return Ok ( ReferencedAsset :: Some ( placeable) . cell ( ) ) ;
8691 }
8792 }
8893 // TODO ignore should probably be handled differently
8994 _ => { }
9095 }
9196 }
92- Ok ( ReferencedAsset :: cell ( ReferencedAsset :: None ) )
97+ Ok ( ReferencedAsset :: None . cell ( ) )
9398 }
9499}
95100
@@ -244,25 +249,9 @@ impl CodeGenerateable for EsmAssetReference {
244249 chunking_context : Vc < Box < dyn ChunkingContext > > ,
245250 ) -> Result < Vc < CodeGeneration > > {
246251 let this = & * self . await ?;
247- let chunking_type = self . chunking_type ( ) . await ?;
248- let resolved = self . resolve_reference ( ) . await ?;
249-
250- // Insert code that throws immediately at time of import if a request is
251- // unresolvable
252- if resolved. is_unresolveable_ref ( ) {
253- let request = request_to_string ( this. request ) . await ?. to_string ( ) ;
254- let stmt = Stmt :: Expr ( ExprStmt {
255- expr : Box :: new ( throw_module_not_found_expr ( & request) ) ,
256- span : DUMMY_SP ,
257- } ) ;
258- return Ok ( CodeGeneration :: hoisted_stmt (
259- format ! ( "throw {request}" ) . into ( ) ,
260- stmt,
261- ) ) ;
262- }
263252
264253 // only chunked references can be imported
265- let result = if chunking_type . is_some ( ) {
254+ let result = if this . annotations . chunking_type ( ) != Some ( "none" ) {
266255 let referenced_asset = self . get_referenced_asset ( ) . await ?;
267256 let import_externals = this. import_externals ;
268257 if let Some ( ident) = referenced_asset. get_ident ( ) . await ? {
@@ -275,6 +264,16 @@ impl CodeGenerateable for EsmAssetReference {
275264 Span :: new ( BytePos ( start as u32 ) , BytePos ( end as u32 ) )
276265 } ) ;
277266 match & * referenced_asset {
267+ ReferencedAsset :: Unresolveable => {
268+ // Insert code that throws immediately at time of import if a request is
269+ // unresolvable
270+ let request = request_to_string ( this. request ) . await ?. to_string ( ) ;
271+ let stmt = Stmt :: Expr ( ExprStmt {
272+ expr : Box :: new ( throw_module_not_found_expr ( & request) ) ,
273+ span : DUMMY_SP ,
274+ } ) ;
275+ Some ( ( format ! ( "throw {request}" ) . into ( ) , stmt) )
276+ }
278277 ReferencedAsset :: Some ( asset) => {
279278 let id = asset
280279 . as_chunk_item ( Vc :: upcast ( chunking_context) )
0 commit comments