1- use deno_core:: serde_json:: { json, Value } ;
2- use deno_core:: json_op_sync;
1+ use deno:: create_main_worker;
2+ use deno:: File ;
3+ use deno:: MediaType ;
4+ use deno:: Flags ;
5+ use deno:: ProgramState ;
6+ use deno:: tools;
7+ use deno:: fs_util;
8+ use deno:: tsc:: { op, State } ;
9+ use deno_core:: { OpFn } ;
10+ use deno_core:: serde_json:: { self , json, Value } ;
11+ use deno_core:: op_sync;
312use deno_core:: error:: AnyError ;
13+ use deno_core:: url:: Url ;
14+ use deno_runtime:: web_worker:: WebWorkerOptions ;
15+ use deno_runtime:: ops:: worker_host:: CreateWebWorkerCb ;
16+ use deno_runtime:: web_worker:: WebWorker ;
417use deno_runtime:: permissions:: Permissions ;
5- use deno_runtime:: worker:: MainWorker ;
6- use deno_runtime:: worker:: WorkerOptions ;
18+ use deno_runtime:: worker:: { MainWorker , WorkerOptions } ;
719use std:: rc:: Rc ;
820use std:: sync:: Arc ;
921use serde:: Serialize ;
1022use serde:: de:: DeserializeOwned ;
11- use deno_core:: { OpFn } ;
12- use super :: source_maps:: apply_source_map;
13- use super :: file_fetcher:: File ;
14- use super :: media_type:: MediaType ;
15- use super :: flags:: Flags ;
16- use super :: program_state:: ProgramState ;
17- use super :: tools;
18- use super :: ops;
19- use super :: fmt_errors:: PrettyJsError ;
20- use super :: module_loader:: CliModuleLoader ;
21- use deno_core:: ModuleSpecifier ;
22- use deno_runtime:: web_worker:: WebWorkerOptions ;
23- use deno_runtime:: ops:: worker_host:: CreateWebWorkerCb ;
24- use deno_runtime:: web_worker:: WebWorker ;
2523use clarity_repl:: clarity:: coverage:: CoverageReporter ;
2624
2725mod sessions {
@@ -155,7 +153,7 @@ pub async fn run_tests(files: Vec<String>, include_coverage: bool) -> Result<(),
155153 vec ! [ "./tests/" . to_string( ) ]
156154 } ;
157155 let test_modules =
158- tools:: test_runner:: prepare_test_modules_urls ( include, & cwd) ?;
156+ tools:: test_runner:: collect_test_module_specifiers ( include, & cwd, fs_util :: is_supported_ext ) ?;
159157
160158 if test_modules. is_empty ( ) {
161159 println ! ( "No matching test modules found" ) ;
@@ -164,7 +162,7 @@ pub async fn run_tests(files: Vec<String>, include_coverage: bool) -> Result<(),
164162 let main_module = deno_core:: resolve_path ( "$deno$test.ts" ) ?;
165163 // Create a dummy source file.
166164
167- let source = tools :: test_runner :: render_test_file (
165+ let source = render_test_file (
168166 test_modules. clone ( ) ,
169167 fail_fast,
170168 quiet,
@@ -184,7 +182,7 @@ pub async fn run_tests(files: Vec<String>, include_coverage: bool) -> Result<(),
184182 program_state. file_fetcher . insert_cached ( source_file) ;
185183
186184 let mut worker =
187- create_main_worker ( & program_state, main_module. clone ( ) , permissions) ;
185+ create_main_worker ( & program_state, main_module. clone ( ) , permissions, false ) ;
188186
189187 worker. js_runtime . register_op ( "setup_chain" , op ( setup_chain) ) ;
190188 worker. js_runtime . register_op ( "mine_block" , op ( mine_block) ) ;
@@ -199,14 +197,14 @@ pub async fn run_tests(files: Vec<String>, include_coverage: bool) -> Result<(),
199197 }
200198
201199 worker. execute ( "window.dispatchEvent(new Event('load'))" ) ;
202- let res = worker. run_event_loop ( ) . await ;
200+ let res = worker. run_event_loop ( false ) . await ;
203201 if let Err ( e) = res {
204202 println ! ( "{}" , e) ;
205203 return Err ( e) ;
206204 }
207205
208206 worker. execute ( "window.dispatchEvent(new Event('unload'))" ) ?;
209- let res = worker. run_event_loop ( ) . await ;
207+ let res = worker. run_event_loop ( false ) . await ;
210208 if let Err ( e) = res {
211209 println ! ( "{}" , e) ;
212210 return Err ( e) ;
@@ -233,166 +231,55 @@ pub async fn run_tests(files: Vec<String>, include_coverage: bool) -> Result<(),
233231 Ok ( ( ) )
234232}
235233
236- fn create_web_worker_callback (
237- program_state : Arc < ProgramState > ,
238- ) -> Arc < CreateWebWorkerCb > {
239- Arc :: new ( move |args| {
240- let global_state_ = program_state. clone ( ) ;
241- let js_error_create_fn = Rc :: new ( move |core_js_error| {
242- let source_mapped_error =
243- apply_source_map ( & core_js_error, global_state_. clone ( ) ) ;
244- PrettyJsError :: create ( source_mapped_error)
245- } ) ;
246-
247- let attach_inspector = program_state. maybe_inspector_server . is_some ( )
248- || program_state. coverage_dir . is_some ( ) ;
249- let maybe_inspector_server = program_state. maybe_inspector_server . clone ( ) ;
250-
251- let module_loader = CliModuleLoader :: new_for_worker (
252- program_state. clone ( ) ,
253- args. parent_permissions . clone ( ) ,
254- ) ;
255- let create_web_worker_cb =
256- create_web_worker_callback ( program_state. clone ( ) ) ;
257-
258- let options = WebWorkerOptions {
259- args : program_state. flags . argv . clone ( ) ,
260- apply_source_maps : true ,
261- debug_flag : false ,
262- unstable : program_state. flags . unstable ,
263- ca_data : program_state. ca_data . clone ( ) ,
264- user_agent : super :: version:: get_user_agent ( ) ,
265- seed : program_state. flags . seed ,
266- module_loader,
267- create_web_worker_cb,
268- js_error_create_fn : Some ( js_error_create_fn) ,
269- use_deno_namespace : args. use_deno_namespace ,
270- attach_inspector,
271- maybe_inspector_server,
272- runtime_version : super :: version:: deno ( ) ,
273- ts_version : super :: version:: TYPESCRIPT . to_string ( ) ,
274- no_color : !super :: colors:: use_color ( ) ,
275- get_error_class_fn : None ,
276- } ;
277-
278- let mut worker = WebWorker :: from_options (
279- args. name ,
280- args. permissions ,
281- args. main_module ,
282- args. worker_id ,
283- & options,
284- ) ;
285-
286- // This block registers additional ops and state that
287- // are only available in the CLI
288- {
289- let js_runtime = & mut worker. js_runtime ;
290- js_runtime
291- . op_state ( )
292- . borrow_mut ( )
293- . put :: < Arc < ProgramState > > ( program_state. clone ( ) ) ;
294- // Applies source maps - works in conjuction with `js_error_create_fn`
295- // above
296- ops:: errors:: init ( js_runtime) ;
297- if args. use_deno_namespace {
298- ops:: runtime_compiler:: init ( js_runtime) ;
299- }
300- }
301- worker. bootstrap ( & options) ;
302-
303- worker
304- } )
305- }
234+ pub fn render_test_file (
235+ modules : Vec < Url > ,
236+ fail_fast : bool ,
237+ quiet : bool ,
238+ filter : Option < String > ,
239+ ) -> String {
240+ let mut test_file = "" . to_string ( ) ;
306241
307- pub fn create_main_worker (
308- program_state : & Arc < ProgramState > ,
309- main_module : ModuleSpecifier ,
310- permissions : Permissions ,
311- ) -> MainWorker {
312- let module_loader = CliModuleLoader :: new ( program_state. clone ( ) ) ;
313-
314- let global_state_ = program_state. clone ( ) ;
315-
316- let js_error_create_fn = Rc :: new ( move |core_js_error| {
317- let source_mapped_error =
318- apply_source_map ( & core_js_error, global_state_. clone ( ) ) ;
319- PrettyJsError :: create ( source_mapped_error)
320- } ) ;
321-
322- let attach_inspector = program_state. maybe_inspector_server . is_some ( )
323- || program_state. flags . repl
324- || program_state. coverage_dir . is_some ( ) ;
325- let maybe_inspector_server = program_state. maybe_inspector_server . clone ( ) ;
326- let should_break_on_first_statement =
327- program_state. flags . inspect_brk . is_some ( ) ;
328-
329- let create_web_worker_cb = create_web_worker_callback ( program_state. clone ( ) ) ;
330-
331- let options = WorkerOptions {
332- apply_source_maps : true ,
333- args : program_state. flags . argv . clone ( ) ,
334- debug_flag : false ,
335- unstable : program_state. flags . unstable ,
336- ca_data : program_state. ca_data . clone ( ) ,
337- user_agent : super :: version:: get_user_agent ( ) ,
338- seed : program_state. flags . seed ,
339- js_error_create_fn : Some ( js_error_create_fn) ,
340- create_web_worker_cb,
341- attach_inspector,
342- maybe_inspector_server,
343- should_break_on_first_statement,
344- module_loader,
345- runtime_version : super :: version:: deno ( ) ,
346- ts_version : super :: version:: TYPESCRIPT . to_string ( ) ,
347- no_color : !super :: colors:: use_color ( ) ,
348- get_error_class_fn : None ,
349- location : program_state. flags . location . clone ( ) ,
350- } ;
351-
352- let mut worker = MainWorker :: from_options ( main_module, permissions, & options) ;
353-
354- // This block registers additional ops and state that
355- // are only available in the CLI
356- {
357- let js_runtime = & mut worker. js_runtime ;
358- js_runtime
359- . op_state ( )
360- . borrow_mut ( )
361- . put :: < Arc < ProgramState > > ( program_state. clone ( ) ) ;
362- // Applies source maps - works in conjuction with `js_error_create_fn`
363- // above
364- ops:: errors:: init ( js_runtime) ;
365- ops:: runtime_compiler:: init ( js_runtime) ;
366- }
367- worker. bootstrap ( & options) ;
368-
369- worker
242+ for module in modules {
243+ test_file. push_str ( & format ! ( "import \" {}\" ;\n " , module. to_string( ) ) ) ;
370244 }
371245
372-
373- fn get_error_class_name ( e : & AnyError ) -> & ' static str {
374- deno_runtime:: errors:: get_error_class_name ( e) . unwrap_or ( "Error" )
375- }
246+ let options = if let Some ( filter) = filter {
247+ json ! ( { "failFast" : fail_fast, "reportToConsole" : !quiet, "disableLog" : quiet, "filter" : filter } )
248+ } else {
249+ json ! ( { "failFast" : fail_fast, "reportToConsole" : !quiet, "disableLog" : quiet } )
250+ } ;
376251
377- fn op < F , V , R > ( op_fn : F ) -> Box < OpFn >
378- where
379- F : Fn ( V ) -> Result < R , AnyError > + ' static ,
380- V : DeserializeOwned ,
381- R : Serialize ,
382- {
383- json_op_sync ( move |s, args, _bufs| {
384- op_fn ( args)
385- } )
252+ test_file. push_str ( "// @ts-ignore\n " ) ;
253+
254+ test_file. push_str ( & format ! (
255+ "await Deno[Deno.internal].runTests({});\n " ,
256+ options
257+ ) ) ;
258+
259+ test_file
386260}
387261
262+ // fn op<F, V, R>(op_fn: F) -> Box<OpFn>
263+ // where
264+ // F: Fn(V) -> Result<R, AnyError> + 'static,
265+ // V: DeserializeOwned,
266+ // R: Serialize,
267+ // {
268+ // op_sync(move |s, args, _: ()| {
269+ // op_fn(args)
270+ // })
271+ // }
272+
388273#[ derive( Debug , Deserialize ) ]
389274#[ serde( rename_all = "camelCase" ) ]
390275struct SetupChainArgs {
391276 name : String ,
392277 transactions : Vec < TransactionArgs >
393278}
394279
395- fn setup_chain ( args : SetupChainArgs ) -> Result < Value , AnyError > {
280+ fn setup_chain ( state : & mut State , args : Value ) -> Result < Value , AnyError > {
281+ let args: SetupChainArgs = serde_json:: from_value ( args)
282+ . expect ( "Invalid request from JavaScript for \" op_load\" ." ) ;
396283 let ( session_id, accounts) = sessions:: handle_setup_chain ( args. name , args. transactions ) ?;
397284
398285 Ok ( json ! ( {
@@ -439,7 +326,9 @@ struct TransferSTXArgs {
439326 recipient : String ,
440327}
441328
442- fn mine_block ( args : MineBlockArgs ) -> Result < Value , AnyError > {
329+ fn mine_block ( state : & mut State , args : Value ) -> Result < Value , AnyError > {
330+ let args: MineBlockArgs = serde_json:: from_value ( args)
331+ . expect ( "Invalid request from JavaScript." ) ;
443332 let ( block_height, receipts) = sessions:: perform_block ( args. session_id , |name, session| {
444333 let initial_tx_sender = session. get_tx_sender ( ) ;
445334 let mut receipts = vec ! [ ] ;
@@ -486,7 +375,9 @@ struct MineEmptyBlocksArgs {
486375 count : u32 ,
487376}
488377
489- fn mine_empty_blocks ( args : MineEmptyBlocksArgs ) -> Result < Value , AnyError > {
378+ fn mine_empty_blocks ( state : & mut State , args : Value ) -> Result < Value , AnyError > {
379+ let args: MineEmptyBlocksArgs = serde_json:: from_value ( args)
380+ . expect ( "Invalid request from JavaScript." ) ;
490381 let block_height = sessions:: perform_block ( args. session_id , |name, session| {
491382 let block_height = session. advance_chain_tip ( args. count ) ;
492383 Ok ( block_height)
@@ -506,9 +397,11 @@ struct CallReadOnlyFnArgs {
506397 contract : String ,
507398 method : String ,
508399 args : Vec < String > ,
509- }
400+ }
510401
511- fn call_read_only_fn ( args : CallReadOnlyFnArgs ) -> Result < Value , AnyError > {
402+ fn call_read_only_fn ( state : & mut State , args : Value ) -> Result < Value , AnyError > {
403+ let args: CallReadOnlyFnArgs = serde_json:: from_value ( args)
404+ . expect ( "Invalid request from JavaScript." ) ;
512405 let ( result, events) = sessions:: perform_block ( args. session_id , |name, session| {
513406 let initial_tx_sender = session. get_tx_sender ( ) ;
514407 session. set_tx_sender ( args. sender . clone ( ) ) ;
@@ -539,7 +432,9 @@ struct GetAssetsMapsArgs {
539432 session_id : u32 ,
540433}
541434
542- fn get_assets_maps ( args : GetAssetsMapsArgs ) -> Result < Value , AnyError > {
435+ fn get_assets_maps ( state : & mut State , args : Value ) -> Result < Value , AnyError > {
436+ let args: GetAssetsMapsArgs = serde_json:: from_value ( args)
437+ . expect ( "Invalid request from JavaScript." ) ;
543438 let assets_maps = sessions:: perform_block ( args. session_id , |name, session| {
544439 let assets_maps = session. get_assets_maps ( ) ;
545440 Ok ( assets_maps)
0 commit comments