@@ -3,26 +3,25 @@ use deno_ast::EmitOptions;
33use deno_ast:: MediaType ;
44use deno_ast:: ParseParams ;
55use deno_ast:: SourceTextInfo ;
6+ use deno_core:: error:: AnyError ;
67use deno_core:: futures:: FutureExt ;
78use deno_core:: ModuleLoader ;
89use deno_core:: ModuleSource ;
910use deno_core:: ModuleSourceFuture ;
1011use deno_core:: ModuleSpecifier ;
1112use deno_core:: ModuleType ;
1213use deno_core:: ResolutionKind ;
14+ use module_fetcher:: cache:: { DenoDir , HttpCache } ;
15+ use module_fetcher:: file_fetcher:: { CacheSetting , FileFetcher } ;
16+ use module_fetcher:: http_util:: HttpClient ;
1317use std:: pin:: Pin ;
1418
1519struct ModuleTypeResult {
16- media_type : MediaType ,
1720 module_type : ModuleType ,
1821 should_transpile : bool ,
1922}
2023
21- fn get_module_type (
22- module_specifier : ModuleSpecifier ,
23- content_type : & str ,
24- ) -> Result < ModuleTypeResult , Error > {
25- let media_type = MediaType :: from_content_type ( & module_specifier, content_type) ;
24+ fn get_module_type ( media_type : MediaType ) -> Result < ModuleTypeResult , Error > {
2625 let ( module_type, should_transpile) = match media_type {
2726 MediaType :: JavaScript | MediaType :: Mjs | MediaType :: Cjs => ( ModuleType :: JavaScript , false ) ,
2827 MediaType :: Jsx => ( ModuleType :: JavaScript , true ) ,
@@ -34,21 +33,52 @@ fn get_module_type(
3433 | MediaType :: Dcts
3534 | MediaType :: Tsx => ( ModuleType :: JavaScript , true ) ,
3635 MediaType :: Json => ( ModuleType :: Json , false ) ,
37- _ => bail ! (
38- "{:?} module type not supported (specifier {:?})" ,
39- media_type,
40- module_specifier. as_str( )
41- ) ,
36+ _ => bail ! ( "{:?} module type not supported" , media_type, ) ,
4237 } ;
4338
4439 Ok ( ModuleTypeResult {
45- media_type,
4640 module_type,
4741 should_transpile,
4842 } )
4943}
5044
51- pub struct DefaultModuleLoader ;
45+ fn make_http_client ( ) -> Result < HttpClient , AnyError > {
46+ let root_cert_store = None ;
47+ let unsafely_ignore_certificate_errors = None ;
48+ HttpClient :: new ( root_cert_store, unsafely_ignore_certificate_errors)
49+ }
50+
51+ pub struct DefaultModuleLoader {
52+ file_fetcher : FileFetcher ,
53+ permissions : module_fetcher:: permissions:: Permissions ,
54+ }
55+
56+ impl DefaultModuleLoader {
57+ pub fn new ( ) -> Result < Self , AnyError > {
58+ // Note: we are reusing Deno dependency cache path
59+ let deno_dir = DenoDir :: new ( None ) ?;
60+ let deps_cache_location = deno_dir. deps_folder_path ( ) ;
61+
62+ let http_cache = HttpCache :: new ( & deps_cache_location) ;
63+ let cache_setting = CacheSetting :: Use ;
64+ let allow_remote = true ;
65+ let http_client = make_http_client ( ) ?;
66+ let blob_store = deno_web:: BlobStore :: default ( ) ;
67+ let file_fetcher = FileFetcher :: new (
68+ http_cache,
69+ cache_setting,
70+ allow_remote,
71+ http_client,
72+ blob_store,
73+ ) ?;
74+ let permissions = module_fetcher:: permissions:: Permissions :: default ( ) ;
75+
76+ Ok ( Self {
77+ file_fetcher,
78+ permissions,
79+ } )
80+ }
81+ }
5282
5383impl ModuleLoader for DefaultModuleLoader {
5484 fn resolve (
@@ -60,55 +90,30 @@ impl ModuleLoader for DefaultModuleLoader {
6090 Ok ( deno_core:: resolve_import ( specifier, referrer) ?)
6191 }
6292
93+ // TODO: implement prepare_load method
6394 fn load (
6495 & self ,
6596 module_specifier : & ModuleSpecifier ,
6697 _maybe_referrer : Option < ModuleSpecifier > ,
6798 _is_dyn_import : bool ,
6899 ) -> Pin < Box < ModuleSourceFuture > > {
100+ let file_fetcher = self . file_fetcher . clone ( ) ;
101+ let permissions = self . permissions . clone ( ) ;
69102 let module_specifier = module_specifier. clone ( ) ;
103+
70104 async move {
71- let ( media_type, module_type, code, should_transpile) = match module_specifier. scheme ( )
72- {
73- "file" => {
74- let content_type = "text/plain" ;
75- let ModuleTypeResult {
76- media_type,
77- module_type,
78- should_transpile,
79- } = get_module_type ( module_specifier. clone ( ) , & content_type) ?;
80- let path = module_specifier. to_file_path ( ) . unwrap ( ) ;
81- let code = std:: fs:: read_to_string ( & path) ?;
82- ( media_type, module_type, code, should_transpile)
83- }
84- "http" | "https" => {
85- let res = reqwest:: get ( module_specifier. clone ( ) ) . await ?;
86- let content_type = res
87- . headers ( )
88- . get ( "content-type" )
89- . map ( |v| v. to_str ( ) )
90- . unwrap ( ) ?;
91- let ModuleTypeResult {
92- media_type,
93- module_type,
94- should_transpile,
95- } = get_module_type ( module_specifier. clone ( ) , content_type) ?;
96- let code = res. text ( ) . await ?;
97- ( media_type, module_type, code, should_transpile)
98- }
99- _ => {
100- bail ! (
101- "unsupported module url scheme: {:?}" ,
102- module_specifier. scheme( )
103- )
104- }
105- } ;
105+ let fetched_file = file_fetcher. fetch ( & module_specifier, permissions) . await ?;
106+ let ModuleTypeResult {
107+ module_type,
108+ should_transpile,
109+ } = get_module_type ( fetched_file. media_type ) ?;
106110
111+ let code = fetched_file. source . to_string ( ) ;
107112 let code = if should_transpile {
108113 let parsed = deno_ast:: parse_module ( ParseParams {
109114 specifier : module_specifier. to_string ( ) ,
110115 text_info : SourceTextInfo :: from_string ( code) ,
111- media_type,
116+ media_type : fetched_file . media_type ,
112117 capture_tokens : false ,
113118 scope_analysis : false ,
114119 maybe_syntax : None ,
@@ -129,7 +134,7 @@ impl ModuleLoader for DefaultModuleLoader {
129134 code : code. into_bytes ( ) . into_boxed_slice ( ) ,
130135 module_type,
131136 module_url_specified : module_specifier. to_string ( ) ,
132- module_url_found : module_specifier . to_string ( ) ,
137+ module_url_found : fetched_file . specifier . to_string ( ) ,
133138 } ;
134139 Ok ( module)
135140 }
0 commit comments