@@ -5,6 +5,7 @@ use std::path::PathBuf;
55use std:: rc:: Rc ;
66use std:: sync:: Arc ;
77
8+ use anyhow:: bail;
89use deno_cache_dir:: file_fetcher:: CacheSetting ;
910use deno_cache_dir:: file_fetcher:: NullBlobStore ;
1011use deno_graph:: MediaType ;
@@ -366,22 +367,30 @@ impl DenoLoader {
366367 resolution_mode : node_resolver:: ResolutionMode ,
367368 ) -> Result < String , anyhow:: Error > {
368369 let importer = importer. filter ( |v| !v. is_empty ( ) ) ;
369- let referrer = match importer {
370+ let ( specifier , referrer) = match importer {
370371 Some ( referrer)
371372 if referrer. starts_with ( "http:" )
372373 || referrer. starts_with ( "https:" )
373374 || referrer. starts_with ( "file:" ) =>
374375 {
375- Url :: parse ( & referrer) ?
376+ ( specifier , Url :: parse ( & referrer) ?)
376377 }
377- Some ( referrer) => deno_path_util:: url_from_file_path (
378- & sys_traits:: impls:: wasm_string_to_path ( referrer) ,
379- ) ?,
378+ Some ( referrer) => (
379+ specifier,
380+ deno_path_util:: url_from_file_path (
381+ & sys_traits:: impls:: wasm_string_to_path ( referrer) ,
382+ ) ?,
383+ ) ,
380384 None => {
381- return Ok (
385+ let entrypoint =
382386 parse_entrypoint ( specifier, self . workspace_factory . initial_cwd ( ) ) ?
383- . to_string ( ) ,
384- ) ;
387+ . to_string ( ) ;
388+ (
389+ entrypoint,
390+ deno_path_util:: url_from_file_path (
391+ self . workspace_factory . initial_cwd ( ) ,
392+ ) ?,
393+ )
385394 }
386395 } ;
387396 let resolved = self . resolver . resolve_with_graph (
@@ -418,9 +427,15 @@ impl DenoLoader {
418427 MediaType :: Wasm ,
419428 & m. source ,
420429 ) ) ,
421- Some ( Module :: Node ( node) ) => Ok ( create_external_repsonse ( & node. specifier ) ) ,
430+ Some ( Module :: Node ( m) ) => Ok ( create_external_repsonse ( & m. specifier ) ) ,
431+ Some ( Module :: Npm ( _) ) => {
432+ bail ! (
433+ "Failed resolving '{}'\n \n Resolve the npm: specifier to a file: specifier before providing it to the loader." ,
434+ url
435+ )
436+ }
422437 None if url. scheme ( ) == "node" => Ok ( create_external_repsonse ( & url) ) ,
423- Some ( Module :: Npm ( _ ) | Module :: External ( _) ) | None => {
438+ Some ( Module :: External ( _) ) | None => {
424439 let file = self . file_fetcher . fetch_bypass_permissions ( & url) . await ?;
425440 Ok ( create_module_response (
426441 & file. url ,
@@ -482,6 +497,7 @@ fn parse_entrypoint(
482497 if entrypoint. starts_with ( "jsr:" )
483498 || entrypoint. starts_with ( "https:" )
484499 || entrypoint. starts_with ( "file:" )
500+ || entrypoint. starts_with ( "npm:" )
485501 {
486502 Ok ( Url :: parse ( & entrypoint) ?)
487503 } else {
0 commit comments