33use std:: borrow:: Cow ;
44use std:: path:: { Path , PathBuf } ;
55use std:: rc:: Rc ;
6+ use std:: sync:: Arc ;
67
78use anyhow:: { anyhow, Context , Error , Result } ;
89use console:: style;
910use dashmap:: DashMap ;
1011use deno_ast:: {
11- EmitOptions , EmittedSource , MediaType , ParseParams , SourceMapOption , SourceTextInfo ,
12- TranspileOptions ,
12+ EmitOptions , EmittedSourceBytes , MediaType , ParseParams , SourceMapOption , TranspileOptions ,
1313} ;
14+ use deno_core:: error:: JsError ;
1415use deno_core:: {
15- include_js_files, ExtensionFileSource , ModuleCodeString , ModuleLoadResponse , ModuleSourceCode ,
16- RequestedModuleType ,
16+ include_js_files, Extension , ExtensionFileSource , ModuleCodeString , ModuleLoadResponse ,
17+ ModuleLoader , ModuleSource , ModuleSourceCode , ModuleSpecifier , ModuleType , RequestedModuleType ,
18+ ResolutionKind ,
1719} ;
18- use deno_runtime:: deno_core:: error:: JsError ;
19- use deno_runtime:: deno_core:: {
20- Extension , ModuleLoader , ModuleSource , ModuleSpecifier , ModuleType , ResolutionKind ,
21- SourceMapGetter ,
22- } ;
23- use deno_runtime:: permissions:: { Permissions , PermissionsContainer , PermissionsOptions } ;
20+ use deno_runtime:: deno_permissions:: { Permissions , PermissionsContainer , PermissionsOptions } ;
2421use deno_runtime:: worker:: { MainWorker , WorkerOptions } ;
2522use deno_runtime:: { fmt_errors, BootstrapOptions } ;
2623use futures:: future:: BoxFuture ;
@@ -66,22 +63,19 @@ pub async fn run(
6663 ..Default :: default ( )
6764 } ;
6865
69- let main_module =
70- deno_core:: resolve_path ( & extension. entry_point ( ) . to_string_lossy ( ) , & PathBuf :: from ( "." ) ) ?;
66+ let main_module = deno_core:: resolve_path ( extension. entry_point ( ) , & PathBuf :: from ( "." ) ) ?;
7167
7268 let bootstrap =
7369 BootstrapOptions { args, user_agent : "phylum-cli/extension" . into ( ) , ..Default :: default ( ) } ;
7470
7571 let module_loader = Rc :: new ( ExtensionsModuleLoader :: new ( extension. path ( ) ) ) ;
76- let source_map_getter: Rc < dyn SourceMapGetter > = Rc :: new ( module_loader. clone ( ) ) ;
7772
7873 let origin_storage_dir = extension. state_path ( ) ;
7974
8075 let options = WorkerOptions {
8176 origin_storage_dir,
8277 module_loader,
8378 bootstrap,
84- source_map_getter : Some ( source_map_getter) ,
8579 extensions : vec ! [ phylum_api] ,
8680 ..Default :: default ( )
8781 } ;
@@ -219,7 +213,7 @@ impl ModuleLoader for ExtensionsModuleLoader {
219213 // Load either a local file under the extensions directory, or a Deno standard
220214 // library module. Reject all URLs that do not fit these two use
221215 // cases.
222- let mut code = match module_specifier. scheme ( ) {
216+ let code = match module_specifier. scheme ( ) {
223217 "file" => {
224218 ExtensionsModuleLoader :: load_from_filesystem ( & extension_path, & module_specifier)
225219 . await ?
@@ -228,31 +222,30 @@ impl ModuleLoader for ExtensionsModuleLoader {
228222 _ => return Err ( anyhow ! ( "Unsupported module specifier: {}" , module_specifier) ) ,
229223 } ;
230224
231- if should_transpile {
232- let transpiled =
233- source_mapper. transpile ( module_specifier. to_string ( ) , & code, media_type) ?;
234- code. clone_from ( & transpiled. text ) ;
225+ let module_source = if should_transpile {
226+ let transpiled = source_mapper. transpile (
227+ module_specifier. to_string ( ) ,
228+ code. into ( ) ,
229+ media_type,
230+ ) ?;
231+ ModuleSourceCode :: Bytes ( transpiled. source . into_boxed_slice ( ) . into ( ) )
235232 } else {
236- source_mapper. source_cache . insert ( module_specifier. to_string ( ) , code. clone ( ) ) ;
237- }
233+ source_mapper
234+ . source_cache
235+ . insert ( module_specifier. to_string ( ) , code. clone ( ) . into ( ) ) ;
236+ ModuleSourceCode :: String ( code. into ( ) )
237+ } ;
238238
239- Ok ( ModuleSource :: new (
240- module_type,
241- ModuleSourceCode :: String ( code. into ( ) ) ,
242- & module_specifier,
243- None ,
244- ) )
239+ Ok ( ModuleSource :: new ( module_type, module_source, & module_specifier, None ) )
245240 } ) )
246241 }
247- }
248242
249- impl SourceMapGetter for ExtensionsModuleLoader {
250243 fn get_source_map ( & self , file_name : & str ) -> Option < Vec < u8 > > {
251244 let transpiled = self . source_mapper . transpiled_cache . get ( file_name) ?;
252- transpiled. source_map . clone ( ) . map ( |map| map . into_bytes ( ) )
245+ transpiled. source_map . clone ( )
253246 }
254247
255- fn get_source_line ( & self , file_name : & str , line_number : usize ) -> Option < String > {
248+ fn get_source_mapped_source_line ( & self , file_name : & str , line_number : usize ) -> Option < String > {
256249 let source = self . source_mapper . source_cache . get ( file_name) ?;
257250 source. lines ( ) . nth ( line_number) . map ( |line| line. to_owned ( ) )
258251 }
@@ -261,8 +254,8 @@ impl SourceMapGetter for ExtensionsModuleLoader {
261254/// Module source map cache.
262255#[ derive( Default ) ]
263256struct SourceMapper {
264- transpiled_cache : DashMap < String , EmittedSource > ,
265- source_cache : DashMap < String , String > ,
257+ transpiled_cache : DashMap < String , EmittedSourceBytes > ,
258+ source_cache : DashMap < String , Arc < str > > ,
266259}
267260
268261impl SourceMapper {
@@ -274,21 +267,19 @@ impl SourceMapper {
274267 fn transpile (
275268 & self ,
276269 specifier : impl Into < String > ,
277- code : impl Into < String > ,
270+ code : Arc < str > ,
278271 media_type : MediaType ,
279- ) -> Result < EmittedSource > {
272+ ) -> Result < EmittedSourceBytes > {
280273 let specifier = specifier. into ( ) ;
281274
282275 // Load module if it is not in the cache.
283276 if !self . transpiled_cache . contains_key ( & specifier) {
284- let code = code. into ( ) ;
285-
286277 // Add the original code to the cache.
287278 self . source_cache . insert ( specifier. clone ( ) , code. clone ( ) ) ;
288279
289280 // Parse module.
290281 let parsed = deno_ast:: parse_module ( ParseParams {
291- text_info : SourceTextInfo :: from_string ( code) ,
282+ text : code,
292283 specifier : specifier. parse ( ) ?,
293284 capture_tokens : false ,
294285 scope_analysis : false ,
@@ -306,12 +297,8 @@ impl SourceMapper {
306297 self . transpiled_cache . insert ( specifier. clone ( ) , transpiled) ;
307298 }
308299
309- // Clone fields manually, since derive is missing.
310300 let transpiled = self . transpiled_cache . get ( & specifier) . unwrap ( ) ;
311- Ok ( EmittedSource {
312- source_map : transpiled. source_map . clone ( ) ,
313- text : transpiled. text . clone ( ) ,
314- } )
301+ Ok ( transpiled. clone ( ) )
315302 }
316303}
317304
0 commit comments