summaryrefslogtreecommitdiff
path: root/tests/specs
diff options
context:
space:
mode:
authorMohammad Sulaiman <mohammad.sulaiman@exalt.ps>2024-11-05 08:39:05 +0200
committerGitHub <noreply@github.com>2024-11-05 06:39:05 +0000
commit89f0b796bd442ff352c3f93f69156ca6d85bfd5e (patch)
tree3ac2a58c6d85f6af57eb2c6b07b1f2d0e8687b3a /tests/specs
parentf9a05068d6de247574fb764044a446d1d7ed2e9b (diff)
chore: deprecate run itests (#26444)
Diffstat (limited to 'tests/specs')
-rw-r--r--tests/specs/run/_001_hello/001_hello.js1
-rw-r--r--tests/specs/run/_001_hello/001_hello.js.out1
-rw-r--r--tests/specs/run/_001_hello/__test__.jsonc4
-rw-r--r--tests/specs/run/_002_hello/002_hello.ts1
-rw-r--r--tests/specs/run/_002_hello/002_hello.ts.out1
-rw-r--r--tests/specs/run/_002_hello/__test__.jsonc4
-rw-r--r--tests/specs/run/_003_relative_import/003_relative_import.ts3
-rw-r--r--tests/specs/run/_003_relative_import/003_relative_import.ts.out1
-rw-r--r--tests/specs/run/_003_relative_import/__test__.jsonc4
-rw-r--r--tests/specs/run/_003_relative_import/print_hello.ts3
-rw-r--r--tests/specs/run/_004_set_timeout/004_set_timeout.ts11
-rw-r--r--tests/specs/run/_004_set_timeout/004_set_timeout.ts.out2
-rw-r--r--tests/specs/run/_004_set_timeout/__test__.jsonc4
-rw-r--r--tests/specs/run/_005_more_imports/005_more_imports.ts11
-rw-r--r--tests/specs/run/_005_more_imports/005_more_imports.ts.out1
-rw-r--r--tests/specs/run/_005_more_imports/__test__.jsonc4
-rw-r--r--tests/specs/run/_005_more_imports/mod1.ts17
-rw-r--r--tests/specs/run/_005_more_imports/print_hello.ts3
-rw-r--r--tests/specs/run/_005_more_imports/subdir2/mod2.ts9
-rw-r--r--tests/specs/run/_006_url_imports/006_url_imports.ts3
-rw-r--r--tests/specs/run/_006_url_imports/006_url_imports.ts.out2
-rw-r--r--tests/specs/run/_006_url_imports/__test__.jsonc4
-rw-r--r--tests/specs/run/_006_url_imports/print_hello.ts3
-rw-r--r--tests/specs/run/_006_url_imports/subdir2/mod2.ts9
-rw-r--r--tests/specs/run/_012_async/012_async.ts11
-rw-r--r--tests/specs/run/_012_async/012_async.ts.out3
-rw-r--r--tests/specs/run/_012_async/__test__.jsonc4
-rw-r--r--tests/specs/run/_013_dynamic_import/013_dynamic_import.ts15
-rw-r--r--tests/specs/run/_013_dynamic_import/013_dynamic_import.ts.out1
-rw-r--r--tests/specs/run/_013_dynamic_import/__test__.jsonc4
-rw-r--r--tests/specs/run/_013_dynamic_import/mod1.ts17
-rw-r--r--tests/specs/run/_013_dynamic_import/print_hello.ts3
-rw-r--r--tests/specs/run/_013_dynamic_import/subdir2/mod2.ts9
-rw-r--r--tests/specs/run/_014_duplicate_import/014_duplicate_import.ts9
-rw-r--r--tests/specs/run/_014_duplicate_import/014_duplicate_import.ts.out1
-rw-r--r--tests/specs/run/_014_duplicate_import/__test__.jsonc4
-rw-r--r--tests/specs/run/_014_duplicate_import/auto_print_hello.ts2
-rw-r--r--tests/specs/run/_015_duplicate_parallel_import/015_duplicate_parallel_import.js20
-rw-r--r--tests/specs/run/_015_duplicate_parallel_import/015_duplicate_parallel_import.js.out1
-rw-r--r--tests/specs/run/_015_duplicate_parallel_import/__test__.jsonc4
-rw-r--r--tests/specs/run/_015_duplicate_parallel_import/mod1.ts17
-rw-r--r--tests/specs/run/_015_duplicate_parallel_import/print_hello.ts3
-rw-r--r--tests/specs/run/_015_duplicate_parallel_import/subdir2/mod2.ts9
-rw-r--r--tests/specs/run/_016_double_await/016_double_await.ts8
-rw-r--r--tests/specs/run/_016_double_await/016_double_await.ts.out2
-rw-r--r--tests/specs/run/_016_double_await/__test__.jsonc4
-rw-r--r--tests/specs/run/_017_import_redirect/017_import_redirect.ts4
-rw-r--r--tests/specs/run/_017_import_redirect/017_import_redirect.ts.out1
-rw-r--r--tests/specs/run/_017_import_redirect/__test__.jsonc4
-rw-r--r--tests/specs/run/_017_import_redirect_check/017_import_redirect.ts4
-rw-r--r--tests/specs/run/_017_import_redirect_check/017_import_redirect.ts.out1
-rw-r--r--tests/specs/run/_017_import_redirect_check/__test__.jsonc4
-rw-r--r--tests/specs/run/_017_import_redirect_info/017_import_redirect.ts4
-rw-r--r--tests/specs/run/_017_import_redirect_info/017_import_redirect_info.out7
-rw-r--r--tests/specs/run/_017_import_redirect_info/__test__.jsonc4
-rw-r--r--tests/specs/run/_017_import_redirect_vendor_dir/017_import_redirect.ts4
-rw-r--r--tests/specs/run/_017_import_redirect_vendor_dir/017_import_redirect.ts.out1
-rw-r--r--tests/specs/run/_017_import_redirect_vendor_dir/__test__.jsonc4
-rw-r--r--tests/specs/run/_018_async_catch/018_async_catch.ts14
-rw-r--r--tests/specs/run/_018_async_catch/018_async_catch.ts.out3
-rw-r--r--tests/specs/run/_018_async_catch/__test__.jsonc4
-rw-r--r--tests/specs/run/_019_media_types/019_media_types.ts24
-rw-r--r--tests/specs/run/_019_media_types/019_media_types.ts.out1
-rw-r--r--tests/specs/run/_019_media_types/__test__.jsonc4
-rw-r--r--tests/specs/run/_020_json_modules/020_json_modules.ts2
-rw-r--r--tests/specs/run/_020_json_modules/020_json_modules.ts.out3
-rw-r--r--tests/specs/run/_020_json_modules/__test__.jsonc5
-rw-r--r--tests/specs/run/_020_json_modules/config.json6
-rw-r--r--tests/specs/run/_021_mjs_modules/021_mjs_modules.ts2
-rw-r--r--tests/specs/run/_021_mjs_modules/021_mjs_modules.ts.out1
-rw-r--r--tests/specs/run/_021_mjs_modules/__test__.jsonc4
-rw-r--r--tests/specs/run/_021_mjs_modules/mod5.mjs1
-rw-r--r--tests/specs/run/_025_reload_js_type_error/025_reload_js_type_error.js6
-rw-r--r--tests/specs/run/_025_reload_js_type_error/025_reload_js_type_error.js.out1
-rw-r--r--tests/specs/run/_025_reload_js_type_error/__test__.jsonc4
-rw-r--r--tests/specs/run/_027_redirect_typescript/027_redirect_typescript.ts2
-rw-r--r--tests/specs/run/_027_redirect_typescript/027_redirect_typescript.ts.out1
-rw-r--r--tests/specs/run/_027_redirect_typescript/__test__.jsonc4
-rw-r--r--tests/specs/run/_027_redirect_typescript_vendor_dir/027_redirect_typescript.ts2
-rw-r--r--tests/specs/run/_027_redirect_typescript_vendor_dir/027_redirect_typescript.ts.out1
-rw-r--r--tests/specs/run/_027_redirect_typescript_vendor_dir/__test__.jsonc4
-rw-r--r--tests/specs/run/_027_redirect_typescript_vendor_dir/vendor/http_localhost_4545/subdir/redirects/redirect1.ts1
-rw-r--r--tests/specs/run/_027_redirect_typescript_vendor_dir/vendor/http_localhost_4545/subdir/redirects/redirect4.ts2
-rw-r--r--tests/specs/run/_027_redirect_typescript_vendor_dir/vendor/manifest.json9
-rw-r--r--tests/specs/run/_028_args/028_args.ts3
-rw-r--r--tests/specs/run/_028_args/028_args.ts.out6
-rw-r--r--tests/specs/run/_028_args/__test__.jsonc4
-rw-r--r--tests/specs/run/_033_import_map_data_uri/__test__.jsonc4
-rw-r--r--tests/specs/run/_033_import_map_data_uri/lodash/lodash.ts1
-rw-r--r--tests/specs/run/_033_import_map_data_uri/lodash/other_file.ts1
-rw-r--r--tests/specs/run/_033_import_map_data_uri/test_data.ts1
-rw-r--r--tests/specs/run/_033_import_map_data_uri/test_data.ts.out1
-rw-r--r--tests/specs/run/_033_import_map_remote/033_import_map_remote.out5
-rw-r--r--tests/specs/run/_033_import_map_remote/__test__.jsonc4
-rw-r--r--tests/specs/run/_033_import_map_remote/import_map_remote.json10
-rw-r--r--tests/specs/run/_033_import_map_remote/lodash/lodash.ts1
-rw-r--r--tests/specs/run/_033_import_map_remote/lodash/other_file.ts1
-rw-r--r--tests/specs/run/_033_import_map_remote/moment/moment.ts1
-rw-r--r--tests/specs/run/_033_import_map_remote/moment/other_file.ts1
-rw-r--r--tests/specs/run/_033_import_map_remote/print_hello.ts3
-rw-r--r--tests/specs/run/_033_import_map_remote/test_remote.ts5
-rw-r--r--tests/specs/run/_033_import_map_remote/vue.ts1
-rw-r--r--tests/specs/run/_033_import_map_vendor_dir_remote/033_import_map_remote.out5
-rw-r--r--tests/specs/run/_033_import_map_vendor_dir_remote/__test__.jsonc4
-rw-r--r--tests/specs/run/_033_import_map_vendor_dir_remote/import_map_remote.json10
-rw-r--r--tests/specs/run/_033_import_map_vendor_dir_remote/lodash/lodash.ts1
-rw-r--r--tests/specs/run/_033_import_map_vendor_dir_remote/lodash/other_file.ts1
-rw-r--r--tests/specs/run/_033_import_map_vendor_dir_remote/moment/moment.ts1
-rw-r--r--tests/specs/run/_033_import_map_vendor_dir_remote/moment/other_file.ts1
-rw-r--r--tests/specs/run/_033_import_map_vendor_dir_remote/print_hello.ts3
-rw-r--r--tests/specs/run/_033_import_map_vendor_dir_remote/test_remote.ts5
-rw-r--r--tests/specs/run/_033_import_map_vendor_dir_remote/vue.ts1
-rw-r--r--tests/specs/run/_035_cached_only_flag/019_media_types.ts24
-rw-r--r--tests/specs/run/_035_cached_only_flag/035_cached_only_flag.out1
-rw-r--r--tests/specs/run/_035_cached_only_flag/__test__.jsonc5
-rw-r--r--tests/specs/run/_038_checkjs/038_checkjs.js5
-rw-r--r--tests/specs/run/_038_checkjs/038_checkjs.js.out22
-rw-r--r--tests/specs/run/_038_checkjs/__test__.jsonc6
-rw-r--r--tests/specs/run/_038_checkjs/checkjs.tsconfig.json5
-rw-r--r--tests/specs/run/_042_dyn_import_evalcontext/042_dyn_import_evalcontext.ts5
-rw-r--r--tests/specs/run/_042_dyn_import_evalcontext/042_dyn_import_evalcontext.ts.out1
-rw-r--r--tests/specs/run/_042_dyn_import_evalcontext/__test__.jsonc4
-rw-r--r--tests/specs/run/_042_dyn_import_evalcontext/mod4.js1
-rw-r--r--tests/specs/run/_044_bad_resource/044_bad_resource.ts3
-rw-r--r--tests/specs/run/_044_bad_resource/044_bad_resource.ts.out2
-rw-r--r--tests/specs/run/_044_bad_resource/__test__.jsonc5
-rw-r--r--tests/specs/run/_046_tsx/046_jsx_test.tsx14
-rw-r--r--tests/specs/run/_046_tsx/046_jsx_test.tsx.out1
-rw-r--r--tests/specs/run/_046_tsx/__test__.jsonc4
-rw-r--r--tests/specs/run/_047_jsx/047_jsx_test.jsx7
-rw-r--r--tests/specs/run/_047_jsx/047_jsx_test.jsx.out1
-rw-r--r--tests/specs/run/_047_jsx/__test__.jsonc4
-rw-r--r--tests/specs/run/_048_media_types_jsx/048_media_types_jsx.ts32
-rw-r--r--tests/specs/run/_048_media_types_jsx/048_media_types_jsx.ts.out2
-rw-r--r--tests/specs/run/_048_media_types_jsx/__test__.jsonc4
-rw-r--r--tests/specs/run/_052_no_remote_flag/019_media_types.ts24
-rw-r--r--tests/specs/run/_052_no_remote_flag/052_no_remote_flag.out1
-rw-r--r--tests/specs/run/_052_no_remote_flag/__test__.jsonc5
-rw-r--r--tests/specs/run/_058_tasks_microtasks_close/058_tasks_microtasks_close.ts19
-rw-r--r--tests/specs/run/_058_tasks_microtasks_close/058_tasks_microtasks_close.ts.out6
-rw-r--r--tests/specs/run/_058_tasks_microtasks_close/__test__.jsonc4
-rw-r--r--tests/specs/run/_059_fs_relative_path_perm/059_fs_relative_path_perm.ts2
-rw-r--r--tests/specs/run/_059_fs_relative_path_perm/059_fs_relative_path_perm.ts.out4
-rw-r--r--tests/specs/run/_059_fs_relative_path_perm/__test__.jsonc5
-rw-r--r--tests/specs/run/_063_permissions_revoke/063_permissions_revoke.ts6
-rw-r--r--tests/specs/run/_063_permissions_revoke/063_permissions_revoke.ts.out3
-rw-r--r--tests/specs/run/_063_permissions_revoke/__test__.jsonc4
-rw-r--r--tests/specs/run/_063_permissions_revoke_sync/063_permissions_revoke.ts.out3
-rw-r--r--tests/specs/run/_063_permissions_revoke_sync/063_permissions_revoke_sync.ts6
-rw-r--r--tests/specs/run/_063_permissions_revoke_sync/__test__.jsonc4
-rw-r--r--tests/specs/run/_064_permissions_revoke_global/064_permissions_revoke_global.ts6
-rw-r--r--tests/specs/run/_064_permissions_revoke_global/064_permissions_revoke_global.ts.out3
-rw-r--r--tests/specs/run/_064_permissions_revoke_global/__test__.jsonc4
-rw-r--r--tests/specs/run/_064_permissions_revoke_global_sync/064_permissions_revoke_global.ts.out3
-rw-r--r--tests/specs/run/_064_permissions_revoke_global_sync/064_permissions_revoke_global_sync.ts6
-rw-r--r--tests/specs/run/_064_permissions_revoke_global_sync/__test__.jsonc4
-rw-r--r--tests/specs/run/_065_permissions_revoke_net/065_permissions_revoke_net.ts6
-rw-r--r--tests/specs/run/_065_permissions_revoke_net/065_permissions_revoke_net.ts.out3
-rw-r--r--tests/specs/run/_065_permissions_revoke_net/__test__.jsonc4
-rw-r--r--tests/specs/run/_070_location/070_location.ts18
-rw-r--r--tests/specs/run/_070_location/070_location.ts.out15
-rw-r--r--tests/specs/run/_070_location/__test__.jsonc4
-rw-r--r--tests/specs/run/_071_location_unset/071_location_unset.ts16
-rw-r--r--tests/specs/run/_071_location_unset/071_location_unset.ts.out4
-rw-r--r--tests/specs/run/_071_location_unset/__test__.jsonc4
-rw-r--r--tests/specs/run/_072_location_relative_fetch/072_location_relative_fetch.ts2
-rw-r--r--tests/specs/run/_072_location_relative_fetch/072_location_relative_fetch.ts.out2
-rw-r--r--tests/specs/run/_072_location_relative_fetch/__test__.jsonc4
-rw-r--r--tests/specs/run/_072_location_relative_fetch/fetch/hello.txt1
-rw-r--r--tests/specs/run/_075_import_local_query_hash/001_hello.js1
-rw-r--r--tests/specs/run/_075_import_local_query_hash/002_hello.ts1
-rw-r--r--tests/specs/run/_075_import_local_query_hash/075_import_local_query_hash.ts2
-rw-r--r--tests/specs/run/_075_import_local_query_hash/075_import_local_query_hash.ts.out2
-rw-r--r--tests/specs/run/_075_import_local_query_hash/__test__.jsonc4
-rw-r--r--tests/specs/run/_077_fetch_empty/077_fetch_empty.ts1
-rw-r--r--tests/specs/run/_077_fetch_empty/077_fetch_empty.ts.out2
-rw-r--r--tests/specs/run/_077_fetch_empty/__test__.jsonc5
-rw-r--r--tests/specs/run/_078_unload_on_exit/078_unload_on_exit.ts9
-rw-r--r--tests/specs/run/_078_unload_on_exit/078_unload_on_exit.ts.out1
-rw-r--r--tests/specs/run/_078_unload_on_exit/__test__.jsonc5
-rw-r--r--tests/specs/run/_079_location_authentication/079_location_authentication.ts1
-rw-r--r--tests/specs/run/_079_location_authentication/079_location_authentication.ts.out1
-rw-r--r--tests/specs/run/_079_location_authentication/__test__.jsonc4
-rw-r--r--tests/specs/run/_081_location_relative_fetch_redirect/081_location_relative_fetch_redirect.ts2
-rw-r--r--tests/specs/run/_081_location_relative_fetch_redirect/081_location_relative_fetch_redirect.ts.out1
-rw-r--r--tests/specs/run/_081_location_relative_fetch_redirect/__test__.jsonc4
-rw-r--r--tests/specs/run/_082_prepare_stack_trace_throw/082_prepare_stack_trace_throw.js6
-rw-r--r--tests/specs/run/_082_prepare_stack_trace_throw/082_prepare_stack_trace_throw.js.out2
-rw-r--r--tests/specs/run/_082_prepare_stack_trace_throw/__test__.jsonc5
-rw-r--r--tests/specs/run/_088_dynamic_import_already_evaluating/088_dynamic_import_already_evaluating.ts2
-rw-r--r--tests/specs/run/_088_dynamic_import_already_evaluating/088_dynamic_import_already_evaluating.ts.out4
-rw-r--r--tests/specs/run/_088_dynamic_import_already_evaluating/088_dynamic_import_target.ts3
-rw-r--r--tests/specs/run/_088_dynamic_import_already_evaluating/__test__.jsonc4
-rw-r--r--tests/specs/run/_091_use_define_for_class_fields/091_use_define_for_class_fields.ts4
-rw-r--r--tests/specs/run/_091_use_define_for_class_fields/091_use_define_for_class_fields.ts.out4
-rw-r--r--tests/specs/run/_091_use_define_for_class_fields/__test__.jsonc5
-rw-r--r--tests/specs/run/aggregate_error/__test__.jsonc5
-rw-r--r--tests/specs/run/aggregate_error/aggregate_error.out18
-rw-r--r--tests/specs/run/aggregate_error/aggregate_error.ts9
-rw-r--r--tests/specs/run/async_error/__test__.jsonc5
-rw-r--r--tests/specs/run/async_error/async_error.ts9
-rw-r--r--tests/specs/run/async_error/async_error.ts.out8
-rw-r--r--tests/specs/run/beforeunload_event/__test__.jsonc4
-rw-r--r--tests/specs/run/beforeunload_event/before_unload.js21
-rw-r--r--tests/specs/run/beforeunload_event/before_unload.js.out8
-rw-r--r--tests/specs/run/blob_gc_finalization/__test__.jsonc5
-rw-r--r--tests/specs/run/blob_gc_finalization/blob_gc_finalization.js11
-rw-r--r--tests/specs/run/blob_gc_finalization/blob_gc_finalization.js.out1
-rw-r--r--tests/specs/run/byte_order_mark/001_hello.js1
-rw-r--r--tests/specs/run/byte_order_mark/__test__.jsonc4
-rw-r--r--tests/specs/run/byte_order_mark/byte_order_mark.out1
-rw-r--r--tests/specs/run/byte_order_mark/byte_order_mark.ts4
-rw-r--r--tests/specs/run/check_js_points_to_ts/__test__.jsonc5
-rw-r--r--tests/specs/run/check_js_points_to_ts/check_js_points_to_ts/bar.ts3
-rw-r--r--tests/specs/run/check_js_points_to_ts/check_js_points_to_ts/foo.d.ts0
-rw-r--r--tests/specs/run/check_js_points_to_ts/check_js_points_to_ts/foo.js4
-rw-r--r--tests/specs/run/check_js_points_to_ts/check_js_points_to_ts/test.js3
-rw-r--r--tests/specs/run/check_js_points_to_ts/check_js_points_to_ts/test.js.out4
-rw-r--r--tests/specs/run/check_js_points_to_ts/checkjs.tsconfig.json5
-rw-r--r--tests/specs/run/check_remote/__test__.jsonc5
-rw-r--r--tests/specs/run/check_remote/no_check_remote.ts3
-rw-r--r--tests/specs/run/check_remote/no_check_remote.ts.disabled.out4
-rw-r--r--tests/specs/run/check_remote/type_error.ts1
-rw-r--r--tests/specs/run/classic_workers_event_loop/__test__.jsonc4
-rw-r--r--tests/specs/run/classic_workers_event_loop/classic_workers_event_loop.js4
-rw-r--r--tests/specs/run/classic_workers_event_loop/classic_workers_event_loop.js.out1
-rw-r--r--tests/specs/run/colors_without_global_this/__test__.jsonc4
-rw-r--r--tests/specs/run/colors_without_global_this/colors_without_globalThis.js1
-rw-r--r--tests/specs/run/complex_error/__test__.jsonc5
-rw-r--r--tests/specs/run/complex_error/complex_error.ts18
-rw-r--r--tests/specs/run/complex_error/complex_error.ts.out44
-rw-r--r--tests/specs/run/config/__test__.jsonc4
-rw-r--r--tests/specs/run/config/config/main.out4
-rw-r--r--tests/specs/run/config/config/main.ts5
-rw-r--r--tests/specs/run/config/config/tsconfig.json7
-rw-r--r--tests/specs/run/config_auto_discovered_for_local_script/__test__.jsonc4
-rw-r--r--tests/specs/run/config_auto_discovered_for_local_script/frontend_work.ts4
-rw-r--r--tests/specs/run/config_auto_discovered_for_local_script_log/__test__.jsonc4
-rw-r--r--tests/specs/run/config_auto_discovered_for_local_script_log/auto_discovery_log.out4
-rw-r--r--tests/specs/run/config_auto_discovered_for_local_script_log/deno.jsonc6
-rw-r--r--tests/specs/run/config_auto_discovered_for_local_script_log/frontend_work.ts4
-rw-r--r--tests/specs/run/config_json_import/__test__.jsonc4
-rw-r--r--tests/specs/run/config_json_import/config_json_import.ts2
-rw-r--r--tests/specs/run/config_json_import/config_json_import.ts.out3
-rw-r--r--tests/specs/run/config_json_import/deno-jsx.json6
-rw-r--r--tests/specs/run/config_not_auto_discovered_for_remote_script/__test__.jsonc4
-rw-r--r--tests/specs/run/config_not_auto_discovered_for_remote_script/server_side_work.ts2
-rw-r--r--tests/specs/run/config_types/__test__.jsonc4
-rw-r--r--tests/specs/run/config_types/config_types/deno.lock6
-rw-r--r--tests/specs/run/config_types/config_types/main.out1
-rw-r--r--tests/specs/run/config_types/config_types/main.ts1
-rw-r--r--tests/specs/run/config_types/config_types/remote.tsconfig.json7
-rw-r--r--tests/specs/run/config_types/config_types/tsconfig.json7
-rw-r--r--tests/specs/run/config_types/config_types/types.d.ts2
-rw-r--r--tests/specs/run/config_types_remote/__test__.jsonc4
-rw-r--r--tests/specs/run/config_types_remote/config_types/deno.lock6
-rw-r--r--tests/specs/run/config_types_remote/config_types/main.out1
-rw-r--r--tests/specs/run/config_types_remote/config_types/main.ts1
-rw-r--r--tests/specs/run/config_types_remote/config_types/remote.tsconfig.json7
-rw-r--r--tests/specs/run/config_types_remote/config_types/tsconfig.json7
-rw-r--r--tests/specs/run/config_types_remote/config_types/types.d.ts2
-rw-r--r--tests/specs/run/custom_inspect_url/__test__.jsonc4
-rw-r--r--tests/specs/run/custom_inspect_url/custom_inspect_url.js3
-rw-r--r--tests/specs/run/custom_inspect_url/custom_inspect_url.js.out47
-rw-r--r--tests/specs/run/decorators_tc39_proposal/__test__.jsonc4
-rw-r--r--tests/specs/run/decorators_tc39_proposal/decorators/experimental/deno.json5
-rw-r--r--tests/specs/run/decorators_tc39_proposal/decorators/experimental/no_check/main.out3
-rw-r--r--tests/specs/run/decorators_tc39_proposal/decorators/experimental/no_check/main.ts21
-rw-r--r--tests/specs/run/decorators_tc39_proposal/decorators/experimental/runtime/main.out7
-rw-r--r--tests/specs/run/decorators_tc39_proposal/decorators/experimental/runtime/main.ts42
-rw-r--r--tests/specs/run/decorators_tc39_proposal/decorators/experimental/ts/main.out3
-rw-r--r--tests/specs/run/decorators_tc39_proposal/decorators/experimental/ts/main.ts14
-rw-r--r--tests/specs/run/decorators_tc39_proposal/decorators/tc39_proposal/main.out3
-rw-r--r--tests/specs/run/decorators_tc39_proposal/decorators/tc39_proposal/main.ts21
-rw-r--r--tests/specs/run/deno_exit_tampering/__test__.jsonc5
-rw-r--r--tests/specs/run/deno_exit_tampering/deno_exit_tampering.ts3
-rw-r--r--tests/specs/run/deny_all_permission_args/__test__.jsonc4
-rw-r--r--tests/specs/run/deny_all_permission_args/deny_all_permission_args.js7
-rw-r--r--tests/specs/run/deny_all_permission_args/deny_all_permission_args.out7
-rw-r--r--tests/specs/run/deny_some_permission_args/__test__.jsonc4
-rw-r--r--tests/specs/run/deny_some_permission_args/deny_some_permission_args.js21
-rw-r--r--tests/specs/run/deny_some_permission_args/deny_some_permission_args.out21
-rw-r--r--tests/specs/run/dom_exception_formatting/__test__.jsonc5
-rw-r--r--tests/specs/run/dom_exception_formatting/dom_exception_formatting.ts1
-rw-r--r--tests/specs/run/dom_exception_formatting/dom_exception_formatting.ts.out3
-rw-r--r--tests/specs/run/dynamic_import_already_rejected/__test__.jsonc4
-rw-r--r--tests/specs/run/dynamic_import_already_rejected/dynamic_import_already_rejected/error_001.ts9
-rw-r--r--tests/specs/run/dynamic_import_already_rejected/dynamic_import_already_rejected/main.out4
-rw-r--r--tests/specs/run/dynamic_import_already_rejected/dynamic_import_already_rejected/main.ts15
-rw-r--r--tests/specs/run/dynamic_import_async_error/__test__.jsonc4
-rw-r--r--tests/specs/run/dynamic_import_async_error/dynamic_import_async_error/delayed_error.ts2
-rw-r--r--tests/specs/run/dynamic_import_async_error/dynamic_import_async_error/main.out2
-rw-r--r--tests/specs/run/dynamic_import_async_error/dynamic_import_async_error/main.ts7
-rw-r--r--tests/specs/run/dynamic_import_concurrent_non_statically_analyzable/__test__.jsonc4
-rw-r--r--tests/specs/run/dynamic_import_concurrent_non_statically_analyzable/dynamic_import_concurrent_non_statically_analyzable/main.out100
-rw-r--r--tests/specs/run/dynamic_import_concurrent_non_statically_analyzable/dynamic_import_concurrent_non_statically_analyzable/main.ts16
-rw-r--r--tests/specs/run/dynamic_import_concurrent_non_statically_analyzable/dynamic_import_concurrent_non_statically_analyzable/mod.ts7
-rw-r--r--tests/specs/run/dynamic_import_conditional/__test__.jsonc4
-rw-r--r--tests/specs/run/dynamic_import_conditional/dynamic_import_conditional.js3
-rw-r--r--tests/specs/run/dynamic_import_conditional/dynamic_import_conditional.js.out1
-rw-r--r--tests/specs/run/dynamic_import_permissions_blob_local/__test__.jsonc5
-rw-r--r--tests/specs/run/dynamic_import_permissions_blob_local/permissions_blob_local.ts6
-rw-r--r--tests/specs/run/dynamic_import_permissions_blob_local/permissions_blob_local.ts.out5
-rw-r--r--tests/specs/run/dynamic_import_permissions_blob_remote/__test__.jsonc5
-rw-r--r--tests/specs/run/dynamic_import_permissions_blob_remote/permissions_blob_remote.ts3
-rw-r--r--tests/specs/run/dynamic_import_permissions_blob_remote/permissions_blob_remote.ts.out5
-rw-r--r--tests/specs/run/dynamic_import_permissions_data_local/__test__.jsonc5
-rw-r--r--tests/specs/run/dynamic_import_permissions_data_local/permissions_data_local.ts5
-rw-r--r--tests/specs/run/dynamic_import_permissions_data_local/permissions_data_local.ts.out5
-rw-r--r--tests/specs/run/dynamic_import_permissions_data_remote/__test__.jsonc5
-rw-r--r--tests/specs/run/dynamic_import_permissions_data_remote/permissions_data_remote.ts3
-rw-r--r--tests/specs/run/dynamic_import_permissions_data_remote/permissions_data_remote.ts.out5
-rw-r--r--tests/specs/run/dynamic_import_permissions_remote_remote/__test__.jsonc5
-rw-r--r--tests/specs/run/dynamic_import_permissions_remote_remote/permissions_remote_remote.ts3
-rw-r--r--tests/specs/run/dynamic_import_permissions_remote_remote/permissions_remote_remote.ts.out5
-rw-r--r--tests/specs/run/dynamic_import_permissions_remote_remote/static_remote.ts2
-rw-r--r--tests/specs/run/dynamic_import_static_analysis_no_permissions/__test__.jsonc4
-rw-r--r--tests/specs/run/dynamic_import_static_analysis_no_permissions/empty_1.ts0
-rw-r--r--tests/specs/run/dynamic_import_static_analysis_no_permissions/empty_2.ts0
-rw-r--r--tests/specs/run/dynamic_import_static_analysis_no_permissions/static_analysis_no_permissions.ts13
-rw-r--r--tests/specs/run/dynamic_import_static_analysis_no_permissions/static_analysis_no_permissions.ts.out2
-rw-r--r--tests/specs/run/dynamic_import_syntax_error/__test__.jsonc5
-rw-r--r--tests/specs/run/dynamic_import_syntax_error/dynamic_import_syntax_error.js1
-rw-r--r--tests/specs/run/dynamic_import_syntax_error/dynamic_import_syntax_error.js.out4
-rw-r--r--tests/specs/run/dynamic_import_syntax_error/dynamic_import_syntax_error_import.js5
-rw-r--r--tests/specs/run/empty_typescript/__test__.jsonc4
-rw-r--r--tests/specs/run/empty_typescript/empty.ts0
-rw-r--r--tests/specs/run/error_001/__test__.jsonc5
-rw-r--r--tests/specs/run/error_001/error_001.ts9
-rw-r--r--tests/specs/run/error_001/error_001.ts.out6
-rw-r--r--tests/specs/run/error_002/__test__.jsonc5
-rw-r--r--tests/specs/run/error_002/error_002.ts7
-rw-r--r--tests/specs/run/error_002/error_002.ts.out6
-rw-r--r--tests/specs/run/error_002/mod1.ts17
-rw-r--r--tests/specs/run/error_002/print_hello.ts3
-rw-r--r--tests/specs/run/error_002/subdir2/mod2.ts9
-rw-r--r--tests/specs/run/error_003_typescript/__test__.jsonc5
-rw-r--r--tests/specs/run/error_003_typescript/error_003_typescript.ts20
-rw-r--r--tests/specs/run/error_003_typescript/error_003_typescript.ts.out7
-rw-r--r--tests/specs/run/error_003_typescript2/__test__.jsonc5
-rw-r--r--tests/specs/run/error_003_typescript2/error_003_typescript.ts20
-rw-r--r--tests/specs/run/error_003_typescript2/error_003_typescript.ts.out7
-rw-r--r--tests/specs/run/error_004_missing_module/__test__.jsonc5
-rw-r--r--tests/specs/run/error_004_missing_module/error_004_missing_module.ts3
-rw-r--r--tests/specs/run/error_004_missing_module/error_004_missing_module.ts.out2
-rw-r--r--tests/specs/run/error_005_missing_dynamic_import/__test__.jsonc5
-rw-r--r--tests/specs/run/error_005_missing_dynamic_import/error_005_missing_dynamic_import.ts3
-rw-r--r--tests/specs/run/error_005_missing_dynamic_import/error_005_missing_dynamic_import.ts.out4
-rw-r--r--tests/specs/run/error_006_import_ext_failure/__test__.jsonc5
-rw-r--r--tests/specs/run/error_006_import_ext_failure/error_006_import_ext_failure.ts1
-rw-r--r--tests/specs/run/error_006_import_ext_failure/error_006_import_ext_failure.ts.out2
-rw-r--r--tests/specs/run/error_007_any/__test__.jsonc5
-rw-r--r--tests/specs/run/error_007_any/error_007_any.ts1
-rw-r--r--tests/specs/run/error_007_any/error_007_any.ts.out1
-rw-r--r--tests/specs/run/error_008_checkjs/__test__.jsonc5
-rw-r--r--tests/specs/run/error_008_checkjs/error_008_checkjs.js5
-rw-r--r--tests/specs/run/error_008_checkjs/error_008_checkjs.js.out4
-rw-r--r--tests/specs/run/error_009_extensions_error/__test__.jsonc5
-rw-r--r--tests/specs/run/error_009_extensions_error/error_009_extensions_error.js2
-rw-r--r--tests/specs/run/error_009_extensions_error/error_009_extensions_error.js.out6
-rw-r--r--tests/specs/run/error_011_bad_module_specifier/__test__.jsonc5
-rw-r--r--tests/specs/run/error_011_bad_module_specifier/error_011_bad_module_specifier.ts3
-rw-r--r--tests/specs/run/error_011_bad_module_specifier/error_011_bad_module_specifier.ts.out2
-rw-r--r--tests/specs/run/error_012_bad_dynamic_import_specifier/__test__.jsonc5
-rw-r--r--tests/specs/run/error_012_bad_dynamic_import_specifier/error_012_bad_dynamic_import_specifier.ts3
-rw-r--r--tests/specs/run/error_012_bad_dynamic_import_specifier/error_012_bad_dynamic_import_specifier.ts.out7
-rw-r--r--tests/specs/run/error_014_catch_dynamic_import_error/__test__.jsonc4
-rw-r--r--tests/specs/run/error_014_catch_dynamic_import_error/error_014_catch_dynamic_import_error.js31
-rw-r--r--tests/specs/run/error_014_catch_dynamic_import_error/error_014_catch_dynamic_import_error.js.out19
-rw-r--r--tests/specs/run/error_014_catch_dynamic_import_error/indirect_import_error.js1
-rw-r--r--tests/specs/run/error_014_catch_dynamic_import_error/indirect_throws.js1
-rw-r--r--tests/specs/run/error_014_catch_dynamic_import_error/throws.js6
-rw-r--r--tests/specs/run/error_015_dynamic_import_permissions/__test__.jsonc5
-rw-r--r--tests/specs/run/error_015_dynamic_import_permissions/error_015_dynamic_import_permissions.js3
-rw-r--r--tests/specs/run/error_015_dynamic_import_permissions/error_015_dynamic_import_permissions.out4
-rw-r--r--tests/specs/run/error_015_dynamic_import_permissions/mod4.js1
-rw-r--r--tests/specs/run/error_017_hide_long_source_ts/__test__.jsonc5
-rw-r--r--tests/specs/run/error_017_hide_long_source_ts/error_017_hide_long_source_ts.ts3
-rw-r--r--tests/specs/run/error_017_hide_long_source_ts/error_017_hide_long_source_ts.ts.out3
-rw-r--r--tests/specs/run/error_018_hide_long_source_js/__test__.jsonc5
-rw-r--r--tests/specs/run/error_018_hide_long_source_js/error_018_hide_long_source_js.js3
-rw-r--r--tests/specs/run/error_018_hide_long_source_js/error_018_hide_long_source_js.js.out2
-rw-r--r--tests/specs/run/error_019_stack_function/__test__.jsonc5
-rw-r--r--tests/specs/run/error_019_stack_function/error_019_stack_function.ts12
-rw-r--r--tests/specs/run/error_019_stack_function/error_019_stack_function.ts.out8
-rw-r--r--tests/specs/run/error_020_stack_constructor/__test__.jsonc5
-rw-r--r--tests/specs/run/error_020_stack_constructor/error_020_stack_constructor.ts14
-rw-r--r--tests/specs/run/error_020_stack_constructor/error_020_stack_constructor.ts.out8
-rw-r--r--tests/specs/run/error_021_stack_method/__test__.jsonc5
-rw-r--r--tests/specs/run/error_021_stack_method/error_021_stack_method.ts14
-rw-r--r--tests/specs/run/error_021_stack_method/error_021_stack_method.ts.out8
-rw-r--r--tests/specs/run/error_022_stack_custom_error/__test__.jsonc5
-rw-r--r--tests/specs/run/error_022_stack_custom_error/error_022_stack_custom_error.ts14
-rw-r--r--tests/specs/run/error_022_stack_custom_error/error_022_stack_custom_error.ts.out6
-rw-r--r--tests/specs/run/error_023_stack_async/__test__.jsonc5
-rw-r--r--tests/specs/run/error_023_stack_async/error_023_stack_async.ts14
-rw-r--r--tests/specs/run/error_023_stack_async/error_023_stack_async.ts.out10
-rw-r--r--tests/specs/run/error_024_stack_promise_all/__test__.jsonc5
-rw-r--r--tests/specs/run/error_024_stack_promise_all/error_024_stack_promise_all.ts16
-rw-r--r--tests/specs/run/error_024_stack_promise_all/error_024_stack_promise_all.ts.out10
-rw-r--r--tests/specs/run/error_025_tab_indent/__test__.jsonc5
-rw-r--r--tests/specs/run/error_025_tab_indent/error_025_tab_indent9
-rw-r--r--tests/specs/run/error_025_tab_indent/error_025_tab_indent.out6
-rw-r--r--tests/specs/run/error_cause/__test__.jsonc5
-rw-r--r--tests/specs/run/error_cause/error_cause.ts14
-rw-r--r--tests/specs/run/error_cause/error_cause.ts.out13
-rw-r--r--tests/specs/run/error_cause_recursive/__test__.jsonc5
-rw-r--r--tests/specs/run/error_cause_recursive/error_cause_recursive.ts4
-rw-r--r--tests/specs/run/error_cause_recursive/error_cause_recursive.ts.out7
-rw-r--r--tests/specs/run/error_cause_recursive_aggregate/__test__.jsonc5
-rw-r--r--tests/specs/run/error_cause_recursive_aggregate/error_cause_recursive_aggregate.ts9
-rw-r--r--tests/specs/run/error_cause_recursive_aggregate/error_cause_recursive_aggregate.ts.out14
-rw-r--r--tests/specs/run/error_cause_recursive_tail/__test__.jsonc5
-rw-r--r--tests/specs/run/error_cause_recursive_tail/error_cause_recursive_tail.ts5
-rw-r--r--tests/specs/run/error_cause_recursive_tail/error_cause_recursive_tail.ts.out9
-rw-r--r--tests/specs/run/error_for_await/__test__.jsonc5
-rw-r--r--tests/specs/run/error_for_await/error_for_await.ts12
-rw-r--r--tests/specs/run/error_for_await/error_for_await.ts.out10
-rw-r--r--tests/specs/run/error_import_map_unable_to_load/__test__.jsonc5
-rw-r--r--tests/specs/run/error_import_map_unable_to_load/error_import_map_unable_to_load.out4
-rw-r--r--tests/specs/run/error_import_map_unable_to_load/import_maps/test_data.ts1
-rw-r--r--tests/specs/run/error_import_map_unable_to_load/import_maps/test_data.ts.out1
-rw-r--r--tests/specs/run/error_missing_module_named_import/__test__.jsonc5
-rw-r--r--tests/specs/run/error_missing_module_named_import/error_missing_module_named_import.ts3
-rw-r--r--tests/specs/run/error_missing_module_named_import/error_missing_module_named_import.ts.out2
-rw-r--r--tests/specs/run/error_name_non_string/__test__.jsonc5
-rw-r--r--tests/specs/run/error_name_non_string/error_name_non_string.js8
-rw-r--r--tests/specs/run/error_name_non_string/error_name_non_string.js.out4
-rw-r--r--tests/specs/run/error_no_check/__test__.jsonc5
-rw-r--r--tests/specs/run/error_no_check/error_no_check.ts1
-rw-r--r--tests/specs/run/error_no_check/error_no_check.ts.out2
-rw-r--r--tests/specs/run/error_no_check/type_and_code.ts7
-rw-r--r--tests/specs/run/error_syntax/__test__.jsonc5
-rw-r--r--tests/specs/run/error_syntax/error_syntax.js3
-rw-r--r--tests/specs/run/error_syntax/error_syntax.js.out4
-rw-r--r--tests/specs/run/error_syntax_empty_trailing_line/__test__.jsonc5
-rw-r--r--tests/specs/run/error_syntax_empty_trailing_line/error_syntax_empty_trailing_line.mjs2
-rw-r--r--tests/specs/run/error_syntax_empty_trailing_line/error_syntax_empty_trailing_line.mjs.out6
-rw-r--r--tests/specs/run/error_type_definitions/__test__.jsonc5
-rw-r--r--tests/specs/run/error_type_definitions/error_type_definitions.ts5
-rw-r--r--tests/specs/run/error_type_definitions/error_type_definitions.ts.out3
-rw-r--r--tests/specs/run/error_type_definitions/type_definitions/bar.d.ts7
-rw-r--r--tests/specs/run/error_type_definitions/type_definitions/bar.js5
-rw-r--r--tests/specs/run/error_type_definitions/type_definitions/fizz.d.ts2
-rw-r--r--tests/specs/run/error_type_definitions/type_definitions/fizz.js1
-rw-r--r--tests/specs/run/error_type_definitions/type_definitions/foo.d.ts2
-rw-r--r--tests/specs/run/error_type_definitions/type_definitions/foo.js1
-rw-r--r--tests/specs/run/error_type_definitions/type_definitions/qat.ts1
-rw-r--r--tests/specs/run/error_with_errors_prop/__test__.jsonc5
-rw-r--r--tests/specs/run/error_with_errors_prop/error_with_errors_prop.js10
-rw-r--r--tests/specs/run/error_with_errors_prop/error_with_errors_prop.js.out17
-rw-r--r--tests/specs/run/es_private_fields/__test__.jsonc4
-rw-r--r--tests/specs/run/es_private_fields/es_private_fields.js15
-rw-r--r--tests/specs/run/es_private_fields/es_private_fields.js.out1
-rw-r--r--tests/specs/run/eval_context_throw_dom_exception/__test__.jsonc4
-rw-r--r--tests/specs/run/eval_context_throw_dom_exception/eval_context_throw_dom_exception.js5
-rw-r--r--tests/specs/run/eval_context_throw_dom_exception/eval_context_throw_dom_exception.js.out8
-rw-r--r--tests/specs/run/event_listener_error/__test__.jsonc5
-rw-r--r--tests/specs/run/event_listener_error/event_listener_error.ts6
-rw-r--r--tests/specs/run/event_listener_error/event_listener_error.ts.out7
-rw-r--r--tests/specs/run/event_listener_error_handled/__test__.jsonc4
-rw-r--r--tests/specs/run/event_listener_error_handled/event_listener_error_handled.ts23
-rw-r--r--tests/specs/run/event_listener_error_handled/event_listener_error_handled.ts.out17
-rw-r--r--tests/specs/run/event_listener_error_immediate_exit/__test__.jsonc5
-rw-r--r--tests/specs/run/event_listener_error_immediate_exit/event_listener_error_immediate_exit.ts12
-rw-r--r--tests/specs/run/event_listener_error_immediate_exit/event_listener_error_immediate_exit.ts.out6
-rw-r--r--tests/specs/run/event_listener_error_immediate_exit_worker/__test__.jsonc5
-rw-r--r--tests/specs/run/event_listener_error_immediate_exit_worker/event_listener_error_immediate_exit.ts12
-rw-r--r--tests/specs/run/event_listener_error_immediate_exit_worker/event_listener_error_immediate_exit_worker.ts4
-rw-r--r--tests/specs/run/event_listener_error_immediate_exit_worker/event_listener_error_immediate_exit_worker.ts.out8
-rw-r--r--tests/specs/run/exit_error42/__test__.jsonc5
-rw-r--r--tests/specs/run/exit_error42/exit_error42.ts3
-rw-r--r--tests/specs/run/exit_error42/exit_error42.ts.out1
-rw-r--r--tests/specs/run/explicit_resource_management/__test__.jsonc4
-rw-r--r--tests/specs/run/explicit_resource_management/explicit_resource_management/main.out5
-rw-r--r--tests/specs/run/explicit_resource_management/explicit_resource_management/main.ts21
-rw-r--r--tests/specs/run/ext_flag_takes_precedence_over_extension/__test__.jsonc5
-rw-r--r--tests/specs/run/ext_flag_takes_precedence_over_extension/ts_with_js_extension.js5
-rw-r--r--tests/specs/run/ext_flag_takes_precedence_over_extension/ts_with_js_extension.out2
-rw-r--r--tests/specs/run/fetch_async_error_stack/__test__.jsonc5
-rw-r--r--tests/specs/run/fetch_async_error_stack/fetch_async_error_stack.ts1
-rw-r--r--tests/specs/run/fetch_async_error_stack/fetch_async_error_stack.ts.out5
-rw-r--r--tests/specs/run/fetch_response_finalization/__test__.jsonc5
-rw-r--r--tests/specs/run/fetch_response_finalization/fetch_response_finalization.js16
-rw-r--r--tests/specs/run/fetch_response_finalization/fetch_response_finalization.js.out2
-rw-r--r--tests/specs/run/finalization_registry/__test__.jsonc4
-rw-r--r--tests/specs/run/finalization_registry/finalization_registry.js20
-rw-r--r--tests/specs/run/finalization_registry/finalization_registry.js.out1
-rw-r--r--tests/specs/run/fix_dynamic_import_errors/__test__.jsonc4
-rw-r--r--tests/specs/run/fix_dynamic_import_errors/b.js2
-rw-r--r--tests/specs/run/fix_dynamic_import_errors/c.js2
-rw-r--r--tests/specs/run/fix_dynamic_import_errors/fix_dynamic_import_errors.js7
-rw-r--r--tests/specs/run/fix_dynamic_import_errors/fix_dynamic_import_errors.js.out2
-rw-r--r--tests/specs/run/fix_emittable_skipped/__test__.jsonc4
-rw-r--r--tests/specs/run/fix_emittable_skipped/emittable.d.ts1
-rw-r--r--tests/specs/run/fix_emittable_skipped/fix_emittable_skipped.js7
-rw-r--r--tests/specs/run/fix_emittable_skipped/fix_emittable_skipped.ts.out1
-rw-r--r--tests/specs/run/fix_emittable_skipped/polyfill.ts8
-rw-r--r--tests/specs/run/fix_js_import_js/__test__.jsonc4
-rw-r--r--tests/specs/run/fix_js_import_js/fix_js_import_js.ts3
-rw-r--r--tests/specs/run/fix_js_import_js/fix_js_import_js.ts.out1
-rw-r--r--tests/specs/run/fix_js_import_js/mod4.js1
-rw-r--r--tests/specs/run/fix_js_import_js/mod6.js1
-rw-r--r--tests/specs/run/fix_js_imports/__test__.jsonc4
-rw-r--r--tests/specs/run/fix_js_imports/amd_like.js3
-rw-r--r--tests/specs/run/fix_js_imports/fix_js_imports.ts3
-rw-r--r--tests/specs/run/fix_js_imports/fix_js_imports.ts.out1
-rw-r--r--tests/specs/run/fix_tsc_file_exists/__test__.jsonc4
-rw-r--r--tests/specs/run/fix_tsc_file_exists/fix_tsc_file_exists.out1
-rw-r--r--tests/specs/run/fix_tsc_file_exists/tsc/a.js2
-rw-r--r--tests/specs/run/fix_tsc_file_exists/tsc/d.ts3
-rw-r--r--tests/specs/run/fix_tsc_file_exists/tsc/node_modules/b.js2
-rw-r--r--tests/specs/run/fix_tsc_file_exists/tsc/node_modules/c.js1
-rw-r--r--tests/specs/run/fix_tsc_file_exists/tsc/test.js4
-rw-r--r--tests/specs/run/fix_worker_dispatchevent/__test__.jsonc4
-rw-r--r--tests/specs/run/fix_worker_dispatchevent/fix_worker_dispatchevent.ts43
-rw-r--r--tests/specs/run/fix_worker_dispatchevent/fix_worker_dispatchevent.ts.out1
-rw-r--r--tests/specs/run/followup_dyn_import_resolved/__test__.jsonc4
-rw-r--r--tests/specs/run/followup_dyn_import_resolved/followup_dyn_import_resolves/main.ts14
-rw-r--r--tests/specs/run/followup_dyn_import_resolved/followup_dyn_import_resolves/main.ts.out3
-rw-r--r--tests/specs/run/followup_dyn_import_resolved/followup_dyn_import_resolves/sub1.ts2
-rw-r--r--tests/specs/run/followup_dyn_import_resolved/followup_dyn_import_resolves/sub2.ts1
-rw-r--r--tests/specs/run/heapstats/__test__.jsonc4
-rw-r--r--tests/specs/run/heapstats/heapstats.js37
-rw-r--r--tests/specs/run/heapstats/heapstats.js.out2
-rw-r--r--tests/specs/run/https_import/RootCA.pem19
-rw-r--r--tests/specs/run/https_import/__test__.jsonc4
-rw-r--r--tests/specs/run/https_import/https_import.ts3
-rw-r--r--tests/specs/run/https_import/https_import.ts.out1
-rw-r--r--tests/specs/run/https_import/print_hello.ts3
-rw-r--r--tests/specs/run/if_main/__test__.jsonc4
-rw-r--r--tests/specs/run/if_main/if_main.ts6
-rw-r--r--tests/specs/run/if_main/if_main.ts.out1
-rw-r--r--tests/specs/run/import_attributes_dynamic_error/__test__.jsonc5
-rw-r--r--tests/specs/run/import_attributes_dynamic_error/data.json6
-rw-r--r--tests/specs/run/import_attributes_dynamic_error/dynamic_error.out4
-rw-r--r--tests/specs/run/import_attributes_dynamic_error/dynamic_error.ts3
-rw-r--r--tests/specs/run/import_attributes_dynamic_import/__test__.jsonc4
-rw-r--r--tests/specs/run/import_attributes_dynamic_import/data.json6
-rw-r--r--tests/specs/run/import_attributes_dynamic_import/dynamic_import.out2
-rw-r--r--tests/specs/run/import_attributes_dynamic_import/dynamic_import.ts3
-rw-r--r--tests/specs/run/import_attributes_static_error/__test__.jsonc5
-rw-r--r--tests/specs/run/import_attributes_static_error/data.json6
-rw-r--r--tests/specs/run/import_attributes_static_error/static_error.out3
-rw-r--r--tests/specs/run/import_attributes_static_error/static_error.ts3
-rw-r--r--tests/specs/run/import_attributes_static_export/__test__.jsonc4
-rw-r--r--tests/specs/run/import_attributes_static_export/data.json6
-rw-r--r--tests/specs/run/import_attributes_static_export/static_export.out1
-rw-r--r--tests/specs/run/import_attributes_static_export/static_export.ts3
-rw-r--r--tests/specs/run/import_attributes_static_export/static_reexport.ts1
-rw-r--r--tests/specs/run/import_attributes_static_import/__test__.jsonc4
-rw-r--r--tests/specs/run/import_attributes_static_import/data.json6
-rw-r--r--tests/specs/run/import_attributes_static_import/static_import.out2
-rw-r--r--tests/specs/run/import_attributes_static_import/static_import.ts5
-rw-r--r--tests/specs/run/import_attributes_type_check/__test__.jsonc5
-rw-r--r--tests/specs/run/import_attributes_type_check/data.json6
-rw-r--r--tests/specs/run/import_attributes_type_check/type_check.out12
-rw-r--r--tests/specs/run/import_attributes_type_check/type_check.ts6
-rw-r--r--tests/specs/run/import_blob_url/__test__.jsonc4
-rw-r--r--tests/specs/run/import_blob_url/import_blob_url.ts13
-rw-r--r--tests/specs/run/import_blob_url/import_blob_url.ts.out3
-rw-r--r--tests/specs/run/import_blob_url_error_stack/__test__.jsonc5
-rw-r--r--tests/specs/run/import_blob_url_error_stack/import_blob_url_error_stack.ts13
-rw-r--r--tests/specs/run/import_blob_url_error_stack/import_blob_url_error_stack.ts.out5
-rw-r--r--tests/specs/run/import_blob_url_import_relative/__test__.jsonc5
-rw-r--r--tests/specs/run/import_blob_url_import_relative/import_blob_url_import_relative.ts8
-rw-r--r--tests/specs/run/import_blob_url_import_relative/import_blob_url_import_relative.ts.out5
-rw-r--r--tests/specs/run/import_blob_url_imports/__test__.jsonc4
-rw-r--r--tests/specs/run/import_blob_url_imports/import_blob_url_imports.ts11
-rw-r--r--tests/specs/run/import_blob_url_imports/import_blob_url_imports.ts.out1
-rw-r--r--tests/specs/run/import_blob_url_jsx/__test__.jsonc4
-rw-r--r--tests/specs/run/import_blob_url_jsx/import_blob_url_jsx.ts16
-rw-r--r--tests/specs/run/import_blob_url_jsx/import_blob_url_jsx.ts.out1
-rw-r--r--tests/specs/run/import_compression/__test__.jsonc4
-rw-r--r--tests/specs/run/import_compression/import_compression/brotli2
-rw-r--r--tests/specs/run/import_compression/import_compression/gzipedbin0 -> 39 bytes
-rw-r--r--tests/specs/run/import_compression/import_compression/main.out4
-rw-r--r--tests/specs/run/import_compression/import_compression/main.ts13
-rw-r--r--tests/specs/run/import_data_url/__test__.jsonc4
-rw-r--r--tests/specs/run/import_data_url/import_data_url.ts12
-rw-r--r--tests/specs/run/import_data_url/import_data_url.ts.out3
-rw-r--r--tests/specs/run/import_data_url_error_stack/__test__.jsonc5
-rw-r--r--tests/specs/run/import_data_url_error_stack/import_data_url_error_stack.ts3
-rw-r--r--tests/specs/run/import_data_url_error_stack/import_data_url_error_stack.ts.out5
-rw-r--r--tests/specs/run/import_data_url_import_relative/__test__.jsonc5
-rw-r--r--tests/specs/run/import_data_url_import_relative/import_data_url_import_relative.ts4
-rw-r--r--tests/specs/run/import_data_url_import_relative/import_data_url_import_relative.ts.out2
-rw-r--r--tests/specs/run/import_data_url_imports/__test__.jsonc4
-rw-r--r--tests/specs/run/import_data_url_imports/import_data_url_imports.ts4
-rw-r--r--tests/specs/run/import_data_url_imports/import_data_url_imports.ts.out1
-rw-r--r--tests/specs/run/import_data_url_jsx/__test__.jsonc4
-rw-r--r--tests/specs/run/import_data_url_jsx/import_data_url_jsx.ts10
-rw-r--r--tests/specs/run/import_data_url_jsx/import_data_url_jsx.ts.out1
-rw-r--r--tests/specs/run/import_dynamic_data_url/__test__.jsonc4
-rw-r--r--tests/specs/run/import_dynamic_data_url/import_dynamic_data_url.ts14
-rw-r--r--tests/specs/run/import_dynamic_data_url/import_dynamic_data_url.ts.out3
-rw-r--r--tests/specs/run/import_extensionless/__test__.jsonc4
-rw-r--r--tests/specs/run/import_extensionless/import_extensionless.ts3
-rw-r--r--tests/specs/run/import_extensionless/import_extensionless.ts.out1
-rw-r--r--tests/specs/run/import_file_with_colon/__test__.jsonc4
-rw-r--r--tests/specs/run/import_file_with_colon/import_file_with_colon.ts1
-rw-r--r--tests/specs/run/import_file_with_colon/import_file_with_colon.ts.out1
-rw-r--r--tests/specs/run/import_type/__test__.jsonc4
-rw-r--r--tests/specs/run/import_type/export_types.ts11
-rw-r--r--tests/specs/run/import_type/import_type.ts5
-rw-r--r--tests/specs/run/import_type/import_type.ts.out1
-rw-r--r--tests/specs/run/import_type_no_check/__test__.jsonc4
-rw-r--r--tests/specs/run/import_type_no_check/export_types.ts11
-rw-r--r--tests/specs/run/import_type_no_check/import_type.ts5
-rw-r--r--tests/specs/run/import_type_no_check/import_type.ts.out1
-rw-r--r--tests/specs/run/inline_js_source_map_2/__test__.jsonc5
-rw-r--r--tests/specs/run/inline_js_source_map_2/inline_js_source_map_2.js4
-rw-r--r--tests/specs/run/inline_js_source_map_2/inline_js_source_map_2.js.out2
-rw-r--r--tests/specs/run/inline_js_source_map_2_with_inline_contents/__test__.jsonc5
-rw-r--r--tests/specs/run/inline_js_source_map_2_with_inline_contents/inline_js_source_map_2_with_inline_contents.js4
-rw-r--r--tests/specs/run/inline_js_source_map_2_with_inline_contents/inline_js_source_map_2_with_inline_contents.js.out2
-rw-r--r--tests/specs/run/inline_js_source_map_with_contents_from_graph/__test__.jsonc5
-rw-r--r--tests/specs/run/inline_js_source_map_with_contents_from_graph/inline_js_source_map_with_contents_from_graph.js4
-rw-r--r--tests/specs/run/inline_js_source_map_with_contents_from_graph/inline_js_source_map_with_contents_from_graph.js.out4
-rw-r--r--tests/specs/run/issue_13562/__test__.jsonc4
-rw-r--r--tests/specs/run/issue_13562/issue13562.ts3
-rw-r--r--tests/specs/run/issue_13562/issue13562.ts.out1
-rw-r--r--tests/specs/run/issue_13562/mod1.ts17
-rw-r--r--tests/specs/run/issue_13562/print_hello.ts3
-rw-r--r--tests/specs/run/issue_13562/subdir2/dynamic_import.ts4
-rw-r--r--tests/specs/run/issue_13562/subdir2/mod2.ts9
-rw-r--r--tests/specs/run/js_import_detect/__test__.jsonc5
-rw-r--r--tests/specs/run/js_import_detect/js_import_detect.ts3
-rw-r--r--tests/specs/run/js_import_detect/js_import_detect.ts.out1
-rw-r--r--tests/specs/run/js_root_with_ts_check/__test__.jsonc5
-rw-r--r--tests/specs/run/js_root_with_ts_check/js_root_with_ts_check.js5
-rw-r--r--tests/specs/run/js_root_with_ts_check/js_root_with_ts_check.js.out4
-rw-r--r--tests/specs/run/js_without_extension/__test__.jsonc5
-rw-r--r--tests/specs/run/js_without_extension/js_without_extension3
-rw-r--r--tests/specs/run/js_without_extension/js_without_extension.out1
-rw-r--r--tests/specs/run/jsx_import_from_ts/__test__.jsonc4
-rw-r--r--tests/specs/run/jsx_import_from_ts/jsx_import_from_ts.App.jsx11
-rw-r--r--tests/specs/run/jsx_import_from_ts/jsx_import_from_ts.ts3
-rw-r--r--tests/specs/run/jsx_import_from_ts/jsx_import_from_ts.ts.out1
-rw-r--r--tests/specs/run/jsx_import_source_error/__test__.jsonc5
-rw-r--r--tests/specs/run/jsx_import_source_error/jsx/deno-jsx-error.jsonc6
-rw-r--r--tests/specs/run/jsx_import_source_error/jsx/deno-jsx-import-map.jsonc6
-rw-r--r--tests/specs/run/jsx_import_source_error/jsx/deno-jsx-precompile-skip.jsonc7
-rw-r--r--tests/specs/run/jsx_import_source_error/jsx/deno-jsx-precompile.jsonc6
-rw-r--r--tests/specs/run/jsx_import_source_error/jsx/deno-jsx.json6
-rw-r--r--tests/specs/run/jsx_import_source_error/jsx/deno-jsx.jsonc6
-rw-r--r--tests/specs/run/jsx_import_source_error/jsx/deno-jsxdev-import-map.jsonc6
-rw-r--r--tests/specs/run/jsx_import_source_error/jsx/deno-jsxdev.jsonc6
-rw-r--r--tests/specs/run/jsx_import_source_error/jsx/deno.lock6
-rw-r--r--tests/specs/run/jsx_import_source_error/jsx/import-map-scoped.json8
-rw-r--r--tests/specs/run/jsx_import_source_error/jsx/import-map.json7
-rw-r--r--tests/specs/run/jsx_import_source_error/jsx/jsx-dev-runtime/index.ts12
-rw-r--r--tests/specs/run/jsx_import_source_error/jsx/jsx-precompile/index.ts23
-rw-r--r--tests/specs/run/jsx_import_source_error/jsx/jsx-runtime/index.ts12
-rw-r--r--tests/specs/run/jsx_import_source_error/jsx_import_source_error.out2
-rw-r--r--tests/specs/run/jsx_import_source_error/jsx_import_source_no_pragma.tsx7
-rw-r--r--tests/specs/run/jsx_import_source_import_map/__test__.jsonc4
-rw-r--r--tests/specs/run/jsx_import_source_import_map/jsx/deno-jsx-error.jsonc6
-rw-r--r--tests/specs/run/jsx_import_source_import_map/jsx/deno-jsx-import-map.jsonc6
-rw-r--r--tests/specs/run/jsx_import_source_import_map/jsx/deno-jsx-precompile-skip.jsonc7
-rw-r--r--tests/specs/run/jsx_import_source_import_map/jsx/deno-jsx-precompile.jsonc6
-rw-r--r--tests/specs/run/jsx_import_source_import_map/jsx/deno-jsx.json6
-rw-r--r--tests/specs/run/jsx_import_source_import_map/jsx/deno-jsx.jsonc6
-rw-r--r--tests/specs/run/jsx_import_source_import_map/jsx/deno-jsxdev-import-map.jsonc6
-rw-r--r--tests/specs/run/jsx_import_source_import_map/jsx/deno-jsxdev.jsonc6
-rw-r--r--tests/specs/run/jsx_import_source_import_map/jsx/deno.lock6
-rw-r--r--tests/specs/run/jsx_import_source_import_map/jsx/import-map-scoped.json8
-rw-r--r--tests/specs/run/jsx_import_source_import_map/jsx/import-map.json7
-rw-r--r--tests/specs/run/jsx_import_source_import_map/jsx/jsx-dev-runtime/index.ts12
-rw-r--r--tests/specs/run/jsx_import_source_import_map/jsx/jsx-precompile/index.ts23
-rw-r--r--tests/specs/run/jsx_import_source_import_map/jsx/jsx-runtime/index.ts12
-rw-r--r--tests/specs/run/jsx_import_source_import_map/jsx_import_source_import_map.out2
-rw-r--r--tests/specs/run/jsx_import_source_import_map/jsx_import_source_no_pragma.tsx7
-rw-r--r--tests/specs/run/jsx_import_source_import_map_dev/__test__.jsonc4
-rw-r--r--tests/specs/run/jsx_import_source_import_map_dev/jsx/deno-jsx-error.jsonc6
-rw-r--r--tests/specs/run/jsx_import_source_import_map_dev/jsx/deno-jsx-import-map.jsonc6
-rw-r--r--tests/specs/run/jsx_import_source_import_map_dev/jsx/deno-jsx-precompile-skip.jsonc7
-rw-r--r--tests/specs/run/jsx_import_source_import_map_dev/jsx/deno-jsx-precompile.jsonc6
-rw-r--r--tests/specs/run/jsx_import_source_import_map_dev/jsx/deno-jsx.json6
-rw-r--r--tests/specs/run/jsx_import_source_import_map_dev/jsx/deno-jsx.jsonc6
-rw-r--r--tests/specs/run/jsx_import_source_import_map_dev/jsx/deno-jsxdev-import-map.jsonc6
-rw-r--r--tests/specs/run/jsx_import_source_import_map_dev/jsx/deno-jsxdev.jsonc6
-rw-r--r--tests/specs/run/jsx_import_source_import_map_dev/jsx/deno.lock6
-rw-r--r--tests/specs/run/jsx_import_source_import_map_dev/jsx/import-map-scoped.json8
-rw-r--r--tests/specs/run/jsx_import_source_import_map_dev/jsx/import-map.json7
-rw-r--r--tests/specs/run/jsx_import_source_import_map_dev/jsx/jsx-dev-runtime/index.ts12
-rw-r--r--tests/specs/run/jsx_import_source_import_map_dev/jsx/jsx-precompile/index.ts23
-rw-r--r--tests/specs/run/jsx_import_source_import_map_dev/jsx/jsx-runtime/index.ts12
-rw-r--r--tests/specs/run/jsx_import_source_import_map_dev/jsx_import_source_import_map_dev.out2
-rw-r--r--tests/specs/run/jsx_import_source_import_map_dev/jsx_import_source_no_pragma.tsx7
-rw-r--r--tests/specs/run/jsx_import_source_import_map_no_check/__test__.jsonc4
-rw-r--r--tests/specs/run/jsx_import_source_import_map_no_check/jsx/deno-jsx-error.jsonc6
-rw-r--r--tests/specs/run/jsx_import_source_import_map_no_check/jsx/deno-jsx-import-map.jsonc6
-rw-r--r--tests/specs/run/jsx_import_source_import_map_no_check/jsx/deno-jsx-precompile-skip.jsonc7
-rw-r--r--tests/specs/run/jsx_import_source_import_map_no_check/jsx/deno-jsx-precompile.jsonc6
-rw-r--r--tests/specs/run/jsx_import_source_import_map_no_check/jsx/deno-jsx.json6
-rw-r--r--tests/specs/run/jsx_import_source_import_map_no_check/jsx/deno-jsx.jsonc6
-rw-r--r--tests/specs/run/jsx_import_source_import_map_no_check/jsx/deno-jsxdev-import-map.jsonc6
-rw-r--r--tests/specs/run/jsx_import_source_import_map_no_check/jsx/deno-jsxdev.jsonc6
-rw-r--r--tests/specs/run/jsx_import_source_import_map_no_check/jsx/deno.lock6
-rw-r--r--tests/specs/run/jsx_import_source_import_map_no_check/jsx/import-map-scoped.json8
-rw-r--r--tests/specs/run/jsx_import_source_import_map_no_check/jsx/import-map.json7
-rw-r--r--tests/specs/run/jsx_import_source_import_map_no_check/jsx/jsx-dev-runtime/index.ts12
-rw-r--r--tests/specs/run/jsx_import_source_import_map_no_check/jsx/jsx-precompile/index.ts23
-rw-r--r--tests/specs/run/jsx_import_source_import_map_no_check/jsx/jsx-runtime/index.ts12
-rw-r--r--tests/specs/run/jsx_import_source_import_map_no_check/jsx_import_source_import_map.out2
-rw-r--r--tests/specs/run/jsx_import_source_import_map_no_check/jsx_import_source_no_pragma.tsx7
-rw-r--r--tests/specs/run/jsx_import_source_no_pragma/__test__.jsonc4
-rw-r--r--tests/specs/run/jsx_import_source_no_pragma/jsx/deno-jsx-error.jsonc6
-rw-r--r--tests/specs/run/jsx_import_source_no_pragma/jsx/deno-jsx-import-map.jsonc6
-rw-r--r--tests/specs/run/jsx_import_source_no_pragma/jsx/deno-jsx-precompile-skip.jsonc7
-rw-r--r--tests/specs/run/jsx_import_source_no_pragma/jsx/deno-jsx-precompile.jsonc6
-rw-r--r--tests/specs/run/jsx_import_source_no_pragma/jsx/deno-jsx.json6
-rw-r--r--tests/specs/run/jsx_import_source_no_pragma/jsx/deno-jsx.jsonc6
-rw-r--r--tests/specs/run/jsx_import_source_no_pragma/jsx/deno-jsxdev-import-map.jsonc6
-rw-r--r--tests/specs/run/jsx_import_source_no_pragma/jsx/deno-jsxdev.jsonc6
-rw-r--r--tests/specs/run/jsx_import_source_no_pragma/jsx/deno.lock6
-rw-r--r--tests/specs/run/jsx_import_source_no_pragma/jsx/import-map-scoped.json8
-rw-r--r--tests/specs/run/jsx_import_source_no_pragma/jsx/import-map.json7
-rw-r--r--tests/specs/run/jsx_import_source_no_pragma/jsx/jsx-dev-runtime/index.ts12
-rw-r--r--tests/specs/run/jsx_import_source_no_pragma/jsx/jsx-precompile/index.ts23
-rw-r--r--tests/specs/run/jsx_import_source_no_pragma/jsx/jsx-runtime/index.ts12
-rw-r--r--tests/specs/run/jsx_import_source_no_pragma/jsx_import_source.out2
-rw-r--r--tests/specs/run/jsx_import_source_no_pragma/jsx_import_source_no_pragma.tsx7
-rw-r--r--tests/specs/run/jsx_import_source_no_pragma_dev/__test__.jsonc4
-rw-r--r--tests/specs/run/jsx_import_source_no_pragma_dev/jsx/deno-jsx-error.jsonc6
-rw-r--r--tests/specs/run/jsx_import_source_no_pragma_dev/jsx/deno-jsx-import-map.jsonc6
-rw-r--r--tests/specs/run/jsx_import_source_no_pragma_dev/jsx/deno-jsx-precompile-skip.jsonc7
-rw-r--r--tests/specs/run/jsx_import_source_no_pragma_dev/jsx/deno-jsx-precompile.jsonc6
-rw-r--r--tests/specs/run/jsx_import_source_no_pragma_dev/jsx/deno-jsx.json6
-rw-r--r--tests/specs/run/jsx_import_source_no_pragma_dev/jsx/deno-jsx.jsonc6
-rw-r--r--tests/specs/run/jsx_import_source_no_pragma_dev/jsx/deno-jsxdev-import-map.jsonc6
-rw-r--r--tests/specs/run/jsx_import_source_no_pragma_dev/jsx/deno-jsxdev.jsonc6
-rw-r--r--tests/specs/run/jsx_import_source_no_pragma_dev/jsx/deno.lock6
-rw-r--r--tests/specs/run/jsx_import_source_no_pragma_dev/jsx/import-map-scoped.json8
-rw-r--r--tests/specs/run/jsx_import_source_no_pragma_dev/jsx/import-map.json7
-rw-r--r--tests/specs/run/jsx_import_source_no_pragma_dev/jsx/jsx-dev-runtime/index.ts12
-rw-r--r--tests/specs/run/jsx_import_source_no_pragma_dev/jsx/jsx-precompile/index.ts23
-rw-r--r--tests/specs/run/jsx_import_source_no_pragma_dev/jsx/jsx-runtime/index.ts12
-rw-r--r--tests/specs/run/jsx_import_source_no_pragma_dev/jsx_import_source_dev.out2
-rw-r--r--tests/specs/run/jsx_import_source_no_pragma_dev/jsx_import_source_no_pragma.tsx7
-rw-r--r--tests/specs/run/jsx_import_source_no_pragma_no_check/__test__.jsonc4
-rw-r--r--tests/specs/run/jsx_import_source_no_pragma_no_check/jsx/deno-jsx-error.jsonc6
-rw-r--r--tests/specs/run/jsx_import_source_no_pragma_no_check/jsx/deno-jsx-import-map.jsonc6
-rw-r--r--tests/specs/run/jsx_import_source_no_pragma_no_check/jsx/deno-jsx-precompile-skip.jsonc7
-rw-r--r--tests/specs/run/jsx_import_source_no_pragma_no_check/jsx/deno-jsx-precompile.jsonc6
-rw-r--r--tests/specs/run/jsx_import_source_no_pragma_no_check/jsx/deno-jsx.json6
-rw-r--r--tests/specs/run/jsx_import_source_no_pragma_no_check/jsx/deno-jsx.jsonc6
-rw-r--r--tests/specs/run/jsx_import_source_no_pragma_no_check/jsx/deno-jsxdev-import-map.jsonc6
-rw-r--r--tests/specs/run/jsx_import_source_no_pragma_no_check/jsx/deno-jsxdev.jsonc6
-rw-r--r--tests/specs/run/jsx_import_source_no_pragma_no_check/jsx/deno.lock6
-rw-r--r--tests/specs/run/jsx_import_source_no_pragma_no_check/jsx/import-map-scoped.json8
-rw-r--r--tests/specs/run/jsx_import_source_no_pragma_no_check/jsx/import-map.json7
-rw-r--r--tests/specs/run/jsx_import_source_no_pragma_no_check/jsx/jsx-dev-runtime/index.ts12
-rw-r--r--tests/specs/run/jsx_import_source_no_pragma_no_check/jsx/jsx-precompile/index.ts23
-rw-r--r--tests/specs/run/jsx_import_source_no_pragma_no_check/jsx/jsx-runtime/index.ts12
-rw-r--r--tests/specs/run/jsx_import_source_no_pragma_no_check/jsx_import_source.out2
-rw-r--r--tests/specs/run/jsx_import_source_no_pragma_no_check/jsx_import_source_no_pragma.tsx7
-rw-r--r--tests/specs/run/jsx_import_source_pragma/__test__.jsonc4
-rw-r--r--tests/specs/run/jsx_import_source_pragma/jsx/deno-jsx-error.jsonc6
-rw-r--r--tests/specs/run/jsx_import_source_pragma/jsx/deno-jsx-import-map.jsonc6
-rw-r--r--tests/specs/run/jsx_import_source_pragma/jsx/deno-jsx-precompile-skip.jsonc7
-rw-r--r--tests/specs/run/jsx_import_source_pragma/jsx/deno-jsx-precompile.jsonc6
-rw-r--r--tests/specs/run/jsx_import_source_pragma/jsx/deno-jsx.json6
-rw-r--r--tests/specs/run/jsx_import_source_pragma/jsx/deno-jsx.jsonc6
-rw-r--r--tests/specs/run/jsx_import_source_pragma/jsx/deno-jsxdev-import-map.jsonc6
-rw-r--r--tests/specs/run/jsx_import_source_pragma/jsx/deno-jsxdev.jsonc6
-rw-r--r--tests/specs/run/jsx_import_source_pragma/jsx/deno.lock6
-rw-r--r--tests/specs/run/jsx_import_source_pragma/jsx/import-map-scoped.json8
-rw-r--r--tests/specs/run/jsx_import_source_pragma/jsx/import-map.json7
-rw-r--r--tests/specs/run/jsx_import_source_pragma/jsx/jsx-dev-runtime/index.ts12
-rw-r--r--tests/specs/run/jsx_import_source_pragma/jsx/jsx-precompile/index.ts23
-rw-r--r--tests/specs/run/jsx_import_source_pragma/jsx/jsx-runtime/index.ts12
-rw-r--r--tests/specs/run/jsx_import_source_pragma/jsx_import_source.out2
-rw-r--r--tests/specs/run/jsx_import_source_pragma/jsx_import_source_pragma.tsx9
-rw-r--r--tests/specs/run/jsx_import_source_pragma_import_map/__test__.jsonc4
-rw-r--r--tests/specs/run/jsx_import_source_pragma_import_map/jsx/deno-jsx-error.jsonc6
-rw-r--r--tests/specs/run/jsx_import_source_pragma_import_map/jsx/deno-jsx-import-map.jsonc6
-rw-r--r--tests/specs/run/jsx_import_source_pragma_import_map/jsx/deno-jsx-precompile-skip.jsonc7
-rw-r--r--tests/specs/run/jsx_import_source_pragma_import_map/jsx/deno-jsx-precompile.jsonc6
-rw-r--r--tests/specs/run/jsx_import_source_pragma_import_map/jsx/deno-jsx.json6
-rw-r--r--tests/specs/run/jsx_import_source_pragma_import_map/jsx/deno-jsx.jsonc6
-rw-r--r--tests/specs/run/jsx_import_source_pragma_import_map/jsx/deno-jsxdev-import-map.jsonc6
-rw-r--r--tests/specs/run/jsx_import_source_pragma_import_map/jsx/deno-jsxdev.jsonc6
-rw-r--r--tests/specs/run/jsx_import_source_pragma_import_map/jsx/deno.lock6
-rw-r--r--tests/specs/run/jsx_import_source_pragma_import_map/jsx/import-map-scoped.json8
-rw-r--r--tests/specs/run/jsx_import_source_pragma_import_map/jsx/import-map.json7
-rw-r--r--tests/specs/run/jsx_import_source_pragma_import_map/jsx/jsx-dev-runtime/index.ts12
-rw-r--r--tests/specs/run/jsx_import_source_pragma_import_map/jsx/jsx-precompile/index.ts23
-rw-r--r--tests/specs/run/jsx_import_source_pragma_import_map/jsx/jsx-runtime/index.ts12
-rw-r--r--tests/specs/run/jsx_import_source_pragma_import_map/jsx_import_source_import_map.out2
-rw-r--r--tests/specs/run/jsx_import_source_pragma_import_map/jsx_import_source_pragma_import_map.tsx9
-rw-r--r--tests/specs/run/jsx_import_source_pragma_import_map_dev/__test__.jsonc4
-rw-r--r--tests/specs/run/jsx_import_source_pragma_import_map_dev/jsx/deno-jsx-error.jsonc6
-rw-r--r--tests/specs/run/jsx_import_source_pragma_import_map_dev/jsx/deno-jsx-import-map.jsonc6
-rw-r--r--tests/specs/run/jsx_import_source_pragma_import_map_dev/jsx/deno-jsx-precompile-skip.jsonc7
-rw-r--r--tests/specs/run/jsx_import_source_pragma_import_map_dev/jsx/deno-jsx-precompile.jsonc6
-rw-r--r--tests/specs/run/jsx_import_source_pragma_import_map_dev/jsx/deno-jsx.json6
-rw-r--r--tests/specs/run/jsx_import_source_pragma_import_map_dev/jsx/deno-jsx.jsonc6
-rw-r--r--tests/specs/run/jsx_import_source_pragma_import_map_dev/jsx/deno-jsxdev-import-map.jsonc6
-rw-r--r--tests/specs/run/jsx_import_source_pragma_import_map_dev/jsx/deno-jsxdev.jsonc6
-rw-r--r--tests/specs/run/jsx_import_source_pragma_import_map_dev/jsx/deno.lock6
-rw-r--r--tests/specs/run/jsx_import_source_pragma_import_map_dev/jsx/import-map-scoped.json8
-rw-r--r--tests/specs/run/jsx_import_source_pragma_import_map_dev/jsx/import-map.json7
-rw-r--r--tests/specs/run/jsx_import_source_pragma_import_map_dev/jsx/jsx-dev-runtime/index.ts12
-rw-r--r--tests/specs/run/jsx_import_source_pragma_import_map_dev/jsx/jsx-precompile/index.ts23
-rw-r--r--tests/specs/run/jsx_import_source_pragma_import_map_dev/jsx/jsx-runtime/index.ts12
-rw-r--r--tests/specs/run/jsx_import_source_pragma_import_map_dev/jsx_import_source_import_map_dev.out2
-rw-r--r--tests/specs/run/jsx_import_source_pragma_import_map_dev/jsx_import_source_pragma_import_map.tsx9
-rw-r--r--tests/specs/run/jsx_import_source_pragma_import_map_no_check/__test__.jsonc4
-rw-r--r--tests/specs/run/jsx_import_source_pragma_import_map_no_check/jsx/deno-jsx-error.jsonc6
-rw-r--r--tests/specs/run/jsx_import_source_pragma_import_map_no_check/jsx/deno-jsx-import-map.jsonc6
-rw-r--r--tests/specs/run/jsx_import_source_pragma_import_map_no_check/jsx/deno-jsx-precompile-skip.jsonc7
-rw-r--r--tests/specs/run/jsx_import_source_pragma_import_map_no_check/jsx/deno-jsx-precompile.jsonc6
-rw-r--r--tests/specs/run/jsx_import_source_pragma_import_map_no_check/jsx/deno-jsx.json6
-rw-r--r--tests/specs/run/jsx_import_source_pragma_import_map_no_check/jsx/deno-jsx.jsonc6
-rw-r--r--tests/specs/run/jsx_import_source_pragma_import_map_no_check/jsx/deno-jsxdev-import-map.jsonc6
-rw-r--r--tests/specs/run/jsx_import_source_pragma_import_map_no_check/jsx/deno-jsxdev.jsonc6
-rw-r--r--tests/specs/run/jsx_import_source_pragma_import_map_no_check/jsx/deno.lock6
-rw-r--r--tests/specs/run/jsx_import_source_pragma_import_map_no_check/jsx/import-map-scoped.json8
-rw-r--r--tests/specs/run/jsx_import_source_pragma_import_map_no_check/jsx/import-map.json7
-rw-r--r--tests/specs/run/jsx_import_source_pragma_import_map_no_check/jsx/jsx-dev-runtime/index.ts12
-rw-r--r--tests/specs/run/jsx_import_source_pragma_import_map_no_check/jsx/jsx-precompile/index.ts23
-rw-r--r--tests/specs/run/jsx_import_source_pragma_import_map_no_check/jsx/jsx-runtime/index.ts12
-rw-r--r--tests/specs/run/jsx_import_source_pragma_import_map_no_check/jsx_import_source_import_map.out2
-rw-r--r--tests/specs/run/jsx_import_source_pragma_import_map_no_check/jsx_import_source_pragma_import_map.tsx9
-rw-r--r--tests/specs/run/jsx_import_source_pragma_no_check/__test__.jsonc4
-rw-r--r--tests/specs/run/jsx_import_source_pragma_no_check/jsx/deno-jsx-error.jsonc6
-rw-r--r--tests/specs/run/jsx_import_source_pragma_no_check/jsx/deno-jsx-import-map.jsonc6
-rw-r--r--tests/specs/run/jsx_import_source_pragma_no_check/jsx/deno-jsx-precompile-skip.jsonc7
-rw-r--r--tests/specs/run/jsx_import_source_pragma_no_check/jsx/deno-jsx-precompile.jsonc6
-rw-r--r--tests/specs/run/jsx_import_source_pragma_no_check/jsx/deno-jsx.json6
-rw-r--r--tests/specs/run/jsx_import_source_pragma_no_check/jsx/deno-jsx.jsonc6
-rw-r--r--tests/specs/run/jsx_import_source_pragma_no_check/jsx/deno-jsxdev-import-map.jsonc6
-rw-r--r--tests/specs/run/jsx_import_source_pragma_no_check/jsx/deno-jsxdev.jsonc6
-rw-r--r--tests/specs/run/jsx_import_source_pragma_no_check/jsx/deno.lock6
-rw-r--r--tests/specs/run/jsx_import_source_pragma_no_check/jsx/import-map-scoped.json8
-rw-r--r--tests/specs/run/jsx_import_source_pragma_no_check/jsx/import-map.json7
-rw-r--r--tests/specs/run/jsx_import_source_pragma_no_check/jsx/jsx-dev-runtime/index.ts12
-rw-r--r--tests/specs/run/jsx_import_source_pragma_no_check/jsx/jsx-precompile/index.ts23
-rw-r--r--tests/specs/run/jsx_import_source_pragma_no_check/jsx/jsx-runtime/index.ts12
-rw-r--r--tests/specs/run/jsx_import_source_pragma_no_check/jsx_import_source.out2
-rw-r--r--tests/specs/run/jsx_import_source_pragma_no_check/jsx_import_source_pragma.tsx9
-rw-r--r--tests/specs/run/jsx_import_source_pragma_with_config/__test__.jsonc4
-rw-r--r--tests/specs/run/jsx_import_source_pragma_with_config/jsx/deno-jsx-error.jsonc6
-rw-r--r--tests/specs/run/jsx_import_source_pragma_with_config/jsx/deno-jsx-import-map.jsonc6
-rw-r--r--tests/specs/run/jsx_import_source_pragma_with_config/jsx/deno-jsx-precompile-skip.jsonc7
-rw-r--r--tests/specs/run/jsx_import_source_pragma_with_config/jsx/deno-jsx-precompile.jsonc6
-rw-r--r--tests/specs/run/jsx_import_source_pragma_with_config/jsx/deno-jsx.json6
-rw-r--r--tests/specs/run/jsx_import_source_pragma_with_config/jsx/deno-jsx.jsonc6
-rw-r--r--tests/specs/run/jsx_import_source_pragma_with_config/jsx/deno-jsxdev-import-map.jsonc6
-rw-r--r--tests/specs/run/jsx_import_source_pragma_with_config/jsx/deno-jsxdev.jsonc6
-rw-r--r--tests/specs/run/jsx_import_source_pragma_with_config/jsx/deno.lock6
-rw-r--r--tests/specs/run/jsx_import_source_pragma_with_config/jsx/import-map-scoped.json8
-rw-r--r--tests/specs/run/jsx_import_source_pragma_with_config/jsx/import-map.json7
-rw-r--r--tests/specs/run/jsx_import_source_pragma_with_config/jsx/jsx-dev-runtime/index.ts12
-rw-r--r--tests/specs/run/jsx_import_source_pragma_with_config/jsx/jsx-precompile/index.ts23
-rw-r--r--tests/specs/run/jsx_import_source_pragma_with_config/jsx/jsx-runtime/index.ts12
-rw-r--r--tests/specs/run/jsx_import_source_pragma_with_config/jsx_import_source.out2
-rw-r--r--tests/specs/run/jsx_import_source_pragma_with_config/jsx_import_source_pragma.tsx9
-rw-r--r--tests/specs/run/jsx_import_source_pragma_with_config_no_check/__test__.jsonc4
-rw-r--r--tests/specs/run/jsx_import_source_pragma_with_config_no_check/jsx/deno-jsx-error.jsonc6
-rw-r--r--tests/specs/run/jsx_import_source_pragma_with_config_no_check/jsx/deno-jsx-import-map.jsonc6
-rw-r--r--tests/specs/run/jsx_import_source_pragma_with_config_no_check/jsx/deno-jsx-precompile-skip.jsonc7
-rw-r--r--tests/specs/run/jsx_import_source_pragma_with_config_no_check/jsx/deno-jsx-precompile.jsonc6
-rw-r--r--tests/specs/run/jsx_import_source_pragma_with_config_no_check/jsx/deno-jsx.json6
-rw-r--r--tests/specs/run/jsx_import_source_pragma_with_config_no_check/jsx/deno-jsx.jsonc6
-rw-r--r--tests/specs/run/jsx_import_source_pragma_with_config_no_check/jsx/deno-jsxdev-import-map.jsonc6
-rw-r--r--tests/specs/run/jsx_import_source_pragma_with_config_no_check/jsx/deno-jsxdev.jsonc6
-rw-r--r--tests/specs/run/jsx_import_source_pragma_with_config_no_check/jsx/deno.lock6
-rw-r--r--tests/specs/run/jsx_import_source_pragma_with_config_no_check/jsx/import-map-scoped.json8
-rw-r--r--tests/specs/run/jsx_import_source_pragma_with_config_no_check/jsx/import-map.json7
-rw-r--r--tests/specs/run/jsx_import_source_pragma_with_config_no_check/jsx/jsx-dev-runtime/index.ts12
-rw-r--r--tests/specs/run/jsx_import_source_pragma_with_config_no_check/jsx/jsx-precompile/index.ts23
-rw-r--r--tests/specs/run/jsx_import_source_pragma_with_config_no_check/jsx/jsx-runtime/index.ts12
-rw-r--r--tests/specs/run/jsx_import_source_pragma_with_config_no_check/jsx_import_source.out2
-rw-r--r--tests/specs/run/jsx_import_source_pragma_with_config_no_check/jsx_import_source_pragma.tsx9
-rw-r--r--tests/specs/run/jsx_import_source_pragma_with_config_vendor_dir/__test__.jsonc4
-rw-r--r--tests/specs/run/jsx_import_source_pragma_with_config_vendor_dir/jsx/deno-jsx-error.jsonc6
-rw-r--r--tests/specs/run/jsx_import_source_pragma_with_config_vendor_dir/jsx/deno-jsx-import-map.jsonc6
-rw-r--r--tests/specs/run/jsx_import_source_pragma_with_config_vendor_dir/jsx/deno-jsx-precompile-skip.jsonc7
-rw-r--r--tests/specs/run/jsx_import_source_pragma_with_config_vendor_dir/jsx/deno-jsx-precompile.jsonc6
-rw-r--r--tests/specs/run/jsx_import_source_pragma_with_config_vendor_dir/jsx/deno-jsx.json6
-rw-r--r--tests/specs/run/jsx_import_source_pragma_with_config_vendor_dir/jsx/deno-jsx.jsonc6
-rw-r--r--tests/specs/run/jsx_import_source_pragma_with_config_vendor_dir/jsx/deno-jsxdev-import-map.jsonc6
-rw-r--r--tests/specs/run/jsx_import_source_pragma_with_config_vendor_dir/jsx/deno-jsxdev.jsonc6
-rw-r--r--tests/specs/run/jsx_import_source_pragma_with_config_vendor_dir/jsx/deno.lock6
-rw-r--r--tests/specs/run/jsx_import_source_pragma_with_config_vendor_dir/jsx/import-map-scoped.json8
-rw-r--r--tests/specs/run/jsx_import_source_pragma_with_config_vendor_dir/jsx/import-map.json7
-rw-r--r--tests/specs/run/jsx_import_source_pragma_with_config_vendor_dir/jsx/jsx-dev-runtime/index.ts12
-rw-r--r--tests/specs/run/jsx_import_source_pragma_with_config_vendor_dir/jsx/jsx-precompile/index.ts23
-rw-r--r--tests/specs/run/jsx_import_source_pragma_with_config_vendor_dir/jsx/jsx-runtime/index.ts12
-rw-r--r--tests/specs/run/jsx_import_source_pragma_with_config_vendor_dir/jsx/vendor/http_localhost_4545/jsx/#jsx-runtime_62ac8.js11
-rw-r--r--tests/specs/run/jsx_import_source_pragma_with_config_vendor_dir/jsx/vendor/manifest.json9
-rw-r--r--tests/specs/run/jsx_import_source_pragma_with_config_vendor_dir/jsx_import_source.out2
-rw-r--r--tests/specs/run/jsx_import_source_pragma_with_config_vendor_dir/jsx_import_source_pragma.tsx9
-rw-r--r--tests/specs/run/jsx_import_source_pragma_with_dev_config/__test__.jsonc4
-rw-r--r--tests/specs/run/jsx_import_source_pragma_with_dev_config/jsx/deno-jsx-error.jsonc6
-rw-r--r--tests/specs/run/jsx_import_source_pragma_with_dev_config/jsx/deno-jsx-import-map.jsonc6
-rw-r--r--tests/specs/run/jsx_import_source_pragma_with_dev_config/jsx/deno-jsx-precompile-skip.jsonc7
-rw-r--r--tests/specs/run/jsx_import_source_pragma_with_dev_config/jsx/deno-jsx-precompile.jsonc6
-rw-r--r--tests/specs/run/jsx_import_source_pragma_with_dev_config/jsx/deno-jsx.json6
-rw-r--r--tests/specs/run/jsx_import_source_pragma_with_dev_config/jsx/deno-jsx.jsonc6
-rw-r--r--tests/specs/run/jsx_import_source_pragma_with_dev_config/jsx/deno-jsxdev-import-map.jsonc6
-rw-r--r--tests/specs/run/jsx_import_source_pragma_with_dev_config/jsx/deno-jsxdev.jsonc6
-rw-r--r--tests/specs/run/jsx_import_source_pragma_with_dev_config/jsx/deno.lock6
-rw-r--r--tests/specs/run/jsx_import_source_pragma_with_dev_config/jsx/import-map-scoped.json8
-rw-r--r--tests/specs/run/jsx_import_source_pragma_with_dev_config/jsx/import-map.json7
-rw-r--r--tests/specs/run/jsx_import_source_pragma_with_dev_config/jsx/jsx-dev-runtime/index.ts12
-rw-r--r--tests/specs/run/jsx_import_source_pragma_with_dev_config/jsx/jsx-precompile/index.ts23
-rw-r--r--tests/specs/run/jsx_import_source_pragma_with_dev_config/jsx/jsx-runtime/index.ts12
-rw-r--r--tests/specs/run/jsx_import_source_pragma_with_dev_config/jsx_import_source_dev.out2
-rw-r--r--tests/specs/run/jsx_import_source_pragma_with_dev_config/jsx_import_source_pragma.tsx9
-rw-r--r--tests/specs/run/jsx_import_source_precompile_import_map/__test__.jsonc4
-rw-r--r--tests/specs/run/jsx_import_source_precompile_import_map/jsx/deno-jsx-error.jsonc6
-rw-r--r--tests/specs/run/jsx_import_source_precompile_import_map/jsx/deno-jsx-import-map.jsonc6
-rw-r--r--tests/specs/run/jsx_import_source_precompile_import_map/jsx/deno-jsx-precompile-skip.jsonc7
-rw-r--r--tests/specs/run/jsx_import_source_precompile_import_map/jsx/deno-jsx-precompile.jsonc6
-rw-r--r--tests/specs/run/jsx_import_source_precompile_import_map/jsx/deno-jsx.json6
-rw-r--r--tests/specs/run/jsx_import_source_precompile_import_map/jsx/deno-jsx.jsonc6
-rw-r--r--tests/specs/run/jsx_import_source_precompile_import_map/jsx/deno-jsxdev-import-map.jsonc6
-rw-r--r--tests/specs/run/jsx_import_source_precompile_import_map/jsx/deno-jsxdev.jsonc6
-rw-r--r--tests/specs/run/jsx_import_source_precompile_import_map/jsx/deno.lock6
-rw-r--r--tests/specs/run/jsx_import_source_precompile_import_map/jsx/import-map-scoped.json8
-rw-r--r--tests/specs/run/jsx_import_source_precompile_import_map/jsx/import-map.json7
-rw-r--r--tests/specs/run/jsx_import_source_precompile_import_map/jsx/jsx-dev-runtime/index.ts12
-rw-r--r--tests/specs/run/jsx_import_source_precompile_import_map/jsx/jsx-precompile/index.ts23
-rw-r--r--tests/specs/run/jsx_import_source_precompile_import_map/jsx/jsx-runtime/index.ts12
-rw-r--r--tests/specs/run/jsx_import_source_precompile_import_map/jsx_precompile/no_pragma.out3
-rw-r--r--tests/specs/run/jsx_import_source_precompile_import_map/jsx_precompile/no_pragma.tsx3
-rw-r--r--tests/specs/run/jsx_import_source_precompile_import_map/jsx_precompile/skip.out3
-rw-r--r--tests/specs/run/jsx_import_source_precompile_import_map/jsx_precompile/skip.tsx9
-rw-r--r--tests/specs/run/jsx_import_source_precompile_import_map_skip_element/__test__.jsonc4
-rw-r--r--tests/specs/run/jsx_import_source_precompile_import_map_skip_element/jsx/deno-jsx-error.jsonc6
-rw-r--r--tests/specs/run/jsx_import_source_precompile_import_map_skip_element/jsx/deno-jsx-import-map.jsonc6
-rw-r--r--tests/specs/run/jsx_import_source_precompile_import_map_skip_element/jsx/deno-jsx-precompile-skip.jsonc7
-rw-r--r--tests/specs/run/jsx_import_source_precompile_import_map_skip_element/jsx/deno-jsx-precompile.jsonc6
-rw-r--r--tests/specs/run/jsx_import_source_precompile_import_map_skip_element/jsx/deno-jsx.json6
-rw-r--r--tests/specs/run/jsx_import_source_precompile_import_map_skip_element/jsx/deno-jsx.jsonc6
-rw-r--r--tests/specs/run/jsx_import_source_precompile_import_map_skip_element/jsx/deno-jsxdev-import-map.jsonc6
-rw-r--r--tests/specs/run/jsx_import_source_precompile_import_map_skip_element/jsx/deno-jsxdev.jsonc6
-rw-r--r--tests/specs/run/jsx_import_source_precompile_import_map_skip_element/jsx/deno.lock6
-rw-r--r--tests/specs/run/jsx_import_source_precompile_import_map_skip_element/jsx/import-map-scoped.json8
-rw-r--r--tests/specs/run/jsx_import_source_precompile_import_map_skip_element/jsx/import-map.json7
-rw-r--r--tests/specs/run/jsx_import_source_precompile_import_map_skip_element/jsx/jsx-dev-runtime/index.ts12
-rw-r--r--tests/specs/run/jsx_import_source_precompile_import_map_skip_element/jsx/jsx-precompile/index.ts23
-rw-r--r--tests/specs/run/jsx_import_source_precompile_import_map_skip_element/jsx/jsx-runtime/index.ts12
-rw-r--r--tests/specs/run/jsx_import_source_precompile_import_map_skip_element/jsx_precompile/no_pragma.out3
-rw-r--r--tests/specs/run/jsx_import_source_precompile_import_map_skip_element/jsx_precompile/no_pragma.tsx3
-rw-r--r--tests/specs/run/jsx_import_source_precompile_import_map_skip_element/jsx_precompile/skip.out3
-rw-r--r--tests/specs/run/jsx_import_source_precompile_import_map_skip_element/jsx_precompile/skip.tsx9
-rw-r--r--tests/specs/run/lock_check_ok/003_relative_import.ts3
-rw-r--r--tests/specs/run/lock_check_ok/003_relative_import.ts.out1
-rw-r--r--tests/specs/run/lock_check_ok/__test__.jsonc4
-rw-r--r--tests/specs/run/lock_check_ok/lock_check_ok.json4
-rw-r--r--tests/specs/run/lock_check_ok/print_hello.ts3
-rw-r--r--tests/specs/run/lock_check_ok2/019_media_types.ts24
-rw-r--r--tests/specs/run/lock_check_ok2/019_media_types.ts.out1
-rw-r--r--tests/specs/run/lock_check_ok2/__test__.jsonc4
-rw-r--r--tests/specs/run/lock_check_ok2/lock_check_ok2.json13
-rw-r--r--tests/specs/run/lock_v2_check_ok/003_relative_import.ts3
-rw-r--r--tests/specs/run/lock_v2_check_ok/003_relative_import.ts.out1
-rw-r--r--tests/specs/run/lock_v2_check_ok/__test__.jsonc4
-rw-r--r--tests/specs/run/lock_v2_check_ok/lock_v2_check_ok.json7
-rw-r--r--tests/specs/run/lock_v2_check_ok/print_hello.ts3
-rw-r--r--tests/specs/run/lock_v2_check_ok2/019_media_types.ts24
-rw-r--r--tests/specs/run/lock_v2_check_ok2/019_media_types.ts.out1
-rw-r--r--tests/specs/run/lock_v2_check_ok2/__test__.jsonc4
-rw-r--r--tests/specs/run/lock_v2_check_ok2/lock_v2_check_ok2.json13
-rw-r--r--tests/specs/run/long_data_url_formatting/__test__.jsonc5
-rw-r--r--tests/specs/run/long_data_url_formatting/long_data_url_formatting.ts3
-rw-r--r--tests/specs/run/long_data_url_formatting/long_data_url_formatting.ts.out8
-rw-r--r--tests/specs/run/main_module/__test__.jsonc4
-rw-r--r--tests/specs/run/main_module/main_module/main.out2
-rw-r--r--tests/specs/run/main_module/main_module/main.ts3
-rw-r--r--tests/specs/run/main_module/main_module/other.ts1
-rw-r--r--tests/specs/run/mts_dmts_mjs/__test__.jsonc4
-rw-r--r--tests/specs/run/mts_dmts_mjs/import.mts4
-rw-r--r--tests/specs/run/mts_dmts_mjs/mod.mjs1
-rw-r--r--tests/specs/run/mts_dmts_mjs/mts_dmts_mjs.out1
-rw-r--r--tests/specs/run/mts_dmts_mjs/types.d.mts1
-rw-r--r--tests/specs/run/mts_dmts_mjs_no_check/__test__.jsonc4
-rw-r--r--tests/specs/run/mts_dmts_mjs_no_check/import.mts4
-rw-r--r--tests/specs/run/mts_dmts_mjs_no_check/mod.mjs1
-rw-r--r--tests/specs/run/mts_dmts_mjs_no_check/mts_dmts_mjs.out1
-rw-r--r--tests/specs/run/mts_dmts_mjs_no_check/types.d.mts1
-rw-r--r--tests/specs/run/nested_error/__test__.jsonc5
-rw-r--r--tests/specs/run/nested_error/nested_error/main.ts3
-rw-r--r--tests/specs/run/nested_error/nested_error/main.ts.out4
-rw-r--r--tests/specs/run/no_check/006_url_imports.ts3
-rw-r--r--tests/specs/run/no_check/006_url_imports.ts.out2
-rw-r--r--tests/specs/run/no_check/__test__.jsonc4
-rw-r--r--tests/specs/run/no_check/mod2.ts1
-rw-r--r--tests/specs/run/no_check/print_hello.ts3
-rw-r--r--tests/specs/run/no_check_decorators/__test__.jsonc4
-rw-r--r--tests/specs/run/no_check_decorators/decorators/experimental/deno.json5
-rw-r--r--tests/specs/run/no_check_decorators/decorators/experimental/no_check/main.out3
-rw-r--r--tests/specs/run/no_check_decorators/decorators/experimental/no_check/main.ts21
-rw-r--r--tests/specs/run/no_check_decorators/decorators/experimental/runtime/main.out7
-rw-r--r--tests/specs/run/no_check_decorators/decorators/experimental/runtime/main.ts42
-rw-r--r--tests/specs/run/no_check_decorators/decorators/experimental/ts/main.out3
-rw-r--r--tests/specs/run/no_check_decorators/decorators/experimental/ts/main.ts14
-rw-r--r--tests/specs/run/no_check_decorators/decorators/tc39_proposal/main.out3
-rw-r--r--tests/specs/run/no_check_decorators/decorators/tc39_proposal/main.ts21
-rw-r--r--tests/specs/run/no_config_auto_discovery_for_local_script/__test__.jsonc5
-rw-r--r--tests/specs/run/no_config_auto_discovery_for_local_script/frontend_work.ts4
-rw-r--r--tests/specs/run/no_config_auto_discovery_for_local_script/no_auto_discovery.out4
-rw-r--r--tests/specs/run/no_lock_flag/__test__.jsonc5
-rw-r--r--tests/specs/run/no_lock_flag/no_lock_flag/deno.json3
-rw-r--r--tests/specs/run/no_lock_flag/no_lock_flag/deno.lock7
-rw-r--r--tests/specs/run/no_lock_flag/no_lock_flag/main.out2
-rw-r--r--tests/specs/run/no_lock_flag/no_lock_flag/main.ts1
-rw-r--r--tests/specs/run/no_prompt_flag/__test__.jsonc4
-rw-r--r--tests/specs/run/no_prompt_flag/no_prompt.ts10
-rw-r--r--tests/specs/run/node_env_var_allowlist/__test__.jsonc5
-rw-r--r--tests/specs/run/node_env_var_allowlist/node_env_var_allowlist.ts2
-rw-r--r--tests/specs/run/node_env_var_allowlist/node_env_var_allowlist.ts.out5
-rw-r--r--tests/specs/run/onload/__test__.jsonc4
-rw-r--r--tests/specs/run/onload/deno.json4
-rw-r--r--tests/specs/run/onload/onload/imported.ts12
-rw-r--r--tests/specs/run/onload/onload/main.out15
-rw-r--r--tests/specs/run/onload/onload/main.ts34
-rw-r--r--tests/specs/run/onload/onload/nest_imported.ts11
-rw-r--r--tests/specs/run/op_exit_op_set_exit_code_in_worker/__test__.jsonc5
-rw-r--r--tests/specs/run/op_exit_op_set_exit_code_in_worker/op_exit_op_set_exit_code_in_worker.ts13
-rw-r--r--tests/specs/run/op_exit_op_set_exit_code_in_worker/op_exit_op_set_exit_code_worker.js4
-rw-r--r--tests/specs/run/package_json_auto_discovered_for_local_script_arg_with_stop/__test__.jsonc5
-rw-r--r--tests/specs/run/package_json_auto_discovered_for_local_script_arg_with_stop/deno.json5
-rw-r--r--tests/specs/run/package_json_auto_discovered_for_local_script_arg_with_stop/main.out5
-rw-r--r--tests/specs/run/package_json_auto_discovered_for_local_script_arg_with_stop/main.ts6
-rw-r--r--tests/specs/run/permission_args/001_hello.js1
-rw-r--r--tests/specs/run/permission_args/__test__.jsonc4
-rw-r--r--tests/specs/run/permission_args/permission_args.out4
-rw-r--r--tests/specs/run/permission_args_quiet/001_hello.js1
-rw-r--r--tests/specs/run/permission_args_quiet/001_hello.js.out1
-rw-r--r--tests/specs/run/permission_args_quiet/__test__.jsonc4
-rw-r--r--tests/specs/run/private_field_presence/__test__.jsonc4
-rw-r--r--tests/specs/run/private_field_presence/private_field_presence.ts20
-rw-r--r--tests/specs/run/private_field_presence/private_field_presence.ts.out2
-rw-r--r--tests/specs/run/private_field_presence_no_check/__test__.jsonc4
-rw-r--r--tests/specs/run/private_field_presence_no_check/private_field_presence.ts20
-rw-r--r--tests/specs/run/private_field_presence_no_check/private_field_presence.ts.out2
-rw-r--r--tests/specs/run/proto_exploit/__test__.jsonc4
-rw-r--r--tests/specs/run/proto_exploit/proto_exploit.js5
-rw-r--r--tests/specs/run/proto_exploit/proto_exploit.js.out2
-rw-r--r--tests/specs/run/queue_microtask_error/__test__.jsonc5
-rw-r--r--tests/specs/run/queue_microtask_error/queue_microtask_error.ts5
-rw-r--r--tests/specs/run/queue_microtask_error/queue_microtask_error.ts.out6
-rw-r--r--tests/specs/run/queue_microtask_error_handled/__test__.jsonc4
-rw-r--r--tests/specs/run/queue_microtask_error_handled/queue_microtask_error_handled.ts21
-rw-r--r--tests/specs/run/queue_microtask_error_handled/queue_microtask_error_handled.ts.out15
-rw-r--r--tests/specs/run/reference_types/__test__.jsonc4
-rw-r--r--tests/specs/run/reference_types/reference_types.ts3
-rw-r--r--tests/specs/run/reference_types/reference_types.ts.out1
-rw-r--r--tests/specs/run/reference_types_error/__test__.jsonc5
-rw-r--r--tests/specs/run/reference_types_error/checkjs.tsconfig.json5
-rw-r--r--tests/specs/run/reference_types_error/reference_types_error.js2
-rw-r--r--tests/specs/run/reference_types_error/reference_types_error.js.out2
-rw-r--r--tests/specs/run/reference_types_error_no_check/__test__.jsonc4
-rw-r--r--tests/specs/run/reference_types_error_no_check/reference_types_error.js2
-rw-r--r--tests/specs/run/reference_types_error_vendor_dir/__test__.jsonc5
-rw-r--r--tests/specs/run/reference_types_error_vendor_dir/checkjs.tsconfig.json5
-rw-r--r--tests/specs/run/reference_types_error_vendor_dir/reference_types_error.js2
-rw-r--r--tests/specs/run/reference_types_error_vendor_dir/reference_types_error.js.out2
-rw-r--r--tests/specs/run/references_types_remote/__test__.jsonc4
-rw-r--r--tests/specs/run/references_types_remote/reference_types_remote.ts3
-rw-r--r--tests/specs/run/references_types_remote/reference_types_remote.ts.out1
-rw-r--r--tests/specs/run/rejection_handled/__test__.jsonc4
-rw-r--r--tests/specs/run/rejection_handled/rejection_handled.out5
-rw-r--r--tests/specs/run/rejection_handled/rejection_handled.ts17
-rw-r--r--tests/specs/run/replace_self/__test__.jsonc4
-rw-r--r--tests/specs/run/replace_self/replace_self.js21
-rw-r--r--tests/specs/run/replace_self/replace_self.js.out4
-rw-r--r--tests/specs/run/report_error/__test__.jsonc5
-rw-r--r--tests/specs/run/report_error/report_error.ts3
-rw-r--r--tests/specs/run/report_error/report_error.ts.out5
-rw-r--r--tests/specs/run/report_error_end_of_program/__test__.jsonc5
-rw-r--r--tests/specs/run/report_error_end_of_program/report_error_end_of_program.ts1
-rw-r--r--tests/specs/run/report_error_end_of_program/report_error_end_of_program.ts.out4
-rw-r--r--tests/specs/run/report_error_handled/__test__.jsonc4
-rw-r--r--tests/specs/run/report_error_handled/report_error_handled.ts19
-rw-r--r--tests/specs/run/report_error_handled/report_error_handled.ts.out13
-rw-r--r--tests/specs/run/runtime_decorators/__test__.jsonc4
-rw-r--r--tests/specs/run/runtime_decorators/decorators/experimental/deno.json5
-rw-r--r--tests/specs/run/runtime_decorators/decorators/experimental/no_check/main.out3
-rw-r--r--tests/specs/run/runtime_decorators/decorators/experimental/no_check/main.ts21
-rw-r--r--tests/specs/run/runtime_decorators/decorators/experimental/runtime/main.out7
-rw-r--r--tests/specs/run/runtime_decorators/decorators/experimental/runtime/main.ts42
-rw-r--r--tests/specs/run/runtime_decorators/decorators/experimental/ts/main.out3
-rw-r--r--tests/specs/run/runtime_decorators/decorators/experimental/ts/main.ts14
-rw-r--r--tests/specs/run/runtime_decorators/decorators/tc39_proposal/main.out3
-rw-r--r--tests/specs/run/runtime_decorators/decorators/tc39_proposal/main.ts21
-rw-r--r--tests/specs/run/seed_random/__test__.jsonc4
-rw-r--r--tests/specs/run/seed_random/seed_random.js11
-rw-r--r--tests/specs/run/seed_random/seed_random.js.out22
-rw-r--r--tests/specs/run/set_exit_code_0/__test__.jsonc5
-rw-r--r--tests/specs/run/set_exit_code_0/set_exit_code_0.ts2
-rw-r--r--tests/specs/run/set_exit_code_1/__test__.jsonc5
-rw-r--r--tests/specs/run/set_exit_code_1/set_exit_code_1.ts2
-rw-r--r--tests/specs/run/set_exit_code_2/__test__.jsonc5
-rw-r--r--tests/specs/run/set_exit_code_2/set_exit_code_2.ts2
-rw-r--r--tests/specs/run/set_timeout_error/__test__.jsonc5
-rw-r--r--tests/specs/run/set_timeout_error/set_timeout_error.ts3
-rw-r--r--tests/specs/run/set_timeout_error/set_timeout_error.ts.out5
-rw-r--r--tests/specs/run/set_timeout_error_handled/__test__.jsonc4
-rw-r--r--tests/specs/run/set_timeout_error_handled/set_timeout_error_handled.ts19
-rw-r--r--tests/specs/run/set_timeout_error_handled/set_timeout_error_handled.ts.out13
-rw-r--r--tests/specs/run/shebang_swc/__test__.jsonc4
-rw-r--r--tests/specs/run/shebang_swc/shebang.ts5
-rw-r--r--tests/specs/run/shebang_swc/shebang.ts.out1
-rw-r--r--tests/specs/run/shebang_swc/shebang2.ts3
-rw-r--r--tests/specs/run/shebang_tsc/__test__.jsonc4
-rw-r--r--tests/specs/run/shebang_tsc/shebang.ts5
-rw-r--r--tests/specs/run/shebang_tsc/shebang.ts.out1
-rw-r--r--tests/specs/run/shebang_tsc/shebang2.ts3
-rw-r--r--tests/specs/run/shebang_with_json_imports_swc/__test__.jsonc5
-rw-r--r--tests/specs/run/shebang_with_json_imports_swc/json_with_shebang.json4
-rw-r--r--tests/specs/run/shebang_with_json_imports_swc/json_with_shebang.ts3
-rw-r--r--tests/specs/run/shebang_with_json_imports_swc/json_with_shebang.ts.out1
-rw-r--r--tests/specs/run/shebang_with_json_imports_tsc/__test__.jsonc5
-rw-r--r--tests/specs/run/shebang_with_json_imports_tsc/json_with_shebang.json4
-rw-r--r--tests/specs/run/shebang_with_json_imports_tsc/json_with_shebang.ts3
-rw-r--r--tests/specs/run/shebang_with_json_imports_tsc/json_with_shebang.ts.out1
-rw-r--r--tests/specs/run/single_compile_with_reload/__test__.jsonc4
-rw-r--r--tests/specs/run/single_compile_with_reload/mod1.ts17
-rw-r--r--tests/specs/run/single_compile_with_reload/print_hello.ts3
-rw-r--r--tests/specs/run/single_compile_with_reload/single_compile_with_reload.ts18
-rw-r--r--tests/specs/run/single_compile_with_reload/single_compile_with_reload.ts.out7
-rw-r--r--tests/specs/run/single_compile_with_reload/single_compile_with_reload_dyn.ts11
-rw-r--r--tests/specs/run/single_compile_with_reload/single_compile_with_reload_worker.ts3
-rw-r--r--tests/specs/run/single_compile_with_reload/subdir2/dynamic_import.ts4
-rw-r--r--tests/specs/run/single_compile_with_reload/subdir2/mod2.ts9
-rw-r--r--tests/specs/run/spawn_stdout_inherit/__test__.jsonc4
-rw-r--r--tests/specs/run/spawn_stdout_inherit/spawn_stdout_inherit.ts8
-rw-r--r--tests/specs/run/spawn_stdout_inherit/spawn_stdout_inherit.ts.out2
-rw-r--r--tests/specs/run/stdin_read_all/__test__.jsonc5
-rw-r--r--tests/specs/run/stdin_read_all/stdin_read_all.out1
-rw-r--r--tests/specs/run/stdin_read_all/stdin_read_all.ts17
-rw-r--r--tests/specs/run/stdout_write_all/__test__.jsonc4
-rw-r--r--tests/specs/run/stdout_write_all/stdout_write_all.out100
-rw-r--r--tests/specs/run/stdout_write_all/stdout_write_all.ts13
-rw-r--r--tests/specs/run/stdout_write_sync_async/__test__.jsonc4
-rw-r--r--tests/specs/run/stdout_write_sync_async/stdout_write_sync_async.out200
-rw-r--r--tests/specs/run/stdout_write_sync_async/stdout_write_sync_async.ts14
-rw-r--r--tests/specs/run/swc_syntax_error/__test__.jsonc5
-rw-r--r--tests/specs/run/swc_syntax_error/swc_syntax_error.ts4
-rw-r--r--tests/specs/run/swc_syntax_error/swc_syntax_error.ts.out4
-rw-r--r--tests/specs/run/test_and_bench_are_noops_in_run/__test__.jsonc4
-rw-r--r--tests/specs/run/test_and_bench_are_noops_in_run/test_and_bench_in_run.js5
-rw-r--r--tests/specs/run/tls_connecttls/RootCA.pem19
-rw-r--r--tests/specs/run/tls_connecttls/__test__.jsonc4
-rw-r--r--tests/specs/run/tls_connecttls/deno.json4
-rw-r--r--tests/specs/run/tls_connecttls/localhost.crt21
-rw-r--r--tests/specs/run/tls_connecttls/localhost.key28
-rw-r--r--tests/specs/run/tls_connecttls/textproto.ts170
-rw-r--r--tests/specs/run/tls_connecttls/tls.out1
-rw-r--r--tests/specs/run/tls_connecttls/tls_connecttls.js65
-rw-r--r--tests/specs/run/tls_starttls/RootCA.pem19
-rw-r--r--tests/specs/run/tls_starttls/__test__.jsonc4
-rw-r--r--tests/specs/run/tls_starttls/deno.json4
-rw-r--r--tests/specs/run/tls_starttls/localhost.crt21
-rw-r--r--tests/specs/run/tls_starttls/localhost.key28
-rw-r--r--tests/specs/run/tls_starttls/textproto.ts170
-rw-r--r--tests/specs/run/tls_starttls/tls.out1
-rw-r--r--tests/specs/run/tls_starttls/tls_starttls.js64
-rw-r--r--tests/specs/run/top_level_await/__test__.jsonc4
-rw-r--r--tests/specs/run/top_level_await/hello.txt1
-rw-r--r--tests/specs/run/top_level_await/top_level_await/circular.js8
-rw-r--r--tests/specs/run/top_level_await/top_level_await/circular.out10
-rw-r--r--tests/specs/run/top_level_await/top_level_await/loop.js20
-rw-r--r--tests/specs/run/top_level_await/top_level_await/loop.out5
-rw-r--r--tests/specs/run/top_level_await/top_level_await/nested.out5
-rw-r--r--tests/specs/run/top_level_await/top_level_await/nested/a.js3
-rw-r--r--tests/specs/run/top_level_await/top_level_await/nested/b.js1
-rw-r--r--tests/specs/run/top_level_await/top_level_await/nested/main.js3
-rw-r--r--tests/specs/run/top_level_await/top_level_await/order.js21
-rw-r--r--tests/specs/run/top_level_await/top_level_await/order.out2
-rw-r--r--tests/specs/run/top_level_await/top_level_await/tla/a.js3
-rw-r--r--tests/specs/run/top_level_await/top_level_await/tla/b.js7
-rw-r--r--tests/specs/run/top_level_await/top_level_await/tla/c.js3
-rw-r--r--tests/specs/run/top_level_await/top_level_await/tla/d.js8
-rw-r--r--tests/specs/run/top_level_await/top_level_await/tla/order.js1
-rw-r--r--tests/specs/run/top_level_await/top_level_await/tla/parent.js9
-rw-r--r--tests/specs/run/top_level_await/top_level_await/tla2/a.js5
-rw-r--r--tests/specs/run/top_level_await/top_level_await/tla2/b.js5
-rw-r--r--tests/specs/run/top_level_await/top_level_await/tla3/b.js7
-rw-r--r--tests/specs/run/top_level_await/top_level_await/tla3/timeout_loop.js23
-rw-r--r--tests/specs/run/top_level_await/top_level_await/top_level_await.js3
-rw-r--r--tests/specs/run/top_level_await/top_level_await/top_level_await.out3
-rw-r--r--tests/specs/run/top_level_await/top_level_await/top_level_await.ts3
-rw-r--r--tests/specs/run/top_level_await/top_level_await/top_level_for_await.js10
-rw-r--r--tests/specs/run/top_level_await/top_level_await/top_level_for_await.out3
-rw-r--r--tests/specs/run/top_level_await/top_level_await/top_level_for_await.ts10
-rw-r--r--tests/specs/run/top_level_await/top_level_await/unresolved.js1
-rw-r--r--tests/specs/run/top_level_await/top_level_await/unresolved.out4
-rw-r--r--tests/specs/run/top_level_await_circular/__test__.jsonc5
-rw-r--r--tests/specs/run/top_level_await_circular/top_level_await/circular.js8
-rw-r--r--tests/specs/run/top_level_await_circular/top_level_await/circular.out10
-rw-r--r--tests/specs/run/top_level_await_circular/top_level_await/loop.js20
-rw-r--r--tests/specs/run/top_level_await_circular/top_level_await/loop.out5
-rw-r--r--tests/specs/run/top_level_await_circular/top_level_await/nested.out5
-rw-r--r--tests/specs/run/top_level_await_circular/top_level_await/nested/a.js3
-rw-r--r--tests/specs/run/top_level_await_circular/top_level_await/nested/b.js1
-rw-r--r--tests/specs/run/top_level_await_circular/top_level_await/nested/main.js3
-rw-r--r--tests/specs/run/top_level_await_circular/top_level_await/order.js21
-rw-r--r--tests/specs/run/top_level_await_circular/top_level_await/order.out2
-rw-r--r--tests/specs/run/top_level_await_circular/top_level_await/tla/a.js3
-rw-r--r--tests/specs/run/top_level_await_circular/top_level_await/tla/b.js7
-rw-r--r--tests/specs/run/top_level_await_circular/top_level_await/tla/c.js3
-rw-r--r--tests/specs/run/top_level_await_circular/top_level_await/tla/d.js8
-rw-r--r--tests/specs/run/top_level_await_circular/top_level_await/tla/order.js1
-rw-r--r--tests/specs/run/top_level_await_circular/top_level_await/tla/parent.js9
-rw-r--r--tests/specs/run/top_level_await_circular/top_level_await/tla2/a.js5
-rw-r--r--tests/specs/run/top_level_await_circular/top_level_await/tla2/b.js5
-rw-r--r--tests/specs/run/top_level_await_circular/top_level_await/tla3/b.js7
-rw-r--r--tests/specs/run/top_level_await_circular/top_level_await/tla3/timeout_loop.js23
-rw-r--r--tests/specs/run/top_level_await_circular/top_level_await/top_level_await.js3
-rw-r--r--tests/specs/run/top_level_await_circular/top_level_await/top_level_await.out3
-rw-r--r--tests/specs/run/top_level_await_circular/top_level_await/top_level_await.ts3
-rw-r--r--tests/specs/run/top_level_await_circular/top_level_await/top_level_for_await.js10
-rw-r--r--tests/specs/run/top_level_await_circular/top_level_await/top_level_for_await.out3
-rw-r--r--tests/specs/run/top_level_await_circular/top_level_await/top_level_for_await.ts10
-rw-r--r--tests/specs/run/top_level_await_circular/top_level_await/unresolved.js1
-rw-r--r--tests/specs/run/top_level_await_circular/top_level_await/unresolved.out4
-rw-r--r--tests/specs/run/top_level_await_loop/__test__.jsonc4
-rw-r--r--tests/specs/run/top_level_await_loop/top_level_await/circular.js8
-rw-r--r--tests/specs/run/top_level_await_loop/top_level_await/circular.out10
-rw-r--r--tests/specs/run/top_level_await_loop/top_level_await/loop.js20
-rw-r--r--tests/specs/run/top_level_await_loop/top_level_await/loop.out5
-rw-r--r--tests/specs/run/top_level_await_loop/top_level_await/nested.out5
-rw-r--r--tests/specs/run/top_level_await_loop/top_level_await/nested/a.js3
-rw-r--r--tests/specs/run/top_level_await_loop/top_level_await/nested/b.js1
-rw-r--r--tests/specs/run/top_level_await_loop/top_level_await/nested/main.js3
-rw-r--r--tests/specs/run/top_level_await_loop/top_level_await/order.js21
-rw-r--r--tests/specs/run/top_level_await_loop/top_level_await/order.out2
-rw-r--r--tests/specs/run/top_level_await_loop/top_level_await/tla/a.js3
-rw-r--r--tests/specs/run/top_level_await_loop/top_level_await/tla/b.js7
-rw-r--r--tests/specs/run/top_level_await_loop/top_level_await/tla/c.js3
-rw-r--r--tests/specs/run/top_level_await_loop/top_level_await/tla/d.js8
-rw-r--r--tests/specs/run/top_level_await_loop/top_level_await/tla/order.js1
-rw-r--r--tests/specs/run/top_level_await_loop/top_level_await/tla/parent.js9
-rw-r--r--tests/specs/run/top_level_await_loop/top_level_await/tla2/a.js5
-rw-r--r--tests/specs/run/top_level_await_loop/top_level_await/tla2/b.js5
-rw-r--r--tests/specs/run/top_level_await_loop/top_level_await/tla3/b.js7
-rw-r--r--tests/specs/run/top_level_await_loop/top_level_await/tla3/timeout_loop.js23
-rw-r--r--tests/specs/run/top_level_await_loop/top_level_await/top_level_await.js3
-rw-r--r--tests/specs/run/top_level_await_loop/top_level_await/top_level_await.out3
-rw-r--r--tests/specs/run/top_level_await_loop/top_level_await/top_level_await.ts3
-rw-r--r--tests/specs/run/top_level_await_loop/top_level_await/top_level_for_await.js10
-rw-r--r--tests/specs/run/top_level_await_loop/top_level_await/top_level_for_await.out3
-rw-r--r--tests/specs/run/top_level_await_loop/top_level_await/top_level_for_await.ts10
-rw-r--r--tests/specs/run/top_level_await_loop/top_level_await/unresolved.js1
-rw-r--r--tests/specs/run/top_level_await_loop/top_level_await/unresolved.out4
-rw-r--r--tests/specs/run/top_level_await_nested/__test__.jsonc4
-rw-r--r--tests/specs/run/top_level_await_nested/top_level_await/circular.js8
-rw-r--r--tests/specs/run/top_level_await_nested/top_level_await/circular.out10
-rw-r--r--tests/specs/run/top_level_await_nested/top_level_await/loop.js20
-rw-r--r--tests/specs/run/top_level_await_nested/top_level_await/loop.out5
-rw-r--r--tests/specs/run/top_level_await_nested/top_level_await/nested.out5
-rw-r--r--tests/specs/run/top_level_await_nested/top_level_await/nested/a.js3
-rw-r--r--tests/specs/run/top_level_await_nested/top_level_await/nested/b.js1
-rw-r--r--tests/specs/run/top_level_await_nested/top_level_await/nested/main.js3
-rw-r--r--tests/specs/run/top_level_await_nested/top_level_await/order.js21
-rw-r--r--tests/specs/run/top_level_await_nested/top_level_await/order.out2
-rw-r--r--tests/specs/run/top_level_await_nested/top_level_await/tla/a.js3
-rw-r--r--tests/specs/run/top_level_await_nested/top_level_await/tla/b.js7
-rw-r--r--tests/specs/run/top_level_await_nested/top_level_await/tla/c.js3
-rw-r--r--tests/specs/run/top_level_await_nested/top_level_await/tla/d.js8
-rw-r--r--tests/specs/run/top_level_await_nested/top_level_await/tla/order.js1
-rw-r--r--tests/specs/run/top_level_await_nested/top_level_await/tla/parent.js9
-rw-r--r--tests/specs/run/top_level_await_nested/top_level_await/tla2/a.js5
-rw-r--r--tests/specs/run/top_level_await_nested/top_level_await/tla2/b.js5
-rw-r--r--tests/specs/run/top_level_await_nested/top_level_await/tla3/b.js7
-rw-r--r--tests/specs/run/top_level_await_nested/top_level_await/tla3/timeout_loop.js23
-rw-r--r--tests/specs/run/top_level_await_nested/top_level_await/top_level_await.js3
-rw-r--r--tests/specs/run/top_level_await_nested/top_level_await/top_level_await.out3
-rw-r--r--tests/specs/run/top_level_await_nested/top_level_await/top_level_await.ts3
-rw-r--r--tests/specs/run/top_level_await_nested/top_level_await/top_level_for_await.js10
-rw-r--r--tests/specs/run/top_level_await_nested/top_level_await/top_level_for_await.out3
-rw-r--r--tests/specs/run/top_level_await_nested/top_level_await/top_level_for_await.ts10
-rw-r--r--tests/specs/run/top_level_await_nested/top_level_await/unresolved.js1
-rw-r--r--tests/specs/run/top_level_await_nested/top_level_await/unresolved.out4
-rw-r--r--tests/specs/run/top_level_await_order/__test__.jsonc4
-rw-r--r--tests/specs/run/top_level_await_order/top_level_await/circular.js8
-rw-r--r--tests/specs/run/top_level_await_order/top_level_await/circular.out10
-rw-r--r--tests/specs/run/top_level_await_order/top_level_await/loop.js20
-rw-r--r--tests/specs/run/top_level_await_order/top_level_await/loop.out5
-rw-r--r--tests/specs/run/top_level_await_order/top_level_await/nested.out5
-rw-r--r--tests/specs/run/top_level_await_order/top_level_await/nested/a.js3
-rw-r--r--tests/specs/run/top_level_await_order/top_level_await/nested/b.js1
-rw-r--r--tests/specs/run/top_level_await_order/top_level_await/nested/main.js3
-rw-r--r--tests/specs/run/top_level_await_order/top_level_await/order.js21
-rw-r--r--tests/specs/run/top_level_await_order/top_level_await/order.out2
-rw-r--r--tests/specs/run/top_level_await_order/top_level_await/tla/a.js3
-rw-r--r--tests/specs/run/top_level_await_order/top_level_await/tla/b.js7
-rw-r--r--tests/specs/run/top_level_await_order/top_level_await/tla/c.js3
-rw-r--r--tests/specs/run/top_level_await_order/top_level_await/tla/d.js8
-rw-r--r--tests/specs/run/top_level_await_order/top_level_await/tla/order.js1
-rw-r--r--tests/specs/run/top_level_await_order/top_level_await/tla/parent.js9
-rw-r--r--tests/specs/run/top_level_await_order/top_level_await/tla2/a.js5
-rw-r--r--tests/specs/run/top_level_await_order/top_level_await/tla2/b.js5
-rw-r--r--tests/specs/run/top_level_await_order/top_level_await/tla3/b.js7
-rw-r--r--tests/specs/run/top_level_await_order/top_level_await/tla3/timeout_loop.js23
-rw-r--r--tests/specs/run/top_level_await_order/top_level_await/top_level_await.js3
-rw-r--r--tests/specs/run/top_level_await_order/top_level_await/top_level_await.out3
-rw-r--r--tests/specs/run/top_level_await_order/top_level_await/top_level_await.ts3
-rw-r--r--tests/specs/run/top_level_await_order/top_level_await/top_level_for_await.js10
-rw-r--r--tests/specs/run/top_level_await_order/top_level_await/top_level_for_await.out3
-rw-r--r--tests/specs/run/top_level_await_order/top_level_await/top_level_for_await.ts10
-rw-r--r--tests/specs/run/top_level_await_order/top_level_await/unresolved.js1
-rw-r--r--tests/specs/run/top_level_await_order/top_level_await/unresolved.out4
-rw-r--r--tests/specs/run/top_level_await_ts/__test__.jsonc4
-rw-r--r--tests/specs/run/top_level_await_ts/hello.txt1
-rw-r--r--tests/specs/run/top_level_await_ts/top_level_await/circular.js8
-rw-r--r--tests/specs/run/top_level_await_ts/top_level_await/circular.out10
-rw-r--r--tests/specs/run/top_level_await_ts/top_level_await/loop.js20
-rw-r--r--tests/specs/run/top_level_await_ts/top_level_await/loop.out5
-rw-r--r--tests/specs/run/top_level_await_ts/top_level_await/nested.out5
-rw-r--r--tests/specs/run/top_level_await_ts/top_level_await/nested/a.js3
-rw-r--r--tests/specs/run/top_level_await_ts/top_level_await/nested/b.js1
-rw-r--r--tests/specs/run/top_level_await_ts/top_level_await/nested/main.js3
-rw-r--r--tests/specs/run/top_level_await_ts/top_level_await/order.js21
-rw-r--r--tests/specs/run/top_level_await_ts/top_level_await/order.out2
-rw-r--r--tests/specs/run/top_level_await_ts/top_level_await/tla/a.js3
-rw-r--r--tests/specs/run/top_level_await_ts/top_level_await/tla/b.js7
-rw-r--r--tests/specs/run/top_level_await_ts/top_level_await/tla/c.js3
-rw-r--r--tests/specs/run/top_level_await_ts/top_level_await/tla/d.js8
-rw-r--r--tests/specs/run/top_level_await_ts/top_level_await/tla/order.js1
-rw-r--r--tests/specs/run/top_level_await_ts/top_level_await/tla/parent.js9
-rw-r--r--tests/specs/run/top_level_await_ts/top_level_await/tla2/a.js5
-rw-r--r--tests/specs/run/top_level_await_ts/top_level_await/tla2/b.js5
-rw-r--r--tests/specs/run/top_level_await_ts/top_level_await/tla3/b.js7
-rw-r--r--tests/specs/run/top_level_await_ts/top_level_await/tla3/timeout_loop.js23
-rw-r--r--tests/specs/run/top_level_await_ts/top_level_await/top_level_await.js3
-rw-r--r--tests/specs/run/top_level_await_ts/top_level_await/top_level_await.out3
-rw-r--r--tests/specs/run/top_level_await_ts/top_level_await/top_level_await.ts3
-rw-r--r--tests/specs/run/top_level_await_ts/top_level_await/top_level_for_await.js10
-rw-r--r--tests/specs/run/top_level_await_ts/top_level_await/top_level_for_await.out3
-rw-r--r--tests/specs/run/top_level_await_ts/top_level_await/top_level_for_await.ts10
-rw-r--r--tests/specs/run/top_level_await_ts/top_level_await/unresolved.js1
-rw-r--r--tests/specs/run/top_level_await_ts/top_level_await/unresolved.out4
-rw-r--r--tests/specs/run/top_level_await_unresolved/__test__.jsonc5
-rw-r--r--tests/specs/run/top_level_await_unresolved/top_level_await/circular.js8
-rw-r--r--tests/specs/run/top_level_await_unresolved/top_level_await/circular.out10
-rw-r--r--tests/specs/run/top_level_await_unresolved/top_level_await/loop.js20
-rw-r--r--tests/specs/run/top_level_await_unresolved/top_level_await/loop.out5
-rw-r--r--tests/specs/run/top_level_await_unresolved/top_level_await/nested.out5
-rw-r--r--tests/specs/run/top_level_await_unresolved/top_level_await/nested/a.js3
-rw-r--r--tests/specs/run/top_level_await_unresolved/top_level_await/nested/b.js1
-rw-r--r--tests/specs/run/top_level_await_unresolved/top_level_await/nested/main.js3
-rw-r--r--tests/specs/run/top_level_await_unresolved/top_level_await/order.js21
-rw-r--r--tests/specs/run/top_level_await_unresolved/top_level_await/order.out2
-rw-r--r--tests/specs/run/top_level_await_unresolved/top_level_await/tla/a.js3
-rw-r--r--tests/specs/run/top_level_await_unresolved/top_level_await/tla/b.js7
-rw-r--r--tests/specs/run/top_level_await_unresolved/top_level_await/tla/c.js3
-rw-r--r--tests/specs/run/top_level_await_unresolved/top_level_await/tla/d.js8
-rw-r--r--tests/specs/run/top_level_await_unresolved/top_level_await/tla/order.js1
-rw-r--r--tests/specs/run/top_level_await_unresolved/top_level_await/tla/parent.js9
-rw-r--r--tests/specs/run/top_level_await_unresolved/top_level_await/tla2/a.js5
-rw-r--r--tests/specs/run/top_level_await_unresolved/top_level_await/tla2/b.js5
-rw-r--r--tests/specs/run/top_level_await_unresolved/top_level_await/tla3/b.js7
-rw-r--r--tests/specs/run/top_level_await_unresolved/top_level_await/tla3/timeout_loop.js23
-rw-r--r--tests/specs/run/top_level_await_unresolved/top_level_await/top_level_await.js3
-rw-r--r--tests/specs/run/top_level_await_unresolved/top_level_await/top_level_await.out3
-rw-r--r--tests/specs/run/top_level_await_unresolved/top_level_await/top_level_await.ts3
-rw-r--r--tests/specs/run/top_level_await_unresolved/top_level_await/top_level_for_await.js10
-rw-r--r--tests/specs/run/top_level_await_unresolved/top_level_await/top_level_for_await.out3
-rw-r--r--tests/specs/run/top_level_await_unresolved/top_level_await/top_level_for_await.ts10
-rw-r--r--tests/specs/run/top_level_await_unresolved/top_level_await/unresolved.js1
-rw-r--r--tests/specs/run/top_level_await_unresolved/top_level_await/unresolved.out4
-rw-r--r--tests/specs/run/top_level_for_await/__test__.jsonc4
-rw-r--r--tests/specs/run/top_level_for_await/top_level_await/circular.js8
-rw-r--r--tests/specs/run/top_level_for_await/top_level_await/circular.out10
-rw-r--r--tests/specs/run/top_level_for_await/top_level_await/loop.js20
-rw-r--r--tests/specs/run/top_level_for_await/top_level_await/loop.out5
-rw-r--r--tests/specs/run/top_level_for_await/top_level_await/nested.out5
-rw-r--r--tests/specs/run/top_level_for_await/top_level_await/nested/a.js3
-rw-r--r--tests/specs/run/top_level_for_await/top_level_await/nested/b.js1
-rw-r--r--tests/specs/run/top_level_for_await/top_level_await/nested/main.js3
-rw-r--r--tests/specs/run/top_level_for_await/top_level_await/order.js21
-rw-r--r--tests/specs/run/top_level_for_await/top_level_await/order.out2
-rw-r--r--tests/specs/run/top_level_for_await/top_level_await/tla/a.js3
-rw-r--r--tests/specs/run/top_level_for_await/top_level_await/tla/b.js7
-rw-r--r--tests/specs/run/top_level_for_await/top_level_await/tla/c.js3
-rw-r--r--tests/specs/run/top_level_for_await/top_level_await/tla/d.js8
-rw-r--r--tests/specs/run/top_level_for_await/top_level_await/tla/order.js1
-rw-r--r--tests/specs/run/top_level_for_await/top_level_await/tla/parent.js9
-rw-r--r--tests/specs/run/top_level_for_await/top_level_await/tla2/a.js5
-rw-r--r--tests/specs/run/top_level_for_await/top_level_await/tla2/b.js5
-rw-r--r--tests/specs/run/top_level_for_await/top_level_await/tla3/b.js7
-rw-r--r--tests/specs/run/top_level_for_await/top_level_await/tla3/timeout_loop.js23
-rw-r--r--tests/specs/run/top_level_for_await/top_level_await/top_level_await.js3
-rw-r--r--tests/specs/run/top_level_for_await/top_level_await/top_level_await.out3
-rw-r--r--tests/specs/run/top_level_for_await/top_level_await/top_level_await.ts3
-rw-r--r--tests/specs/run/top_level_for_await/top_level_await/top_level_for_await.js10
-rw-r--r--tests/specs/run/top_level_for_await/top_level_await/top_level_for_await.out3
-rw-r--r--tests/specs/run/top_level_for_await/top_level_await/top_level_for_await.ts10
-rw-r--r--tests/specs/run/top_level_for_await/top_level_await/unresolved.js1
-rw-r--r--tests/specs/run/top_level_for_await/top_level_await/unresolved.out4
-rw-r--r--tests/specs/run/top_level_for_await_ts/__test__.jsonc4
-rw-r--r--tests/specs/run/top_level_for_await_ts/top_level_await/circular.js8
-rw-r--r--tests/specs/run/top_level_for_await_ts/top_level_await/circular.out10
-rw-r--r--tests/specs/run/top_level_for_await_ts/top_level_await/loop.js20
-rw-r--r--tests/specs/run/top_level_for_await_ts/top_level_await/loop.out5
-rw-r--r--tests/specs/run/top_level_for_await_ts/top_level_await/nested.out5
-rw-r--r--tests/specs/run/top_level_for_await_ts/top_level_await/nested/a.js3
-rw-r--r--tests/specs/run/top_level_for_await_ts/top_level_await/nested/b.js1
-rw-r--r--tests/specs/run/top_level_for_await_ts/top_level_await/nested/main.js3
-rw-r--r--tests/specs/run/top_level_for_await_ts/top_level_await/order.js21
-rw-r--r--tests/specs/run/top_level_for_await_ts/top_level_await/order.out2
-rw-r--r--tests/specs/run/top_level_for_await_ts/top_level_await/tla/a.js3
-rw-r--r--tests/specs/run/top_level_for_await_ts/top_level_await/tla/b.js7
-rw-r--r--tests/specs/run/top_level_for_await_ts/top_level_await/tla/c.js3
-rw-r--r--tests/specs/run/top_level_for_await_ts/top_level_await/tla/d.js8
-rw-r--r--tests/specs/run/top_level_for_await_ts/top_level_await/tla/order.js1
-rw-r--r--tests/specs/run/top_level_for_await_ts/top_level_await/tla/parent.js9
-rw-r--r--tests/specs/run/top_level_for_await_ts/top_level_await/tla2/a.js5
-rw-r--r--tests/specs/run/top_level_for_await_ts/top_level_await/tla2/b.js5
-rw-r--r--tests/specs/run/top_level_for_await_ts/top_level_await/tla3/b.js7
-rw-r--r--tests/specs/run/top_level_for_await_ts/top_level_await/tla3/timeout_loop.js23
-rw-r--r--tests/specs/run/top_level_for_await_ts/top_level_await/top_level_await.js3
-rw-r--r--tests/specs/run/top_level_for_await_ts/top_level_await/top_level_await.out3
-rw-r--r--tests/specs/run/top_level_for_await_ts/top_level_await/top_level_await.ts3
-rw-r--r--tests/specs/run/top_level_for_await_ts/top_level_await/top_level_for_await.js10
-rw-r--r--tests/specs/run/top_level_for_await_ts/top_level_await/top_level_for_await.out3
-rw-r--r--tests/specs/run/top_level_for_await_ts/top_level_await/top_level_for_await.ts10
-rw-r--r--tests/specs/run/top_level_for_await_ts/top_level_await/unresolved.js1
-rw-r--r--tests/specs/run/top_level_for_await_ts/top_level_await/unresolved.out4
-rw-r--r--tests/specs/run/ts_decorators/__test__.jsonc4
-rw-r--r--tests/specs/run/ts_decorators/decorators/experimental/deno.json5
-rw-r--r--tests/specs/run/ts_decorators/decorators/experimental/no_check/main.out3
-rw-r--r--tests/specs/run/ts_decorators/decorators/experimental/no_check/main.ts21
-rw-r--r--tests/specs/run/ts_decorators/decorators/experimental/runtime/main.out7
-rw-r--r--tests/specs/run/ts_decorators/decorators/experimental/runtime/main.ts42
-rw-r--r--tests/specs/run/ts_decorators/decorators/experimental/ts/main.out3
-rw-r--r--tests/specs/run/ts_decorators/decorators/experimental/ts/main.ts14
-rw-r--r--tests/specs/run/ts_decorators/decorators/tc39_proposal/main.out3
-rw-r--r--tests/specs/run/ts_decorators/decorators/tc39_proposal/main.ts21
-rw-r--r--tests/specs/run/ts_import_from_js/005_more_imports.ts11
-rw-r--r--tests/specs/run/ts_import_from_js/__test__.jsonc4
-rw-r--r--tests/specs/run/ts_import_from_js/mod1.ts17
-rw-r--r--tests/specs/run/ts_import_from_js/mod2.ts1
-rw-r--r--tests/specs/run/ts_import_from_js/print_hello.ts3
-rw-r--r--tests/specs/run/ts_import_from_js/subdir2/dynamic_import.ts4
-rw-r--r--tests/specs/run/ts_import_from_js/subdir2/mod2.ts9
-rw-r--r--tests/specs/run/ts_import_from_js/ts_import_from_js/deps.js2
-rw-r--r--tests/specs/run/ts_import_from_js/ts_import_from_js/main.js3
-rw-r--r--tests/specs/run/ts_import_from_js/ts_import_from_js/main.out3
-rw-r--r--tests/specs/run/ts_type_imports/__test__.jsonc5
-rw-r--r--tests/specs/run/ts_type_imports/ts_type_imports.ts5
-rw-r--r--tests/specs/run/ts_type_imports/ts_type_imports.ts.out6
-rw-r--r--tests/specs/run/ts_type_imports/ts_type_imports_foo.ts1
-rw-r--r--tests/specs/run/ts_type_only_import/__test__.jsonc4
-rw-r--r--tests/specs/run/ts_type_only_import/ts_type_only_import.d.ts3
-rw-r--r--tests/specs/run/ts_type_only_import/ts_type_only_import.ts1
-rw-r--r--tests/specs/run/ts_type_only_import/ts_type_only_import.ts.out1
-rw-r--r--tests/specs/run/ts_without_extension/__test__.jsonc5
-rw-r--r--tests/specs/run/ts_without_extension/ts_without_extension3
-rw-r--r--tests/specs/run/ts_without_extension/ts_without_extension.out2
-rw-r--r--tests/specs/run/tsx_imports/046_jsx_test.tsx14
-rw-r--r--tests/specs/run/tsx_imports/__test__.jsonc4
-rw-r--r--tests/specs/run/tsx_imports/tsx_imports/Component.tsx1
-rw-r--r--tests/specs/run/tsx_imports/tsx_imports/tsx_imports.ts1
-rw-r--r--tests/specs/run/tsx_imports/tsx_imports/tsx_imports.ts.out2
-rw-r--r--tests/specs/run/type_definitions/__test__.jsonc4
-rw-r--r--tests/specs/run/type_definitions/type_definitions.ts12
-rw-r--r--tests/specs/run/type_definitions/type_definitions.ts.out3
-rw-r--r--tests/specs/run/type_definitions/type_definitions/bar.d.ts7
-rw-r--r--tests/specs/run/type_definitions/type_definitions/bar.js5
-rw-r--r--tests/specs/run/type_definitions/type_definitions/fizz.d.ts2
-rw-r--r--tests/specs/run/type_definitions/type_definitions/fizz.js1
-rw-r--r--tests/specs/run/type_definitions/type_definitions/foo.d.ts2
-rw-r--r--tests/specs/run/type_definitions/type_definitions/foo.js1
-rw-r--r--tests/specs/run/type_definitions/type_definitions/qat.ts1
-rw-r--r--tests/specs/run/type_definitions_for_export/__test__.jsonc5
-rw-r--r--tests/specs/run/type_definitions_for_export/export_type_def.ts2
-rw-r--r--tests/specs/run/type_definitions_for_export/type_definitions/bar.d.ts7
-rw-r--r--tests/specs/run/type_definitions_for_export/type_definitions/bar.js5
-rw-r--r--tests/specs/run/type_definitions_for_export/type_definitions/fizz.d.ts2
-rw-r--r--tests/specs/run/type_definitions_for_export/type_definitions/fizz.js1
-rw-r--r--tests/specs/run/type_definitions_for_export/type_definitions/foo.d.ts2
-rw-r--r--tests/specs/run/type_definitions_for_export/type_definitions/foo.js1
-rw-r--r--tests/specs/run/type_definitions_for_export/type_definitions/qat.ts1
-rw-r--r--tests/specs/run/type_definitions_for_export/type_definitions_for_export.ts7
-rw-r--r--tests/specs/run/type_definitions_for_export/type_definitions_for_export.ts.out5
-rw-r--r--tests/specs/run/type_directives_01/__test__.jsonc4
-rw-r--r--tests/specs/run/type_directives_01/type_directives_01.ts3
-rw-r--r--tests/specs/run/type_directives_01/type_directives_01.ts.out3
-rw-r--r--tests/specs/run/type_directives_02/__test__.jsonc4
-rw-r--r--tests/specs/run/type_directives_02/type_directives_02.ts3
-rw-r--r--tests/specs/run/type_directives_02/type_directives_02.ts.out3
-rw-r--r--tests/specs/run/type_directives_02/type_reference.d.ts1
-rw-r--r--tests/specs/run/type_directives_02/type_reference.js3
-rw-r--r--tests/specs/run/type_headers_deno_types/__test__.jsonc4
-rw-r--r--tests/specs/run/type_headers_deno_types/type_headers_deno_types.ts18
-rw-r--r--tests/specs/run/type_headers_deno_types/type_headers_deno_types.ts.out5
-rw-r--r--tests/specs/run/unbuffered_stderr/__test__.jsonc4
-rw-r--r--tests/specs/run/unbuffered_stderr/unbuffered_stderr.ts1
-rw-r--r--tests/specs/run/unbuffered_stderr/unbuffered_stderr.ts.out1
-rw-r--r--tests/specs/run/unbuffered_stdout/__test__.jsonc4
-rw-r--r--tests/specs/run/unbuffered_stdout/unbuffered_stdout.ts1
-rw-r--r--tests/specs/run/unbuffered_stdout/unbuffered_stdout.ts.out1
-rw-r--r--tests/specs/run/unhandled_rejection/__test__.jsonc4
-rw-r--r--tests/specs/run/unhandled_rejection/unhandled_rejection.ts13
-rw-r--r--tests/specs/run/unhandled_rejection/unhandled_rejection.ts.out9
-rw-r--r--tests/specs/run/unhandled_rejection_dynamic_import/__test__.jsonc5
-rw-r--r--tests/specs/run/unhandled_rejection_dynamic_import/unhandled_rejection_dynamic_import/import.ts5
-rw-r--r--tests/specs/run/unhandled_rejection_dynamic_import/unhandled_rejection_dynamic_import/main.ts1
-rw-r--r--tests/specs/run/unhandled_rejection_dynamic_import/unhandled_rejection_dynamic_import/main.ts.out3
-rw-r--r--tests/specs/run/unhandled_rejection_dynamic_import2/__test__.jsonc4
-rw-r--r--tests/specs/run/unhandled_rejection_dynamic_import2/unhandled_rejection_dynamic_import2/import.ts3
-rw-r--r--tests/specs/run/unhandled_rejection_dynamic_import2/unhandled_rejection_dynamic_import2/main.ts21
-rw-r--r--tests/specs/run/unhandled_rejection_dynamic_import2/unhandled_rejection_dynamic_import2/main.ts.out5
-rw-r--r--tests/specs/run/unhandled_rejection_sync_error/__test__.jsonc4
-rw-r--r--tests/specs/run/unhandled_rejection_sync_error/unhandled_rejection_sync_error.ts6
-rw-r--r--tests/specs/run/unhandled_rejection_sync_error/unhandled_rejection_sync_error.ts.out6
-rw-r--r--tests/specs/run/unsafe_proto/__test__.jsonc5
-rw-r--r--tests/specs/run/unsafe_proto/unsafe_proto/main.js5
-rw-r--r--tests/specs/run/unsafe_proto/unsafe_proto/main.out2
-rw-r--r--tests/specs/run/unsafe_proto/unsafe_proto/main_with_unsafe_proto_flag.out2
-rw-r--r--tests/specs/run/unsafe_proto/unsafe_proto/worker.js2
-rw-r--r--tests/specs/run/unsafe_proto_flag/__test__.jsonc5
-rw-r--r--tests/specs/run/unsafe_proto_flag/unsafe_proto/main.js5
-rw-r--r--tests/specs/run/unsafe_proto_flag/unsafe_proto/main.out2
-rw-r--r--tests/specs/run/unsafe_proto_flag/unsafe_proto/main_with_unsafe_proto_flag.out2
-rw-r--r--tests/specs/run/unsafe_proto_flag/unsafe_proto/worker.js2
-rw-r--r--tests/specs/run/unstable_broadcast_channel_disabled/__test__.jsonc4
-rw-r--r--tests/specs/run/unstable_broadcast_channel_disabled/unstable_broadcast_channel.disabled.out2
-rw-r--r--tests/specs/run/unstable_broadcast_channel_disabled/unstable_broadcast_channel.js10
-rw-r--r--tests/specs/run/unstable_broadcast_channel_enabled/__test__.jsonc4
-rw-r--r--tests/specs/run/unstable_broadcast_channel_enabled/unstable_broadcast_channel.enabled.out2
-rw-r--r--tests/specs/run/unstable_broadcast_channel_enabled/unstable_broadcast_channel.js10
-rw-r--r--tests/specs/run/unstable_cron_disabled/__test__.jsonc4
-rw-r--r--tests/specs/run/unstable_cron_disabled/unstable_cron.disabled.out2
-rw-r--r--tests/specs/run/unstable_cron_disabled/unstable_cron.js10
-rw-r--r--tests/specs/run/unstable_cron_enabled/__test__.jsonc4
-rw-r--r--tests/specs/run/unstable_cron_enabled/unstable_cron.enabled.out2
-rw-r--r--tests/specs/run/unstable_cron_enabled/unstable_cron.js10
-rw-r--r--tests/specs/run/unstable_kv_disabled/__test__.jsonc4
-rw-r--r--tests/specs/run/unstable_kv_disabled/unstable_kv.disabled.out10
-rw-r--r--tests/specs/run/unstable_kv_disabled/unstable_kv.js14
-rw-r--r--tests/specs/run/unstable_kv_enabled/__test__.jsonc4
-rw-r--r--tests/specs/run/unstable_kv_enabled/unstable_kv.enabled.out10
-rw-r--r--tests/specs/run/unstable_kv_enabled/unstable_kv.js14
-rw-r--r--tests/specs/run/unstable_net_disabled/__test__.jsonc4
-rw-r--r--tests/specs/run/unstable_net_disabled/unstable_net.disabled.out4
-rw-r--r--tests/specs/run/unstable_net_disabled/unstable_net.js11
-rw-r--r--tests/specs/run/unstable_net_enabled/__test__.jsonc4
-rw-r--r--tests/specs/run/unstable_net_enabled/unstable_net.enabled.out4
-rw-r--r--tests/specs/run/unstable_net_enabled/unstable_net.js11
-rw-r--r--tests/specs/run/unstable_worker/__test__.jsonc4
-rw-r--r--tests/specs/run/unstable_worker/unstable_worker.ts6
-rw-r--r--tests/specs/run/unstable_worker/unstable_worker.ts.out2
-rw-r--r--tests/specs/run/unstable_worker/worker_unstable.ts5
-rw-r--r--tests/specs/run/unstable_worker_options_disabled/__test__.jsonc5
-rw-r--r--tests/specs/run/unstable_worker_options_disabled/unstable_worker_options.disabled.out1
-rw-r--r--tests/specs/run/unstable_worker_options_disabled/unstable_worker_options.js19
-rw-r--r--tests/specs/run/unstable_worker_options_enabled/__test__.jsonc4
-rw-r--r--tests/specs/run/unstable_worker_options_enabled/unstable_worker_options.enabled.out2
-rw-r--r--tests/specs/run/unstable_worker_options_enabled/unstable_worker_options.js19
-rw-r--r--tests/specs/run/unsupported_dynamic_import_scheme/__test__.jsonc5
-rw-r--r--tests/specs/run/unsupported_dynamic_import_scheme/unsupported_dynamic_import_scheme.out7
-rw-r--r--tests/specs/run/v8_flags_env_run/__test__.jsonc7
-rw-r--r--tests/specs/run/v8_flags_env_run/v8_flags.js1
-rw-r--r--tests/specs/run/v8_flags_env_run/v8_flags.js.out1
-rw-r--r--tests/specs/run/v8_flags_run/__test__.jsonc4
-rw-r--r--tests/specs/run/v8_flags_run/v8_flags.js1
-rw-r--r--tests/specs/run/v8_flags_run/v8_flags.js.out1
-rw-r--r--tests/specs/run/v8_flags_unrecognized/__test__.jsonc5
-rw-r--r--tests/specs/run/v8_flags_unrecognized/v8_flags_unrecognized.out5
-rw-r--r--tests/specs/run/v8_help/__test__.jsonc4
-rw-r--r--tests/specs/run/v8_help/v8_help.out4
-rw-r--r--tests/specs/run/wasm/__test__.jsonc4
-rw-r--r--tests/specs/run/wasm/wasm.ts16
-rw-r--r--tests/specs/run/wasm/wasm.ts.out1
-rw-r--r--tests/specs/run/wasm_async/__test__.jsonc4
-rw-r--r--tests/specs/run/wasm_async/wasm_async.js27
-rw-r--r--tests/specs/run/wasm_async/wasm_async.out1
-rw-r--r--tests/specs/run/wasm_shared/__test__.jsonc4
-rw-r--r--tests/specs/run/wasm_shared/wasm_shared.out0
-rw-r--r--tests/specs/run/wasm_shared/wasm_shared.ts6
-rw-r--r--tests/specs/run/wasm_streaming_panic_test/__test__.jsonc5
-rw-r--r--tests/specs/run/wasm_streaming_panic_test/wasm_streaming_panic_test.js3
-rw-r--r--tests/specs/run/wasm_streaming_panic_test/wasm_streaming_panic_test.js.out2
-rw-r--r--tests/specs/run/wasm_unreachable/__test__.jsonc5
-rw-r--r--tests/specs/run/wasm_unreachable/unreachable.wasmbin0 -> 42 bytes
-rw-r--r--tests/specs/run/wasm_unreachable/wasm_unreachable.js9
-rw-r--r--tests/specs/run/wasm_unreachable/wasm_unreachable.out3
-rw-r--r--tests/specs/run/wasm_url/__test__.jsonc5
-rw-r--r--tests/specs/run/wasm_url/wasm_url.js8
-rw-r--r--tests/specs/run/wasm_url/wasm_url.out3
-rw-r--r--tests/specs/run/weakref/__test__.jsonc4
-rw-r--r--tests/specs/run/weakref/weakref.ts1
-rw-r--r--tests/specs/run/weakref/weakref.ts.out1
-rw-r--r--tests/specs/run/webstorage_serialization/__test__.jsonc4
-rw-r--r--tests/specs/run/webstorage_serialization/webstorage/config_a.jsonc3
-rw-r--r--tests/specs/run/webstorage_serialization/webstorage/config_b.jsonc3
-rw-r--r--tests/specs/run/webstorage_serialization/webstorage/fixture.ts2
-rw-r--r--tests/specs/run/webstorage_serialization/webstorage/logger.ts1
-rw-r--r--tests/specs/run/webstorage_serialization/webstorage/serialization.ts4
-rw-r--r--tests/specs/run/webstorage_serialization/webstorage/serialization.ts.out2
-rw-r--r--tests/specs/run/webstorage_serialization/webstorage/setter.ts1
-rw-r--r--tests/specs/run/worker_close_in_wasm_reactions/__test__.jsonc4
-rw-r--r--tests/specs/run/worker_close_in_wasm_reactions/close_in_wasm_reactions.js21
-rw-r--r--tests/specs/run/worker_close_in_wasm_reactions/worker_close_in_wasm_reactions.js10
-rw-r--r--tests/specs/run/worker_close_in_wasm_reactions/worker_close_in_wasm_reactions.js.out2
-rw-r--r--tests/specs/run/worker_close_nested/__test__.jsonc4
-rw-r--r--tests/specs/run/worker_close_nested/close_nested_child.js8
-rw-r--r--tests/specs/run/worker_close_nested/close_nested_parent.js13
-rw-r--r--tests/specs/run/worker_close_nested/worker_close_nested.js20
-rw-r--r--tests/specs/run/worker_close_nested/worker_close_nested.js.out5
-rw-r--r--tests/specs/run/worker_close_race/__test__.jsonc4
-rw-r--r--tests/specs/run/worker_close_race/close_race_worker.js6
-rw-r--r--tests/specs/run/worker_close_race/worker_close_race.js14
-rw-r--r--tests/specs/run/worker_close_race/worker_close_race.js.out0
-rw-r--r--tests/specs/run/worker_drop_handle_race/__test__.jsonc5
-rw-r--r--tests/specs/run/worker_drop_handle_race/drop_handle_race.js3
-rw-r--r--tests/specs/run/worker_drop_handle_race/worker_drop_handle_race.js12
-rw-r--r--tests/specs/run/worker_drop_handle_race/worker_drop_handle_race.js.out7
-rw-r--r--tests/specs/run/worker_drop_handle_race_terminate/__test__.jsonc4
-rw-r--r--tests/specs/run/worker_drop_handle_race_terminate/worker_drop_handle_race_terminate.js37
-rw-r--r--tests/specs/run/worker_drop_handle_race_terminate/worker_drop_handle_race_terminate.js.out4
-rw-r--r--tests/specs/run/worker_event_handler_test/__test__.jsonc4
-rw-r--r--tests/specs/run/worker_event_handler_test/worker_event_handler_test.js5
-rw-r--r--tests/specs/run/worker_event_handler_test/worker_event_handler_test.js.out11
-rw-r--r--tests/specs/run/worker_event_handler_test/worker_event_handlers.js26
-rw-r--r--tests/specs/run/worker_message_before_close/__test__.jsonc4
-rw-r--r--tests/specs/run/worker_message_before_close/message_before_close.js4
-rw-r--r--tests/specs/run/worker_message_before_close/worker_message_before_close.js26
-rw-r--r--tests/specs/run/worker_message_before_close/worker_message_before_close.js.out1
1630 files changed, 11049 insertions, 0 deletions
diff --git a/tests/specs/run/_001_hello/001_hello.js b/tests/specs/run/_001_hello/001_hello.js
new file mode 100644
index 000000000..accefceba
--- /dev/null
+++ b/tests/specs/run/_001_hello/001_hello.js
@@ -0,0 +1 @@
+console.log("Hello World");
diff --git a/tests/specs/run/_001_hello/001_hello.js.out b/tests/specs/run/_001_hello/001_hello.js.out
new file mode 100644
index 000000000..557db03de
--- /dev/null
+++ b/tests/specs/run/_001_hello/001_hello.js.out
@@ -0,0 +1 @@
+Hello World
diff --git a/tests/specs/run/_001_hello/__test__.jsonc b/tests/specs/run/_001_hello/__test__.jsonc
new file mode 100644
index 000000000..4fd8126f0
--- /dev/null
+++ b/tests/specs/run/_001_hello/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --reload 001_hello.js",
+ "output": "001_hello.js.out"
+}
diff --git a/tests/specs/run/_002_hello/002_hello.ts b/tests/specs/run/_002_hello/002_hello.ts
new file mode 100644
index 000000000..accefceba
--- /dev/null
+++ b/tests/specs/run/_002_hello/002_hello.ts
@@ -0,0 +1 @@
+console.log("Hello World");
diff --git a/tests/specs/run/_002_hello/002_hello.ts.out b/tests/specs/run/_002_hello/002_hello.ts.out
new file mode 100644
index 000000000..557db03de
--- /dev/null
+++ b/tests/specs/run/_002_hello/002_hello.ts.out
@@ -0,0 +1 @@
+Hello World
diff --git a/tests/specs/run/_002_hello/__test__.jsonc b/tests/specs/run/_002_hello/__test__.jsonc
new file mode 100644
index 000000000..dde74d27c
--- /dev/null
+++ b/tests/specs/run/_002_hello/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --quiet --reload 002_hello.ts",
+ "output": "002_hello.ts.out"
+}
diff --git a/tests/specs/run/_003_relative_import/003_relative_import.ts b/tests/specs/run/_003_relative_import/003_relative_import.ts
new file mode 100644
index 000000000..d392f4a5d
--- /dev/null
+++ b/tests/specs/run/_003_relative_import/003_relative_import.ts
@@ -0,0 +1,3 @@
+import { printHello } from "./print_hello.ts";
+
+printHello();
diff --git a/tests/specs/run/_003_relative_import/003_relative_import.ts.out b/tests/specs/run/_003_relative_import/003_relative_import.ts.out
new file mode 100644
index 000000000..e965047ad
--- /dev/null
+++ b/tests/specs/run/_003_relative_import/003_relative_import.ts.out
@@ -0,0 +1 @@
+Hello
diff --git a/tests/specs/run/_003_relative_import/__test__.jsonc b/tests/specs/run/_003_relative_import/__test__.jsonc
new file mode 100644
index 000000000..7bed2c00a
--- /dev/null
+++ b/tests/specs/run/_003_relative_import/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --quiet --reload 003_relative_import.ts",
+ "output": "003_relative_import.ts.out"
+}
diff --git a/tests/specs/run/_003_relative_import/print_hello.ts b/tests/specs/run/_003_relative_import/print_hello.ts
new file mode 100644
index 000000000..b9c0ad527
--- /dev/null
+++ b/tests/specs/run/_003_relative_import/print_hello.ts
@@ -0,0 +1,3 @@
+export function printHello() {
+ console.log("Hello");
+}
diff --git a/tests/specs/run/_004_set_timeout/004_set_timeout.ts b/tests/specs/run/_004_set_timeout/004_set_timeout.ts
new file mode 100644
index 000000000..214b25086
--- /dev/null
+++ b/tests/specs/run/_004_set_timeout/004_set_timeout.ts
@@ -0,0 +1,11 @@
+setTimeout(() => {
+ console.log("World");
+}, 10);
+
+console.log("Hello");
+
+const id = setTimeout(() => {
+ console.log("Not printed");
+}, 10000);
+
+clearTimeout(id);
diff --git a/tests/specs/run/_004_set_timeout/004_set_timeout.ts.out b/tests/specs/run/_004_set_timeout/004_set_timeout.ts.out
new file mode 100644
index 000000000..f9264f7fb
--- /dev/null
+++ b/tests/specs/run/_004_set_timeout/004_set_timeout.ts.out
@@ -0,0 +1,2 @@
+Hello
+World
diff --git a/tests/specs/run/_004_set_timeout/__test__.jsonc b/tests/specs/run/_004_set_timeout/__test__.jsonc
new file mode 100644
index 000000000..6904dc093
--- /dev/null
+++ b/tests/specs/run/_004_set_timeout/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --quiet --reload 004_set_timeout.ts",
+ "output": "004_set_timeout.ts.out"
+}
diff --git a/tests/specs/run/_005_more_imports/005_more_imports.ts b/tests/specs/run/_005_more_imports/005_more_imports.ts
new file mode 100644
index 000000000..c69556be1
--- /dev/null
+++ b/tests/specs/run/_005_more_imports/005_more_imports.ts
@@ -0,0 +1,11 @@
+import { printHello3, returnsFoo2, returnsHi } from "./mod1.ts";
+
+printHello3();
+
+if (returnsHi() !== "Hi") {
+ throw Error("Unexpected");
+}
+
+if (returnsFoo2() !== "Foo") {
+ throw Error("Unexpected");
+}
diff --git a/tests/specs/run/_005_more_imports/005_more_imports.ts.out b/tests/specs/run/_005_more_imports/005_more_imports.ts.out
new file mode 100644
index 000000000..e965047ad
--- /dev/null
+++ b/tests/specs/run/_005_more_imports/005_more_imports.ts.out
@@ -0,0 +1 @@
+Hello
diff --git a/tests/specs/run/_005_more_imports/__test__.jsonc b/tests/specs/run/_005_more_imports/__test__.jsonc
new file mode 100644
index 000000000..159a0265a
--- /dev/null
+++ b/tests/specs/run/_005_more_imports/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --quiet --reload 005_more_imports.ts",
+ "output": "005_more_imports.ts.out"
+}
diff --git a/tests/specs/run/_005_more_imports/mod1.ts b/tests/specs/run/_005_more_imports/mod1.ts
new file mode 100644
index 000000000..5e58f432e
--- /dev/null
+++ b/tests/specs/run/_005_more_imports/mod1.ts
@@ -0,0 +1,17 @@
+import { printHello2, returnsFoo } from "./subdir2/mod2.ts";
+
+export function returnsHi(): string {
+ return "Hi";
+}
+
+export function returnsFoo2(): string {
+ return returnsFoo();
+}
+
+export function printHello3() {
+ printHello2();
+}
+
+export function throwsError() {
+ throw Error("exception from mod1");
+}
diff --git a/tests/specs/run/_005_more_imports/print_hello.ts b/tests/specs/run/_005_more_imports/print_hello.ts
new file mode 100644
index 000000000..b9c0ad527
--- /dev/null
+++ b/tests/specs/run/_005_more_imports/print_hello.ts
@@ -0,0 +1,3 @@
+export function printHello() {
+ console.log("Hello");
+}
diff --git a/tests/specs/run/_005_more_imports/subdir2/mod2.ts b/tests/specs/run/_005_more_imports/subdir2/mod2.ts
new file mode 100644
index 000000000..9071d0aeb
--- /dev/null
+++ b/tests/specs/run/_005_more_imports/subdir2/mod2.ts
@@ -0,0 +1,9 @@
+import { printHello } from "../print_hello.ts";
+
+export function returnsFoo(): string {
+ return "Foo";
+}
+
+export function printHello2() {
+ printHello();
+}
diff --git a/tests/specs/run/_006_url_imports/006_url_imports.ts b/tests/specs/run/_006_url_imports/006_url_imports.ts
new file mode 100644
index 000000000..4036f27ed
--- /dev/null
+++ b/tests/specs/run/_006_url_imports/006_url_imports.ts
@@ -0,0 +1,3 @@
+import { printHello } from "http://localhost:4545/subdir/mod2.ts";
+printHello();
+console.log("success");
diff --git a/tests/specs/run/_006_url_imports/006_url_imports.ts.out b/tests/specs/run/_006_url_imports/006_url_imports.ts.out
new file mode 100644
index 000000000..989ce33e9
--- /dev/null
+++ b/tests/specs/run/_006_url_imports/006_url_imports.ts.out
@@ -0,0 +1,2 @@
+Hello
+success
diff --git a/tests/specs/run/_006_url_imports/__test__.jsonc b/tests/specs/run/_006_url_imports/__test__.jsonc
new file mode 100644
index 000000000..50c0379ab
--- /dev/null
+++ b/tests/specs/run/_006_url_imports/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --quiet --reload --allow-import 006_url_imports.ts",
+ "output": "006_url_imports.ts.out"
+}
diff --git a/tests/specs/run/_006_url_imports/print_hello.ts b/tests/specs/run/_006_url_imports/print_hello.ts
new file mode 100644
index 000000000..b9c0ad527
--- /dev/null
+++ b/tests/specs/run/_006_url_imports/print_hello.ts
@@ -0,0 +1,3 @@
+export function printHello() {
+ console.log("Hello");
+}
diff --git a/tests/specs/run/_006_url_imports/subdir2/mod2.ts b/tests/specs/run/_006_url_imports/subdir2/mod2.ts
new file mode 100644
index 000000000..9071d0aeb
--- /dev/null
+++ b/tests/specs/run/_006_url_imports/subdir2/mod2.ts
@@ -0,0 +1,9 @@
+import { printHello } from "../print_hello.ts";
+
+export function returnsFoo(): string {
+ return "Foo";
+}
+
+export function printHello2() {
+ printHello();
+}
diff --git a/tests/specs/run/_012_async/012_async.ts b/tests/specs/run/_012_async/012_async.ts
new file mode 100644
index 000000000..536197b68
--- /dev/null
+++ b/tests/specs/run/_012_async/012_async.ts
@@ -0,0 +1,11 @@
+// Check that we can use the async keyword.
+async function main() {
+ await new Promise((resolve) => {
+ console.log("2");
+ setTimeout(resolve, 100);
+ });
+ console.log("3");
+}
+
+console.log("1");
+main();
diff --git a/tests/specs/run/_012_async/012_async.ts.out b/tests/specs/run/_012_async/012_async.ts.out
new file mode 100644
index 000000000..01e79c32a
--- /dev/null
+++ b/tests/specs/run/_012_async/012_async.ts.out
@@ -0,0 +1,3 @@
+1
+2
+3
diff --git a/tests/specs/run/_012_async/__test__.jsonc b/tests/specs/run/_012_async/__test__.jsonc
new file mode 100644
index 000000000..2778f0484
--- /dev/null
+++ b/tests/specs/run/_012_async/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --quiet --reload 012_async.ts",
+ "output": "012_async.ts.out"
+}
diff --git a/tests/specs/run/_013_dynamic_import/013_dynamic_import.ts b/tests/specs/run/_013_dynamic_import/013_dynamic_import.ts
new file mode 100644
index 000000000..5e73b6eb7
--- /dev/null
+++ b/tests/specs/run/_013_dynamic_import/013_dynamic_import.ts
@@ -0,0 +1,15 @@
+(async () => {
+ const { returnsHi, returnsFoo2, printHello3 } = await import(
+ "./mod1.ts"
+ );
+
+ printHello3();
+
+ if (returnsHi() !== "Hi") {
+ throw Error("Unexpected");
+ }
+
+ if (returnsFoo2() !== "Foo") {
+ throw Error("Unexpected");
+ }
+})();
diff --git a/tests/specs/run/_013_dynamic_import/013_dynamic_import.ts.out b/tests/specs/run/_013_dynamic_import/013_dynamic_import.ts.out
new file mode 100644
index 000000000..e965047ad
--- /dev/null
+++ b/tests/specs/run/_013_dynamic_import/013_dynamic_import.ts.out
@@ -0,0 +1 @@
+Hello
diff --git a/tests/specs/run/_013_dynamic_import/__test__.jsonc b/tests/specs/run/_013_dynamic_import/__test__.jsonc
new file mode 100644
index 000000000..8be2c975b
--- /dev/null
+++ b/tests/specs/run/_013_dynamic_import/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --quiet --reload --allow-read 013_dynamic_import.ts",
+ "output": "013_dynamic_import.ts.out"
+}
diff --git a/tests/specs/run/_013_dynamic_import/mod1.ts b/tests/specs/run/_013_dynamic_import/mod1.ts
new file mode 100644
index 000000000..5e58f432e
--- /dev/null
+++ b/tests/specs/run/_013_dynamic_import/mod1.ts
@@ -0,0 +1,17 @@
+import { printHello2, returnsFoo } from "./subdir2/mod2.ts";
+
+export function returnsHi(): string {
+ return "Hi";
+}
+
+export function returnsFoo2(): string {
+ return returnsFoo();
+}
+
+export function printHello3() {
+ printHello2();
+}
+
+export function throwsError() {
+ throw Error("exception from mod1");
+}
diff --git a/tests/specs/run/_013_dynamic_import/print_hello.ts b/tests/specs/run/_013_dynamic_import/print_hello.ts
new file mode 100644
index 000000000..b9c0ad527
--- /dev/null
+++ b/tests/specs/run/_013_dynamic_import/print_hello.ts
@@ -0,0 +1,3 @@
+export function printHello() {
+ console.log("Hello");
+}
diff --git a/tests/specs/run/_013_dynamic_import/subdir2/mod2.ts b/tests/specs/run/_013_dynamic_import/subdir2/mod2.ts
new file mode 100644
index 000000000..9071d0aeb
--- /dev/null
+++ b/tests/specs/run/_013_dynamic_import/subdir2/mod2.ts
@@ -0,0 +1,9 @@
+import { printHello } from "../print_hello.ts";
+
+export function returnsFoo(): string {
+ return "Foo";
+}
+
+export function printHello2() {
+ printHello();
+}
diff --git a/tests/specs/run/_014_duplicate_import/014_duplicate_import.ts b/tests/specs/run/_014_duplicate_import/014_duplicate_import.ts
new file mode 100644
index 000000000..b996ca8ae
--- /dev/null
+++ b/tests/specs/run/_014_duplicate_import/014_duplicate_import.ts
@@ -0,0 +1,9 @@
+// with all the imports of the same module, the module should only be
+// instantiated once
+import "./auto_print_hello.ts";
+
+import "./auto_print_hello.ts";
+
+(async () => {
+ await import("./auto_print_hello.ts");
+})();
diff --git a/tests/specs/run/_014_duplicate_import/014_duplicate_import.ts.out b/tests/specs/run/_014_duplicate_import/014_duplicate_import.ts.out
new file mode 100644
index 000000000..4effa19f4
--- /dev/null
+++ b/tests/specs/run/_014_duplicate_import/014_duplicate_import.ts.out
@@ -0,0 +1 @@
+hello!
diff --git a/tests/specs/run/_014_duplicate_import/__test__.jsonc b/tests/specs/run/_014_duplicate_import/__test__.jsonc
new file mode 100644
index 000000000..7172fc183
--- /dev/null
+++ b/tests/specs/run/_014_duplicate_import/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --quiet --reload --allow-read 014_duplicate_import.ts ",
+ "output": "014_duplicate_import.ts.out"
+}
diff --git a/tests/specs/run/_014_duplicate_import/auto_print_hello.ts b/tests/specs/run/_014_duplicate_import/auto_print_hello.ts
new file mode 100644
index 000000000..5efa72e03
--- /dev/null
+++ b/tests/specs/run/_014_duplicate_import/auto_print_hello.ts
@@ -0,0 +1,2 @@
+console.log("hello!");
+export default {};
diff --git a/tests/specs/run/_015_duplicate_parallel_import/015_duplicate_parallel_import.js b/tests/specs/run/_015_duplicate_parallel_import/015_duplicate_parallel_import.js
new file mode 100644
index 000000000..136d80f46
--- /dev/null
+++ b/tests/specs/run/_015_duplicate_parallel_import/015_duplicate_parallel_import.js
@@ -0,0 +1,20 @@
+// Importing the same module in parallel, the module should only be
+// instantiated once.
+
+const promises = new Array(100)
+ .fill(null)
+ .map(() => import("./mod1.ts"));
+
+Promise.all(promises).then((imports) => {
+ const mod = imports.reduce((first, cur) => {
+ if (typeof first !== "object") {
+ throw new Error("Expected an object.");
+ }
+ if (first !== cur) {
+ throw new Error("More than one instance of the same module.");
+ }
+ return first;
+ });
+
+ mod.printHello3();
+});
diff --git a/tests/specs/run/_015_duplicate_parallel_import/015_duplicate_parallel_import.js.out b/tests/specs/run/_015_duplicate_parallel_import/015_duplicate_parallel_import.js.out
new file mode 100644
index 000000000..e965047ad
--- /dev/null
+++ b/tests/specs/run/_015_duplicate_parallel_import/015_duplicate_parallel_import.js.out
@@ -0,0 +1 @@
+Hello
diff --git a/tests/specs/run/_015_duplicate_parallel_import/__test__.jsonc b/tests/specs/run/_015_duplicate_parallel_import/__test__.jsonc
new file mode 100644
index 000000000..44fe479e2
--- /dev/null
+++ b/tests/specs/run/_015_duplicate_parallel_import/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --quiet --reload --allow-read 015_duplicate_parallel_import.js",
+ "output": "015_duplicate_parallel_import.js.out"
+}
diff --git a/tests/specs/run/_015_duplicate_parallel_import/mod1.ts b/tests/specs/run/_015_duplicate_parallel_import/mod1.ts
new file mode 100644
index 000000000..5e58f432e
--- /dev/null
+++ b/tests/specs/run/_015_duplicate_parallel_import/mod1.ts
@@ -0,0 +1,17 @@
+import { printHello2, returnsFoo } from "./subdir2/mod2.ts";
+
+export function returnsHi(): string {
+ return "Hi";
+}
+
+export function returnsFoo2(): string {
+ return returnsFoo();
+}
+
+export function printHello3() {
+ printHello2();
+}
+
+export function throwsError() {
+ throw Error("exception from mod1");
+}
diff --git a/tests/specs/run/_015_duplicate_parallel_import/print_hello.ts b/tests/specs/run/_015_duplicate_parallel_import/print_hello.ts
new file mode 100644
index 000000000..b9c0ad527
--- /dev/null
+++ b/tests/specs/run/_015_duplicate_parallel_import/print_hello.ts
@@ -0,0 +1,3 @@
+export function printHello() {
+ console.log("Hello");
+}
diff --git a/tests/specs/run/_015_duplicate_parallel_import/subdir2/mod2.ts b/tests/specs/run/_015_duplicate_parallel_import/subdir2/mod2.ts
new file mode 100644
index 000000000..9071d0aeb
--- /dev/null
+++ b/tests/specs/run/_015_duplicate_parallel_import/subdir2/mod2.ts
@@ -0,0 +1,9 @@
+import { printHello } from "../print_hello.ts";
+
+export function returnsFoo(): string {
+ return "Foo";
+}
+
+export function printHello2() {
+ printHello();
+}
diff --git a/tests/specs/run/_016_double_await/016_double_await.ts b/tests/specs/run/_016_double_await/016_double_await.ts
new file mode 100644
index 000000000..457a53ff3
--- /dev/null
+++ b/tests/specs/run/_016_double_await/016_double_await.ts
@@ -0,0 +1,8 @@
+// This is to test if Deno would die at 2nd await
+// See https://github.com/denoland/deno/issues/919
+(async () => {
+ const currDirInfo = await Deno.stat(".");
+ const parentDirInfo = await Deno.stat("..");
+ console.log(currDirInfo.isDirectory);
+ console.log(parentDirInfo.isFile);
+})();
diff --git a/tests/specs/run/_016_double_await/016_double_await.ts.out b/tests/specs/run/_016_double_await/016_double_await.ts.out
new file mode 100644
index 000000000..da29283aa
--- /dev/null
+++ b/tests/specs/run/_016_double_await/016_double_await.ts.out
@@ -0,0 +1,2 @@
+true
+false
diff --git a/tests/specs/run/_016_double_await/__test__.jsonc b/tests/specs/run/_016_double_await/__test__.jsonc
new file mode 100644
index 000000000..9ff202716
--- /dev/null
+++ b/tests/specs/run/_016_double_await/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --quiet --allow-read --reload 016_double_await.ts",
+ "output": "016_double_await.ts.out"
+}
diff --git a/tests/specs/run/_017_import_redirect/017_import_redirect.ts b/tests/specs/run/_017_import_redirect/017_import_redirect.ts
new file mode 100644
index 000000000..1265dd4ed
--- /dev/null
+++ b/tests/specs/run/_017_import_redirect/017_import_redirect.ts
@@ -0,0 +1,4 @@
+// http -> https redirect would happen:
+import { printHello } from "http://gist.githubusercontent.com/ry/f12b2aa3409e6b52645bc346a9e22929/raw/79318f239f51d764384a8bded8d7c6a833610dde/print_hello.ts";
+
+printHello();
diff --git a/tests/specs/run/_017_import_redirect/017_import_redirect.ts.out b/tests/specs/run/_017_import_redirect/017_import_redirect.ts.out
new file mode 100644
index 000000000..e965047ad
--- /dev/null
+++ b/tests/specs/run/_017_import_redirect/017_import_redirect.ts.out
@@ -0,0 +1 @@
+Hello
diff --git a/tests/specs/run/_017_import_redirect/__test__.jsonc b/tests/specs/run/_017_import_redirect/__test__.jsonc
new file mode 100644
index 000000000..dd5442dcd
--- /dev/null
+++ b/tests/specs/run/_017_import_redirect/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --quiet --allow-import --reload --check 017_import_redirect.ts",
+ "output": "017_import_redirect.ts.out"
+}
diff --git a/tests/specs/run/_017_import_redirect_check/017_import_redirect.ts b/tests/specs/run/_017_import_redirect_check/017_import_redirect.ts
new file mode 100644
index 000000000..1265dd4ed
--- /dev/null
+++ b/tests/specs/run/_017_import_redirect_check/017_import_redirect.ts
@@ -0,0 +1,4 @@
+// http -> https redirect would happen:
+import { printHello } from "http://gist.githubusercontent.com/ry/f12b2aa3409e6b52645bc346a9e22929/raw/79318f239f51d764384a8bded8d7c6a833610dde/print_hello.ts";
+
+printHello();
diff --git a/tests/specs/run/_017_import_redirect_check/017_import_redirect.ts.out b/tests/specs/run/_017_import_redirect_check/017_import_redirect.ts.out
new file mode 100644
index 000000000..e965047ad
--- /dev/null
+++ b/tests/specs/run/_017_import_redirect_check/017_import_redirect.ts.out
@@ -0,0 +1 @@
+Hello
diff --git a/tests/specs/run/_017_import_redirect_check/__test__.jsonc b/tests/specs/run/_017_import_redirect_check/__test__.jsonc
new file mode 100644
index 000000000..dd5442dcd
--- /dev/null
+++ b/tests/specs/run/_017_import_redirect_check/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --quiet --allow-import --reload --check 017_import_redirect.ts",
+ "output": "017_import_redirect.ts.out"
+}
diff --git a/tests/specs/run/_017_import_redirect_info/017_import_redirect.ts b/tests/specs/run/_017_import_redirect_info/017_import_redirect.ts
new file mode 100644
index 000000000..1265dd4ed
--- /dev/null
+++ b/tests/specs/run/_017_import_redirect_info/017_import_redirect.ts
@@ -0,0 +1,4 @@
+// http -> https redirect would happen:
+import { printHello } from "http://gist.githubusercontent.com/ry/f12b2aa3409e6b52645bc346a9e22929/raw/79318f239f51d764384a8bded8d7c6a833610dde/print_hello.ts";
+
+printHello();
diff --git a/tests/specs/run/_017_import_redirect_info/017_import_redirect_info.out b/tests/specs/run/_017_import_redirect_info/017_import_redirect_info.out
new file mode 100644
index 000000000..d1850ccb5
--- /dev/null
+++ b/tests/specs/run/_017_import_redirect_info/017_import_redirect_info.out
@@ -0,0 +1,7 @@
+local: [WILDCARD]017_import_redirect.ts
+type: TypeScript
+dependencies: 1 unique
+size: 278B
+
+file:///[WILDCARD]/017_import_redirect.ts ([WILDCARD])
+└── https://gist.githubusercontent.com/ry/f12b2aa3409e6b52645bc346a9e22929/raw/79318f239f51d764384a8bded8d7c6a833610dde/print_hello.ts ([WILDCARD])
diff --git a/tests/specs/run/_017_import_redirect_info/__test__.jsonc b/tests/specs/run/_017_import_redirect_info/__test__.jsonc
new file mode 100644
index 000000000..d23e8dd99
--- /dev/null
+++ b/tests/specs/run/_017_import_redirect_info/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "info --quiet --allow-import --reload 017_import_redirect.ts",
+ "output": "017_import_redirect_info.out"
+}
diff --git a/tests/specs/run/_017_import_redirect_vendor_dir/017_import_redirect.ts b/tests/specs/run/_017_import_redirect_vendor_dir/017_import_redirect.ts
new file mode 100644
index 000000000..1265dd4ed
--- /dev/null
+++ b/tests/specs/run/_017_import_redirect_vendor_dir/017_import_redirect.ts
@@ -0,0 +1,4 @@
+// http -> https redirect would happen:
+import { printHello } from "http://gist.githubusercontent.com/ry/f12b2aa3409e6b52645bc346a9e22929/raw/79318f239f51d764384a8bded8d7c6a833610dde/print_hello.ts";
+
+printHello();
diff --git a/tests/specs/run/_017_import_redirect_vendor_dir/017_import_redirect.ts.out b/tests/specs/run/_017_import_redirect_vendor_dir/017_import_redirect.ts.out
new file mode 100644
index 000000000..e965047ad
--- /dev/null
+++ b/tests/specs/run/_017_import_redirect_vendor_dir/017_import_redirect.ts.out
@@ -0,0 +1 @@
+Hello
diff --git a/tests/specs/run/_017_import_redirect_vendor_dir/__test__.jsonc b/tests/specs/run/_017_import_redirect_vendor_dir/__test__.jsonc
new file mode 100644
index 000000000..dd5442dcd
--- /dev/null
+++ b/tests/specs/run/_017_import_redirect_vendor_dir/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --quiet --allow-import --reload --check 017_import_redirect.ts",
+ "output": "017_import_redirect.ts.out"
+}
diff --git a/tests/specs/run/_018_async_catch/018_async_catch.ts b/tests/specs/run/_018_async_catch/018_async_catch.ts
new file mode 100644
index 000000000..ac43a52e8
--- /dev/null
+++ b/tests/specs/run/_018_async_catch/018_async_catch.ts
@@ -0,0 +1,14 @@
+function fn(): Promise<never> {
+ throw new Error("message");
+}
+async function call() {
+ try {
+ console.log("before await fn()");
+ await fn();
+ console.log("after await fn()");
+ } catch (_error) {
+ console.log("catch");
+ }
+ console.log("after try-catch");
+}
+call().catch(() => console.log("outer catch"));
diff --git a/tests/specs/run/_018_async_catch/018_async_catch.ts.out b/tests/specs/run/_018_async_catch/018_async_catch.ts.out
new file mode 100644
index 000000000..4fc219973
--- /dev/null
+++ b/tests/specs/run/_018_async_catch/018_async_catch.ts.out
@@ -0,0 +1,3 @@
+before await fn()
+catch
+after try-catch
diff --git a/tests/specs/run/_018_async_catch/__test__.jsonc b/tests/specs/run/_018_async_catch/__test__.jsonc
new file mode 100644
index 000000000..7995c79fd
--- /dev/null
+++ b/tests/specs/run/_018_async_catch/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --quiet --reload 018_async_catch.ts",
+ "output": "018_async_catch.ts.out"
+}
diff --git a/tests/specs/run/_019_media_types/019_media_types.ts b/tests/specs/run/_019_media_types/019_media_types.ts
new file mode 100644
index 000000000..d985bd249
--- /dev/null
+++ b/tests/specs/run/_019_media_types/019_media_types.ts
@@ -0,0 +1,24 @@
+// When run against the test HTTP server, it will serve different media types
+// based on the URL containing `.t#.` strings, which exercises the different
+// mapping of media types end to end.
+
+import { loaded as loadedTs1 } from "http://localhost:4545/subdir/mt_text_typescript.t1.ts";
+import { loaded as loadedTs2 } from "http://localhost:4545/subdir/mt_video_vdn.t2.ts";
+import { loaded as loadedTs3 } from "http://localhost:4545/subdir/mt_video_mp2t.t3.ts";
+import { loaded as loadedTs4 } from "http://localhost:4545/subdir/mt_application_x_typescript.t4.ts";
+import { loaded as loadedJs1 } from "http://localhost:4545/subdir/mt_text_javascript.j1.js";
+import { loaded as loadedJs2 } from "http://localhost:4545/subdir/mt_application_ecmascript.j2.js";
+import { loaded as loadedJs3 } from "http://localhost:4545/subdir/mt_text_ecmascript.j3.js";
+import { loaded as loadedJs4 } from "http://localhost:4545/subdir/mt_application_x_javascript.j4.js";
+
+console.log(
+ "success",
+ loadedTs1,
+ loadedTs2,
+ loadedTs3,
+ loadedTs4,
+ loadedJs1,
+ loadedJs2,
+ loadedJs3,
+ loadedJs4,
+);
diff --git a/tests/specs/run/_019_media_types/019_media_types.ts.out b/tests/specs/run/_019_media_types/019_media_types.ts.out
new file mode 100644
index 000000000..b3e94678c
--- /dev/null
+++ b/tests/specs/run/_019_media_types/019_media_types.ts.out
@@ -0,0 +1 @@
+[WILDCARD]success true true true true true true true true
diff --git a/tests/specs/run/_019_media_types/__test__.jsonc b/tests/specs/run/_019_media_types/__test__.jsonc
new file mode 100644
index 000000000..b741a0bf2
--- /dev/null
+++ b/tests/specs/run/_019_media_types/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --reload --allow-import 019_media_types.ts",
+ "output": "019_media_types.ts.out"
+}
diff --git a/tests/specs/run/_020_json_modules/020_json_modules.ts b/tests/specs/run/_020_json_modules/020_json_modules.ts
new file mode 100644
index 000000000..bde024cf8
--- /dev/null
+++ b/tests/specs/run/_020_json_modules/020_json_modules.ts
@@ -0,0 +1,2 @@
+import config from "./config.json";
+console.log(JSON.stringify(config));
diff --git a/tests/specs/run/_020_json_modules/020_json_modules.ts.out b/tests/specs/run/_020_json_modules/020_json_modules.ts.out
new file mode 100644
index 000000000..8bf0b4146
--- /dev/null
+++ b/tests/specs/run/_020_json_modules/020_json_modules.ts.out
@@ -0,0 +1,3 @@
+error: Expected a JavaScript or TypeScript module, but identified a Json module. Consider importing Json modules with an import attribute with the type of "json".
+ Specifier: [WILDCARD]/config.json
+[WILDCARD] \ No newline at end of file
diff --git a/tests/specs/run/_020_json_modules/__test__.jsonc b/tests/specs/run/_020_json_modules/__test__.jsonc
new file mode 100644
index 000000000..618616438
--- /dev/null
+++ b/tests/specs/run/_020_json_modules/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run --reload 020_json_modules.ts",
+ "output": "020_json_modules.ts.out",
+ "exitCode": 1
+}
diff --git a/tests/specs/run/_020_json_modules/config.json b/tests/specs/run/_020_json_modules/config.json
new file mode 100644
index 000000000..01c3b5e79
--- /dev/null
+++ b/tests/specs/run/_020_json_modules/config.json
@@ -0,0 +1,6 @@
+{
+ "foo": {
+ "bar": true,
+ "baz": ["qat", 1]
+ }
+}
diff --git a/tests/specs/run/_021_mjs_modules/021_mjs_modules.ts b/tests/specs/run/_021_mjs_modules/021_mjs_modules.ts
new file mode 100644
index 000000000..326fce3e5
--- /dev/null
+++ b/tests/specs/run/_021_mjs_modules/021_mjs_modules.ts
@@ -0,0 +1,2 @@
+import { isMod5 } from "./mod5.mjs";
+console.log(isMod5);
diff --git a/tests/specs/run/_021_mjs_modules/021_mjs_modules.ts.out b/tests/specs/run/_021_mjs_modules/021_mjs_modules.ts.out
new file mode 100644
index 000000000..27ba77dda
--- /dev/null
+++ b/tests/specs/run/_021_mjs_modules/021_mjs_modules.ts.out
@@ -0,0 +1 @@
+true
diff --git a/tests/specs/run/_021_mjs_modules/__test__.jsonc b/tests/specs/run/_021_mjs_modules/__test__.jsonc
new file mode 100644
index 000000000..f02965886
--- /dev/null
+++ b/tests/specs/run/_021_mjs_modules/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --quiet --reload 021_mjs_modules.ts",
+ "output": "021_mjs_modules.ts.out"
+}
diff --git a/tests/specs/run/_021_mjs_modules/mod5.mjs b/tests/specs/run/_021_mjs_modules/mod5.mjs
new file mode 100644
index 000000000..f21d8862b
--- /dev/null
+++ b/tests/specs/run/_021_mjs_modules/mod5.mjs
@@ -0,0 +1 @@
+export const isMod5 = true;
diff --git a/tests/specs/run/_025_reload_js_type_error/025_reload_js_type_error.js b/tests/specs/run/_025_reload_js_type_error/025_reload_js_type_error.js
new file mode 100644
index 000000000..660626a68
--- /dev/null
+++ b/tests/specs/run/_025_reload_js_type_error/025_reload_js_type_error.js
@@ -0,0 +1,6 @@
+// deno-lint-ignore-file
+// There was a bug where if this was executed with --reload it would throw a
+// type error.
+globalThis.test = null;
+test = console;
+test.log("hello");
diff --git a/tests/specs/run/_025_reload_js_type_error/025_reload_js_type_error.js.out b/tests/specs/run/_025_reload_js_type_error/025_reload_js_type_error.js.out
new file mode 100644
index 000000000..ce0136250
--- /dev/null
+++ b/tests/specs/run/_025_reload_js_type_error/025_reload_js_type_error.js.out
@@ -0,0 +1 @@
+hello
diff --git a/tests/specs/run/_025_reload_js_type_error/__test__.jsonc b/tests/specs/run/_025_reload_js_type_error/__test__.jsonc
new file mode 100644
index 000000000..ce098f909
--- /dev/null
+++ b/tests/specs/run/_025_reload_js_type_error/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --quiet --reload 025_reload_js_type_error.js",
+ "output": "025_reload_js_type_error.js.out"
+}
diff --git a/tests/specs/run/_027_redirect_typescript/027_redirect_typescript.ts b/tests/specs/run/_027_redirect_typescript/027_redirect_typescript.ts
new file mode 100644
index 000000000..584341975
--- /dev/null
+++ b/tests/specs/run/_027_redirect_typescript/027_redirect_typescript.ts
@@ -0,0 +1,2 @@
+import { value } from "http://localhost:4547/redirects/redirect4.ts";
+console.log(value);
diff --git a/tests/specs/run/_027_redirect_typescript/027_redirect_typescript.ts.out b/tests/specs/run/_027_redirect_typescript/027_redirect_typescript.ts.out
new file mode 100644
index 000000000..480d4e8ca
--- /dev/null
+++ b/tests/specs/run/_027_redirect_typescript/027_redirect_typescript.ts.out
@@ -0,0 +1 @@
+4 imports 1
diff --git a/tests/specs/run/_027_redirect_typescript/__test__.jsonc b/tests/specs/run/_027_redirect_typescript/__test__.jsonc
new file mode 100644
index 000000000..fca55c9f8
--- /dev/null
+++ b/tests/specs/run/_027_redirect_typescript/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --quiet --reload --allow-import 027_redirect_typescript.ts",
+ "output": "027_redirect_typescript.ts.out"
+}
diff --git a/tests/specs/run/_027_redirect_typescript_vendor_dir/027_redirect_typescript.ts b/tests/specs/run/_027_redirect_typescript_vendor_dir/027_redirect_typescript.ts
new file mode 100644
index 000000000..584341975
--- /dev/null
+++ b/tests/specs/run/_027_redirect_typescript_vendor_dir/027_redirect_typescript.ts
@@ -0,0 +1,2 @@
+import { value } from "http://localhost:4547/redirects/redirect4.ts";
+console.log(value);
diff --git a/tests/specs/run/_027_redirect_typescript_vendor_dir/027_redirect_typescript.ts.out b/tests/specs/run/_027_redirect_typescript_vendor_dir/027_redirect_typescript.ts.out
new file mode 100644
index 000000000..480d4e8ca
--- /dev/null
+++ b/tests/specs/run/_027_redirect_typescript_vendor_dir/027_redirect_typescript.ts.out
@@ -0,0 +1 @@
+4 imports 1
diff --git a/tests/specs/run/_027_redirect_typescript_vendor_dir/__test__.jsonc b/tests/specs/run/_027_redirect_typescript_vendor_dir/__test__.jsonc
new file mode 100644
index 000000000..f35557907
--- /dev/null
+++ b/tests/specs/run/_027_redirect_typescript_vendor_dir/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --quiet --reload --vendor --allow-import 027_redirect_typescript.ts",
+ "output": "027_redirect_typescript.ts.out"
+}
diff --git a/tests/specs/run/_027_redirect_typescript_vendor_dir/vendor/http_localhost_4545/subdir/redirects/redirect1.ts b/tests/specs/run/_027_redirect_typescript_vendor_dir/vendor/http_localhost_4545/subdir/redirects/redirect1.ts
new file mode 100644
index 000000000..d674be88c
--- /dev/null
+++ b/tests/specs/run/_027_redirect_typescript_vendor_dir/vendor/http_localhost_4545/subdir/redirects/redirect1.ts
@@ -0,0 +1 @@
+export const redirect = 1;
diff --git a/tests/specs/run/_027_redirect_typescript_vendor_dir/vendor/http_localhost_4545/subdir/redirects/redirect4.ts b/tests/specs/run/_027_redirect_typescript_vendor_dir/vendor/http_localhost_4545/subdir/redirects/redirect4.ts
new file mode 100644
index 000000000..45c65c5eb
--- /dev/null
+++ b/tests/specs/run/_027_redirect_typescript_vendor_dir/vendor/http_localhost_4545/subdir/redirects/redirect4.ts
@@ -0,0 +1,2 @@
+import { redirect } from "./redirect1.ts";
+export const value = `4 imports ${redirect}`;
diff --git a/tests/specs/run/_027_redirect_typescript_vendor_dir/vendor/manifest.json b/tests/specs/run/_027_redirect_typescript_vendor_dir/vendor/manifest.json
new file mode 100644
index 000000000..49cc42e8c
--- /dev/null
+++ b/tests/specs/run/_027_redirect_typescript_vendor_dir/vendor/manifest.json
@@ -0,0 +1,9 @@
+{
+ "modules": {
+ "http://localhost:4547/redirects/redirect4.ts": {
+ "headers": {
+ "location": "http://localhost:4545/subdir/redirects/redirect4.ts"
+ }
+ }
+ }
+}
diff --git a/tests/specs/run/_028_args/028_args.ts b/tests/specs/run/_028_args/028_args.ts
new file mode 100644
index 000000000..ec41d52f9
--- /dev/null
+++ b/tests/specs/run/_028_args/028_args.ts
@@ -0,0 +1,3 @@
+Deno.args.forEach((arg) => {
+ console.log(arg);
+});
diff --git a/tests/specs/run/_028_args/028_args.ts.out b/tests/specs/run/_028_args/028_args.ts.out
new file mode 100644
index 000000000..0f1b5c59e
--- /dev/null
+++ b/tests/specs/run/_028_args/028_args.ts.out
@@ -0,0 +1,6 @@
+--arg1
+val1
+--arg2=val2
+--
+arg3
+arg4
diff --git a/tests/specs/run/_028_args/__test__.jsonc b/tests/specs/run/_028_args/__test__.jsonc
new file mode 100644
index 000000000..6ab81bf21
--- /dev/null
+++ b/tests/specs/run/_028_args/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --quiet --reload 028_args.ts --arg1 val1 --arg2=val2 -- arg3 arg4",
+ "output": "028_args.ts.out"
+}
diff --git a/tests/specs/run/_033_import_map_data_uri/__test__.jsonc b/tests/specs/run/_033_import_map_data_uri/__test__.jsonc
new file mode 100644
index 000000000..400269c75
--- /dev/null
+++ b/tests/specs/run/_033_import_map_data_uri/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --quiet --reload --allow-import --import-map=data:application/json;charset=utf-8;base64,ewogICJpbXBvcnRzIjogewogICAgInRlc3Rfc2VydmVyLyI6ICJodHRwOi8vbG9jYWxob3N0OjQ1NDUvIgogIH0KfQ== test_data.ts",
+ "output": "test_data.ts.out"
+}
diff --git a/tests/specs/run/_033_import_map_data_uri/lodash/lodash.ts b/tests/specs/run/_033_import_map_data_uri/lodash/lodash.ts
new file mode 100644
index 000000000..2ec04ed3c
--- /dev/null
+++ b/tests/specs/run/_033_import_map_data_uri/lodash/lodash.ts
@@ -0,0 +1 @@
+console.log("Hello from remapped lodash!");
diff --git a/tests/specs/run/_033_import_map_data_uri/lodash/other_file.ts b/tests/specs/run/_033_import_map_data_uri/lodash/other_file.ts
new file mode 100644
index 000000000..714adae3f
--- /dev/null
+++ b/tests/specs/run/_033_import_map_data_uri/lodash/other_file.ts
@@ -0,0 +1 @@
+console.log("Hello from remapped lodash dir!");
diff --git a/tests/specs/run/_033_import_map_data_uri/test_data.ts b/tests/specs/run/_033_import_map_data_uri/test_data.ts
new file mode 100644
index 000000000..5e8efea69
--- /dev/null
+++ b/tests/specs/run/_033_import_map_data_uri/test_data.ts
@@ -0,0 +1 @@
+import "test_server/import_maps/lodash/lodash.ts";
diff --git a/tests/specs/run/_033_import_map_data_uri/test_data.ts.out b/tests/specs/run/_033_import_map_data_uri/test_data.ts.out
new file mode 100644
index 000000000..da996dc0d
--- /dev/null
+++ b/tests/specs/run/_033_import_map_data_uri/test_data.ts.out
@@ -0,0 +1 @@
+Hello from remapped lodash!
diff --git a/tests/specs/run/_033_import_map_remote/033_import_map_remote.out b/tests/specs/run/_033_import_map_remote/033_import_map_remote.out
new file mode 100644
index 000000000..804fa0d57
--- /dev/null
+++ b/tests/specs/run/_033_import_map_remote/033_import_map_remote.out
@@ -0,0 +1,5 @@
+Hello from remapped moment!
+Hello from remapped moment dir!
+Hello from remapped lodash!
+Hello from remapped lodash dir!
+Hello from remapped Vue!
diff --git a/tests/specs/run/_033_import_map_remote/__test__.jsonc b/tests/specs/run/_033_import_map_remote/__test__.jsonc
new file mode 100644
index 000000000..20c848d49
--- /dev/null
+++ b/tests/specs/run/_033_import_map_remote/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --quiet --reload --allow-import --import-map=import_map_remote.json test_remote.ts",
+ "output": "033_import_map_remote.out"
+}
diff --git a/tests/specs/run/_033_import_map_remote/import_map_remote.json b/tests/specs/run/_033_import_map_remote/import_map_remote.json
new file mode 100644
index 000000000..190fc4f55
--- /dev/null
+++ b/tests/specs/run/_033_import_map_remote/import_map_remote.json
@@ -0,0 +1,10 @@
+{
+ "imports": {
+ "moment": "./moment/moment.ts",
+ "moment/": "./moment/",
+ "lodash": "./lodash/lodash.ts",
+ "lodash/": "./lodash/",
+ "https://www.unpkg.com/vue/dist/vue.runtime.esm.js": "./vue.ts",
+ "print_hello": "./print_hello.ts"
+ }
+}
diff --git a/tests/specs/run/_033_import_map_remote/lodash/lodash.ts b/tests/specs/run/_033_import_map_remote/lodash/lodash.ts
new file mode 100644
index 000000000..2ec04ed3c
--- /dev/null
+++ b/tests/specs/run/_033_import_map_remote/lodash/lodash.ts
@@ -0,0 +1 @@
+console.log("Hello from remapped lodash!");
diff --git a/tests/specs/run/_033_import_map_remote/lodash/other_file.ts b/tests/specs/run/_033_import_map_remote/lodash/other_file.ts
new file mode 100644
index 000000000..714adae3f
--- /dev/null
+++ b/tests/specs/run/_033_import_map_remote/lodash/other_file.ts
@@ -0,0 +1 @@
+console.log("Hello from remapped lodash dir!");
diff --git a/tests/specs/run/_033_import_map_remote/moment/moment.ts b/tests/specs/run/_033_import_map_remote/moment/moment.ts
new file mode 100644
index 000000000..2b54a431e
--- /dev/null
+++ b/tests/specs/run/_033_import_map_remote/moment/moment.ts
@@ -0,0 +1 @@
+console.log("Hello from remapped moment!");
diff --git a/tests/specs/run/_033_import_map_remote/moment/other_file.ts b/tests/specs/run/_033_import_map_remote/moment/other_file.ts
new file mode 100644
index 000000000..24f3a0226
--- /dev/null
+++ b/tests/specs/run/_033_import_map_remote/moment/other_file.ts
@@ -0,0 +1 @@
+console.log("Hello from remapped moment dir!");
diff --git a/tests/specs/run/_033_import_map_remote/print_hello.ts b/tests/specs/run/_033_import_map_remote/print_hello.ts
new file mode 100644
index 000000000..794257390
--- /dev/null
+++ b/tests/specs/run/_033_import_map_remote/print_hello.ts
@@ -0,0 +1,3 @@
+export function printHello() {
+ console.log("Hello, world!");
+}
diff --git a/tests/specs/run/_033_import_map_remote/test_remote.ts b/tests/specs/run/_033_import_map_remote/test_remote.ts
new file mode 100644
index 000000000..206bdbd5f
--- /dev/null
+++ b/tests/specs/run/_033_import_map_remote/test_remote.ts
@@ -0,0 +1,5 @@
+import "moment";
+import "moment/other_file.ts";
+import "lodash";
+import "lodash/other_file.ts";
+import "https://www.unpkg.com/vue/dist/vue.runtime.esm.js";
diff --git a/tests/specs/run/_033_import_map_remote/vue.ts b/tests/specs/run/_033_import_map_remote/vue.ts
new file mode 100644
index 000000000..76dbe1917
--- /dev/null
+++ b/tests/specs/run/_033_import_map_remote/vue.ts
@@ -0,0 +1 @@
+console.log("Hello from remapped Vue!");
diff --git a/tests/specs/run/_033_import_map_vendor_dir_remote/033_import_map_remote.out b/tests/specs/run/_033_import_map_vendor_dir_remote/033_import_map_remote.out
new file mode 100644
index 000000000..804fa0d57
--- /dev/null
+++ b/tests/specs/run/_033_import_map_vendor_dir_remote/033_import_map_remote.out
@@ -0,0 +1,5 @@
+Hello from remapped moment!
+Hello from remapped moment dir!
+Hello from remapped lodash!
+Hello from remapped lodash dir!
+Hello from remapped Vue!
diff --git a/tests/specs/run/_033_import_map_vendor_dir_remote/__test__.jsonc b/tests/specs/run/_033_import_map_vendor_dir_remote/__test__.jsonc
new file mode 100644
index 000000000..4eb3a22c5
--- /dev/null
+++ b/tests/specs/run/_033_import_map_vendor_dir_remote/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --quiet --reload --allow-import --import-map=import_map_remote.json --vendor test_remote.ts",
+ "output": "033_import_map_remote.out"
+}
diff --git a/tests/specs/run/_033_import_map_vendor_dir_remote/import_map_remote.json b/tests/specs/run/_033_import_map_vendor_dir_remote/import_map_remote.json
new file mode 100644
index 000000000..190fc4f55
--- /dev/null
+++ b/tests/specs/run/_033_import_map_vendor_dir_remote/import_map_remote.json
@@ -0,0 +1,10 @@
+{
+ "imports": {
+ "moment": "./moment/moment.ts",
+ "moment/": "./moment/",
+ "lodash": "./lodash/lodash.ts",
+ "lodash/": "./lodash/",
+ "https://www.unpkg.com/vue/dist/vue.runtime.esm.js": "./vue.ts",
+ "print_hello": "./print_hello.ts"
+ }
+}
diff --git a/tests/specs/run/_033_import_map_vendor_dir_remote/lodash/lodash.ts b/tests/specs/run/_033_import_map_vendor_dir_remote/lodash/lodash.ts
new file mode 100644
index 000000000..2ec04ed3c
--- /dev/null
+++ b/tests/specs/run/_033_import_map_vendor_dir_remote/lodash/lodash.ts
@@ -0,0 +1 @@
+console.log("Hello from remapped lodash!");
diff --git a/tests/specs/run/_033_import_map_vendor_dir_remote/lodash/other_file.ts b/tests/specs/run/_033_import_map_vendor_dir_remote/lodash/other_file.ts
new file mode 100644
index 000000000..714adae3f
--- /dev/null
+++ b/tests/specs/run/_033_import_map_vendor_dir_remote/lodash/other_file.ts
@@ -0,0 +1 @@
+console.log("Hello from remapped lodash dir!");
diff --git a/tests/specs/run/_033_import_map_vendor_dir_remote/moment/moment.ts b/tests/specs/run/_033_import_map_vendor_dir_remote/moment/moment.ts
new file mode 100644
index 000000000..2b54a431e
--- /dev/null
+++ b/tests/specs/run/_033_import_map_vendor_dir_remote/moment/moment.ts
@@ -0,0 +1 @@
+console.log("Hello from remapped moment!");
diff --git a/tests/specs/run/_033_import_map_vendor_dir_remote/moment/other_file.ts b/tests/specs/run/_033_import_map_vendor_dir_remote/moment/other_file.ts
new file mode 100644
index 000000000..24f3a0226
--- /dev/null
+++ b/tests/specs/run/_033_import_map_vendor_dir_remote/moment/other_file.ts
@@ -0,0 +1 @@
+console.log("Hello from remapped moment dir!");
diff --git a/tests/specs/run/_033_import_map_vendor_dir_remote/print_hello.ts b/tests/specs/run/_033_import_map_vendor_dir_remote/print_hello.ts
new file mode 100644
index 000000000..794257390
--- /dev/null
+++ b/tests/specs/run/_033_import_map_vendor_dir_remote/print_hello.ts
@@ -0,0 +1,3 @@
+export function printHello() {
+ console.log("Hello, world!");
+}
diff --git a/tests/specs/run/_033_import_map_vendor_dir_remote/test_remote.ts b/tests/specs/run/_033_import_map_vendor_dir_remote/test_remote.ts
new file mode 100644
index 000000000..206bdbd5f
--- /dev/null
+++ b/tests/specs/run/_033_import_map_vendor_dir_remote/test_remote.ts
@@ -0,0 +1,5 @@
+import "moment";
+import "moment/other_file.ts";
+import "lodash";
+import "lodash/other_file.ts";
+import "https://www.unpkg.com/vue/dist/vue.runtime.esm.js";
diff --git a/tests/specs/run/_033_import_map_vendor_dir_remote/vue.ts b/tests/specs/run/_033_import_map_vendor_dir_remote/vue.ts
new file mode 100644
index 000000000..76dbe1917
--- /dev/null
+++ b/tests/specs/run/_033_import_map_vendor_dir_remote/vue.ts
@@ -0,0 +1 @@
+console.log("Hello from remapped Vue!");
diff --git a/tests/specs/run/_035_cached_only_flag/019_media_types.ts b/tests/specs/run/_035_cached_only_flag/019_media_types.ts
new file mode 100644
index 000000000..d985bd249
--- /dev/null
+++ b/tests/specs/run/_035_cached_only_flag/019_media_types.ts
@@ -0,0 +1,24 @@
+// When run against the test HTTP server, it will serve different media types
+// based on the URL containing `.t#.` strings, which exercises the different
+// mapping of media types end to end.
+
+import { loaded as loadedTs1 } from "http://localhost:4545/subdir/mt_text_typescript.t1.ts";
+import { loaded as loadedTs2 } from "http://localhost:4545/subdir/mt_video_vdn.t2.ts";
+import { loaded as loadedTs3 } from "http://localhost:4545/subdir/mt_video_mp2t.t3.ts";
+import { loaded as loadedTs4 } from "http://localhost:4545/subdir/mt_application_x_typescript.t4.ts";
+import { loaded as loadedJs1 } from "http://localhost:4545/subdir/mt_text_javascript.j1.js";
+import { loaded as loadedJs2 } from "http://localhost:4545/subdir/mt_application_ecmascript.j2.js";
+import { loaded as loadedJs3 } from "http://localhost:4545/subdir/mt_text_ecmascript.j3.js";
+import { loaded as loadedJs4 } from "http://localhost:4545/subdir/mt_application_x_javascript.j4.js";
+
+console.log(
+ "success",
+ loadedTs1,
+ loadedTs2,
+ loadedTs3,
+ loadedTs4,
+ loadedJs1,
+ loadedJs2,
+ loadedJs3,
+ loadedJs4,
+);
diff --git a/tests/specs/run/_035_cached_only_flag/035_cached_only_flag.out b/tests/specs/run/_035_cached_only_flag/035_cached_only_flag.out
new file mode 100644
index 000000000..aad3f2fbc
--- /dev/null
+++ b/tests/specs/run/_035_cached_only_flag/035_cached_only_flag.out
@@ -0,0 +1 @@
+error: Specifier not found in cache: "http://127.0.0.1:4545/019_media_types.ts", --cached-only is specified.
diff --git a/tests/specs/run/_035_cached_only_flag/__test__.jsonc b/tests/specs/run/_035_cached_only_flag/__test__.jsonc
new file mode 100644
index 000000000..ac9d01cdd
--- /dev/null
+++ b/tests/specs/run/_035_cached_only_flag/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run --reload --check --allow-import --cached-only http://127.0.0.1:4545/019_media_types.ts",
+ "output": "035_cached_only_flag.out",
+ "exitCode": 1
+}
diff --git a/tests/specs/run/_038_checkjs/038_checkjs.js b/tests/specs/run/_038_checkjs/038_checkjs.js
new file mode 100644
index 000000000..f0856d94c
--- /dev/null
+++ b/tests/specs/run/_038_checkjs/038_checkjs.js
@@ -0,0 +1,5 @@
+// console.log intentionally misspelled to trigger a type error
+consol.log("hello world!");
+
+// the following error should be ignored and not output to the console
+const foo = new Foo();
diff --git a/tests/specs/run/_038_checkjs/038_checkjs.js.out b/tests/specs/run/_038_checkjs/038_checkjs.js.out
new file mode 100644
index 000000000..4ea473e4f
--- /dev/null
+++ b/tests/specs/run/_038_checkjs/038_checkjs.js.out
@@ -0,0 +1,22 @@
+[WILDCARD]
+error: TS2552 [ERROR]: Cannot find name 'consol'. Did you mean 'console'?
+consol.log("hello world!");
+~~~~~~
+ at [WILDCARD]/038_checkjs.js:2:1
+
+ 'console' is declared here.
+ declare var console: Console;
+ ~~~~~~~
+ at [WILDCARD]
+
+TS2552 [ERROR]: Cannot find name 'Foo'. Did you mean 'foo'?
+const foo = new Foo();
+ ~~~
+ at [WILDCARD]/038_checkjs.js:5:17
+
+ 'foo' is declared here.
+ const foo = new Foo();
+ ~~~
+ at [WILDCARD]/038_checkjs.js:5:7
+
+Found 2 errors.
diff --git a/tests/specs/run/_038_checkjs/__test__.jsonc b/tests/specs/run/_038_checkjs/__test__.jsonc
new file mode 100644
index 000000000..6915787d2
--- /dev/null
+++ b/tests/specs/run/_038_checkjs/__test__.jsonc
@@ -0,0 +1,6 @@
+{
+ // checking if JS file is run through TS compiler
+ "args": "run --reload --config checkjs.tsconfig.json --check 038_checkjs.js",
+ "exitCode": 1,
+ "output": "038_checkjs.js.out"
+}
diff --git a/tests/specs/run/_038_checkjs/checkjs.tsconfig.json b/tests/specs/run/_038_checkjs/checkjs.tsconfig.json
new file mode 100644
index 000000000..08ac60b6c
--- /dev/null
+++ b/tests/specs/run/_038_checkjs/checkjs.tsconfig.json
@@ -0,0 +1,5 @@
+{
+ "compilerOptions": {
+ "checkJs": true
+ }
+}
diff --git a/tests/specs/run/_042_dyn_import_evalcontext/042_dyn_import_evalcontext.ts b/tests/specs/run/_042_dyn_import_evalcontext/042_dyn_import_evalcontext.ts
new file mode 100644
index 000000000..f39ae2468
--- /dev/null
+++ b/tests/specs/run/_042_dyn_import_evalcontext/042_dyn_import_evalcontext.ts
@@ -0,0 +1,5 @@
+// @ts-expect-error "Deno[Deno.internal].core" is not a public interface
+Deno[Deno.internal].core.evalContext(
+ "(async () => console.log(await import('./_042_dyn_import_evalcontext/mod4.js')))()",
+ new URL("..", import.meta.url).href,
+);
diff --git a/tests/specs/run/_042_dyn_import_evalcontext/042_dyn_import_evalcontext.ts.out b/tests/specs/run/_042_dyn_import_evalcontext/042_dyn_import_evalcontext.ts.out
new file mode 100644
index 000000000..89e16b478
--- /dev/null
+++ b/tests/specs/run/_042_dyn_import_evalcontext/042_dyn_import_evalcontext.ts.out
@@ -0,0 +1 @@
+[Module: null prototype] { isMod4: true }
diff --git a/tests/specs/run/_042_dyn_import_evalcontext/__test__.jsonc b/tests/specs/run/_042_dyn_import_evalcontext/__test__.jsonc
new file mode 100644
index 000000000..e3cb0d184
--- /dev/null
+++ b/tests/specs/run/_042_dyn_import_evalcontext/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --quiet --allow-read --reload 042_dyn_import_evalcontext.ts",
+ "output": "042_dyn_import_evalcontext.ts.out"
+}
diff --git a/tests/specs/run/_042_dyn_import_evalcontext/mod4.js b/tests/specs/run/_042_dyn_import_evalcontext/mod4.js
new file mode 100644
index 000000000..71332dbc4
--- /dev/null
+++ b/tests/specs/run/_042_dyn_import_evalcontext/mod4.js
@@ -0,0 +1 @@
+export const isMod4 = true;
diff --git a/tests/specs/run/_044_bad_resource/044_bad_resource.ts b/tests/specs/run/_044_bad_resource/044_bad_resource.ts
new file mode 100644
index 000000000..c76a11eff
--- /dev/null
+++ b/tests/specs/run/_044_bad_resource/044_bad_resource.ts
@@ -0,0 +1,3 @@
+const file = await Deno.open("./044_bad_resource.ts", { read: true });
+file.close();
+await file.seek(10, 0);
diff --git a/tests/specs/run/_044_bad_resource/044_bad_resource.ts.out b/tests/specs/run/_044_bad_resource/044_bad_resource.ts.out
new file mode 100644
index 000000000..c9912711d
--- /dev/null
+++ b/tests/specs/run/_044_bad_resource/044_bad_resource.ts.out
@@ -0,0 +1,2 @@
+[WILDCARD]error: Uncaught[WILDCARD] BadResource: Bad resource ID
+[WILDCARD]
diff --git a/tests/specs/run/_044_bad_resource/__test__.jsonc b/tests/specs/run/_044_bad_resource/__test__.jsonc
new file mode 100644
index 000000000..cb7832e74
--- /dev/null
+++ b/tests/specs/run/_044_bad_resource/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run --quiet --reload --allow-read 044_bad_resource.ts",
+ "output": "044_bad_resource.ts.out",
+ "exitCode": 1
+}
diff --git a/tests/specs/run/_046_tsx/046_jsx_test.tsx b/tests/specs/run/_046_tsx/046_jsx_test.tsx
new file mode 100644
index 000000000..5ed3ff2fa
--- /dev/null
+++ b/tests/specs/run/_046_tsx/046_jsx_test.tsx
@@ -0,0 +1,14 @@
+declare global {
+ export namespace JSX {
+ interface IntrinsicElements {
+ [elemName: string]: any;
+ }
+ }
+}
+const React = {
+ createElement(factory: any, props: any, ...children: any[]) {
+ return { factory, props, children };
+ },
+};
+const View = () => <div class="deno">land</div>;
+console.log(<View />);
diff --git a/tests/specs/run/_046_tsx/046_jsx_test.tsx.out b/tests/specs/run/_046_tsx/046_jsx_test.tsx.out
new file mode 100644
index 000000000..85cfe824b
--- /dev/null
+++ b/tests/specs/run/_046_tsx/046_jsx_test.tsx.out
@@ -0,0 +1 @@
+{ factory: [Function: View], props: null, children: [] }
diff --git a/tests/specs/run/_046_tsx/__test__.jsonc b/tests/specs/run/_046_tsx/__test__.jsonc
new file mode 100644
index 000000000..28a48ecec
--- /dev/null
+++ b/tests/specs/run/_046_tsx/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --quiet --reload 046_jsx_test.tsx",
+ "output": "046_jsx_test.tsx.out"
+}
diff --git a/tests/specs/run/_047_jsx/047_jsx_test.jsx b/tests/specs/run/_047_jsx/047_jsx_test.jsx
new file mode 100644
index 000000000..4c2314072
--- /dev/null
+++ b/tests/specs/run/_047_jsx/047_jsx_test.jsx
@@ -0,0 +1,7 @@
+const React = {
+ createElement(factory, props, ...children) {
+ return { factory, props, children };
+ },
+};
+const View = () => <div class="deno">land</div>;
+console.log(<View />);
diff --git a/tests/specs/run/_047_jsx/047_jsx_test.jsx.out b/tests/specs/run/_047_jsx/047_jsx_test.jsx.out
new file mode 100644
index 000000000..85cfe824b
--- /dev/null
+++ b/tests/specs/run/_047_jsx/047_jsx_test.jsx.out
@@ -0,0 +1 @@
+{ factory: [Function: View], props: null, children: [] }
diff --git a/tests/specs/run/_047_jsx/__test__.jsonc b/tests/specs/run/_047_jsx/__test__.jsonc
new file mode 100644
index 000000000..bb89db017
--- /dev/null
+++ b/tests/specs/run/_047_jsx/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --quiet --reload 047_jsx_test.jsx",
+ "output": "047_jsx_test.jsx.out"
+}
diff --git a/tests/specs/run/_048_media_types_jsx/048_media_types_jsx.ts b/tests/specs/run/_048_media_types_jsx/048_media_types_jsx.ts
new file mode 100644
index 000000000..8dcd0ad68
--- /dev/null
+++ b/tests/specs/run/_048_media_types_jsx/048_media_types_jsx.ts
@@ -0,0 +1,32 @@
+// When run against the test HTTP server, it will serve different media types
+// based on the URL containing `.t#.` strings, which exercises the different
+// mapping of media types end to end.
+import { loaded as loadedTsx1 } from "http://localhost:4545/subdir/mt_text_typescript_tsx.t1.tsx";
+import { loaded as loadedTsx2 } from "http://localhost:4545/subdir/mt_video_vdn_tsx.t2.tsx";
+import { loaded as loadedTsx3 } from "http://localhost:4545/subdir/mt_video_mp2t_tsx.t3.tsx";
+import { loaded as loadedTsx4 } from "http://localhost:4545/subdir/mt_application_x_typescript_tsx.t4.tsx";
+import { loaded as loadedJsx1 } from "http://localhost:4545/subdir/mt_text_javascript_jsx.j1.jsx";
+import { loaded as loadedJsx2 } from "http://localhost:4545/subdir/mt_application_ecmascript_jsx.j2.jsx";
+import { loaded as loadedJsx3 } from "http://localhost:4545/subdir/mt_text_ecmascript_jsx.j3.jsx";
+import { loaded as loadedJsx4 } from "http://localhost:4545/subdir/mt_application_x_javascript_jsx.j4.jsx";
+
+declare global {
+ namespace JSX {
+ interface IntrinsicElements {
+ // deno-lint-ignore no-explicit-any
+ [elemName: string]: any;
+ }
+ }
+}
+
+console.log(
+ "success",
+ loadedTsx1,
+ loadedTsx2,
+ loadedTsx3,
+ loadedTsx4,
+ loadedJsx1,
+ loadedJsx2,
+ loadedJsx3,
+ loadedJsx4,
+);
diff --git a/tests/specs/run/_048_media_types_jsx/048_media_types_jsx.ts.out b/tests/specs/run/_048_media_types_jsx/048_media_types_jsx.ts.out
new file mode 100644
index 000000000..266cc5741
--- /dev/null
+++ b/tests/specs/run/_048_media_types_jsx/048_media_types_jsx.ts.out
@@ -0,0 +1,2 @@
+[WILDCARD]
+success true true true true true true true true
diff --git a/tests/specs/run/_048_media_types_jsx/__test__.jsonc b/tests/specs/run/_048_media_types_jsx/__test__.jsonc
new file mode 100644
index 000000000..0dec930b0
--- /dev/null
+++ b/tests/specs/run/_048_media_types_jsx/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --reload --allow-import 048_media_types_jsx.ts",
+ "output": "048_media_types_jsx.ts.out"
+}
diff --git a/tests/specs/run/_052_no_remote_flag/019_media_types.ts b/tests/specs/run/_052_no_remote_flag/019_media_types.ts
new file mode 100644
index 000000000..d985bd249
--- /dev/null
+++ b/tests/specs/run/_052_no_remote_flag/019_media_types.ts
@@ -0,0 +1,24 @@
+// When run against the test HTTP server, it will serve different media types
+// based on the URL containing `.t#.` strings, which exercises the different
+// mapping of media types end to end.
+
+import { loaded as loadedTs1 } from "http://localhost:4545/subdir/mt_text_typescript.t1.ts";
+import { loaded as loadedTs2 } from "http://localhost:4545/subdir/mt_video_vdn.t2.ts";
+import { loaded as loadedTs3 } from "http://localhost:4545/subdir/mt_video_mp2t.t3.ts";
+import { loaded as loadedTs4 } from "http://localhost:4545/subdir/mt_application_x_typescript.t4.ts";
+import { loaded as loadedJs1 } from "http://localhost:4545/subdir/mt_text_javascript.j1.js";
+import { loaded as loadedJs2 } from "http://localhost:4545/subdir/mt_application_ecmascript.j2.js";
+import { loaded as loadedJs3 } from "http://localhost:4545/subdir/mt_text_ecmascript.j3.js";
+import { loaded as loadedJs4 } from "http://localhost:4545/subdir/mt_application_x_javascript.j4.js";
+
+console.log(
+ "success",
+ loadedTs1,
+ loadedTs2,
+ loadedTs3,
+ loadedTs4,
+ loadedJs1,
+ loadedJs2,
+ loadedJs3,
+ loadedJs4,
+);
diff --git a/tests/specs/run/_052_no_remote_flag/052_no_remote_flag.out b/tests/specs/run/_052_no_remote_flag/052_no_remote_flag.out
new file mode 100644
index 000000000..c1f9f4e13
--- /dev/null
+++ b/tests/specs/run/_052_no_remote_flag/052_no_remote_flag.out
@@ -0,0 +1 @@
+error: A remote specifier was requested: "http://127.0.0.1:4545/019_media_types.ts", but --no-remote is specified.
diff --git a/tests/specs/run/_052_no_remote_flag/__test__.jsonc b/tests/specs/run/_052_no_remote_flag/__test__.jsonc
new file mode 100644
index 000000000..c8ac477c6
--- /dev/null
+++ b/tests/specs/run/_052_no_remote_flag/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run --reload --check --allow-import --no-remote http://127.0.0.1:4545/019_media_types.ts",
+ "output": "052_no_remote_flag.out",
+ "exitCode": 1
+}
diff --git a/tests/specs/run/_058_tasks_microtasks_close/058_tasks_microtasks_close.ts b/tests/specs/run/_058_tasks_microtasks_close/058_tasks_microtasks_close.ts
new file mode 100644
index 000000000..df6f85ea0
--- /dev/null
+++ b/tests/specs/run/_058_tasks_microtasks_close/058_tasks_microtasks_close.ts
@@ -0,0 +1,19 @@
+// deno-lint-ignore-file no-window-prefix
+console.log("sync 1");
+setTimeout(() => {
+ console.log("setTimeout 1");
+ Promise.resolve().then(() => {
+ console.log("Promise resolve in setTimeout 1");
+ });
+});
+Promise.resolve().then(() => {
+ console.log("promise 1");
+});
+globalThis.close();
+console.log("sync 2");
+setTimeout(() => {
+ console.log("setTimeout 2");
+});
+setTimeout(() => {
+ console.log("setTimeout 3");
+}, 100);
diff --git a/tests/specs/run/_058_tasks_microtasks_close/058_tasks_microtasks_close.ts.out b/tests/specs/run/_058_tasks_microtasks_close/058_tasks_microtasks_close.ts.out
new file mode 100644
index 000000000..218273cab
--- /dev/null
+++ b/tests/specs/run/_058_tasks_microtasks_close/058_tasks_microtasks_close.ts.out
@@ -0,0 +1,6 @@
+sync 1
+sync 2
+promise 1
+setTimeout 1
+Promise resolve in setTimeout 1
+setTimeout 2
diff --git a/tests/specs/run/_058_tasks_microtasks_close/__test__.jsonc b/tests/specs/run/_058_tasks_microtasks_close/__test__.jsonc
new file mode 100644
index 000000000..9eec8f53c
--- /dev/null
+++ b/tests/specs/run/_058_tasks_microtasks_close/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --quiet 058_tasks_microtasks_close.ts",
+ "output": "058_tasks_microtasks_close.ts.out"
+}
diff --git a/tests/specs/run/_059_fs_relative_path_perm/059_fs_relative_path_perm.ts b/tests/specs/run/_059_fs_relative_path_perm/059_fs_relative_path_perm.ts
new file mode 100644
index 000000000..26630fe1c
--- /dev/null
+++ b/tests/specs/run/_059_fs_relative_path_perm/059_fs_relative_path_perm.ts
@@ -0,0 +1,2 @@
+// The permission error message shouldn't include the CWD.
+Deno.readFileSync("non-existent");
diff --git a/tests/specs/run/_059_fs_relative_path_perm/059_fs_relative_path_perm.ts.out b/tests/specs/run/_059_fs_relative_path_perm/059_fs_relative_path_perm.ts.out
new file mode 100644
index 000000000..0d0412208
--- /dev/null
+++ b/tests/specs/run/_059_fs_relative_path_perm/059_fs_relative_path_perm.ts.out
@@ -0,0 +1,4 @@
+[WILDCARD]error: Uncaught (in promise) NotCapable: Requires read access to "non-existent", run again with the --allow-read flag
+Deno.readFileSync("non-existent");
+ ^
+ at [WILDCARD]
diff --git a/tests/specs/run/_059_fs_relative_path_perm/__test__.jsonc b/tests/specs/run/_059_fs_relative_path_perm/__test__.jsonc
new file mode 100644
index 000000000..04a7b8aa4
--- /dev/null
+++ b/tests/specs/run/_059_fs_relative_path_perm/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run 059_fs_relative_path_perm.ts",
+ "output": "059_fs_relative_path_perm.ts.out",
+ "exitCode": 1
+}
diff --git a/tests/specs/run/_063_permissions_revoke/063_permissions_revoke.ts b/tests/specs/run/_063_permissions_revoke/063_permissions_revoke.ts
new file mode 100644
index 000000000..a81eee7cb
--- /dev/null
+++ b/tests/specs/run/_063_permissions_revoke/063_permissions_revoke.ts
@@ -0,0 +1,6 @@
+const status1 = await Deno.permissions.revoke({ name: "read", path: "foo" });
+console.log(status1);
+const status2 = await Deno.permissions.query({ name: "read", path: "bar" });
+console.log(status2);
+const status3 = await Deno.permissions.revoke({ name: "read", path: "bar" });
+console.log(status3);
diff --git a/tests/specs/run/_063_permissions_revoke/063_permissions_revoke.ts.out b/tests/specs/run/_063_permissions_revoke/063_permissions_revoke.ts.out
new file mode 100644
index 000000000..bbd64c557
--- /dev/null
+++ b/tests/specs/run/_063_permissions_revoke/063_permissions_revoke.ts.out
@@ -0,0 +1,3 @@
+[WILDCARD]PermissionStatus { state: "prompt", onchange: null }
+PermissionStatus { state: "granted", onchange: null }
+PermissionStatus { state: "prompt", onchange: null }
diff --git a/tests/specs/run/_063_permissions_revoke/__test__.jsonc b/tests/specs/run/_063_permissions_revoke/__test__.jsonc
new file mode 100644
index 000000000..1dd5ed747
--- /dev/null
+++ b/tests/specs/run/_063_permissions_revoke/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --allow-read=foo,bar 063_permissions_revoke.ts",
+ "output": "063_permissions_revoke.ts.out"
+}
diff --git a/tests/specs/run/_063_permissions_revoke_sync/063_permissions_revoke.ts.out b/tests/specs/run/_063_permissions_revoke_sync/063_permissions_revoke.ts.out
new file mode 100644
index 000000000..bbd64c557
--- /dev/null
+++ b/tests/specs/run/_063_permissions_revoke_sync/063_permissions_revoke.ts.out
@@ -0,0 +1,3 @@
+[WILDCARD]PermissionStatus { state: "prompt", onchange: null }
+PermissionStatus { state: "granted", onchange: null }
+PermissionStatus { state: "prompt", onchange: null }
diff --git a/tests/specs/run/_063_permissions_revoke_sync/063_permissions_revoke_sync.ts b/tests/specs/run/_063_permissions_revoke_sync/063_permissions_revoke_sync.ts
new file mode 100644
index 000000000..267ef3785
--- /dev/null
+++ b/tests/specs/run/_063_permissions_revoke_sync/063_permissions_revoke_sync.ts
@@ -0,0 +1,6 @@
+const status1 = Deno.permissions.revokeSync({ name: "read", path: "foo" });
+console.log(status1);
+const status2 = Deno.permissions.querySync({ name: "read", path: "bar" });
+console.log(status2);
+const status3 = Deno.permissions.revokeSync({ name: "read", path: "bar" });
+console.log(status3);
diff --git a/tests/specs/run/_063_permissions_revoke_sync/__test__.jsonc b/tests/specs/run/_063_permissions_revoke_sync/__test__.jsonc
new file mode 100644
index 000000000..8dd9384e3
--- /dev/null
+++ b/tests/specs/run/_063_permissions_revoke_sync/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --allow-read=foo,bar 063_permissions_revoke_sync.ts",
+ "output": "063_permissions_revoke.ts.out"
+}
diff --git a/tests/specs/run/_064_permissions_revoke_global/064_permissions_revoke_global.ts b/tests/specs/run/_064_permissions_revoke_global/064_permissions_revoke_global.ts
new file mode 100644
index 000000000..a9b1fcd40
--- /dev/null
+++ b/tests/specs/run/_064_permissions_revoke_global/064_permissions_revoke_global.ts
@@ -0,0 +1,6 @@
+const status1 = await Deno.permissions.revoke({ name: "read" });
+console.log(status1);
+const status2 = await Deno.permissions.query({ name: "read", path: "foo" });
+console.log(status2);
+const status3 = await Deno.permissions.query({ name: "read", path: "bar" });
+console.log(status3);
diff --git a/tests/specs/run/_064_permissions_revoke_global/064_permissions_revoke_global.ts.out b/tests/specs/run/_064_permissions_revoke_global/064_permissions_revoke_global.ts.out
new file mode 100644
index 000000000..f7e389a76
--- /dev/null
+++ b/tests/specs/run/_064_permissions_revoke_global/064_permissions_revoke_global.ts.out
@@ -0,0 +1,3 @@
+[WILDCARD]PermissionStatus { state: "prompt", onchange: null }
+PermissionStatus { state: "prompt", onchange: null }
+PermissionStatus { state: "prompt", onchange: null }
diff --git a/tests/specs/run/_064_permissions_revoke_global/__test__.jsonc b/tests/specs/run/_064_permissions_revoke_global/__test__.jsonc
new file mode 100644
index 000000000..929e48ee8
--- /dev/null
+++ b/tests/specs/run/_064_permissions_revoke_global/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --allow-read=foo,bar 064_permissions_revoke_global.ts",
+ "output": "064_permissions_revoke_global.ts.out"
+}
diff --git a/tests/specs/run/_064_permissions_revoke_global_sync/064_permissions_revoke_global.ts.out b/tests/specs/run/_064_permissions_revoke_global_sync/064_permissions_revoke_global.ts.out
new file mode 100644
index 000000000..f7e389a76
--- /dev/null
+++ b/tests/specs/run/_064_permissions_revoke_global_sync/064_permissions_revoke_global.ts.out
@@ -0,0 +1,3 @@
+[WILDCARD]PermissionStatus { state: "prompt", onchange: null }
+PermissionStatus { state: "prompt", onchange: null }
+PermissionStatus { state: "prompt", onchange: null }
diff --git a/tests/specs/run/_064_permissions_revoke_global_sync/064_permissions_revoke_global_sync.ts b/tests/specs/run/_064_permissions_revoke_global_sync/064_permissions_revoke_global_sync.ts
new file mode 100644
index 000000000..597b1481d
--- /dev/null
+++ b/tests/specs/run/_064_permissions_revoke_global_sync/064_permissions_revoke_global_sync.ts
@@ -0,0 +1,6 @@
+const status1 = Deno.permissions.revokeSync({ name: "read" });
+console.log(status1);
+const status2 = Deno.permissions.querySync({ name: "read", path: "foo" });
+console.log(status2);
+const status3 = Deno.permissions.querySync({ name: "read", path: "bar" });
+console.log(status3);
diff --git a/tests/specs/run/_064_permissions_revoke_global_sync/__test__.jsonc b/tests/specs/run/_064_permissions_revoke_global_sync/__test__.jsonc
new file mode 100644
index 000000000..8d6f8079d
--- /dev/null
+++ b/tests/specs/run/_064_permissions_revoke_global_sync/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --allow-read=foo,bar 064_permissions_revoke_global_sync.ts",
+ "output": "064_permissions_revoke_global.ts.out"
+}
diff --git a/tests/specs/run/_065_permissions_revoke_net/065_permissions_revoke_net.ts b/tests/specs/run/_065_permissions_revoke_net/065_permissions_revoke_net.ts
new file mode 100644
index 000000000..40c9d413a
--- /dev/null
+++ b/tests/specs/run/_065_permissions_revoke_net/065_permissions_revoke_net.ts
@@ -0,0 +1,6 @@
+const status1 = await Deno.permissions.query({ name: "net" });
+console.log(status1);
+const status2 = await Deno.permissions.revoke({ name: "net" });
+console.log(status2);
+const status3 = await Deno.permissions.query({ name: "net" });
+console.log(status3);
diff --git a/tests/specs/run/_065_permissions_revoke_net/065_permissions_revoke_net.ts.out b/tests/specs/run/_065_permissions_revoke_net/065_permissions_revoke_net.ts.out
new file mode 100644
index 000000000..a9c941ecd
--- /dev/null
+++ b/tests/specs/run/_065_permissions_revoke_net/065_permissions_revoke_net.ts.out
@@ -0,0 +1,3 @@
+PermissionStatus { state: "granted", onchange: null }
+PermissionStatus { state: "prompt", onchange: null }
+PermissionStatus { state: "prompt", onchange: null }
diff --git a/tests/specs/run/_065_permissions_revoke_net/__test__.jsonc b/tests/specs/run/_065_permissions_revoke_net/__test__.jsonc
new file mode 100644
index 000000000..ab66835fd
--- /dev/null
+++ b/tests/specs/run/_065_permissions_revoke_net/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --allow-net 065_permissions_revoke_net.ts",
+ "output": "065_permissions_revoke_net.ts.out"
+}
diff --git a/tests/specs/run/_070_location/070_location.ts b/tests/specs/run/_070_location/070_location.ts
new file mode 100644
index 000000000..05e5abdf1
--- /dev/null
+++ b/tests/specs/run/_070_location/070_location.ts
@@ -0,0 +1,18 @@
+// deno-lint-ignore-file no-global-assign
+console.log(Location);
+console.log(Location.prototype);
+console.log(location);
+try {
+ location = {};
+} catch (error) {
+ if (error instanceof Error) {
+ console.log(error.toString());
+ }
+}
+try {
+ location.hostname = "bar";
+} catch (error) {
+ if (error instanceof Error) {
+ console.log(error.toString());
+ }
+}
diff --git a/tests/specs/run/_070_location/070_location.ts.out b/tests/specs/run/_070_location/070_location.ts.out
new file mode 100644
index 000000000..a03cf6477
--- /dev/null
+++ b/tests/specs/run/_070_location/070_location.ts.out
@@ -0,0 +1,15 @@
+[class Location]
+Object [Location] {}
+Location {
+ hash: "#bat",
+ host: "foo",
+ hostname: "foo",
+ href: "https://foo/bar?baz#bat",
+ origin: "https://foo",
+ pathname: "/bar",
+ port: "",
+ protocol: "https:",
+ search: "?baz"
+}
+NotSupportedError: Cannot set "location".
+NotSupportedError: Cannot set "location.hostname".
diff --git a/tests/specs/run/_070_location/__test__.jsonc b/tests/specs/run/_070_location/__test__.jsonc
new file mode 100644
index 000000000..ad92752ea
--- /dev/null
+++ b/tests/specs/run/_070_location/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --location https://foo/bar?baz#bat 070_location.ts",
+ "output": "070_location.ts.out"
+}
diff --git a/tests/specs/run/_071_location_unset/071_location_unset.ts b/tests/specs/run/_071_location_unset/071_location_unset.ts
new file mode 100644
index 000000000..f560d2716
--- /dev/null
+++ b/tests/specs/run/_071_location_unset/071_location_unset.ts
@@ -0,0 +1,16 @@
+console.log(Location);
+console.log(Location.prototype);
+console.log(location);
+
+globalThis.location = {
+ hash: "#bat",
+ host: "foo",
+ hostname: "foo",
+ href: "https://foo/bar?baz#bat",
+ origin: "https://foo",
+ pathname: "/bar",
+ port: "",
+ protocol: "https:",
+ search: "?baz",
+};
+console.log(location.pathname);
diff --git a/tests/specs/run/_071_location_unset/071_location_unset.ts.out b/tests/specs/run/_071_location_unset/071_location_unset.ts.out
new file mode 100644
index 000000000..c9482011f
--- /dev/null
+++ b/tests/specs/run/_071_location_unset/071_location_unset.ts.out
@@ -0,0 +1,4 @@
+[class Location]
+Object [Location] {}
+undefined
+/bar
diff --git a/tests/specs/run/_071_location_unset/__test__.jsonc b/tests/specs/run/_071_location_unset/__test__.jsonc
new file mode 100644
index 000000000..946755cf5
--- /dev/null
+++ b/tests/specs/run/_071_location_unset/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run 071_location_unset.ts",
+ "output": "071_location_unset.ts.out"
+}
diff --git a/tests/specs/run/_072_location_relative_fetch/072_location_relative_fetch.ts b/tests/specs/run/_072_location_relative_fetch/072_location_relative_fetch.ts
new file mode 100644
index 000000000..b2a291693
--- /dev/null
+++ b/tests/specs/run/_072_location_relative_fetch/072_location_relative_fetch.ts
@@ -0,0 +1,2 @@
+const response = await fetch("run/fetch/hello.txt");
+console.log(await response.text());
diff --git a/tests/specs/run/_072_location_relative_fetch/072_location_relative_fetch.ts.out b/tests/specs/run/_072_location_relative_fetch/072_location_relative_fetch.ts.out
new file mode 100644
index 000000000..8151f6f88
--- /dev/null
+++ b/tests/specs/run/_072_location_relative_fetch/072_location_relative_fetch.ts.out
@@ -0,0 +1,2 @@
+[WILDCARD]Hello, world!
+
diff --git a/tests/specs/run/_072_location_relative_fetch/__test__.jsonc b/tests/specs/run/_072_location_relative_fetch/__test__.jsonc
new file mode 100644
index 000000000..e6e9e4899
--- /dev/null
+++ b/tests/specs/run/_072_location_relative_fetch/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --location http://127.0.0.1:4545/ --allow-net 072_location_relative_fetch.ts",
+ "output": "072_location_relative_fetch.ts.out"
+}
diff --git a/tests/specs/run/_072_location_relative_fetch/fetch/hello.txt b/tests/specs/run/_072_location_relative_fetch/fetch/hello.txt
new file mode 100644
index 000000000..af5626b4a
--- /dev/null
+++ b/tests/specs/run/_072_location_relative_fetch/fetch/hello.txt
@@ -0,0 +1 @@
+Hello, world!
diff --git a/tests/specs/run/_075_import_local_query_hash/001_hello.js b/tests/specs/run/_075_import_local_query_hash/001_hello.js
new file mode 100644
index 000000000..accefceba
--- /dev/null
+++ b/tests/specs/run/_075_import_local_query_hash/001_hello.js
@@ -0,0 +1 @@
+console.log("Hello World");
diff --git a/tests/specs/run/_075_import_local_query_hash/002_hello.ts b/tests/specs/run/_075_import_local_query_hash/002_hello.ts
new file mode 100644
index 000000000..accefceba
--- /dev/null
+++ b/tests/specs/run/_075_import_local_query_hash/002_hello.ts
@@ -0,0 +1 @@
+console.log("Hello World");
diff --git a/tests/specs/run/_075_import_local_query_hash/075_import_local_query_hash.ts b/tests/specs/run/_075_import_local_query_hash/075_import_local_query_hash.ts
new file mode 100644
index 000000000..99c7ceab4
--- /dev/null
+++ b/tests/specs/run/_075_import_local_query_hash/075_import_local_query_hash.ts
@@ -0,0 +1,2 @@
+import "./001_hello.js?a=b#c";
+import "./002_hello.ts?a=b#c";
diff --git a/tests/specs/run/_075_import_local_query_hash/075_import_local_query_hash.ts.out b/tests/specs/run/_075_import_local_query_hash/075_import_local_query_hash.ts.out
new file mode 100644
index 000000000..340777742
--- /dev/null
+++ b/tests/specs/run/_075_import_local_query_hash/075_import_local_query_hash.ts.out
@@ -0,0 +1,2 @@
+[WILDCARD]Hello World
+Hello World
diff --git a/tests/specs/run/_075_import_local_query_hash/__test__.jsonc b/tests/specs/run/_075_import_local_query_hash/__test__.jsonc
new file mode 100644
index 000000000..521cd3ea8
--- /dev/null
+++ b/tests/specs/run/_075_import_local_query_hash/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run 075_import_local_query_hash.ts",
+ "output": "075_import_local_query_hash.ts.out"
+}
diff --git a/tests/specs/run/_077_fetch_empty/077_fetch_empty.ts b/tests/specs/run/_077_fetch_empty/077_fetch_empty.ts
new file mode 100644
index 000000000..b10a9094e
--- /dev/null
+++ b/tests/specs/run/_077_fetch_empty/077_fetch_empty.ts
@@ -0,0 +1 @@
+await fetch("");
diff --git a/tests/specs/run/_077_fetch_empty/077_fetch_empty.ts.out b/tests/specs/run/_077_fetch_empty/077_fetch_empty.ts.out
new file mode 100644
index 000000000..f11e0f563
--- /dev/null
+++ b/tests/specs/run/_077_fetch_empty/077_fetch_empty.ts.out
@@ -0,0 +1,2 @@
+[WILDCARD]error: Uncaught (in promise) TypeError: Invalid URL: ''
+[WILDCARD]
diff --git a/tests/specs/run/_077_fetch_empty/__test__.jsonc b/tests/specs/run/_077_fetch_empty/__test__.jsonc
new file mode 100644
index 000000000..654b10938
--- /dev/null
+++ b/tests/specs/run/_077_fetch_empty/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run -A 077_fetch_empty.ts",
+ "output": "077_fetch_empty.ts.out",
+ "exitCode": 1
+}
diff --git a/tests/specs/run/_078_unload_on_exit/078_unload_on_exit.ts b/tests/specs/run/_078_unload_on_exit/078_unload_on_exit.ts
new file mode 100644
index 000000000..aaa80c578
--- /dev/null
+++ b/tests/specs/run/_078_unload_on_exit/078_unload_on_exit.ts
@@ -0,0 +1,9 @@
+globalThis.onunload = () => {
+ console.log("onunload is called");
+ // This second exit call doesn't trigger unload event,
+ // and therefore actually stops the process.
+ Deno.exit(1);
+ console.log("This doesn't show up in console");
+};
+// This exit call triggers the above unload event handler.
+Deno.exit(0);
diff --git a/tests/specs/run/_078_unload_on_exit/078_unload_on_exit.ts.out b/tests/specs/run/_078_unload_on_exit/078_unload_on_exit.ts.out
new file mode 100644
index 000000000..e213f9632
--- /dev/null
+++ b/tests/specs/run/_078_unload_on_exit/078_unload_on_exit.ts.out
@@ -0,0 +1 @@
+[WILDCARD]onunload is called
diff --git a/tests/specs/run/_078_unload_on_exit/__test__.jsonc b/tests/specs/run/_078_unload_on_exit/__test__.jsonc
new file mode 100644
index 000000000..4091b7dc9
--- /dev/null
+++ b/tests/specs/run/_078_unload_on_exit/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run 078_unload_on_exit.ts",
+ "output": "078_unload_on_exit.ts.out",
+ "exitCode": 1
+}
diff --git a/tests/specs/run/_079_location_authentication/079_location_authentication.ts b/tests/specs/run/_079_location_authentication/079_location_authentication.ts
new file mode 100644
index 000000000..4989312ac
--- /dev/null
+++ b/tests/specs/run/_079_location_authentication/079_location_authentication.ts
@@ -0,0 +1 @@
+console.log(location.href);
diff --git a/tests/specs/run/_079_location_authentication/079_location_authentication.ts.out b/tests/specs/run/_079_location_authentication/079_location_authentication.ts.out
new file mode 100644
index 000000000..0dd73f999
--- /dev/null
+++ b/tests/specs/run/_079_location_authentication/079_location_authentication.ts.out
@@ -0,0 +1 @@
+https://baz/qux
diff --git a/tests/specs/run/_079_location_authentication/__test__.jsonc b/tests/specs/run/_079_location_authentication/__test__.jsonc
new file mode 100644
index 000000000..30ba27949
--- /dev/null
+++ b/tests/specs/run/_079_location_authentication/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --location https://foo:bar@baz/qux 079_location_authentication.ts",
+ "output": "079_location_authentication.ts.out"
+}
diff --git a/tests/specs/run/_081_location_relative_fetch_redirect/081_location_relative_fetch_redirect.ts b/tests/specs/run/_081_location_relative_fetch_redirect/081_location_relative_fetch_redirect.ts
new file mode 100644
index 000000000..742ef0afb
--- /dev/null
+++ b/tests/specs/run/_081_location_relative_fetch_redirect/081_location_relative_fetch_redirect.ts
@@ -0,0 +1,2 @@
+const response = await fetch("/");
+console.log(response.url);
diff --git a/tests/specs/run/_081_location_relative_fetch_redirect/081_location_relative_fetch_redirect.ts.out b/tests/specs/run/_081_location_relative_fetch_redirect/081_location_relative_fetch_redirect.ts.out
new file mode 100644
index 000000000..f62b93195
--- /dev/null
+++ b/tests/specs/run/_081_location_relative_fetch_redirect/081_location_relative_fetch_redirect.ts.out
@@ -0,0 +1 @@
+[WILDCARD]http://localhost:4545/
diff --git a/tests/specs/run/_081_location_relative_fetch_redirect/__test__.jsonc b/tests/specs/run/_081_location_relative_fetch_redirect/__test__.jsonc
new file mode 100644
index 000000000..6756bf6d1
--- /dev/null
+++ b/tests/specs/run/_081_location_relative_fetch_redirect/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --location http://127.0.0.1:4546/ --allow-net 081_location_relative_fetch_redirect.ts",
+ "output": "081_location_relative_fetch_redirect.ts.out"
+}
diff --git a/tests/specs/run/_082_prepare_stack_trace_throw/082_prepare_stack_trace_throw.js b/tests/specs/run/_082_prepare_stack_trace_throw/082_prepare_stack_trace_throw.js
new file mode 100644
index 000000000..8137bfdc8
--- /dev/null
+++ b/tests/specs/run/_082_prepare_stack_trace_throw/082_prepare_stack_trace_throw.js
@@ -0,0 +1,6 @@
+Error.prepareStackTrace = () => {
+ console.trace();
+ throw new Error("foo");
+};
+
+new Error("bar").stack;
diff --git a/tests/specs/run/_082_prepare_stack_trace_throw/082_prepare_stack_trace_throw.js.out b/tests/specs/run/_082_prepare_stack_trace_throw/082_prepare_stack_trace_throw.js.out
new file mode 100644
index 000000000..b6715c749
--- /dev/null
+++ b/tests/specs/run/_082_prepare_stack_trace_throw/082_prepare_stack_trace_throw.js.out
@@ -0,0 +1,2 @@
+[WILDCARD]error: Uncaught (in promise) Error: foo
+[WILDCARD]
diff --git a/tests/specs/run/_082_prepare_stack_trace_throw/__test__.jsonc b/tests/specs/run/_082_prepare_stack_trace_throw/__test__.jsonc
new file mode 100644
index 000000000..41b27e3bd
--- /dev/null
+++ b/tests/specs/run/_082_prepare_stack_trace_throw/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run 082_prepare_stack_trace_throw.js",
+ "output": "082_prepare_stack_trace_throw.js.out",
+ "exitCode": 1
+}
diff --git a/tests/specs/run/_088_dynamic_import_already_evaluating/088_dynamic_import_already_evaluating.ts b/tests/specs/run/_088_dynamic_import_already_evaluating/088_dynamic_import_already_evaluating.ts
new file mode 100644
index 000000000..272163a5d
--- /dev/null
+++ b/tests/specs/run/_088_dynamic_import_already_evaluating/088_dynamic_import_already_evaluating.ts
@@ -0,0 +1,2 @@
+import("./088_dynamic_import_target.ts").then(() => console.log(3));
+import("./088_dynamic_import_target.ts").then(() => console.log(3));
diff --git a/tests/specs/run/_088_dynamic_import_already_evaluating/088_dynamic_import_already_evaluating.ts.out b/tests/specs/run/_088_dynamic_import_already_evaluating/088_dynamic_import_already_evaluating.ts.out
new file mode 100644
index 000000000..a36dd11e7
--- /dev/null
+++ b/tests/specs/run/_088_dynamic_import_already_evaluating/088_dynamic_import_already_evaluating.ts.out
@@ -0,0 +1,4 @@
+[WILDCARD]1
+2
+3
+3
diff --git a/tests/specs/run/_088_dynamic_import_already_evaluating/088_dynamic_import_target.ts b/tests/specs/run/_088_dynamic_import_already_evaluating/088_dynamic_import_target.ts
new file mode 100644
index 000000000..226f1851a
--- /dev/null
+++ b/tests/specs/run/_088_dynamic_import_already_evaluating/088_dynamic_import_target.ts
@@ -0,0 +1,3 @@
+console.log(1);
+await new Promise((r) => setTimeout(r, 100));
+console.log(2);
diff --git a/tests/specs/run/_088_dynamic_import_already_evaluating/__test__.jsonc b/tests/specs/run/_088_dynamic_import_already_evaluating/__test__.jsonc
new file mode 100644
index 000000000..4ce912bf8
--- /dev/null
+++ b/tests/specs/run/_088_dynamic_import_already_evaluating/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --allow-read 088_dynamic_import_already_evaluating.ts",
+ "output": "088_dynamic_import_already_evaluating.ts.out"
+}
diff --git a/tests/specs/run/_091_use_define_for_class_fields/091_use_define_for_class_fields.ts b/tests/specs/run/_091_use_define_for_class_fields/091_use_define_for_class_fields.ts
new file mode 100644
index 000000000..46be3ac0b
--- /dev/null
+++ b/tests/specs/run/_091_use_define_for_class_fields/091_use_define_for_class_fields.ts
@@ -0,0 +1,4 @@
+class _A {
+ b = this.a;
+ constructor(public a: unknown) {}
+}
diff --git a/tests/specs/run/_091_use_define_for_class_fields/091_use_define_for_class_fields.ts.out b/tests/specs/run/_091_use_define_for_class_fields/091_use_define_for_class_fields.ts.out
new file mode 100644
index 000000000..08f94a967
--- /dev/null
+++ b/tests/specs/run/_091_use_define_for_class_fields/091_use_define_for_class_fields.ts.out
@@ -0,0 +1,4 @@
+[WILDCARD]error: TS2729 [ERROR]: Property 'a' is used before its initialization.
+ b = this.a;
+ ^
+[WILDCARD]
diff --git a/tests/specs/run/_091_use_define_for_class_fields/__test__.jsonc b/tests/specs/run/_091_use_define_for_class_fields/__test__.jsonc
new file mode 100644
index 000000000..100db44aa
--- /dev/null
+++ b/tests/specs/run/_091_use_define_for_class_fields/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run --check 091_use_define_for_class_fields.ts",
+ "output": "091_use_define_for_class_fields.ts.out",
+ "exitCode": 1
+}
diff --git a/tests/specs/run/aggregate_error/__test__.jsonc b/tests/specs/run/aggregate_error/__test__.jsonc
new file mode 100644
index 000000000..e9bd82481
--- /dev/null
+++ b/tests/specs/run/aggregate_error/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run --quiet aggregate_error.ts",
+ "output": "aggregate_error.out",
+ "exitCode": 1
+}
diff --git a/tests/specs/run/aggregate_error/aggregate_error.out b/tests/specs/run/aggregate_error/aggregate_error.out
new file mode 100644
index 000000000..59c0fb2a5
--- /dev/null
+++ b/tests/specs/run/aggregate_error/aggregate_error.out
@@ -0,0 +1,18 @@
+AggregateError: Multiple errors.
+ at [WILDCARD]/aggregate_error.ts:1:24
+
+AggregateError: Multiple errors.
+ Error: Error message 1.
+ at [WILDCARD]/aggregate_error.ts:2:3
+ Error: Error message 2.
+ at [WILDCARD]/aggregate_error.ts:3:3
+ at [WILDCARD]/aggregate_error.ts:1:24
+
+error: Uncaught (in promise) AggregateError: Multiple errors.
+ Error: Error message 1.
+ at [WILDCARD]/aggregate_error.ts:2:3
+ Error: Error message 2.
+ at [WILDCARD]/aggregate_error.ts:3:3
+const aggregateError = new AggregateError([
+ ^
+ at [WILDCARD]/aggregate_error.ts:1:24
diff --git a/tests/specs/run/aggregate_error/aggregate_error.ts b/tests/specs/run/aggregate_error/aggregate_error.ts
new file mode 100644
index 000000000..ce4b54376
--- /dev/null
+++ b/tests/specs/run/aggregate_error/aggregate_error.ts
@@ -0,0 +1,9 @@
+const aggregateError = new AggregateError([
+ new Error("Error message 1."),
+ new Error("Error message 2."),
+], "Multiple errors.");
+console.log(aggregateError.stack);
+console.log();
+console.log(aggregateError);
+console.log();
+throw aggregateError;
diff --git a/tests/specs/run/async_error/__test__.jsonc b/tests/specs/run/async_error/__test__.jsonc
new file mode 100644
index 000000000..86c31adac
--- /dev/null
+++ b/tests/specs/run/async_error/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run --reload async_error.ts",
+ "output": "async_error.ts.out",
+ "exitCode": 1
+}
diff --git a/tests/specs/run/async_error/async_error.ts b/tests/specs/run/async_error/async_error.ts
new file mode 100644
index 000000000..b55c73aeb
--- /dev/null
+++ b/tests/specs/run/async_error/async_error.ts
@@ -0,0 +1,9 @@
+console.log("hello");
+// deno-lint-ignore require-await
+const foo = async (): Promise<never> => {
+ console.log("before error");
+ throw Error("error");
+};
+
+foo();
+console.log("world");
diff --git a/tests/specs/run/async_error/async_error.ts.out b/tests/specs/run/async_error/async_error.ts.out
new file mode 100644
index 000000000..b424f9072
--- /dev/null
+++ b/tests/specs/run/async_error/async_error.ts.out
@@ -0,0 +1,8 @@
+[WILDCARD]hello
+before error
+world
+error: Uncaught (in promise) Error: error
+ throw Error("error");
+ ^
+ at foo ([WILDCARD]/async_error.ts:5:9)
+ at [WILDCARD]/async_error.ts:8:1
diff --git a/tests/specs/run/beforeunload_event/__test__.jsonc b/tests/specs/run/beforeunload_event/__test__.jsonc
new file mode 100644
index 000000000..01c7e7007
--- /dev/null
+++ b/tests/specs/run/beforeunload_event/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run before_unload.js",
+ "output": "before_unload.js.out"
+}
diff --git a/tests/specs/run/beforeunload_event/before_unload.js b/tests/specs/run/beforeunload_event/before_unload.js
new file mode 100644
index 000000000..2572e512b
--- /dev/null
+++ b/tests/specs/run/beforeunload_event/before_unload.js
@@ -0,0 +1,21 @@
+let count = 0;
+
+console.log("0");
+
+globalThis.addEventListener("beforeunload", (e) => {
+ console.log("GOT EVENT");
+ if (count === 0 || count === 1) {
+ e.preventDefault();
+ setTimeout(() => {
+ console.log("3");
+ }, 100);
+ }
+
+ count++;
+});
+
+console.log("1");
+
+setTimeout(() => {
+ console.log("2");
+}, 100);
diff --git a/tests/specs/run/beforeunload_event/before_unload.js.out b/tests/specs/run/beforeunload_event/before_unload.js.out
new file mode 100644
index 000000000..f1f2ab49a
--- /dev/null
+++ b/tests/specs/run/beforeunload_event/before_unload.js.out
@@ -0,0 +1,8 @@
+0
+1
+2
+GOT EVENT
+3
+GOT EVENT
+3
+GOT EVENT
diff --git a/tests/specs/run/blob_gc_finalization/__test__.jsonc b/tests/specs/run/blob_gc_finalization/__test__.jsonc
new file mode 100644
index 000000000..20a8128fc
--- /dev/null
+++ b/tests/specs/run/blob_gc_finalization/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run blob_gc_finalization.js",
+ "output": "blob_gc_finalization.js.out",
+ "exitCode": 0
+}
diff --git a/tests/specs/run/blob_gc_finalization/blob_gc_finalization.js b/tests/specs/run/blob_gc_finalization/blob_gc_finalization.js
new file mode 100644
index 000000000..c721e6b45
--- /dev/null
+++ b/tests/specs/run/blob_gc_finalization/blob_gc_finalization.js
@@ -0,0 +1,11 @@
+// This test creates 128 blobs of 128 MB each. This will only work if the blobs
+// and their backing data is GCed as expected.
+for (let i = 0; i < 128; i++) {
+ // Create a 128MB byte array, and then a blob from it.
+ const buf = new Uint8Array(128 * 1024 * 1024);
+ new Blob([buf]);
+ // It is very important that there is a yield here, otherwise the finalizer
+ // for the blob is not called and the memory is not freed.
+ await new Promise((resolve) => setTimeout(resolve, 0));
+}
+console.log("GCed all blobs");
diff --git a/tests/specs/run/blob_gc_finalization/blob_gc_finalization.js.out b/tests/specs/run/blob_gc_finalization/blob_gc_finalization.js.out
new file mode 100644
index 000000000..dcc4500f8
--- /dev/null
+++ b/tests/specs/run/blob_gc_finalization/blob_gc_finalization.js.out
@@ -0,0 +1 @@
+GCed all blobs
diff --git a/tests/specs/run/byte_order_mark/001_hello.js b/tests/specs/run/byte_order_mark/001_hello.js
new file mode 100644
index 000000000..accefceba
--- /dev/null
+++ b/tests/specs/run/byte_order_mark/001_hello.js
@@ -0,0 +1 @@
+console.log("Hello World");
diff --git a/tests/specs/run/byte_order_mark/__test__.jsonc b/tests/specs/run/byte_order_mark/__test__.jsonc
new file mode 100644
index 000000000..f47cb7d02
--- /dev/null
+++ b/tests/specs/run/byte_order_mark/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --no-check byte_order_mark.ts",
+ "output": "byte_order_mark.out"
+}
diff --git a/tests/specs/run/byte_order_mark/byte_order_mark.out b/tests/specs/run/byte_order_mark/byte_order_mark.out
new file mode 100644
index 000000000..557db03de
--- /dev/null
+++ b/tests/specs/run/byte_order_mark/byte_order_mark.out
@@ -0,0 +1 @@
+Hello World
diff --git a/tests/specs/run/byte_order_mark/byte_order_mark.ts b/tests/specs/run/byte_order_mark/byte_order_mark.ts
new file mode 100644
index 000000000..71da3e1e9
--- /dev/null
+++ b/tests/specs/run/byte_order_mark/byte_order_mark.ts
@@ -0,0 +1,4 @@
+import "./001_hello.js";
+// Note this file starts with special byte order mark <U+FEFF>
+// it's important that this file is a .ts typescript file which is passed to
+// deno through `--no-check` mode.
diff --git a/tests/specs/run/check_js_points_to_ts/__test__.jsonc b/tests/specs/run/check_js_points_to_ts/__test__.jsonc
new file mode 100644
index 000000000..a63b9e5a4
--- /dev/null
+++ b/tests/specs/run/check_js_points_to_ts/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run --quiet --check --config checkjs.tsconfig.json check_js_points_to_ts/test.js",
+ "output": "check_js_points_to_ts/test.js.out",
+ "exitCode": 1
+}
diff --git a/tests/specs/run/check_js_points_to_ts/check_js_points_to_ts/bar.ts b/tests/specs/run/check_js_points_to_ts/check_js_points_to_ts/bar.ts
new file mode 100644
index 000000000..026cd2f1e
--- /dev/null
+++ b/tests/specs/run/check_js_points_to_ts/check_js_points_to_ts/bar.ts
@@ -0,0 +1,3 @@
+export function bar(): string {
+ return 42;
+}
diff --git a/tests/specs/run/check_js_points_to_ts/check_js_points_to_ts/foo.d.ts b/tests/specs/run/check_js_points_to_ts/check_js_points_to_ts/foo.d.ts
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/tests/specs/run/check_js_points_to_ts/check_js_points_to_ts/foo.d.ts
diff --git a/tests/specs/run/check_js_points_to_ts/check_js_points_to_ts/foo.js b/tests/specs/run/check_js_points_to_ts/check_js_points_to_ts/foo.js
new file mode 100644
index 000000000..9ac1a14ff
--- /dev/null
+++ b/tests/specs/run/check_js_points_to_ts/check_js_points_to_ts/foo.js
@@ -0,0 +1,4 @@
+import { bar } from "./bar.ts";
+export function foo() {
+ bar();
+}
diff --git a/tests/specs/run/check_js_points_to_ts/check_js_points_to_ts/test.js b/tests/specs/run/check_js_points_to_ts/check_js_points_to_ts/test.js
new file mode 100644
index 000000000..00d894451
--- /dev/null
+++ b/tests/specs/run/check_js_points_to_ts/check_js_points_to_ts/test.js
@@ -0,0 +1,3 @@
+// @deno-types="./foo.d.ts"
+import { foo } from "./foo.js";
+foo();
diff --git a/tests/specs/run/check_js_points_to_ts/check_js_points_to_ts/test.js.out b/tests/specs/run/check_js_points_to_ts/check_js_points_to_ts/test.js.out
new file mode 100644
index 000000000..67cda9a65
--- /dev/null
+++ b/tests/specs/run/check_js_points_to_ts/check_js_points_to_ts/test.js.out
@@ -0,0 +1,4 @@
+error: TS2322 [ERROR]: Type 'number' is not assignable to type 'string'.
+ return 42;
+ ~~~~~~
+ at [WILDCARD]
diff --git a/tests/specs/run/check_js_points_to_ts/checkjs.tsconfig.json b/tests/specs/run/check_js_points_to_ts/checkjs.tsconfig.json
new file mode 100644
index 000000000..08ac60b6c
--- /dev/null
+++ b/tests/specs/run/check_js_points_to_ts/checkjs.tsconfig.json
@@ -0,0 +1,5 @@
+{
+ "compilerOptions": {
+ "checkJs": true
+ }
+}
diff --git a/tests/specs/run/check_remote/__test__.jsonc b/tests/specs/run/check_remote/__test__.jsonc
new file mode 100644
index 000000000..6543e61b3
--- /dev/null
+++ b/tests/specs/run/check_remote/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run --quiet --allow-import --reload --check=all no_check_remote.ts",
+ "output": "no_check_remote.ts.disabled.out",
+ "exitCode": 1
+}
diff --git a/tests/specs/run/check_remote/no_check_remote.ts b/tests/specs/run/check_remote/no_check_remote.ts
new file mode 100644
index 000000000..f42dadf8a
--- /dev/null
+++ b/tests/specs/run/check_remote/no_check_remote.ts
@@ -0,0 +1,3 @@
+import * as a from "./type_error.ts";
+
+console.log(a.a);
diff --git a/tests/specs/run/check_remote/no_check_remote.ts.disabled.out b/tests/specs/run/check_remote/no_check_remote.ts.disabled.out
new file mode 100644
index 000000000..06c046072
--- /dev/null
+++ b/tests/specs/run/check_remote/no_check_remote.ts.disabled.out
@@ -0,0 +1,4 @@
+error: TS2322 [ERROR]: Type '12' is not assignable to type '"a"'.
+export const a: "a" = 12;
+ ^
+ at [WILDCARD]/type_error.ts:1:14
diff --git a/tests/specs/run/check_remote/type_error.ts b/tests/specs/run/check_remote/type_error.ts
new file mode 100644
index 000000000..cc3c1d29d
--- /dev/null
+++ b/tests/specs/run/check_remote/type_error.ts
@@ -0,0 +1 @@
+export const a: "a" = 12;
diff --git a/tests/specs/run/classic_workers_event_loop/__test__.jsonc b/tests/specs/run/classic_workers_event_loop/__test__.jsonc
new file mode 100644
index 000000000..44ea36bdc
--- /dev/null
+++ b/tests/specs/run/classic_workers_event_loop/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --enable-testing-features-do-not-use classic_workers_event_loop.js",
+ "output": "classic_workers_event_loop.js.out"
+}
diff --git a/tests/specs/run/classic_workers_event_loop/classic_workers_event_loop.js b/tests/specs/run/classic_workers_event_loop/classic_workers_event_loop.js
new file mode 100644
index 000000000..810a6df7f
--- /dev/null
+++ b/tests/specs/run/classic_workers_event_loop/classic_workers_event_loop.js
@@ -0,0 +1,4 @@
+new Worker(
+ "data:application/javascript,setTimeout(() => {console.log('done'); self.close()}, 1000)",
+ { type: "classic" },
+);
diff --git a/tests/specs/run/classic_workers_event_loop/classic_workers_event_loop.js.out b/tests/specs/run/classic_workers_event_loop/classic_workers_event_loop.js.out
new file mode 100644
index 000000000..19f86f493
--- /dev/null
+++ b/tests/specs/run/classic_workers_event_loop/classic_workers_event_loop.js.out
@@ -0,0 +1 @@
+done
diff --git a/tests/specs/run/colors_without_global_this/__test__.jsonc b/tests/specs/run/colors_without_global_this/__test__.jsonc
new file mode 100644
index 000000000..1d2f1c1cf
--- /dev/null
+++ b/tests/specs/run/colors_without_global_this/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run colors_without_globalThis.js",
+ "output": "true\n"
+}
diff --git a/tests/specs/run/colors_without_global_this/colors_without_globalThis.js b/tests/specs/run/colors_without_global_this/colors_without_globalThis.js
new file mode 100644
index 000000000..f9d4b68fc
--- /dev/null
+++ b/tests/specs/run/colors_without_global_this/colors_without_globalThis.js
@@ -0,0 +1 @@
+console.log(delete globalThis.globalThis);
diff --git a/tests/specs/run/complex_error/__test__.jsonc b/tests/specs/run/complex_error/__test__.jsonc
new file mode 100644
index 000000000..2f7274be4
--- /dev/null
+++ b/tests/specs/run/complex_error/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run --quiet complex_error.ts",
+ "output": "complex_error.ts.out",
+ "exitCode": 1
+}
diff --git a/tests/specs/run/complex_error/complex_error.ts b/tests/specs/run/complex_error/complex_error.ts
new file mode 100644
index 000000000..b462992ac
--- /dev/null
+++ b/tests/specs/run/complex_error/complex_error.ts
@@ -0,0 +1,18 @@
+const error = new AggregateError(
+ [
+ new AggregateError([new Error("qux1"), new Error("quux1")]),
+ new Error("bar1", { cause: new Error("baz1") }),
+ ],
+ "foo1",
+ {
+ cause: new AggregateError([
+ new AggregateError([new Error("qux2"), new Error("quux2")]),
+ new Error("bar2", { cause: new Error("baz2") }),
+ ], "foo2"),
+ },
+);
+console.log(error.stack);
+console.log();
+console.log(error);
+console.log();
+throw error;
diff --git a/tests/specs/run/complex_error/complex_error.ts.out b/tests/specs/run/complex_error/complex_error.ts.out
new file mode 100644
index 000000000..3c3c26eaf
--- /dev/null
+++ b/tests/specs/run/complex_error/complex_error.ts.out
@@ -0,0 +1,44 @@
+AggregateError: foo1
+ at [WILDCARD]/complex_error.ts:1:15
+
+AggregateError: foo1
+ AggregateError
+ Error: qux1
+ at [WILDCARD]/complex_error.ts:3:25
+ Error: quux1
+ at [WILDCARD]/complex_error.ts:3:44
+ at [WILDCARD]/complex_error.ts:3:5
+ Error: bar1
+ at [WILDCARD]/complex_error.ts:4:5
+ Caused by Error: baz1
+ at [WILDCARD]/complex_error.ts:4:32
+ at [WILDCARD]/complex_error.ts:1:15
+Caused by AggregateError: foo2
+ at [WILDCARD]/complex_error.ts:8:12
+
+error: Uncaught (in promise) AggregateError: foo1
+ AggregateError
+ Error: qux1
+ at [WILDCARD]/complex_error.ts:3:25
+ Error: quux1
+ at [WILDCARD]/complex_error.ts:3:44
+ at [WILDCARD]/complex_error.ts:3:5
+ Error: bar1
+ at [WILDCARD]/complex_error.ts:4:5
+ Caused by: Error: baz1
+ at [WILDCARD]/complex_error.ts:4:32
+const error = new AggregateError(
+ ^
+ at [WILDCARD]/complex_error.ts:1:15
+Caused by: AggregateError: foo2
+ AggregateError
+ Error: qux2
+ at [WILDCARD]/complex_error.ts:9:27
+ Error: quux2
+ at [WILDCARD]/complex_error.ts:9:46
+ at [WILDCARD]/complex_error.ts:9:7
+ Error: bar2
+ at [WILDCARD]/complex_error.ts:10:7
+ Caused by: Error: baz2
+ at [WILDCARD]/complex_error.ts:10:34
+ at [WILDCARD]/complex_error.ts:8:12
diff --git a/tests/specs/run/config/__test__.jsonc b/tests/specs/run/config/__test__.jsonc
new file mode 100644
index 000000000..59d3ae5fc
--- /dev/null
+++ b/tests/specs/run/config/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --reload --config config/tsconfig.json --check config/main.ts",
+ "output": "config/main.out"
+}
diff --git a/tests/specs/run/config/config/main.out b/tests/specs/run/config/config/main.out
new file mode 100644
index 000000000..277314807
--- /dev/null
+++ b/tests/specs/run/config/config/main.out
@@ -0,0 +1,4 @@
+[WILDCARD]Unsupported compiler options in "[WILDCARD]tsconfig.json".
+ The following options were ignored:
+ module, target
+Check [WILDCARD]/main.ts
diff --git a/tests/specs/run/config/config/main.ts b/tests/specs/run/config/config/main.ts
new file mode 100644
index 000000000..51a61e447
--- /dev/null
+++ b/tests/specs/run/config/config/main.ts
@@ -0,0 +1,5 @@
+function foo(bar) {
+ return bar;
+}
+
+foo(1);
diff --git a/tests/specs/run/config/config/tsconfig.json b/tests/specs/run/config/config/tsconfig.json
new file mode 100644
index 000000000..0f0881920
--- /dev/null
+++ b/tests/specs/run/config/config/tsconfig.json
@@ -0,0 +1,7 @@
+{
+ "compilerOptions": {
+ "module": "amd",
+ "strict": false,
+ "target": "es5"
+ }
+}
diff --git a/tests/specs/run/config_auto_discovered_for_local_script/__test__.jsonc b/tests/specs/run/config_auto_discovered_for_local_script/__test__.jsonc
new file mode 100644
index 000000000..bd2a77ab1
--- /dev/null
+++ b/tests/specs/run/config_auto_discovered_for_local_script/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --quiet frontend_work.ts",
+ "output": "ok\n"
+}
diff --git a/tests/specs/run/config_auto_discovered_for_local_script/frontend_work.ts b/tests/specs/run/config_auto_discovered_for_local_script/frontend_work.ts
new file mode 100644
index 000000000..783af44e4
--- /dev/null
+++ b/tests/specs/run/config_auto_discovered_for_local_script/frontend_work.ts
@@ -0,0 +1,4 @@
+function _main() {
+ console.log(document);
+}
+console.log("ok");
diff --git a/tests/specs/run/config_auto_discovered_for_local_script_log/__test__.jsonc b/tests/specs/run/config_auto_discovered_for_local_script_log/__test__.jsonc
new file mode 100644
index 000000000..5182cc958
--- /dev/null
+++ b/tests/specs/run/config_auto_discovered_for_local_script_log/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run -L debug frontend_work.ts",
+ "output": "auto_discovery_log.out"
+}
diff --git a/tests/specs/run/config_auto_discovered_for_local_script_log/auto_discovery_log.out b/tests/specs/run/config_auto_discovered_for_local_script_log/auto_discovery_log.out
new file mode 100644
index 000000000..1a25eb9a7
--- /dev/null
+++ b/tests/specs/run/config_auto_discovered_for_local_script_log/auto_discovery_log.out
@@ -0,0 +1,4 @@
+DEBUG RS - [WILDCARD] - Config file found at '[WILDCARD]deno.jsonc'
+[WILDCARD]
+ok
+[WILDCARD]
diff --git a/tests/specs/run/config_auto_discovered_for_local_script_log/deno.jsonc b/tests/specs/run/config_auto_discovered_for_local_script_log/deno.jsonc
new file mode 100644
index 000000000..9017fac30
--- /dev/null
+++ b/tests/specs/run/config_auto_discovered_for_local_script_log/deno.jsonc
@@ -0,0 +1,6 @@
+{
+ // type settings for frontend dev
+ "compilerOptions": {
+ "lib": ["esnext", "dom"]
+ }
+}
diff --git a/tests/specs/run/config_auto_discovered_for_local_script_log/frontend_work.ts b/tests/specs/run/config_auto_discovered_for_local_script_log/frontend_work.ts
new file mode 100644
index 000000000..783af44e4
--- /dev/null
+++ b/tests/specs/run/config_auto_discovered_for_local_script_log/frontend_work.ts
@@ -0,0 +1,4 @@
+function _main() {
+ console.log(document);
+}
+console.log("ok");
diff --git a/tests/specs/run/config_json_import/__test__.jsonc b/tests/specs/run/config_json_import/__test__.jsonc
new file mode 100644
index 000000000..6ef632ff8
--- /dev/null
+++ b/tests/specs/run/config_json_import/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --quiet -c deno-jsx.json config_json_import.ts",
+ "output": "config_json_import.ts.out"
+}
diff --git a/tests/specs/run/config_json_import/config_json_import.ts b/tests/specs/run/config_json_import/config_json_import.ts
new file mode 100644
index 000000000..4a772fac3
--- /dev/null
+++ b/tests/specs/run/config_json_import/config_json_import.ts
@@ -0,0 +1,2 @@
+import config from "./deno-jsx.json" with { type: "json" };
+console.log(config);
diff --git a/tests/specs/run/config_json_import/config_json_import.ts.out b/tests/specs/run/config_json_import/config_json_import.ts.out
new file mode 100644
index 000000000..aa55be7d5
--- /dev/null
+++ b/tests/specs/run/config_json_import/config_json_import.ts.out
@@ -0,0 +1,3 @@
+{
+ compilerOptions: { jsx: "react-jsx", jsxImportSource: "http://localhost:4545/jsx" }
+}
diff --git a/tests/specs/run/config_json_import/deno-jsx.json b/tests/specs/run/config_json_import/deno-jsx.json
new file mode 100644
index 000000000..311409ea3
--- /dev/null
+++ b/tests/specs/run/config_json_import/deno-jsx.json
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "react-jsx",
+ "jsxImportSource": "http://localhost:4545/jsx"
+ }
+}
diff --git a/tests/specs/run/config_not_auto_discovered_for_remote_script/__test__.jsonc b/tests/specs/run/config_not_auto_discovered_for_remote_script/__test__.jsonc
new file mode 100644
index 000000000..e6ccc02ac
--- /dev/null
+++ b/tests/specs/run/config_not_auto_discovered_for_remote_script/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --allow-import --quiet server_side_work.ts",
+ "output": "ok\n"
+}
diff --git a/tests/specs/run/config_not_auto_discovered_for_remote_script/server_side_work.ts b/tests/specs/run/config_not_auto_discovered_for_remote_script/server_side_work.ts
new file mode 100644
index 000000000..12db2ab05
--- /dev/null
+++ b/tests/specs/run/config_not_auto_discovered_for_remote_script/server_side_work.ts
@@ -0,0 +1,2 @@
+const _ = Deno.build.os;
+console.log("ok");
diff --git a/tests/specs/run/config_types/__test__.jsonc b/tests/specs/run/config_types/__test__.jsonc
new file mode 100644
index 000000000..d803915c7
--- /dev/null
+++ b/tests/specs/run/config_types/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --reload --quiet --check=all --config config_types/tsconfig.json config_types/main.ts",
+ "output": "config_types/main.out"
+}
diff --git a/tests/specs/run/config_types/config_types/deno.lock b/tests/specs/run/config_types/config_types/deno.lock
new file mode 100644
index 000000000..157bd98a2
--- /dev/null
+++ b/tests/specs/run/config_types/config_types/deno.lock
@@ -0,0 +1,6 @@
+{
+ "version": "2",
+ "remote": {
+ "http://localhost:4545/run/config_types/types.d.ts": "741c39165e37de0c12acc5c081841f4362487e3f17dc4cad7017b70af72c4605"
+ }
+}
diff --git a/tests/specs/run/config_types/config_types/main.out b/tests/specs/run/config_types/config_types/main.out
new file mode 100644
index 000000000..417b7b537
--- /dev/null
+++ b/tests/specs/run/config_types/config_types/main.out
@@ -0,0 +1 @@
+undefined
diff --git a/tests/specs/run/config_types/config_types/main.ts b/tests/specs/run/config_types/config_types/main.ts
new file mode 100644
index 000000000..f1a8d6583
--- /dev/null
+++ b/tests/specs/run/config_types/config_types/main.ts
@@ -0,0 +1 @@
+console.log(globalThis.a);
diff --git a/tests/specs/run/config_types/config_types/remote.tsconfig.json b/tests/specs/run/config_types/config_types/remote.tsconfig.json
new file mode 100644
index 000000000..255ff5def
--- /dev/null
+++ b/tests/specs/run/config_types/config_types/remote.tsconfig.json
@@ -0,0 +1,7 @@
+{
+ "compilerOptions": {
+ "types": [
+ "http://localhost:4545/run/config_types/types.d.ts"
+ ]
+ }
+}
diff --git a/tests/specs/run/config_types/config_types/tsconfig.json b/tests/specs/run/config_types/config_types/tsconfig.json
new file mode 100644
index 000000000..85f1549e0
--- /dev/null
+++ b/tests/specs/run/config_types/config_types/tsconfig.json
@@ -0,0 +1,7 @@
+{
+ "compilerOptions": {
+ "types": [
+ "./types.d.ts"
+ ]
+ }
+}
diff --git a/tests/specs/run/config_types/config_types/types.d.ts b/tests/specs/run/config_types/config_types/types.d.ts
new file mode 100644
index 000000000..536a6d0a6
--- /dev/null
+++ b/tests/specs/run/config_types/config_types/types.d.ts
@@ -0,0 +1,2 @@
+// deno-lint-ignore-file no-var
+declare var a: string;
diff --git a/tests/specs/run/config_types_remote/__test__.jsonc b/tests/specs/run/config_types_remote/__test__.jsonc
new file mode 100644
index 000000000..87457ace2
--- /dev/null
+++ b/tests/specs/run/config_types_remote/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --allow-import --reload --quiet --check=all --config config_types/remote.tsconfig.json config_types/main.ts",
+ "output": "config_types/main.out"
+}
diff --git a/tests/specs/run/config_types_remote/config_types/deno.lock b/tests/specs/run/config_types_remote/config_types/deno.lock
new file mode 100644
index 000000000..157bd98a2
--- /dev/null
+++ b/tests/specs/run/config_types_remote/config_types/deno.lock
@@ -0,0 +1,6 @@
+{
+ "version": "2",
+ "remote": {
+ "http://localhost:4545/run/config_types/types.d.ts": "741c39165e37de0c12acc5c081841f4362487e3f17dc4cad7017b70af72c4605"
+ }
+}
diff --git a/tests/specs/run/config_types_remote/config_types/main.out b/tests/specs/run/config_types_remote/config_types/main.out
new file mode 100644
index 000000000..417b7b537
--- /dev/null
+++ b/tests/specs/run/config_types_remote/config_types/main.out
@@ -0,0 +1 @@
+undefined
diff --git a/tests/specs/run/config_types_remote/config_types/main.ts b/tests/specs/run/config_types_remote/config_types/main.ts
new file mode 100644
index 000000000..f1a8d6583
--- /dev/null
+++ b/tests/specs/run/config_types_remote/config_types/main.ts
@@ -0,0 +1 @@
+console.log(globalThis.a);
diff --git a/tests/specs/run/config_types_remote/config_types/remote.tsconfig.json b/tests/specs/run/config_types_remote/config_types/remote.tsconfig.json
new file mode 100644
index 000000000..255ff5def
--- /dev/null
+++ b/tests/specs/run/config_types_remote/config_types/remote.tsconfig.json
@@ -0,0 +1,7 @@
+{
+ "compilerOptions": {
+ "types": [
+ "http://localhost:4545/run/config_types/types.d.ts"
+ ]
+ }
+}
diff --git a/tests/specs/run/config_types_remote/config_types/tsconfig.json b/tests/specs/run/config_types_remote/config_types/tsconfig.json
new file mode 100644
index 000000000..85f1549e0
--- /dev/null
+++ b/tests/specs/run/config_types_remote/config_types/tsconfig.json
@@ -0,0 +1,7 @@
+{
+ "compilerOptions": {
+ "types": [
+ "./types.d.ts"
+ ]
+ }
+}
diff --git a/tests/specs/run/config_types_remote/config_types/types.d.ts b/tests/specs/run/config_types_remote/config_types/types.d.ts
new file mode 100644
index 000000000..536a6d0a6
--- /dev/null
+++ b/tests/specs/run/config_types_remote/config_types/types.d.ts
@@ -0,0 +1,2 @@
+// deno-lint-ignore-file no-var
+declare var a: string;
diff --git a/tests/specs/run/custom_inspect_url/__test__.jsonc b/tests/specs/run/custom_inspect_url/__test__.jsonc
new file mode 100644
index 000000000..1c1c2b9c4
--- /dev/null
+++ b/tests/specs/run/custom_inspect_url/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run custom_inspect_url.js",
+ "output": "custom_inspect_url.js.out"
+}
diff --git a/tests/specs/run/custom_inspect_url/custom_inspect_url.js b/tests/specs/run/custom_inspect_url/custom_inspect_url.js
new file mode 100644
index 000000000..69aa2dc49
--- /dev/null
+++ b/tests/specs/run/custom_inspect_url/custom_inspect_url.js
@@ -0,0 +1,3 @@
+console.log([new URL("https://example.com/path")]);
+console.log({ url: new URL("https://example.com/path") });
+console.log({ url: [new URL("https://example.com/path")] });
diff --git a/tests/specs/run/custom_inspect_url/custom_inspect_url.js.out b/tests/specs/run/custom_inspect_url/custom_inspect_url.js.out
new file mode 100644
index 000000000..1c714e34e
--- /dev/null
+++ b/tests/specs/run/custom_inspect_url/custom_inspect_url.js.out
@@ -0,0 +1,47 @@
+[
+ URL {
+ href: "https://example.com/path",
+ origin: "https://example.com",
+ protocol: "https:",
+ username: "",
+ password: "",
+ host: "example.com",
+ hostname: "example.com",
+ port: "",
+ pathname: "/path",
+ hash: "",
+ search: ""
+ }
+]
+{
+ url: URL {
+ href: "https://example.com/path",
+ origin: "https://example.com",
+ protocol: "https:",
+ username: "",
+ password: "",
+ host: "example.com",
+ hostname: "example.com",
+ port: "",
+ pathname: "/path",
+ hash: "",
+ search: ""
+ }
+}
+{
+ url: [
+ URL {
+ href: "https://example.com/path",
+ origin: "https://example.com",
+ protocol: "https:",
+ username: "",
+ password: "",
+ host: "example.com",
+ hostname: "example.com",
+ port: "",
+ pathname: "/path",
+ hash: "",
+ search: ""
+ }
+ ]
+}
diff --git a/tests/specs/run/decorators_tc39_proposal/__test__.jsonc b/tests/specs/run/decorators_tc39_proposal/__test__.jsonc
new file mode 100644
index 000000000..8e529695d
--- /dev/null
+++ b/tests/specs/run/decorators_tc39_proposal/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --quiet --reload --check decorators/tc39_proposal/main.ts",
+ "output": "decorators/tc39_proposal/main.out"
+}
diff --git a/tests/specs/run/decorators_tc39_proposal/decorators/experimental/deno.json b/tests/specs/run/decorators_tc39_proposal/decorators/experimental/deno.json
new file mode 100644
index 000000000..504cd646e
--- /dev/null
+++ b/tests/specs/run/decorators_tc39_proposal/decorators/experimental/deno.json
@@ -0,0 +1,5 @@
+{
+ "compilerOptions": {
+ "experimentalDecorators": true
+ }
+}
diff --git a/tests/specs/run/decorators_tc39_proposal/decorators/experimental/no_check/main.out b/tests/specs/run/decorators_tc39_proposal/decorators/experimental/no_check/main.out
new file mode 100644
index 000000000..015f7076e
--- /dev/null
+++ b/tests/specs/run/decorators_tc39_proposal/decorators/experimental/no_check/main.out
@@ -0,0 +1,3 @@
+a(): evaluated
+a(): called
+method
diff --git a/tests/specs/run/decorators_tc39_proposal/decorators/experimental/no_check/main.ts b/tests/specs/run/decorators_tc39_proposal/decorators/experimental/no_check/main.ts
new file mode 100644
index 000000000..9f7ec550d
--- /dev/null
+++ b/tests/specs/run/decorators_tc39_proposal/decorators/experimental/no_check/main.ts
@@ -0,0 +1,21 @@
+// deno-lint-ignore-file
+function a() {
+ console.log("a(): evaluated");
+ return (
+ _target: any,
+ _propertyKey: string,
+ _descriptor: PropertyDescriptor,
+ ) => {
+ console.log("a(): called");
+ };
+}
+
+class B {
+ @a()
+ method() {
+ console.log("method");
+ }
+}
+
+const b = new B();
+b.method();
diff --git a/tests/specs/run/decorators_tc39_proposal/decorators/experimental/runtime/main.out b/tests/specs/run/decorators_tc39_proposal/decorators/experimental/runtime/main.out
new file mode 100644
index 000000000..0fc1d4590
--- /dev/null
+++ b/tests/specs/run/decorators_tc39_proposal/decorators/experimental/runtime/main.out
@@ -0,0 +1,7 @@
+@A evaluated
+@B evaluated
+@B called
+@A called
+fn() called from @A
+fn() called from @B
+C.test() called
diff --git a/tests/specs/run/decorators_tc39_proposal/decorators/experimental/runtime/main.ts b/tests/specs/run/decorators_tc39_proposal/decorators/experimental/runtime/main.ts
new file mode 100644
index 000000000..40a26bbd4
--- /dev/null
+++ b/tests/specs/run/decorators_tc39_proposal/decorators/experimental/runtime/main.ts
@@ -0,0 +1,42 @@
+// deno-lint-ignore-file
+function a() {
+ console.log("@A evaluated");
+ return function (
+ target: any,
+ propertyKey: string,
+ descriptor: PropertyDescriptor,
+ ) {
+ console.log("@A called");
+ const fn = descriptor.value;
+ descriptor.value = function () {
+ console.log("fn() called from @A");
+ fn();
+ };
+ };
+}
+
+function b() {
+ console.log("@B evaluated");
+ return function (
+ target: any,
+ propertyKey: string,
+ descriptor: PropertyDescriptor,
+ ) {
+ console.log("@B called");
+ const fn = descriptor.value;
+ descriptor.value = function () {
+ console.log("fn() called from @B");
+ fn();
+ };
+ };
+}
+
+class C {
+ @a()
+ @b()
+ static test() {
+ console.log("C.test() called");
+ }
+}
+
+C.test();
diff --git a/tests/specs/run/decorators_tc39_proposal/decorators/experimental/ts/main.out b/tests/specs/run/decorators_tc39_proposal/decorators/experimental/ts/main.out
new file mode 100644
index 000000000..ea64fbaa6
--- /dev/null
+++ b/tests/specs/run/decorators_tc39_proposal/decorators/experimental/ts/main.out
@@ -0,0 +1,3 @@
+Warning experimentalDecorators compiler option is deprecated and may be removed at any time
+Check [WILDCARD]
+SomeClass { someField: "asdf" }
diff --git a/tests/specs/run/decorators_tc39_proposal/decorators/experimental/ts/main.ts b/tests/specs/run/decorators_tc39_proposal/decorators/experimental/ts/main.ts
new file mode 100644
index 000000000..95fba6cd4
--- /dev/null
+++ b/tests/specs/run/decorators_tc39_proposal/decorators/experimental/ts/main.ts
@@ -0,0 +1,14 @@
+// deno-lint-ignore-file
+
+function Decorate() {
+ return function (constructor: any): any {
+ return class extends constructor {
+ protected someField: string = "asdf";
+ };
+ };
+}
+
+@Decorate()
+class SomeClass {}
+
+console.log(new SomeClass());
diff --git a/tests/specs/run/decorators_tc39_proposal/decorators/tc39_proposal/main.out b/tests/specs/run/decorators_tc39_proposal/decorators/tc39_proposal/main.out
new file mode 100644
index 000000000..39394952e
--- /dev/null
+++ b/tests/specs/run/decorators_tc39_proposal/decorators/tc39_proposal/main.out
@@ -0,0 +1,3 @@
+starting m with arguments 1
+C.m 1
+ending m
diff --git a/tests/specs/run/decorators_tc39_proposal/decorators/tc39_proposal/main.ts b/tests/specs/run/decorators_tc39_proposal/decorators/tc39_proposal/main.ts
new file mode 100644
index 000000000..00c8a8502
--- /dev/null
+++ b/tests/specs/run/decorators_tc39_proposal/decorators/tc39_proposal/main.ts
@@ -0,0 +1,21 @@
+// deno-lint-ignore no-explicit-any
+function logged(value: any, { kind, name }: { kind: string; name: string }) {
+ if (kind === "method") {
+ return function (...args: unknown[]) {
+ console.log(`starting ${name} with arguments ${args.join(", ")}`);
+ // @ts-ignore this has implicit any type
+ const ret = value.call(this, ...args);
+ console.log(`ending ${name}`);
+ return ret;
+ };
+ }
+}
+
+class C {
+ @logged
+ m(arg: number) {
+ console.log("C.m", arg);
+ }
+}
+
+new C().m(1);
diff --git a/tests/specs/run/deno_exit_tampering/__test__.jsonc b/tests/specs/run/deno_exit_tampering/__test__.jsonc
new file mode 100644
index 000000000..1666fbacb
--- /dev/null
+++ b/tests/specs/run/deno_exit_tampering/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run --no-check deno_exit_tampering.ts",
+ "output": "",
+ "exitCode": 42
+}
diff --git a/tests/specs/run/deno_exit_tampering/deno_exit_tampering.ts b/tests/specs/run/deno_exit_tampering/deno_exit_tampering.ts
new file mode 100644
index 000000000..3b24261e2
--- /dev/null
+++ b/tests/specs/run/deno_exit_tampering/deno_exit_tampering.ts
@@ -0,0 +1,3 @@
+delete globalThis.dispatchEvent;
+delete EventTarget.prototype.dispatchEvent;
+Deno.exit(42);
diff --git a/tests/specs/run/deny_all_permission_args/__test__.jsonc b/tests/specs/run/deny_all_permission_args/__test__.jsonc
new file mode 100644
index 000000000..1d6b28682
--- /dev/null
+++ b/tests/specs/run/deny_all_permission_args/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --deny-env --deny-read --deny-write --deny-ffi --deny-run --deny-sys --deny-net deny_all_permission_args.js",
+ "output": "deny_all_permission_args.out"
+}
diff --git a/tests/specs/run/deny_all_permission_args/deny_all_permission_args.js b/tests/specs/run/deny_all_permission_args/deny_all_permission_args.js
new file mode 100644
index 000000000..c63d2c362
--- /dev/null
+++ b/tests/specs/run/deny_all_permission_args/deny_all_permission_args.js
@@ -0,0 +1,7 @@
+console.log(Deno.permissions.querySync({ name: "env" }));
+console.log(Deno.permissions.querySync({ name: "read" }));
+console.log(Deno.permissions.querySync({ name: "write" }));
+console.log(Deno.permissions.querySync({ name: "ffi" }));
+console.log(Deno.permissions.querySync({ name: "run" }));
+console.log(Deno.permissions.querySync({ name: "sys" }));
+console.log(Deno.permissions.querySync({ name: "net" }));
diff --git a/tests/specs/run/deny_all_permission_args/deny_all_permission_args.out b/tests/specs/run/deny_all_permission_args/deny_all_permission_args.out
new file mode 100644
index 000000000..de6f687f4
--- /dev/null
+++ b/tests/specs/run/deny_all_permission_args/deny_all_permission_args.out
@@ -0,0 +1,7 @@
+PermissionStatus { state: "denied", onchange: null }
+PermissionStatus { state: "denied", onchange: null }
+PermissionStatus { state: "denied", onchange: null }
+PermissionStatus { state: "denied", onchange: null }
+PermissionStatus { state: "denied", onchange: null }
+PermissionStatus { state: "denied", onchange: null }
+PermissionStatus { state: "denied", onchange: null }
diff --git a/tests/specs/run/deny_some_permission_args/__test__.jsonc b/tests/specs/run/deny_some_permission_args/__test__.jsonc
new file mode 100644
index 000000000..a55ee57e4
--- /dev/null
+++ b/tests/specs/run/deny_some_permission_args/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --allow-env --deny-env=FOO --allow-read --deny-read=/foo --allow-write --deny-write=/foo --allow-ffi --deny-ffi=/foo --allow-run --deny-run=foo --allow-sys --deny-sys=hostname --allow-net --deny-net=127.0.0.1 deny_some_permission_args.js",
+ "output": "deny_some_permission_args.out"
+}
diff --git a/tests/specs/run/deny_some_permission_args/deny_some_permission_args.js b/tests/specs/run/deny_some_permission_args/deny_some_permission_args.js
new file mode 100644
index 000000000..357dda238
--- /dev/null
+++ b/tests/specs/run/deny_some_permission_args/deny_some_permission_args.js
@@ -0,0 +1,21 @@
+console.log(Deno.permissions.querySync({ name: "env" }));
+console.log(Deno.permissions.querySync({ name: "env", variable: "FOO" }));
+console.log(Deno.permissions.querySync({ name: "env", variable: "BAR" }));
+console.log(Deno.permissions.querySync({ name: "read" }));
+console.log(Deno.permissions.querySync({ name: "read", path: "/foo" }));
+console.log(Deno.permissions.querySync({ name: "read", path: "/bar" }));
+console.log(Deno.permissions.querySync({ name: "write" }));
+console.log(Deno.permissions.querySync({ name: "write", path: "/foo" }));
+console.log(Deno.permissions.querySync({ name: "write", path: "/bar" }));
+console.log(Deno.permissions.querySync({ name: "ffi" }));
+console.log(Deno.permissions.querySync({ name: "ffi", path: "/foo" }));
+console.log(Deno.permissions.querySync({ name: "ffi", path: "/bar" }));
+console.log(Deno.permissions.querySync({ name: "run" }));
+console.log(Deno.permissions.querySync({ name: "run", command: "foo" }));
+console.log(Deno.permissions.querySync({ name: "run", command: "bar" }));
+console.log(Deno.permissions.querySync({ name: "sys" }));
+console.log(Deno.permissions.querySync({ name: "sys", kind: "hostname" }));
+console.log(Deno.permissions.querySync({ name: "sys", kind: "loadavg" }));
+console.log(Deno.permissions.querySync({ name: "net" }));
+console.log(Deno.permissions.querySync({ name: "net", host: "127.0.0.1" }));
+console.log(Deno.permissions.querySync({ name: "net", host: "192.168.0.1" }));
diff --git a/tests/specs/run/deny_some_permission_args/deny_some_permission_args.out b/tests/specs/run/deny_some_permission_args/deny_some_permission_args.out
new file mode 100644
index 000000000..abb5274ee
--- /dev/null
+++ b/tests/specs/run/deny_some_permission_args/deny_some_permission_args.out
@@ -0,0 +1,21 @@
+PermissionStatus { state: "granted", onchange: null, partial: true }
+PermissionStatus { state: "denied", onchange: null }
+PermissionStatus { state: "granted", onchange: null }
+PermissionStatus { state: "granted", onchange: null, partial: true }
+PermissionStatus { state: "denied", onchange: null }
+PermissionStatus { state: "granted", onchange: null }
+PermissionStatus { state: "granted", onchange: null, partial: true }
+PermissionStatus { state: "denied", onchange: null }
+PermissionStatus { state: "granted", onchange: null }
+PermissionStatus { state: "granted", onchange: null, partial: true }
+PermissionStatus { state: "denied", onchange: null }
+PermissionStatus { state: "granted", onchange: null }
+PermissionStatus { state: "granted", onchange: null, partial: true }
+PermissionStatus { state: "denied", onchange: null }
+PermissionStatus { state: "granted", onchange: null }
+PermissionStatus { state: "granted", onchange: null, partial: true }
+PermissionStatus { state: "denied", onchange: null }
+PermissionStatus { state: "granted", onchange: null }
+PermissionStatus { state: "granted", onchange: null, partial: true }
+PermissionStatus { state: "denied", onchange: null }
+PermissionStatus { state: "granted", onchange: null }
diff --git a/tests/specs/run/dom_exception_formatting/__test__.jsonc b/tests/specs/run/dom_exception_formatting/__test__.jsonc
new file mode 100644
index 000000000..5b1505b57
--- /dev/null
+++ b/tests/specs/run/dom_exception_formatting/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run dom_exception_formatting.ts",
+ "output": "dom_exception_formatting.ts.out",
+ "exitCode": 1
+}
diff --git a/tests/specs/run/dom_exception_formatting/dom_exception_formatting.ts b/tests/specs/run/dom_exception_formatting/dom_exception_formatting.ts
new file mode 100644
index 000000000..0209ec81e
--- /dev/null
+++ b/tests/specs/run/dom_exception_formatting/dom_exception_formatting.ts
@@ -0,0 +1 @@
+throw new DOMException("foo", "SyntaxError");
diff --git a/tests/specs/run/dom_exception_formatting/dom_exception_formatting.ts.out b/tests/specs/run/dom_exception_formatting/dom_exception_formatting.ts.out
new file mode 100644
index 000000000..75615d0a8
--- /dev/null
+++ b/tests/specs/run/dom_exception_formatting/dom_exception_formatting.ts.out
@@ -0,0 +1,3 @@
+[WILDCARD]error: Uncaught (in promise) SyntaxError: foo
+[WILDCARD]
+ at file:///[WILDCARD]/dom_exception_formatting.ts:[WILDCARD]
diff --git a/tests/specs/run/dynamic_import_already_rejected/__test__.jsonc b/tests/specs/run/dynamic_import_already_rejected/__test__.jsonc
new file mode 100644
index 000000000..0cd120130
--- /dev/null
+++ b/tests/specs/run/dynamic_import_already_rejected/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --allow-read dynamic_import_already_rejected/main.ts",
+ "output": "dynamic_import_already_rejected/main.out"
+}
diff --git a/tests/specs/run/dynamic_import_already_rejected/dynamic_import_already_rejected/error_001.ts b/tests/specs/run/dynamic_import_already_rejected/dynamic_import_already_rejected/error_001.ts
new file mode 100644
index 000000000..b01068bc0
--- /dev/null
+++ b/tests/specs/run/dynamic_import_already_rejected/dynamic_import_already_rejected/error_001.ts
@@ -0,0 +1,9 @@
+function foo(): never {
+ throw Error("bad");
+}
+
+function bar() {
+ foo();
+}
+
+bar();
diff --git a/tests/specs/run/dynamic_import_already_rejected/dynamic_import_already_rejected/main.out b/tests/specs/run/dynamic_import_already_rejected/dynamic_import_already_rejected/main.out
new file mode 100644
index 000000000..c3eb66f9e
--- /dev/null
+++ b/tests/specs/run/dynamic_import_already_rejected/dynamic_import_already_rejected/main.out
@@ -0,0 +1,4 @@
+[WILDCARD]Caught: Error: bad
+ at [WILDCARD]/error_001.ts:[WILDCARD]
+Caught: Error: bad
+ at [WILDCARD]/error_001.ts:[WILDCARD]
diff --git a/tests/specs/run/dynamic_import_already_rejected/dynamic_import_already_rejected/main.ts b/tests/specs/run/dynamic_import_already_rejected/dynamic_import_already_rejected/main.ts
new file mode 100644
index 000000000..249de8d8b
--- /dev/null
+++ b/tests/specs/run/dynamic_import_already_rejected/dynamic_import_already_rejected/main.ts
@@ -0,0 +1,15 @@
+try {
+ await import("./error_001.ts");
+} catch (error) {
+ if (error instanceof Error) {
+ console.log(`Caught: ${error.stack}`);
+ }
+}
+
+try {
+ await import("./error_001.ts");
+} catch (error) {
+ if (error instanceof Error) {
+ console.log(`Caught: ${error.stack}`);
+ }
+}
diff --git a/tests/specs/run/dynamic_import_async_error/__test__.jsonc b/tests/specs/run/dynamic_import_async_error/__test__.jsonc
new file mode 100644
index 000000000..9824c3450
--- /dev/null
+++ b/tests/specs/run/dynamic_import_async_error/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --allow-read dynamic_import_async_error/main.ts",
+ "output": "dynamic_import_async_error/main.out"
+}
diff --git a/tests/specs/run/dynamic_import_async_error/dynamic_import_async_error/delayed_error.ts b/tests/specs/run/dynamic_import_async_error/dynamic_import_async_error/delayed_error.ts
new file mode 100644
index 000000000..76057e627
--- /dev/null
+++ b/tests/specs/run/dynamic_import_async_error/dynamic_import_async_error/delayed_error.ts
@@ -0,0 +1,2 @@
+await new Promise((r) => setTimeout(r, 100));
+throw new Error("foo");
diff --git a/tests/specs/run/dynamic_import_async_error/dynamic_import_async_error/main.out b/tests/specs/run/dynamic_import_async_error/dynamic_import_async_error/main.out
new file mode 100644
index 000000000..974c2e426
--- /dev/null
+++ b/tests/specs/run/dynamic_import_async_error/dynamic_import_async_error/main.out
@@ -0,0 +1,2 @@
+[WILDCARD]Caught: Error: foo
+ at [WILDCARD]/delayed_error.ts:[WILDCARD]
diff --git a/tests/specs/run/dynamic_import_async_error/dynamic_import_async_error/main.ts b/tests/specs/run/dynamic_import_async_error/dynamic_import_async_error/main.ts
new file mode 100644
index 000000000..998e7ed3e
--- /dev/null
+++ b/tests/specs/run/dynamic_import_async_error/dynamic_import_async_error/main.ts
@@ -0,0 +1,7 @@
+try {
+ await import("./delayed_error.ts");
+} catch (error) {
+ if (error instanceof Error) {
+ console.log(`Caught: ${error.stack}`);
+ }
+}
diff --git a/tests/specs/run/dynamic_import_concurrent_non_statically_analyzable/__test__.jsonc b/tests/specs/run/dynamic_import_concurrent_non_statically_analyzable/__test__.jsonc
new file mode 100644
index 000000000..c4c30ca5d
--- /dev/null
+++ b/tests/specs/run/dynamic_import_concurrent_non_statically_analyzable/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --allow-import --allow-read --allow-net --quiet dynamic_import_concurrent_non_statically_analyzable/main.ts",
+ "output": "dynamic_import_concurrent_non_statically_analyzable/main.out"
+}
diff --git a/tests/specs/run/dynamic_import_concurrent_non_statically_analyzable/dynamic_import_concurrent_non_statically_analyzable/main.out b/tests/specs/run/dynamic_import_concurrent_non_statically_analyzable/dynamic_import_concurrent_non_statically_analyzable/main.out
new file mode 100644
index 000000000..c344d0aae
--- /dev/null
+++ b/tests/specs/run/dynamic_import_concurrent_non_statically_analyzable/dynamic_import_concurrent_non_statically_analyzable/main.out
@@ -0,0 +1,100 @@
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
diff --git a/tests/specs/run/dynamic_import_concurrent_non_statically_analyzable/dynamic_import_concurrent_non_statically_analyzable/main.ts b/tests/specs/run/dynamic_import_concurrent_non_statically_analyzable/dynamic_import_concurrent_non_statically_analyzable/main.ts
new file mode 100644
index 000000000..0832e40be
--- /dev/null
+++ b/tests/specs/run/dynamic_import_concurrent_non_statically_analyzable/dynamic_import_concurrent_non_statically_analyzable/main.ts
@@ -0,0 +1,16 @@
+import * as path from "http://localhost:4545/deno_std/path/mod.ts";
+
+const currentDir = path.dirname(path.fromFileUrl(import.meta.url));
+const url = path.toFileUrl(path.join(currentDir, "./mod.ts"));
+const urls = [];
+
+// this is hard to reproduce, but doing this will help
+for (let i = 0; i < 100; i++) {
+ urls.push(url.toString() + "#" + i);
+}
+
+const results = await Promise.all(urls.map((url) => import(url)));
+
+for (const result of results) {
+ result.outputValue();
+}
diff --git a/tests/specs/run/dynamic_import_concurrent_non_statically_analyzable/dynamic_import_concurrent_non_statically_analyzable/mod.ts b/tests/specs/run/dynamic_import_concurrent_non_statically_analyzable/dynamic_import_concurrent_non_statically_analyzable/mod.ts
new file mode 100644
index 000000000..56f2002ed
--- /dev/null
+++ b/tests/specs/run/dynamic_import_concurrent_non_statically_analyzable/dynamic_import_concurrent_non_statically_analyzable/mod.ts
@@ -0,0 +1,7 @@
+// sleep a bit so many concurrent tasks end up
+// attempting to build the graph at the same time
+import "http://localhost:4545/sleep/10";
+
+export function outputValue() {
+ console.log(parseInt(new URL(import.meta.url).hash.slice(1), 10));
+}
diff --git a/tests/specs/run/dynamic_import_conditional/__test__.jsonc b/tests/specs/run/dynamic_import_conditional/__test__.jsonc
new file mode 100644
index 000000000..8adff3a16
--- /dev/null
+++ b/tests/specs/run/dynamic_import_conditional/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --quiet --reload dynamic_import_conditional.js",
+ "output": "dynamic_import_conditional.js.out"
+}
diff --git a/tests/specs/run/dynamic_import_conditional/dynamic_import_conditional.js b/tests/specs/run/dynamic_import_conditional/dynamic_import_conditional.js
new file mode 100644
index 000000000..1b4193e3e
--- /dev/null
+++ b/tests/specs/run/dynamic_import_conditional/dynamic_import_conditional.js
@@ -0,0 +1,3 @@
+const Worker = globalThis.Worker ?? (await import("worker_threads")).Worker;
+
+console.log(!!Worker);
diff --git a/tests/specs/run/dynamic_import_conditional/dynamic_import_conditional.js.out b/tests/specs/run/dynamic_import_conditional/dynamic_import_conditional.js.out
new file mode 100644
index 000000000..27ba77dda
--- /dev/null
+++ b/tests/specs/run/dynamic_import_conditional/dynamic_import_conditional.js.out
@@ -0,0 +1 @@
+true
diff --git a/tests/specs/run/dynamic_import_permissions_blob_local/__test__.jsonc b/tests/specs/run/dynamic_import_permissions_blob_local/__test__.jsonc
new file mode 100644
index 000000000..27a747b3a
--- /dev/null
+++ b/tests/specs/run/dynamic_import_permissions_blob_local/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run --quiet --reload --allow-net=localhost:4545 permissions_blob_local.ts",
+ "output": "permissions_blob_local.ts.out",
+ "exitCode": 1
+}
diff --git a/tests/specs/run/dynamic_import_permissions_blob_local/permissions_blob_local.ts b/tests/specs/run/dynamic_import_permissions_blob_local/permissions_blob_local.ts
new file mode 100644
index 000000000..865c1777a
--- /dev/null
+++ b/tests/specs/run/dynamic_import_permissions_blob_local/permissions_blob_local.ts
@@ -0,0 +1,6 @@
+// This file doesn't really exist, but it doesn't matter, a "NotCapable" error should be thrown.
+const code = `import "file:///${
+ Deno.build.os == "windows" ? "C:/" : ""
+}local_file.ts";`;
+const blob = new Blob([code]);
+await import(URL.createObjectURL(blob));
diff --git a/tests/specs/run/dynamic_import_permissions_blob_local/permissions_blob_local.ts.out b/tests/specs/run/dynamic_import_permissions_blob_local/permissions_blob_local.ts.out
new file mode 100644
index 000000000..b7b246ba2
--- /dev/null
+++ b/tests/specs/run/dynamic_import_permissions_blob_local/permissions_blob_local.ts.out
@@ -0,0 +1,5 @@
+error: Uncaught (in promise) TypeError: Requires read access to "[WILDCARD]local_file.ts", run again with the --allow-read flag
+ at blob:null/[WILDCARD]:1:8
+await import(URL.createObjectURL(blob));
+^
+ at async file://[WILDCARD]/permissions_blob_local.ts:6:1
diff --git a/tests/specs/run/dynamic_import_permissions_blob_remote/__test__.jsonc b/tests/specs/run/dynamic_import_permissions_blob_remote/__test__.jsonc
new file mode 100644
index 000000000..f9d66b6b3
--- /dev/null
+++ b/tests/specs/run/dynamic_import_permissions_blob_remote/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run --quiet --reload --allow-net=localhost:4545 permissions_blob_remote.ts",
+ "output": "permissions_blob_remote.ts.out",
+ "exitCode": 1
+}
diff --git a/tests/specs/run/dynamic_import_permissions_blob_remote/permissions_blob_remote.ts b/tests/specs/run/dynamic_import_permissions_blob_remote/permissions_blob_remote.ts
new file mode 100644
index 000000000..569b1f84c
--- /dev/null
+++ b/tests/specs/run/dynamic_import_permissions_blob_remote/permissions_blob_remote.ts
@@ -0,0 +1,3 @@
+const code = `import "https://example.com/some/file.ts";`;
+const blob = new Blob([code]);
+await import(URL.createObjectURL(blob));
diff --git a/tests/specs/run/dynamic_import_permissions_blob_remote/permissions_blob_remote.ts.out b/tests/specs/run/dynamic_import_permissions_blob_remote/permissions_blob_remote.ts.out
new file mode 100644
index 000000000..287cf9998
--- /dev/null
+++ b/tests/specs/run/dynamic_import_permissions_blob_remote/permissions_blob_remote.ts.out
@@ -0,0 +1,5 @@
+error: Uncaught (in promise) TypeError: Requires import access to "example.com:443", run again with the --allow-import flag
+ at blob:null/[WILDCARD]:1:8
+await import(URL.createObjectURL(blob));
+^
+ at async file:///[WILDCARD]/permissions_blob_remote.ts:3:1
diff --git a/tests/specs/run/dynamic_import_permissions_data_local/__test__.jsonc b/tests/specs/run/dynamic_import_permissions_data_local/__test__.jsonc
new file mode 100644
index 000000000..8f118d8be
--- /dev/null
+++ b/tests/specs/run/dynamic_import_permissions_data_local/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run --quiet --reload --allow-net=localhost:4545 permissions_data_local.ts",
+ "output": "permissions_data_local.ts.out",
+ "exitCode": 1
+}
diff --git a/tests/specs/run/dynamic_import_permissions_data_local/permissions_data_local.ts b/tests/specs/run/dynamic_import_permissions_data_local/permissions_data_local.ts
new file mode 100644
index 000000000..01bff7d7a
--- /dev/null
+++ b/tests/specs/run/dynamic_import_permissions_data_local/permissions_data_local.ts
@@ -0,0 +1,5 @@
+// This file doesn't really exist, but it doesn't matter, a "NotCapable" error should be thrown.
+const code = `import "file:///${
+ Deno.build.os == "windows" ? "C:/" : ""
+}local_file.ts";`;
+await import(`data:application/javascript;base64,${btoa(code)}`);
diff --git a/tests/specs/run/dynamic_import_permissions_data_local/permissions_data_local.ts.out b/tests/specs/run/dynamic_import_permissions_data_local/permissions_data_local.ts.out
new file mode 100644
index 000000000..bf8c1948e
--- /dev/null
+++ b/tests/specs/run/dynamic_import_permissions_data_local/permissions_data_local.ts.out
@@ -0,0 +1,5 @@
+error: Uncaught (in promise) TypeError: Requires read access to "[WILDCARD]local_file.ts", run again with the --allow-read flag
+ at data:application/javascript;base64,[WILDCARD]:1:8
+await import(`data:application/javascript;base64,${btoa(code)}`);
+^
+ at async file:///[WILDCARD]/permissions_data_local.ts:5:1
diff --git a/tests/specs/run/dynamic_import_permissions_data_remote/__test__.jsonc b/tests/specs/run/dynamic_import_permissions_data_remote/__test__.jsonc
new file mode 100644
index 000000000..5b2c0c568
--- /dev/null
+++ b/tests/specs/run/dynamic_import_permissions_data_remote/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run --quiet --reload --allow-import=localhost:4545 permissions_data_remote.ts",
+ "output": "permissions_data_remote.ts.out",
+ "exitCode": 1
+}
diff --git a/tests/specs/run/dynamic_import_permissions_data_remote/permissions_data_remote.ts b/tests/specs/run/dynamic_import_permissions_data_remote/permissions_data_remote.ts
new file mode 100644
index 000000000..b0a9540c3
--- /dev/null
+++ b/tests/specs/run/dynamic_import_permissions_data_remote/permissions_data_remote.ts
@@ -0,0 +1,3 @@
+// This file doesn't really exist, but it doesn't matter, a "PermissionsDenied" error should be thrown.
+const code = `import "https://example.com/some/file.ts";`;
+await import(`data:application/javascript;base64,${btoa(code)}`);
diff --git a/tests/specs/run/dynamic_import_permissions_data_remote/permissions_data_remote.ts.out b/tests/specs/run/dynamic_import_permissions_data_remote/permissions_data_remote.ts.out
new file mode 100644
index 000000000..c8de9382a
--- /dev/null
+++ b/tests/specs/run/dynamic_import_permissions_data_remote/permissions_data_remote.ts.out
@@ -0,0 +1,5 @@
+error: Uncaught (in promise) TypeError: Requires import access to "example.com:443", run again with the --allow-import flag
+ at data:application/javascript;base64,aW1wb3J0ICJodHRwczovL2V4YW1wbGUuY29tL3NvbWUvZmlsZS50cyI7:1:8
+await import(`data:application/javascript;base64,${btoa(code)}`);
+^
+ at async file:///[WILDCARD]/permissions_data_remote.ts:3:1
diff --git a/tests/specs/run/dynamic_import_permissions_remote_remote/__test__.jsonc b/tests/specs/run/dynamic_import_permissions_remote_remote/__test__.jsonc
new file mode 100644
index 000000000..00fd2a6e4
--- /dev/null
+++ b/tests/specs/run/dynamic_import_permissions_remote_remote/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run --quiet --reload --allow-import=localhost:4545 permissions_remote_remote.ts",
+ "output": "permissions_remote_remote.ts.out",
+ "exitCode": 1
+}
diff --git a/tests/specs/run/dynamic_import_permissions_remote_remote/permissions_remote_remote.ts b/tests/specs/run/dynamic_import_permissions_remote_remote/permissions_remote_remote.ts
new file mode 100644
index 000000000..65a254191
--- /dev/null
+++ b/tests/specs/run/dynamic_import_permissions_remote_remote/permissions_remote_remote.ts
@@ -0,0 +1,3 @@
+await import(
+ "" + "http://localhost:4545/dynamic_import/static_remote.ts"
+);
diff --git a/tests/specs/run/dynamic_import_permissions_remote_remote/permissions_remote_remote.ts.out b/tests/specs/run/dynamic_import_permissions_remote_remote/permissions_remote_remote.ts.out
new file mode 100644
index 000000000..16fe3bbdd
--- /dev/null
+++ b/tests/specs/run/dynamic_import_permissions_remote_remote/permissions_remote_remote.ts.out
@@ -0,0 +1,5 @@
+error: Uncaught (in promise) TypeError: Requires import access to "example.com:443", run again with the --allow-import flag
+ at http://localhost:4545/dynamic_import/static_remote.ts:2:8
+await import(
+^
+ at async file:///[WILDCARD]/permissions_remote_remote.ts:1:1
diff --git a/tests/specs/run/dynamic_import_permissions_remote_remote/static_remote.ts b/tests/specs/run/dynamic_import_permissions_remote_remote/static_remote.ts
new file mode 100644
index 000000000..2d6e820fd
--- /dev/null
+++ b/tests/specs/run/dynamic_import_permissions_remote_remote/static_remote.ts
@@ -0,0 +1,2 @@
+// This file doesn't really exist, but it doesn't matter, a "PermissionsDenied" error should be thrown.
+import "https://example.com/some/file.ts";
diff --git a/tests/specs/run/dynamic_import_static_analysis_no_permissions/__test__.jsonc b/tests/specs/run/dynamic_import_static_analysis_no_permissions/__test__.jsonc
new file mode 100644
index 000000000..937974869
--- /dev/null
+++ b/tests/specs/run/dynamic_import_static_analysis_no_permissions/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --quiet --reload --no-prompt static_analysis_no_permissions.ts",
+ "output": "static_analysis_no_permissions.ts.out"
+}
diff --git a/tests/specs/run/dynamic_import_static_analysis_no_permissions/empty_1.ts b/tests/specs/run/dynamic_import_static_analysis_no_permissions/empty_1.ts
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/tests/specs/run/dynamic_import_static_analysis_no_permissions/empty_1.ts
diff --git a/tests/specs/run/dynamic_import_static_analysis_no_permissions/empty_2.ts b/tests/specs/run/dynamic_import_static_analysis_no_permissions/empty_2.ts
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/tests/specs/run/dynamic_import_static_analysis_no_permissions/empty_2.ts
diff --git a/tests/specs/run/dynamic_import_static_analysis_no_permissions/static_analysis_no_permissions.ts b/tests/specs/run/dynamic_import_static_analysis_no_permissions/static_analysis_no_permissions.ts
new file mode 100644
index 000000000..de75ba87b
--- /dev/null
+++ b/tests/specs/run/dynamic_import_static_analysis_no_permissions/static_analysis_no_permissions.ts
@@ -0,0 +1,13 @@
+try {
+ await import("./empty_1.ts");
+ console.log("✅ Succeeded importing statically analyzable specifier");
+} catch {
+ console.log("⌠Failed importing statically analyzable specifier");
+}
+
+try {
+ await import("" + "./empty_2.ts");
+ console.log("⌠Succeeded importing non-statically analyzable specifier");
+} catch {
+ console.log("✅ Failed importing non-statically analyzable specifier");
+}
diff --git a/tests/specs/run/dynamic_import_static_analysis_no_permissions/static_analysis_no_permissions.ts.out b/tests/specs/run/dynamic_import_static_analysis_no_permissions/static_analysis_no_permissions.ts.out
new file mode 100644
index 000000000..ba9249ab0
--- /dev/null
+++ b/tests/specs/run/dynamic_import_static_analysis_no_permissions/static_analysis_no_permissions.ts.out
@@ -0,0 +1,2 @@
+✅ Succeeded importing statically analyzable specifier
+✅ Failed importing non-statically analyzable specifier
diff --git a/tests/specs/run/dynamic_import_syntax_error/__test__.jsonc b/tests/specs/run/dynamic_import_syntax_error/__test__.jsonc
new file mode 100644
index 000000000..1971d3184
--- /dev/null
+++ b/tests/specs/run/dynamic_import_syntax_error/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run -A dynamic_import_syntax_error.js",
+ "output": "dynamic_import_syntax_error.js.out",
+ "exitCode": 1
+}
diff --git a/tests/specs/run/dynamic_import_syntax_error/dynamic_import_syntax_error.js b/tests/specs/run/dynamic_import_syntax_error/dynamic_import_syntax_error.js
new file mode 100644
index 000000000..be8ec132f
--- /dev/null
+++ b/tests/specs/run/dynamic_import_syntax_error/dynamic_import_syntax_error.js
@@ -0,0 +1 @@
+await import("./dynamic_import_syntax_error_import.js");
diff --git a/tests/specs/run/dynamic_import_syntax_error/dynamic_import_syntax_error.js.out b/tests/specs/run/dynamic_import_syntax_error/dynamic_import_syntax_error.js.out
new file mode 100644
index 000000000..91e69eac7
--- /dev/null
+++ b/tests/specs/run/dynamic_import_syntax_error/dynamic_import_syntax_error.js.out
@@ -0,0 +1,4 @@
+error: Uncaught (in promise) SyntaxError: Unexpected reserved word at [WILDCARD]/dynamic_import_syntax_error_import.js:3:3
+await import("./dynamic_import_syntax_error_import.js");
+^
+ at async [WILDCARD]/dynamic_import_syntax_error.js:1:1
diff --git a/tests/specs/run/dynamic_import_syntax_error/dynamic_import_syntax_error_import.js b/tests/specs/run/dynamic_import_syntax_error/dynamic_import_syntax_error_import.js
new file mode 100644
index 000000000..bcf075638
--- /dev/null
+++ b/tests/specs/run/dynamic_import_syntax_error/dynamic_import_syntax_error_import.js
@@ -0,0 +1,5 @@
+// deno-lint-ignore-file
+function foo() {
+ await Promise.resolve();
+}
+foo();
diff --git a/tests/specs/run/empty_typescript/__test__.jsonc b/tests/specs/run/empty_typescript/__test__.jsonc
new file mode 100644
index 000000000..8090c50f6
--- /dev/null
+++ b/tests/specs/run/empty_typescript/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --reload --check empty.ts",
+ "output": "Check file:[WILDCARD]/empty.ts\n"
+}
diff --git a/tests/specs/run/empty_typescript/empty.ts b/tests/specs/run/empty_typescript/empty.ts
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/tests/specs/run/empty_typescript/empty.ts
diff --git a/tests/specs/run/error_001/__test__.jsonc b/tests/specs/run/error_001/__test__.jsonc
new file mode 100644
index 000000000..7b9158e4f
--- /dev/null
+++ b/tests/specs/run/error_001/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run --reload error_001.ts",
+ "output": "error_001.ts.out",
+ "exitCode": 1
+}
diff --git a/tests/specs/run/error_001/error_001.ts b/tests/specs/run/error_001/error_001.ts
new file mode 100644
index 000000000..b01068bc0
--- /dev/null
+++ b/tests/specs/run/error_001/error_001.ts
@@ -0,0 +1,9 @@
+function foo(): never {
+ throw Error("bad");
+}
+
+function bar() {
+ foo();
+}
+
+bar();
diff --git a/tests/specs/run/error_001/error_001.ts.out b/tests/specs/run/error_001/error_001.ts.out
new file mode 100644
index 000000000..9d8559917
--- /dev/null
+++ b/tests/specs/run/error_001/error_001.ts.out
@@ -0,0 +1,6 @@
+[WILDCARD]error: Uncaught (in promise) Error: bad
+ throw Error("bad");
+ ^
+ at foo ([WILDCARD]/error_001.ts:2:9)
+ at bar ([WILDCARD]/error_001.ts:6:3)
+ at [WILDCARD]/error_001.ts:9:1
diff --git a/tests/specs/run/error_002/__test__.jsonc b/tests/specs/run/error_002/__test__.jsonc
new file mode 100644
index 000000000..3a68a8675
--- /dev/null
+++ b/tests/specs/run/error_002/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run --reload error_002.ts",
+ "output": "error_002.ts.out",
+ "exitCode": 1
+}
diff --git a/tests/specs/run/error_002/error_002.ts b/tests/specs/run/error_002/error_002.ts
new file mode 100644
index 000000000..ac712fbf7
--- /dev/null
+++ b/tests/specs/run/error_002/error_002.ts
@@ -0,0 +1,7 @@
+import { throwsError } from "./mod1.ts";
+
+function foo() {
+ throwsError();
+}
+
+foo();
diff --git a/tests/specs/run/error_002/error_002.ts.out b/tests/specs/run/error_002/error_002.ts.out
new file mode 100644
index 000000000..1051e7360
--- /dev/null
+++ b/tests/specs/run/error_002/error_002.ts.out
@@ -0,0 +1,6 @@
+[WILDCARD]error: Uncaught (in promise) Error: exception from mod1
+ throw Error("exception from mod1");
+ ^
+ at throwsError ([WILDCARD]/mod1.ts:16:9)
+ at foo ([WILDCARD]/error_002.ts:4:3)
+ at [WILDCARD]/error_002.ts:7:1
diff --git a/tests/specs/run/error_002/mod1.ts b/tests/specs/run/error_002/mod1.ts
new file mode 100644
index 000000000..5e58f432e
--- /dev/null
+++ b/tests/specs/run/error_002/mod1.ts
@@ -0,0 +1,17 @@
+import { printHello2, returnsFoo } from "./subdir2/mod2.ts";
+
+export function returnsHi(): string {
+ return "Hi";
+}
+
+export function returnsFoo2(): string {
+ return returnsFoo();
+}
+
+export function printHello3() {
+ printHello2();
+}
+
+export function throwsError() {
+ throw Error("exception from mod1");
+}
diff --git a/tests/specs/run/error_002/print_hello.ts b/tests/specs/run/error_002/print_hello.ts
new file mode 100644
index 000000000..b9c0ad527
--- /dev/null
+++ b/tests/specs/run/error_002/print_hello.ts
@@ -0,0 +1,3 @@
+export function printHello() {
+ console.log("Hello");
+}
diff --git a/tests/specs/run/error_002/subdir2/mod2.ts b/tests/specs/run/error_002/subdir2/mod2.ts
new file mode 100644
index 000000000..9071d0aeb
--- /dev/null
+++ b/tests/specs/run/error_002/subdir2/mod2.ts
@@ -0,0 +1,9 @@
+import { printHello } from "../print_hello.ts";
+
+export function returnsFoo(): string {
+ return "Foo";
+}
+
+export function printHello2() {
+ printHello();
+}
diff --git a/tests/specs/run/error_003_typescript/__test__.jsonc b/tests/specs/run/error_003_typescript/__test__.jsonc
new file mode 100644
index 000000000..f7ef69b26
--- /dev/null
+++ b/tests/specs/run/error_003_typescript/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run --reload --check error_003_typescript.ts",
+ "output": "error_003_typescript.ts.out",
+ "exitCode": 1
+}
diff --git a/tests/specs/run/error_003_typescript/error_003_typescript.ts b/tests/specs/run/error_003_typescript/error_003_typescript.ts
new file mode 100644
index 000000000..e1f882123
--- /dev/null
+++ b/tests/specs/run/error_003_typescript/error_003_typescript.ts
@@ -0,0 +1,20 @@
+// deno-lint-ignore-file
+let x = {
+ a: {
+ b: {
+ c() {
+ return { d: "hello" };
+ },
+ },
+ },
+};
+let y = {
+ a: {
+ b: {
+ c() {
+ return { d: 1234 };
+ },
+ },
+ },
+};
+x = y;
diff --git a/tests/specs/run/error_003_typescript/error_003_typescript.ts.out b/tests/specs/run/error_003_typescript/error_003_typescript.ts.out
new file mode 100644
index 000000000..bbb2ec470
--- /dev/null
+++ b/tests/specs/run/error_003_typescript/error_003_typescript.ts.out
@@ -0,0 +1,7 @@
+[WILDCARD]
+error: TS2322 [ERROR]: Type '{ a: { b: { c(): { d: number; }; }; }; }' is not assignable to type '{ a: { b: { c(): { d: string; }; }; }; }'.
+ The types of 'a.b.c().d' are incompatible between these types.
+ Type 'number' is not assignable to type 'string'.
+x = y;
+^
+ at [WILDCARD]/error_003_typescript.ts:20:1
diff --git a/tests/specs/run/error_003_typescript2/__test__.jsonc b/tests/specs/run/error_003_typescript2/__test__.jsonc
new file mode 100644
index 000000000..ceeb6e7d9
--- /dev/null
+++ b/tests/specs/run/error_003_typescript2/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run --check error_003_typescript.ts",
+ "output": "error_003_typescript.ts.out",
+ "exitCode": 1
+}
diff --git a/tests/specs/run/error_003_typescript2/error_003_typescript.ts b/tests/specs/run/error_003_typescript2/error_003_typescript.ts
new file mode 100644
index 000000000..e1f882123
--- /dev/null
+++ b/tests/specs/run/error_003_typescript2/error_003_typescript.ts
@@ -0,0 +1,20 @@
+// deno-lint-ignore-file
+let x = {
+ a: {
+ b: {
+ c() {
+ return { d: "hello" };
+ },
+ },
+ },
+};
+let y = {
+ a: {
+ b: {
+ c() {
+ return { d: 1234 };
+ },
+ },
+ },
+};
+x = y;
diff --git a/tests/specs/run/error_003_typescript2/error_003_typescript.ts.out b/tests/specs/run/error_003_typescript2/error_003_typescript.ts.out
new file mode 100644
index 000000000..bbb2ec470
--- /dev/null
+++ b/tests/specs/run/error_003_typescript2/error_003_typescript.ts.out
@@ -0,0 +1,7 @@
+[WILDCARD]
+error: TS2322 [ERROR]: Type '{ a: { b: { c(): { d: number; }; }; }; }' is not assignable to type '{ a: { b: { c(): { d: string; }; }; }; }'.
+ The types of 'a.b.c().d' are incompatible between these types.
+ Type 'number' is not assignable to type 'string'.
+x = y;
+^
+ at [WILDCARD]/error_003_typescript.ts:20:1
diff --git a/tests/specs/run/error_004_missing_module/__test__.jsonc b/tests/specs/run/error_004_missing_module/__test__.jsonc
new file mode 100644
index 000000000..824b9d8c9
--- /dev/null
+++ b/tests/specs/run/error_004_missing_module/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run --reload error_004_missing_module.ts",
+ "output": "error_004_missing_module.ts.out",
+ "exitCode": 1
+}
diff --git a/tests/specs/run/error_004_missing_module/error_004_missing_module.ts b/tests/specs/run/error_004_missing_module/error_004_missing_module.ts
new file mode 100644
index 000000000..82b281181
--- /dev/null
+++ b/tests/specs/run/error_004_missing_module/error_004_missing_module.ts
@@ -0,0 +1,3 @@
+import * as badModule from "./bad-module.ts";
+
+console.log(badModule);
diff --git a/tests/specs/run/error_004_missing_module/error_004_missing_module.ts.out b/tests/specs/run/error_004_missing_module/error_004_missing_module.ts.out
new file mode 100644
index 000000000..9a2cfb8a8
--- /dev/null
+++ b/tests/specs/run/error_004_missing_module/error_004_missing_module.ts.out
@@ -0,0 +1,2 @@
+[WILDCARD]error: Module not found "file:///[WILDCARD]/bad-module.ts".
+ at file:///[WILDCARD]/error_004_missing_module.ts:1:28
diff --git a/tests/specs/run/error_005_missing_dynamic_import/__test__.jsonc b/tests/specs/run/error_005_missing_dynamic_import/__test__.jsonc
new file mode 100644
index 000000000..b9f6a1b74
--- /dev/null
+++ b/tests/specs/run/error_005_missing_dynamic_import/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run --reload --allow-read --quiet error_005_missing_dynamic_import.ts",
+ "output": "error_005_missing_dynamic_import.ts.out",
+ "exitCode": 1
+}
diff --git a/tests/specs/run/error_005_missing_dynamic_import/error_005_missing_dynamic_import.ts b/tests/specs/run/error_005_missing_dynamic_import/error_005_missing_dynamic_import.ts
new file mode 100644
index 000000000..8ea8ff94e
--- /dev/null
+++ b/tests/specs/run/error_005_missing_dynamic_import/error_005_missing_dynamic_import.ts
@@ -0,0 +1,3 @@
+(async () => {
+ const _badModule = await import("./bad-module.ts");
+})();
diff --git a/tests/specs/run/error_005_missing_dynamic_import/error_005_missing_dynamic_import.ts.out b/tests/specs/run/error_005_missing_dynamic_import/error_005_missing_dynamic_import.ts.out
new file mode 100644
index 000000000..55e4a8524
--- /dev/null
+++ b/tests/specs/run/error_005_missing_dynamic_import/error_005_missing_dynamic_import.ts.out
@@ -0,0 +1,4 @@
+error: Uncaught (in promise) TypeError: Module not found "[WILDCARD]/bad-module.ts".
+ const _badModule = await import("./bad-module.ts");
+ ^
+ at async file://[WILDCARD]/error_005_missing_dynamic_import.ts:2:22
diff --git a/tests/specs/run/error_006_import_ext_failure/__test__.jsonc b/tests/specs/run/error_006_import_ext_failure/__test__.jsonc
new file mode 100644
index 000000000..0e70bdcaf
--- /dev/null
+++ b/tests/specs/run/error_006_import_ext_failure/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run --reload error_006_import_ext_failure.ts",
+ "output": "error_006_import_ext_failure.ts.out",
+ "exitCode": 1
+}
diff --git a/tests/specs/run/error_006_import_ext_failure/error_006_import_ext_failure.ts b/tests/specs/run/error_006_import_ext_failure/error_006_import_ext_failure.ts
new file mode 100644
index 000000000..3c32303a3
--- /dev/null
+++ b/tests/specs/run/error_006_import_ext_failure/error_006_import_ext_failure.ts
@@ -0,0 +1 @@
+import "./non-existent";
diff --git a/tests/specs/run/error_006_import_ext_failure/error_006_import_ext_failure.ts.out b/tests/specs/run/error_006_import_ext_failure/error_006_import_ext_failure.ts.out
new file mode 100644
index 000000000..667579bd8
--- /dev/null
+++ b/tests/specs/run/error_006_import_ext_failure/error_006_import_ext_failure.ts.out
@@ -0,0 +1,2 @@
+[WILDCARD]error: Module not found "[WILDCARD]/non-existent".
+ at file:///[WILDCARD]/error_006_import_ext_failure.ts:1:8
diff --git a/tests/specs/run/error_007_any/__test__.jsonc b/tests/specs/run/error_007_any/__test__.jsonc
new file mode 100644
index 000000000..8a1c0d27e
--- /dev/null
+++ b/tests/specs/run/error_007_any/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run --reload error_007_any.ts",
+ "output": "error_007_any.ts.out",
+ "exitCode": 1
+}
diff --git a/tests/specs/run/error_007_any/error_007_any.ts b/tests/specs/run/error_007_any/error_007_any.ts
new file mode 100644
index 000000000..bfef1289b
--- /dev/null
+++ b/tests/specs/run/error_007_any/error_007_any.ts
@@ -0,0 +1 @@
+throw { foo: "bar" };
diff --git a/tests/specs/run/error_007_any/error_007_any.ts.out b/tests/specs/run/error_007_any/error_007_any.ts.out
new file mode 100644
index 000000000..8d13dadb9
--- /dev/null
+++ b/tests/specs/run/error_007_any/error_007_any.ts.out
@@ -0,0 +1 @@
+[WILDCARD]error: Uncaught (in promise) { foo: "bar" }
diff --git a/tests/specs/run/error_008_checkjs/__test__.jsonc b/tests/specs/run/error_008_checkjs/__test__.jsonc
new file mode 100644
index 000000000..f735be953
--- /dev/null
+++ b/tests/specs/run/error_008_checkjs/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run --reload error_008_checkjs.js",
+ "output": "error_008_checkjs.js.out",
+ "exitCode": 1
+}
diff --git a/tests/specs/run/error_008_checkjs/error_008_checkjs.js b/tests/specs/run/error_008_checkjs/error_008_checkjs.js
new file mode 100644
index 000000000..f0856d94c
--- /dev/null
+++ b/tests/specs/run/error_008_checkjs/error_008_checkjs.js
@@ -0,0 +1,5 @@
+// console.log intentionally misspelled to trigger a type error
+consol.log("hello world!");
+
+// the following error should be ignored and not output to the console
+const foo = new Foo();
diff --git a/tests/specs/run/error_008_checkjs/error_008_checkjs.js.out b/tests/specs/run/error_008_checkjs/error_008_checkjs.js.out
new file mode 100644
index 000000000..bab481422
--- /dev/null
+++ b/tests/specs/run/error_008_checkjs/error_008_checkjs.js.out
@@ -0,0 +1,4 @@
+[WILDCARD]error: Uncaught (in promise) ReferenceError: consol is not defined
+consol.log("hello world!");
+^
+ at [WILDCARD]/error_008_checkjs.js:2:1
diff --git a/tests/specs/run/error_009_extensions_error/__test__.jsonc b/tests/specs/run/error_009_extensions_error/__test__.jsonc
new file mode 100644
index 000000000..740d5119f
--- /dev/null
+++ b/tests/specs/run/error_009_extensions_error/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run error_009_extensions_error.js",
+ "output": "error_009_extensions_error.js.out",
+ "exitCode": 1
+}
diff --git a/tests/specs/run/error_009_extensions_error/error_009_extensions_error.js b/tests/specs/run/error_009_extensions_error/error_009_extensions_error.js
new file mode 100644
index 000000000..01b97ea38
--- /dev/null
+++ b/tests/specs/run/error_009_extensions_error/error_009_extensions_error.js
@@ -0,0 +1,2 @@
+// Missing arg.
+new Event();
diff --git a/tests/specs/run/error_009_extensions_error/error_009_extensions_error.js.out b/tests/specs/run/error_009_extensions_error/error_009_extensions_error.js.out
new file mode 100644
index 000000000..2ed936643
--- /dev/null
+++ b/tests/specs/run/error_009_extensions_error/error_009_extensions_error.js.out
@@ -0,0 +1,6 @@
+[WILDCARD]error: Uncaught (in promise) TypeError: Failed to construct 'Event': 1 argument required, but only 0 present
+new Event();
+^
+ at [WILDCARD]
+ at new Event (ext:deno_web/[WILDCARD])
+ at [WILDCARD]
diff --git a/tests/specs/run/error_011_bad_module_specifier/__test__.jsonc b/tests/specs/run/error_011_bad_module_specifier/__test__.jsonc
new file mode 100644
index 000000000..5ca5146be
--- /dev/null
+++ b/tests/specs/run/error_011_bad_module_specifier/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run --reload error_011_bad_module_specifier.ts",
+ "output": "error_011_bad_module_specifier.ts.out",
+ "exitCode": 1
+}
diff --git a/tests/specs/run/error_011_bad_module_specifier/error_011_bad_module_specifier.ts b/tests/specs/run/error_011_bad_module_specifier/error_011_bad_module_specifier.ts
new file mode 100644
index 000000000..1c57e37a5
--- /dev/null
+++ b/tests/specs/run/error_011_bad_module_specifier/error_011_bad_module_specifier.ts
@@ -0,0 +1,3 @@
+import * as badModule from "bad-module.ts";
+
+console.log(badModule);
diff --git a/tests/specs/run/error_011_bad_module_specifier/error_011_bad_module_specifier.ts.out b/tests/specs/run/error_011_bad_module_specifier/error_011_bad_module_specifier.ts.out
new file mode 100644
index 000000000..81be915d1
--- /dev/null
+++ b/tests/specs/run/error_011_bad_module_specifier/error_011_bad_module_specifier.ts.out
@@ -0,0 +1,2 @@
+[WILDCARD]error: Relative import path "bad-module.ts" not prefixed with / or ./ or ../
+ at [WILDCARD]/error_011_bad_module_specifier.ts:1:28
diff --git a/tests/specs/run/error_012_bad_dynamic_import_specifier/__test__.jsonc b/tests/specs/run/error_012_bad_dynamic_import_specifier/__test__.jsonc
new file mode 100644
index 000000000..9344f730d
--- /dev/null
+++ b/tests/specs/run/error_012_bad_dynamic_import_specifier/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run --reload --check error_012_bad_dynamic_import_specifier.ts",
+ "output": "error_012_bad_dynamic_import_specifier.ts.out",
+ "exitCode": 1
+}
diff --git a/tests/specs/run/error_012_bad_dynamic_import_specifier/error_012_bad_dynamic_import_specifier.ts b/tests/specs/run/error_012_bad_dynamic_import_specifier/error_012_bad_dynamic_import_specifier.ts
new file mode 100644
index 000000000..5f39f407c
--- /dev/null
+++ b/tests/specs/run/error_012_bad_dynamic_import_specifier/error_012_bad_dynamic_import_specifier.ts
@@ -0,0 +1,3 @@
+(async () => {
+ const _badModule = await import("bad-module.ts");
+})();
diff --git a/tests/specs/run/error_012_bad_dynamic_import_specifier/error_012_bad_dynamic_import_specifier.ts.out b/tests/specs/run/error_012_bad_dynamic_import_specifier/error_012_bad_dynamic_import_specifier.ts.out
new file mode 100644
index 000000000..7acd66713
--- /dev/null
+++ b/tests/specs/run/error_012_bad_dynamic_import_specifier/error_012_bad_dynamic_import_specifier.ts.out
@@ -0,0 +1,7 @@
+Check [WILDCARD]error_012_bad_dynamic_import_specifier.ts
+error: Uncaught (in promise) TypeError: Relative import path "bad-module.ts" not prefixed with / or ./ or ../
+ at [WILDCARD]/error_012_bad_dynamic_import_specifier.ts:2:35
+
+ const _badModule = await import("bad-module.ts");
+ ^
+ at async [WILDCARD]/error_012_bad_dynamic_import_specifier.ts:2:22
diff --git a/tests/specs/run/error_014_catch_dynamic_import_error/__test__.jsonc b/tests/specs/run/error_014_catch_dynamic_import_error/__test__.jsonc
new file mode 100644
index 000000000..94957dc65
--- /dev/null
+++ b/tests/specs/run/error_014_catch_dynamic_import_error/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --reload --allow-read error_014_catch_dynamic_import_error.js",
+ "output": "error_014_catch_dynamic_import_error.js.out"
+}
diff --git a/tests/specs/run/error_014_catch_dynamic_import_error/error_014_catch_dynamic_import_error.js b/tests/specs/run/error_014_catch_dynamic_import_error/error_014_catch_dynamic_import_error.js
new file mode 100644
index 000000000..05b021d15
--- /dev/null
+++ b/tests/specs/run/error_014_catch_dynamic_import_error/error_014_catch_dynamic_import_error.js
@@ -0,0 +1,31 @@
+(async () => {
+ try {
+ await import("does not exist");
+ } catch (err) {
+ console.log("Caught direct dynamic import error.");
+ console.log(err);
+ }
+
+ try {
+ await import("./indirect_import_error.js");
+ } catch (err) {
+ console.log("Caught indirect direct dynamic import error.");
+ console.log(err);
+ }
+
+ try {
+ await import("./throws.js");
+ } catch (err) {
+ console.log("Caught error thrown by dynamically imported module.");
+ console.log(err);
+ }
+
+ try {
+ await import("./indirect_throws.js");
+ } catch (err) {
+ console.log(
+ "Caught error thrown indirectly by dynamically imported module.",
+ );
+ console.log(err);
+ }
+})();
diff --git a/tests/specs/run/error_014_catch_dynamic_import_error/error_014_catch_dynamic_import_error.js.out b/tests/specs/run/error_014_catch_dynamic_import_error/error_014_catch_dynamic_import_error.js.out
new file mode 100644
index 000000000..71feaa55b
--- /dev/null
+++ b/tests/specs/run/error_014_catch_dynamic_import_error/error_014_catch_dynamic_import_error.js.out
@@ -0,0 +1,19 @@
+Caught direct dynamic import error.
+TypeError: Relative import path "does not exist" not prefixed with / or ./ or ../
+ at [WILDCARD]/error_014_catch_dynamic_import_error.js:3:18
+
+ at [WILDCARD]/error_014_catch_dynamic_import_error.js:3:5 {
+ code: "ERR_MODULE_NOT_FOUND"
+}
+Caught indirect direct dynamic import error.
+TypeError: Relative import path "does not exist either" not prefixed with / or ./ or ../
+ at [WILDCARD]/indirect_import_error.js:1:15
+ at async [WILDCARD]/error_014_catch_dynamic_import_error.js:10:5 {
+ code: "ERR_MODULE_NOT_FOUND"
+}
+Caught error thrown by dynamically imported module.
+Error: An error
+ at [WILDCARD]/throws.js:6:7
+Caught error thrown indirectly by dynamically imported module.
+Error: An error
+ at [WILDCARD]/throws.js:6:7
diff --git a/tests/specs/run/error_014_catch_dynamic_import_error/indirect_import_error.js b/tests/specs/run/error_014_catch_dynamic_import_error/indirect_import_error.js
new file mode 100644
index 000000000..84011d291
--- /dev/null
+++ b/tests/specs/run/error_014_catch_dynamic_import_error/indirect_import_error.js
@@ -0,0 +1 @@
+export * from "does not exist either";
diff --git a/tests/specs/run/error_014_catch_dynamic_import_error/indirect_throws.js b/tests/specs/run/error_014_catch_dynamic_import_error/indirect_throws.js
new file mode 100644
index 000000000..e1810a66c
--- /dev/null
+++ b/tests/specs/run/error_014_catch_dynamic_import_error/indirect_throws.js
@@ -0,0 +1 @@
+export * from "./throws.js";
diff --git a/tests/specs/run/error_014_catch_dynamic_import_error/throws.js b/tests/specs/run/error_014_catch_dynamic_import_error/throws.js
new file mode 100644
index 000000000..abdf29156
--- /dev/null
+++ b/tests/specs/run/error_014_catch_dynamic_import_error/throws.js
@@ -0,0 +1,6 @@
+// deno-lint-ignore-file
+export function boo() {
+ console.log("Boo!");
+}
+
+throw new Error("An error");
diff --git a/tests/specs/run/error_015_dynamic_import_permissions/__test__.jsonc b/tests/specs/run/error_015_dynamic_import_permissions/__test__.jsonc
new file mode 100644
index 000000000..3ab25f1a5
--- /dev/null
+++ b/tests/specs/run/error_015_dynamic_import_permissions/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run --reload --quiet error_015_dynamic_import_permissions.js",
+ "output": "error_015_dynamic_import_permissions.out",
+ "exitCode": 1
+}
diff --git a/tests/specs/run/error_015_dynamic_import_permissions/error_015_dynamic_import_permissions.js b/tests/specs/run/error_015_dynamic_import_permissions/error_015_dynamic_import_permissions.js
new file mode 100644
index 000000000..6e7daf5d0
--- /dev/null
+++ b/tests/specs/run/error_015_dynamic_import_permissions/error_015_dynamic_import_permissions.js
@@ -0,0 +1,3 @@
+(async () => {
+ await import("" + "http://example.com/mod4.js");
+})();
diff --git a/tests/specs/run/error_015_dynamic_import_permissions/error_015_dynamic_import_permissions.out b/tests/specs/run/error_015_dynamic_import_permissions/error_015_dynamic_import_permissions.out
new file mode 100644
index 000000000..8ef2f6f1e
--- /dev/null
+++ b/tests/specs/run/error_015_dynamic_import_permissions/error_015_dynamic_import_permissions.out
@@ -0,0 +1,4 @@
+error: Uncaught (in promise) TypeError: Requires import access to "example.com:80", run again with the --allow-import flag
+ await import("" + "http://example.com/mod4.js");
+ ^
+ at async file://[WILDCARD]/error_015_dynamic_import_permissions.js:2:3
diff --git a/tests/specs/run/error_015_dynamic_import_permissions/mod4.js b/tests/specs/run/error_015_dynamic_import_permissions/mod4.js
new file mode 100644
index 000000000..71332dbc4
--- /dev/null
+++ b/tests/specs/run/error_015_dynamic_import_permissions/mod4.js
@@ -0,0 +1 @@
+export const isMod4 = true;
diff --git a/tests/specs/run/error_017_hide_long_source_ts/__test__.jsonc b/tests/specs/run/error_017_hide_long_source_ts/__test__.jsonc
new file mode 100644
index 000000000..382d56039
--- /dev/null
+++ b/tests/specs/run/error_017_hide_long_source_ts/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run --reload --check error_017_hide_long_source_ts.ts",
+ "output": "error_017_hide_long_source_ts.ts.out",
+ "exitCode": 1
+}
diff --git a/tests/specs/run/error_017_hide_long_source_ts/error_017_hide_long_source_ts.ts b/tests/specs/run/error_017_hide_long_source_ts/error_017_hide_long_source_ts.ts
new file mode 100644
index 000000000..d61cb1277
--- /dev/null
+++ b/tests/specs/run/error_017_hide_long_source_ts/error_017_hide_long_source_ts.ts
@@ -0,0 +1,3 @@
+// deno-fmt-ignore-file
+const LONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONG = undefined;
+LONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONG.a;
diff --git a/tests/specs/run/error_017_hide_long_source_ts/error_017_hide_long_source_ts.ts.out b/tests/specs/run/error_017_hide_long_source_ts/error_017_hide_long_source_ts.ts.out
new file mode 100644
index 000000000..917061ab9
--- /dev/null
+++ b/tests/specs/run/error_017_hide_long_source_ts/error_017_hide_long_source_ts.ts.out
@@ -0,0 +1,3 @@
+[WILDCARD]
+error: TS2532 [ERROR]: Object is possibly 'undefined'.
+ at [WILDCARD]/error_017_hide_long_source_ts.ts:3:1
diff --git a/tests/specs/run/error_018_hide_long_source_js/__test__.jsonc b/tests/specs/run/error_018_hide_long_source_js/__test__.jsonc
new file mode 100644
index 000000000..4e91a820d
--- /dev/null
+++ b/tests/specs/run/error_018_hide_long_source_js/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run error_018_hide_long_source_js.js",
+ "output": "error_018_hide_long_source_js.js.out",
+ "exitCode": 1
+}
diff --git a/tests/specs/run/error_018_hide_long_source_js/error_018_hide_long_source_js.js b/tests/specs/run/error_018_hide_long_source_js/error_018_hide_long_source_js.js
new file mode 100644
index 000000000..d61cb1277
--- /dev/null
+++ b/tests/specs/run/error_018_hide_long_source_js/error_018_hide_long_source_js.js
@@ -0,0 +1,3 @@
+// deno-fmt-ignore-file
+const LONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONG = undefined;
+LONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONGLONG.a;
diff --git a/tests/specs/run/error_018_hide_long_source_js/error_018_hide_long_source_js.js.out b/tests/specs/run/error_018_hide_long_source_js/error_018_hide_long_source_js.js.out
new file mode 100644
index 000000000..0897a100c
--- /dev/null
+++ b/tests/specs/run/error_018_hide_long_source_js/error_018_hide_long_source_js.js.out
@@ -0,0 +1,2 @@
+error: Uncaught (in promise) TypeError: Cannot read properties of undefined (reading 'a')
+ at file:///[WILDCARD]/error_018_hide_long_source_js.js:3:206
diff --git a/tests/specs/run/error_019_stack_function/__test__.jsonc b/tests/specs/run/error_019_stack_function/__test__.jsonc
new file mode 100644
index 000000000..5e272ee49
--- /dev/null
+++ b/tests/specs/run/error_019_stack_function/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run error_019_stack_function.ts",
+ "output": "error_019_stack_function.ts.out",
+ "exitCode": 1
+}
diff --git a/tests/specs/run/error_019_stack_function/error_019_stack_function.ts b/tests/specs/run/error_019_stack_function/error_019_stack_function.ts
new file mode 100644
index 000000000..a6a69d146
--- /dev/null
+++ b/tests/specs/run/error_019_stack_function/error_019_stack_function.ts
@@ -0,0 +1,12 @@
+function foo(): never {
+ throw new Error("function");
+}
+
+try {
+ foo();
+} catch (error) {
+ if (error instanceof Error) {
+ console.log(error.stack);
+ }
+ throw error;
+}
diff --git a/tests/specs/run/error_019_stack_function/error_019_stack_function.ts.out b/tests/specs/run/error_019_stack_function/error_019_stack_function.ts.out
new file mode 100644
index 000000000..edaff27c0
--- /dev/null
+++ b/tests/specs/run/error_019_stack_function/error_019_stack_function.ts.out
@@ -0,0 +1,8 @@
+[WILDCARD]Error: function
+ at foo ([WILDCARD]/error_019_stack_function.ts:[WILDCARD])
+ at [WILDCARD]/error_019_stack_function.ts:[WILDCARD]
+error: Uncaught (in promise) Error: function
+ throw new Error("function");
+ ^
+ at foo ([WILDCARD]/error_019_stack_function.ts:[WILDCARD])
+ at [WILDCARD]/error_019_stack_function.ts:[WILDCARD]
diff --git a/tests/specs/run/error_020_stack_constructor/__test__.jsonc b/tests/specs/run/error_020_stack_constructor/__test__.jsonc
new file mode 100644
index 000000000..2dd574565
--- /dev/null
+++ b/tests/specs/run/error_020_stack_constructor/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run error_020_stack_constructor.ts",
+ "output": "error_020_stack_constructor.ts.out",
+ "exitCode": 1
+}
diff --git a/tests/specs/run/error_020_stack_constructor/error_020_stack_constructor.ts b/tests/specs/run/error_020_stack_constructor/error_020_stack_constructor.ts
new file mode 100644
index 000000000..526d1a661
--- /dev/null
+++ b/tests/specs/run/error_020_stack_constructor/error_020_stack_constructor.ts
@@ -0,0 +1,14 @@
+class A {
+ constructor() {
+ throw new Error("constructor");
+ }
+}
+
+try {
+ new A();
+} catch (error) {
+ if (error instanceof Error) {
+ console.log(error.stack);
+ }
+ throw error;
+}
diff --git a/tests/specs/run/error_020_stack_constructor/error_020_stack_constructor.ts.out b/tests/specs/run/error_020_stack_constructor/error_020_stack_constructor.ts.out
new file mode 100644
index 000000000..9e48b8f98
--- /dev/null
+++ b/tests/specs/run/error_020_stack_constructor/error_020_stack_constructor.ts.out
@@ -0,0 +1,8 @@
+[WILDCARD]Error: constructor
+ at new A ([WILDCARD]/error_020_stack_constructor.ts:[WILDCARD])
+ at [WILDCARD]/error_020_stack_constructor.ts:[WILDCARD]
+error: Uncaught (in promise) Error: constructor
+ throw new Error("constructor");
+ ^
+ at new A ([WILDCARD]/error_020_stack_constructor.ts:[WILDCARD])
+ at [WILDCARD]/error_020_stack_constructor.ts:[WILDCARD]
diff --git a/tests/specs/run/error_021_stack_method/__test__.jsonc b/tests/specs/run/error_021_stack_method/__test__.jsonc
new file mode 100644
index 000000000..db78cac09
--- /dev/null
+++ b/tests/specs/run/error_021_stack_method/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run error_021_stack_method.ts",
+ "output": "error_021_stack_method.ts.out",
+ "exitCode": 1
+}
diff --git a/tests/specs/run/error_021_stack_method/error_021_stack_method.ts b/tests/specs/run/error_021_stack_method/error_021_stack_method.ts
new file mode 100644
index 000000000..b6ebe1f5e
--- /dev/null
+++ b/tests/specs/run/error_021_stack_method/error_021_stack_method.ts
@@ -0,0 +1,14 @@
+class A {
+ m(): never {
+ throw new Error("method");
+ }
+}
+
+try {
+ new A().m();
+} catch (error) {
+ if (error instanceof Error) {
+ console.log(error.stack);
+ }
+ throw error;
+}
diff --git a/tests/specs/run/error_021_stack_method/error_021_stack_method.ts.out b/tests/specs/run/error_021_stack_method/error_021_stack_method.ts.out
new file mode 100644
index 000000000..9df9b1b7c
--- /dev/null
+++ b/tests/specs/run/error_021_stack_method/error_021_stack_method.ts.out
@@ -0,0 +1,8 @@
+[WILDCARD]Error: method
+ at A.m ([WILDCARD]/error_021_stack_method.ts:[WILDCARD])
+ at [WILDCARD]/error_021_stack_method.ts:[WILDCARD]
+error: Uncaught (in promise) Error: method
+ throw new Error("method");
+ ^
+ at A.m ([WILDCARD]/error_021_stack_method.ts:[WILDCARD])
+ at [WILDCARD]/error_021_stack_method.ts:[WILDCARD]
diff --git a/tests/specs/run/error_022_stack_custom_error/__test__.jsonc b/tests/specs/run/error_022_stack_custom_error/__test__.jsonc
new file mode 100644
index 000000000..f31505833
--- /dev/null
+++ b/tests/specs/run/error_022_stack_custom_error/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run error_022_stack_custom_error.ts",
+ "output": "error_022_stack_custom_error.ts.out",
+ "exitCode": 1
+}
diff --git a/tests/specs/run/error_022_stack_custom_error/error_022_stack_custom_error.ts b/tests/specs/run/error_022_stack_custom_error/error_022_stack_custom_error.ts
new file mode 100644
index 000000000..b95743503
--- /dev/null
+++ b/tests/specs/run/error_022_stack_custom_error/error_022_stack_custom_error.ts
@@ -0,0 +1,14 @@
+class CustomError extends Error {
+ constructor() {
+ super();
+ this.name = "CustomError";
+ }
+
+ get message(): string {
+ return "custom error";
+ }
+}
+
+const error = new CustomError();
+console.log(error.stack);
+throw error;
diff --git a/tests/specs/run/error_022_stack_custom_error/error_022_stack_custom_error.ts.out b/tests/specs/run/error_022_stack_custom_error/error_022_stack_custom_error.ts.out
new file mode 100644
index 000000000..73e033e52
--- /dev/null
+++ b/tests/specs/run/error_022_stack_custom_error/error_022_stack_custom_error.ts.out
@@ -0,0 +1,6 @@
+[WILDCARD]CustomError: custom error
+ at [WILDCARD]/error_022_stack_custom_error.ts:[WILDCARD]
+error: Uncaught (in promise) CustomError: custom error
+const error = new CustomError();
+ ^
+ at [WILDCARD]/error_022_stack_custom_error.ts:[WILDCARD]
diff --git a/tests/specs/run/error_023_stack_async/__test__.jsonc b/tests/specs/run/error_023_stack_async/__test__.jsonc
new file mode 100644
index 000000000..76cdff013
--- /dev/null
+++ b/tests/specs/run/error_023_stack_async/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run error_023_stack_async.ts",
+ "output": "error_023_stack_async.ts.out",
+ "exitCode": 1
+}
diff --git a/tests/specs/run/error_023_stack_async/error_023_stack_async.ts b/tests/specs/run/error_023_stack_async/error_023_stack_async.ts
new file mode 100644
index 000000000..fdabaa5df
--- /dev/null
+++ b/tests/specs/run/error_023_stack_async/error_023_stack_async.ts
@@ -0,0 +1,14 @@
+const p = (async () => {
+ await Promise.resolve().then((): never => {
+ throw new Error("async");
+ });
+})();
+
+try {
+ await p;
+} catch (error) {
+ if (error instanceof Error) {
+ console.log(error.stack);
+ }
+ throw error;
+}
diff --git a/tests/specs/run/error_023_stack_async/error_023_stack_async.ts.out b/tests/specs/run/error_023_stack_async/error_023_stack_async.ts.out
new file mode 100644
index 000000000..2d122d986
--- /dev/null
+++ b/tests/specs/run/error_023_stack_async/error_023_stack_async.ts.out
@@ -0,0 +1,10 @@
+[WILDCARD]Error: async
+ at [WILDCARD]/error_023_stack_async.ts:[WILDCARD]
+ at async [WILDCARD]/error_023_stack_async.ts:[WILDCARD]
+ at async [WILDCARD]/error_023_stack_async.ts:[WILDCARD]
+error: Uncaught (in promise) Error: async
+ throw new Error("async");
+ ^
+ at [WILDCARD]/error_023_stack_async.ts:[WILDCARD]
+ at async [WILDCARD]/error_023_stack_async.ts:[WILDCARD]
+ at async [WILDCARD]/error_023_stack_async.ts:[WILDCARD]
diff --git a/tests/specs/run/error_024_stack_promise_all/__test__.jsonc b/tests/specs/run/error_024_stack_promise_all/__test__.jsonc
new file mode 100644
index 000000000..7c733f971
--- /dev/null
+++ b/tests/specs/run/error_024_stack_promise_all/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run error_024_stack_promise_all.ts",
+ "output": "error_024_stack_promise_all.ts.out",
+ "exitCode": 1
+}
diff --git a/tests/specs/run/error_024_stack_promise_all/error_024_stack_promise_all.ts b/tests/specs/run/error_024_stack_promise_all/error_024_stack_promise_all.ts
new file mode 100644
index 000000000..8ca7b203c
--- /dev/null
+++ b/tests/specs/run/error_024_stack_promise_all/error_024_stack_promise_all.ts
@@ -0,0 +1,16 @@
+const p = Promise.all([
+ Promise.resolve(),
+ (async (): Promise<never> => {
+ await Promise.resolve();
+ throw new Error("Promise.all()");
+ })(),
+]);
+
+try {
+ await p;
+} catch (error) {
+ if (error instanceof Error) {
+ console.log(error.stack);
+ }
+ throw error;
+}
diff --git a/tests/specs/run/error_024_stack_promise_all/error_024_stack_promise_all.ts.out b/tests/specs/run/error_024_stack_promise_all/error_024_stack_promise_all.ts.out
new file mode 100644
index 000000000..c7d10a649
--- /dev/null
+++ b/tests/specs/run/error_024_stack_promise_all/error_024_stack_promise_all.ts.out
@@ -0,0 +1,10 @@
+[WILDCARD]Error: Promise.all()
+ at [WILDCARD]/error_024_stack_promise_all.ts:[WILDCARD]
+ at async Promise.all (index 1)
+ at async [WILDCARD]/error_024_stack_promise_all.ts:[WILDCARD]
+error: Uncaught (in promise) Error: Promise.all()
+ throw new Error("Promise.all()");
+ ^
+ at [WILDCARD]/error_024_stack_promise_all.ts:[WILDCARD]
+ at async Promise.all (index 1)
+ at async [WILDCARD]/error_024_stack_promise_all.ts:[WILDCARD]
diff --git a/tests/specs/run/error_025_tab_indent/__test__.jsonc b/tests/specs/run/error_025_tab_indent/__test__.jsonc
new file mode 100644
index 000000000..23c49458e
--- /dev/null
+++ b/tests/specs/run/error_025_tab_indent/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run error_025_tab_indent",
+ "output": "error_025_tab_indent.out",
+ "exitCode": 1
+}
diff --git a/tests/specs/run/error_025_tab_indent/error_025_tab_indent b/tests/specs/run/error_025_tab_indent/error_025_tab_indent
new file mode 100644
index 000000000..35a25bcea
--- /dev/null
+++ b/tests/specs/run/error_025_tab_indent/error_025_tab_indent
@@ -0,0 +1,9 @@
+function foo() {
+ throw Error("bad");
+}
+
+function bar() {
+ foo();
+}
+
+bar();
diff --git a/tests/specs/run/error_025_tab_indent/error_025_tab_indent.out b/tests/specs/run/error_025_tab_indent/error_025_tab_indent.out
new file mode 100644
index 000000000..edf525c90
--- /dev/null
+++ b/tests/specs/run/error_025_tab_indent/error_025_tab_indent.out
@@ -0,0 +1,6 @@
+[WILDCARD]error: Uncaught (in promise) Error: bad
+ throw Error("bad");
+ ^
+ at foo ([WILDCARD]/error_025_tab_indent:2:8)
+ at bar ([WILDCARD]/error_025_tab_indent:6:2)
+ at [WILDCARD]/error_025_tab_indent:9:1
diff --git a/tests/specs/run/error_cause/__test__.jsonc b/tests/specs/run/error_cause/__test__.jsonc
new file mode 100644
index 000000000..ccbf71dea
--- /dev/null
+++ b/tests/specs/run/error_cause/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run error_cause.ts",
+ "output": "error_cause.ts.out",
+ "exitCode": 1
+}
diff --git a/tests/specs/run/error_cause/error_cause.ts b/tests/specs/run/error_cause/error_cause.ts
new file mode 100644
index 000000000..385ce2a03
--- /dev/null
+++ b/tests/specs/run/error_cause/error_cause.ts
@@ -0,0 +1,14 @@
+function a() {
+ // deno-lint-ignore no-explicit-any
+ throw new Error("foo", { cause: new Error("bar", { cause: "deno" as any }) });
+}
+
+function b() {
+ a();
+}
+
+function c() {
+ b();
+}
+
+c();
diff --git a/tests/specs/run/error_cause/error_cause.ts.out b/tests/specs/run/error_cause/error_cause.ts.out
new file mode 100644
index 000000000..4dc439ac9
--- /dev/null
+++ b/tests/specs/run/error_cause/error_cause.ts.out
@@ -0,0 +1,13 @@
+error: Uncaught (in promise) Error: foo
+ throw new Error("foo", { cause: new Error("bar", { cause: "deno" as any }) });
+ ^
+ at a (file:///[WILDCARD]/error_cause.ts:3:9)
+ at b (file:///[WILDCARD]/error_cause.ts:7:3)
+ at c (file:///[WILDCARD]/error_cause.ts:11:3)
+ at file:///[WILDCARD]/error_cause.ts:14:1
+Caused by: Error: bar
+ at a (file:///[WILDCARD]/error_cause.ts:3:35)
+ at b (file:///[WILDCARD]/error_cause.ts:7:3)
+ at c (file:///[WILDCARD]/error_cause.ts:11:3)
+ at file:///[WILDCARD]/error_cause.ts:14:1
+Caused by: "deno"
diff --git a/tests/specs/run/error_cause_recursive/__test__.jsonc b/tests/specs/run/error_cause_recursive/__test__.jsonc
new file mode 100644
index 000000000..71c4cf3cc
--- /dev/null
+++ b/tests/specs/run/error_cause_recursive/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run error_cause_recursive.ts",
+ "output": "error_cause_recursive.ts.out",
+ "exitCode": 1
+}
diff --git a/tests/specs/run/error_cause_recursive/error_cause_recursive.ts b/tests/specs/run/error_cause_recursive/error_cause_recursive.ts
new file mode 100644
index 000000000..a6999b1ff
--- /dev/null
+++ b/tests/specs/run/error_cause_recursive/error_cause_recursive.ts
@@ -0,0 +1,4 @@
+const x = new Error("foo");
+const y = new Error("bar", { cause: x });
+x.cause = y;
+throw y;
diff --git a/tests/specs/run/error_cause_recursive/error_cause_recursive.ts.out b/tests/specs/run/error_cause_recursive/error_cause_recursive.ts.out
new file mode 100644
index 000000000..52d5a03a1
--- /dev/null
+++ b/tests/specs/run/error_cause_recursive/error_cause_recursive.ts.out
@@ -0,0 +1,7 @@
+error: Uncaught (in promise) Error: bar <ref *1>
+const y = new Error("bar", { cause: x });
+ ^
+ at file:///[WILDCARD]/error_cause_recursive.ts:2:11
+Caused by: Error: foo
+ at file:///[WILDCARD]/error_cause_recursive.ts:1:11
+Caused by: [Circular *1]
diff --git a/tests/specs/run/error_cause_recursive_aggregate/__test__.jsonc b/tests/specs/run/error_cause_recursive_aggregate/__test__.jsonc
new file mode 100644
index 000000000..2aabee0ec
--- /dev/null
+++ b/tests/specs/run/error_cause_recursive_aggregate/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run error_cause_recursive_aggregate.ts",
+ "output": "error_cause_recursive_aggregate.ts.out",
+ "exitCode": 1
+}
diff --git a/tests/specs/run/error_cause_recursive_aggregate/error_cause_recursive_aggregate.ts b/tests/specs/run/error_cause_recursive_aggregate/error_cause_recursive_aggregate.ts
new file mode 100644
index 000000000..4bb2ae064
--- /dev/null
+++ b/tests/specs/run/error_cause_recursive_aggregate/error_cause_recursive_aggregate.ts
@@ -0,0 +1,9 @@
+const foo = new Error("foo");
+const bar = new Error("bar", { cause: foo });
+foo.cause = bar;
+
+const qux = new Error("qux");
+const quux = new Error("quux", { cause: qux });
+qux.cause = quux;
+
+throw new AggregateError([bar, quux]);
diff --git a/tests/specs/run/error_cause_recursive_aggregate/error_cause_recursive_aggregate.ts.out b/tests/specs/run/error_cause_recursive_aggregate/error_cause_recursive_aggregate.ts.out
new file mode 100644
index 000000000..4ae20055a
--- /dev/null
+++ b/tests/specs/run/error_cause_recursive_aggregate/error_cause_recursive_aggregate.ts.out
@@ -0,0 +1,14 @@
+error: Uncaught (in promise) AggregateError
+ Error: bar <ref *1>
+ at file:///[WILDCARD]/error_cause_recursive_aggregate.ts:2:13
+ Caused by: Error: foo
+ at file:///[WILDCARD]/error_cause_recursive_aggregate.ts:1:13
+ Caused by: [Circular *1]
+ Error: quux <ref *2>
+ at file:///[WILDCARD]/error_cause_recursive_aggregate.ts:6:14
+ Caused by: Error: qux
+ at file:///[WILDCARD]/error_cause_recursive_aggregate.ts:5:13
+ Caused by: [Circular *2]
+throw new AggregateError([bar, quux]);
+ ^
+ at file:///[WILDCARD]/error_cause_recursive_aggregate.ts:9:7
diff --git a/tests/specs/run/error_cause_recursive_tail/__test__.jsonc b/tests/specs/run/error_cause_recursive_tail/__test__.jsonc
new file mode 100644
index 000000000..249ccac48
--- /dev/null
+++ b/tests/specs/run/error_cause_recursive_tail/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run error_cause_recursive_tail.ts",
+ "output": "error_cause_recursive_tail.ts.out",
+ "exitCode": 1
+}
diff --git a/tests/specs/run/error_cause_recursive_tail/error_cause_recursive_tail.ts b/tests/specs/run/error_cause_recursive_tail/error_cause_recursive_tail.ts
new file mode 100644
index 000000000..51e7fa6d9
--- /dev/null
+++ b/tests/specs/run/error_cause_recursive_tail/error_cause_recursive_tail.ts
@@ -0,0 +1,5 @@
+const foo = new Error("foo");
+const bar = new Error("bar", { cause: foo });
+const baz = new Error("baz", { cause: bar });
+foo.cause = bar;
+throw baz;
diff --git a/tests/specs/run/error_cause_recursive_tail/error_cause_recursive_tail.ts.out b/tests/specs/run/error_cause_recursive_tail/error_cause_recursive_tail.ts.out
new file mode 100644
index 000000000..04b15e91a
--- /dev/null
+++ b/tests/specs/run/error_cause_recursive_tail/error_cause_recursive_tail.ts.out
@@ -0,0 +1,9 @@
+error: Uncaught (in promise) Error: baz
+const baz = new Error("baz", { cause: bar });
+ ^
+ at file:///[WILDCARD]/error_cause_recursive_tail.ts:3:13
+Caused by: Error: bar <ref *1>
+ at file:///[WILDCARD]/error_cause_recursive_tail.ts:2:13
+Caused by: Error: foo
+ at file:///[WILDCARD]/error_cause_recursive_tail.ts:1:13
+Caused by: [Circular *1]
diff --git a/tests/specs/run/error_for_await/__test__.jsonc b/tests/specs/run/error_for_await/__test__.jsonc
new file mode 100644
index 000000000..b67f67ece
--- /dev/null
+++ b/tests/specs/run/error_for_await/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run --reload --check error_for_await.ts",
+ "output": "error_for_await.ts.out",
+ "exitCode": 1
+}
diff --git a/tests/specs/run/error_for_await/error_for_await.ts b/tests/specs/run/error_for_await/error_for_await.ts
new file mode 100644
index 000000000..ce8571df1
--- /dev/null
+++ b/tests/specs/run/error_for_await/error_for_await.ts
@@ -0,0 +1,12 @@
+const listener = Deno.listen({ port: 8080 });
+
+for await (const conn of listener) {
+ handleConn(conn);
+}
+
+function handleConn(conn: Deno.Conn) {
+ const httpConn = (Deno as any).serveHttp(conn);
+ for await (const event of httpConn) {
+ event.respondWith(new Response("html", { status: 200 }));
+ }
+}
diff --git a/tests/specs/run/error_for_await/error_for_await.ts.out b/tests/specs/run/error_for_await/error_for_await.ts.out
new file mode 100644
index 000000000..db3cdecb4
--- /dev/null
+++ b/tests/specs/run/error_for_await/error_for_await.ts.out
@@ -0,0 +1,10 @@
+[WILDCARD]
+error: TS1103 [ERROR]: 'for await' loops are only allowed within async functions and at the top levels of modules.
+ for await (const event of httpConn) {
+ ~~~~~
+ at [WILDCARD]error_for_await.ts:9:7
+
+TS1356 [ERROR]: Did you mean to mark this function as 'async'?
+ function handleConn(conn: Deno.Conn) {
+ ~~~~~~~~~~
+ at [WILDCARD]error_for_await.ts:7:10
diff --git a/tests/specs/run/error_import_map_unable_to_load/__test__.jsonc b/tests/specs/run/error_import_map_unable_to_load/__test__.jsonc
new file mode 100644
index 000000000..c7dd939a4
--- /dev/null
+++ b/tests/specs/run/error_import_map_unable_to_load/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run --import-map=import_maps/does_not_exist.json import_maps/test.ts",
+ "output": "error_import_map_unable_to_load.out",
+ "exitCode": 1
+}
diff --git a/tests/specs/run/error_import_map_unable_to_load/error_import_map_unable_to_load.out b/tests/specs/run/error_import_map_unable_to_load/error_import_map_unable_to_load.out
new file mode 100644
index 000000000..50760e438
--- /dev/null
+++ b/tests/specs/run/error_import_map_unable_to_load/error_import_map_unable_to_load.out
@@ -0,0 +1,4 @@
+error: Unable to load '[WILDCARD]' import map
+
+Caused by:
+ [WILDCARD] \ No newline at end of file
diff --git a/tests/specs/run/error_import_map_unable_to_load/import_maps/test_data.ts b/tests/specs/run/error_import_map_unable_to_load/import_maps/test_data.ts
new file mode 100644
index 000000000..5e8efea69
--- /dev/null
+++ b/tests/specs/run/error_import_map_unable_to_load/import_maps/test_data.ts
@@ -0,0 +1 @@
+import "test_server/import_maps/lodash/lodash.ts";
diff --git a/tests/specs/run/error_import_map_unable_to_load/import_maps/test_data.ts.out b/tests/specs/run/error_import_map_unable_to_load/import_maps/test_data.ts.out
new file mode 100644
index 000000000..da996dc0d
--- /dev/null
+++ b/tests/specs/run/error_import_map_unable_to_load/import_maps/test_data.ts.out
@@ -0,0 +1 @@
+Hello from remapped lodash!
diff --git a/tests/specs/run/error_missing_module_named_import/__test__.jsonc b/tests/specs/run/error_missing_module_named_import/__test__.jsonc
new file mode 100644
index 000000000..9f5780d2a
--- /dev/null
+++ b/tests/specs/run/error_missing_module_named_import/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run --reload error_missing_module_named_import.ts",
+ "output": "error_missing_module_named_import.ts.out",
+ "exitCode": 1
+}
diff --git a/tests/specs/run/error_missing_module_named_import/error_missing_module_named_import.ts b/tests/specs/run/error_missing_module_named_import/error_missing_module_named_import.ts
new file mode 100644
index 000000000..9eb5239ff
--- /dev/null
+++ b/tests/specs/run/error_missing_module_named_import/error_missing_module_named_import.ts
@@ -0,0 +1,3 @@
+import { a } from "./does_not_exist.js";
+
+console.log(a);
diff --git a/tests/specs/run/error_missing_module_named_import/error_missing_module_named_import.ts.out b/tests/specs/run/error_missing_module_named_import/error_missing_module_named_import.ts.out
new file mode 100644
index 000000000..700377d65
--- /dev/null
+++ b/tests/specs/run/error_missing_module_named_import/error_missing_module_named_import.ts.out
@@ -0,0 +1,2 @@
+error: Module not found "file://[WILDCARD]/does_not_exist.js".
+ at file:///[WILDCARD]/error_missing_module_named_import.ts:[WILDCARD]
diff --git a/tests/specs/run/error_name_non_string/__test__.jsonc b/tests/specs/run/error_name_non_string/__test__.jsonc
new file mode 100644
index 000000000..a6748b56a
--- /dev/null
+++ b/tests/specs/run/error_name_non_string/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run --quiet error_name_non_string.js",
+ "output": "error_name_non_string.js.out",
+ "exitCode": 1
+}
diff --git a/tests/specs/run/error_name_non_string/error_name_non_string.js b/tests/specs/run/error_name_non_string/error_name_non_string.js
new file mode 100644
index 000000000..ae9609927
--- /dev/null
+++ b/tests/specs/run/error_name_non_string/error_name_non_string.js
@@ -0,0 +1,8 @@
+class ErrorNameNonString extends Error {
+ constructor() {
+ super();
+ this.name = 42;
+ }
+}
+
+throw new ErrorNameNonString();
diff --git a/tests/specs/run/error_name_non_string/error_name_non_string.js.out b/tests/specs/run/error_name_non_string/error_name_non_string.js.out
new file mode 100644
index 000000000..14fa56c62
--- /dev/null
+++ b/tests/specs/run/error_name_non_string/error_name_non_string.js.out
@@ -0,0 +1,4 @@
+error: Uncaught (in promise) Error
+throw new ErrorNameNonString();
+ ^
+ at file:///[WILDCARD]/error_name_non_string.js:[WILDCARD]
diff --git a/tests/specs/run/error_no_check/__test__.jsonc b/tests/specs/run/error_no_check/__test__.jsonc
new file mode 100644
index 000000000..439dc5615
--- /dev/null
+++ b/tests/specs/run/error_no_check/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run --reload --no-check error_no_check.ts",
+ "output": "error_no_check.ts.out",
+ "exitCode": 1
+}
diff --git a/tests/specs/run/error_no_check/error_no_check.ts b/tests/specs/run/error_no_check/error_no_check.ts
new file mode 100644
index 000000000..95ebff028
--- /dev/null
+++ b/tests/specs/run/error_no_check/error_no_check.ts
@@ -0,0 +1 @@
+export { AnInterface, isAnInterface } from "./type_and_code.ts";
diff --git a/tests/specs/run/error_no_check/error_no_check.ts.out b/tests/specs/run/error_no_check/error_no_check.ts.out
new file mode 100644
index 000000000..c4e85332d
--- /dev/null
+++ b/tests/specs/run/error_no_check/error_no_check.ts.out
@@ -0,0 +1,2 @@
+error: Uncaught SyntaxError: The requested module './type_and_code.ts' does not provide an export named 'AnInterface'
+[WILDCARD] \ No newline at end of file
diff --git a/tests/specs/run/error_no_check/type_and_code.ts b/tests/specs/run/error_no_check/type_and_code.ts
new file mode 100644
index 000000000..b14713419
--- /dev/null
+++ b/tests/specs/run/error_no_check/type_and_code.ts
@@ -0,0 +1,7 @@
+export interface AnInterface {
+ a: string;
+}
+
+export function isAnInterface(value: unknown): value is AnInterface {
+ return value && typeof value === "object" && "a" in value;
+}
diff --git a/tests/specs/run/error_syntax/__test__.jsonc b/tests/specs/run/error_syntax/__test__.jsonc
new file mode 100644
index 000000000..7a60f2c73
--- /dev/null
+++ b/tests/specs/run/error_syntax/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run --reload error_syntax.js",
+ "output": "error_syntax.js.out",
+ "exitCode": 1
+}
diff --git a/tests/specs/run/error_syntax/error_syntax.js b/tests/specs/run/error_syntax/error_syntax.js
new file mode 100644
index 000000000..c0414c356
--- /dev/null
+++ b/tests/specs/run/error_syntax/error_syntax.js
@@ -0,0 +1,3 @@
+
+// deno-fmt-ignore-file
+(the following is a syntax error ^^ ! )
diff --git a/tests/specs/run/error_syntax/error_syntax.js.out b/tests/specs/run/error_syntax/error_syntax.js.out
new file mode 100644
index 000000000..fa4d51686
--- /dev/null
+++ b/tests/specs/run/error_syntax/error_syntax.js.out
@@ -0,0 +1,4 @@
+error: The module's source code could not be parsed: Expected ',', got 'following' at [WILDCARD]/error_syntax.js:3:6
+
+ (the following is a syntax error ^^ ! )
+ ~~~~~~~~~
diff --git a/tests/specs/run/error_syntax_empty_trailing_line/__test__.jsonc b/tests/specs/run/error_syntax_empty_trailing_line/__test__.jsonc
new file mode 100644
index 000000000..72f1de1f7
--- /dev/null
+++ b/tests/specs/run/error_syntax_empty_trailing_line/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run --reload error_syntax_empty_trailing_line.mjs",
+ "output": "error_syntax_empty_trailing_line.mjs.out",
+ "exitCode": 1
+}
diff --git a/tests/specs/run/error_syntax_empty_trailing_line/error_syntax_empty_trailing_line.mjs b/tests/specs/run/error_syntax_empty_trailing_line/error_syntax_empty_trailing_line.mjs
new file mode 100644
index 000000000..864dfb0c7
--- /dev/null
+++ b/tests/specs/run/error_syntax_empty_trailing_line/error_syntax_empty_trailing_line.mjs
@@ -0,0 +1,2 @@
+// Deliberately using .mjs to avoid triggering dprint
+setTimeout(() => {}),
diff --git a/tests/specs/run/error_syntax_empty_trailing_line/error_syntax_empty_trailing_line.mjs.out b/tests/specs/run/error_syntax_empty_trailing_line/error_syntax_empty_trailing_line.mjs.out
new file mode 100644
index 000000000..2c9b97aa4
--- /dev/null
+++ b/tests/specs/run/error_syntax_empty_trailing_line/error_syntax_empty_trailing_line.mjs.out
@@ -0,0 +1,6 @@
+error: The module's source code could not be parsed: Unexpected eof at [WILDCARD]/error_syntax_empty_trailing_line.mjs:3:1
+
+ setTimeout(() => {}),
+ ~~~~~~~~~~~~~~~~~~~~~
+
+ ~
diff --git a/tests/specs/run/error_type_definitions/__test__.jsonc b/tests/specs/run/error_type_definitions/__test__.jsonc
new file mode 100644
index 000000000..0ea9bc016
--- /dev/null
+++ b/tests/specs/run/error_type_definitions/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run --reload --check error_type_definitions.ts",
+ "output": "error_type_definitions.ts.out",
+ "exitCode": 1
+}
diff --git a/tests/specs/run/error_type_definitions/error_type_definitions.ts b/tests/specs/run/error_type_definitions/error_type_definitions.ts
new file mode 100644
index 000000000..ceb11787e
--- /dev/null
+++ b/tests/specs/run/error_type_definitions/error_type_definitions.ts
@@ -0,0 +1,5 @@
+// @deno-types="./type_definitions/bar.d.ts"
+import { Bar } from "./type_definitions/bar.js";
+
+const bar = new Bar();
+console.log(bar);
diff --git a/tests/specs/run/error_type_definitions/error_type_definitions.ts.out b/tests/specs/run/error_type_definitions/error_type_definitions.ts.out
new file mode 100644
index 000000000..057c21df5
--- /dev/null
+++ b/tests/specs/run/error_type_definitions/error_type_definitions.ts.out
@@ -0,0 +1,3 @@
+[WILDCARD]error: Failed resolving types. Relative import path "baz" not prefixed with / or ./ or ../
+ hint: If you want to use a JSR or npm package, try running `deno add jsr:baz` or `deno add npm:baz`
+ at [WILDCARD]/type_definitions/bar.d.ts:[WILDCARD]
diff --git a/tests/specs/run/error_type_definitions/type_definitions/bar.d.ts b/tests/specs/run/error_type_definitions/type_definitions/bar.d.ts
new file mode 100644
index 000000000..d43335dbb
--- /dev/null
+++ b/tests/specs/run/error_type_definitions/type_definitions/bar.d.ts
@@ -0,0 +1,7 @@
+/// <reference types="baz" />
+
+declare namespace bar {
+ export class Bar {
+ baz: string;
+ }
+}
diff --git a/tests/specs/run/error_type_definitions/type_definitions/bar.js b/tests/specs/run/error_type_definitions/type_definitions/bar.js
new file mode 100644
index 000000000..e9c2e5193
--- /dev/null
+++ b/tests/specs/run/error_type_definitions/type_definitions/bar.js
@@ -0,0 +1,5 @@
+export class Bar {
+ constructor() {
+ this.baz = "baz";
+ }
+}
diff --git a/tests/specs/run/error_type_definitions/type_definitions/fizz.d.ts b/tests/specs/run/error_type_definitions/type_definitions/fizz.d.ts
new file mode 100644
index 000000000..34eb41b96
--- /dev/null
+++ b/tests/specs/run/error_type_definitions/type_definitions/fizz.d.ts
@@ -0,0 +1,2 @@
+/** A global value. */
+declare const fizz: string;
diff --git a/tests/specs/run/error_type_definitions/type_definitions/fizz.js b/tests/specs/run/error_type_definitions/type_definitions/fizz.js
new file mode 100644
index 000000000..852162c94
--- /dev/null
+++ b/tests/specs/run/error_type_definitions/type_definitions/fizz.js
@@ -0,0 +1 @@
+globalThis.fizz = "fizz";
diff --git a/tests/specs/run/error_type_definitions/type_definitions/foo.d.ts b/tests/specs/run/error_type_definitions/type_definitions/foo.d.ts
new file mode 100644
index 000000000..ce39201e1
--- /dev/null
+++ b/tests/specs/run/error_type_definitions/type_definitions/foo.d.ts
@@ -0,0 +1,2 @@
+/** An exported value. */
+export const foo: string;
diff --git a/tests/specs/run/error_type_definitions/type_definitions/foo.js b/tests/specs/run/error_type_definitions/type_definitions/foo.js
new file mode 100644
index 000000000..61d366eb2
--- /dev/null
+++ b/tests/specs/run/error_type_definitions/type_definitions/foo.js
@@ -0,0 +1 @@
+export const foo = "foo";
diff --git a/tests/specs/run/error_type_definitions/type_definitions/qat.ts b/tests/specs/run/error_type_definitions/type_definitions/qat.ts
new file mode 100644
index 000000000..6196c9d38
--- /dev/null
+++ b/tests/specs/run/error_type_definitions/type_definitions/qat.ts
@@ -0,0 +1 @@
+export const qat = "qat";
diff --git a/tests/specs/run/error_with_errors_prop/__test__.jsonc b/tests/specs/run/error_with_errors_prop/__test__.jsonc
new file mode 100644
index 000000000..afbfd24cf
--- /dev/null
+++ b/tests/specs/run/error_with_errors_prop/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run --quiet error_with_errors_prop.js",
+ "output": "error_with_errors_prop.js.out",
+ "exitCode": 1
+}
diff --git a/tests/specs/run/error_with_errors_prop/error_with_errors_prop.js b/tests/specs/run/error_with_errors_prop/error_with_errors_prop.js
new file mode 100644
index 000000000..d1c6bbfaa
--- /dev/null
+++ b/tests/specs/run/error_with_errors_prop/error_with_errors_prop.js
@@ -0,0 +1,10 @@
+const error = new Error("Error with errors prop.");
+error.errors = [
+ new Error("Error message 1."),
+ new Error("Error message 2."),
+];
+console.log(error.stack);
+console.log();
+console.log(error);
+console.log();
+throw error;
diff --git a/tests/specs/run/error_with_errors_prop/error_with_errors_prop.js.out b/tests/specs/run/error_with_errors_prop/error_with_errors_prop.js.out
new file mode 100644
index 000000000..d958996af
--- /dev/null
+++ b/tests/specs/run/error_with_errors_prop/error_with_errors_prop.js.out
@@ -0,0 +1,17 @@
+Error: Error with errors prop.
+ at [WILDCARD]/error_with_errors_prop.js:1:15
+
+Error: Error with errors prop.
+ at [WILDCARD]/error_with_errors_prop.js:1:15 {
+ errors: [
+ Error: Error message 1.
+ at [WILDCARD]/error_with_errors_prop.js:3:3,
+ Error: Error message 2.
+ at [WILDCARD]/error_with_errors_prop.js:4:3
+ ]
+}
+
+error: Uncaught (in promise) Error: Error with errors prop.
+const error = new Error("Error with errors prop.");
+ ^
+ at [WILDCARD]/error_with_errors_prop.js:1:15
diff --git a/tests/specs/run/es_private_fields/__test__.jsonc b/tests/specs/run/es_private_fields/__test__.jsonc
new file mode 100644
index 000000000..817efd67e
--- /dev/null
+++ b/tests/specs/run/es_private_fields/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --quiet --reload es_private_fields.js",
+ "output": "es_private_fields.js.out"
+}
diff --git a/tests/specs/run/es_private_fields/es_private_fields.js b/tests/specs/run/es_private_fields/es_private_fields.js
new file mode 100644
index 000000000..b5f83e39c
--- /dev/null
+++ b/tests/specs/run/es_private_fields/es_private_fields.js
@@ -0,0 +1,15 @@
+class Foo {
+ #field = "field";
+
+ setValue(val) {
+ this.#field = val;
+ }
+
+ getValue() {
+ return this.#field;
+ }
+}
+
+const bar = new Foo();
+bar.setValue("PRIVATE");
+console.log(bar.getValue());
diff --git a/tests/specs/run/es_private_fields/es_private_fields.js.out b/tests/specs/run/es_private_fields/es_private_fields.js.out
new file mode 100644
index 000000000..be1970b05
--- /dev/null
+++ b/tests/specs/run/es_private_fields/es_private_fields.js.out
@@ -0,0 +1 @@
+PRIVATE
diff --git a/tests/specs/run/eval_context_throw_dom_exception/__test__.jsonc b/tests/specs/run/eval_context_throw_dom_exception/__test__.jsonc
new file mode 100644
index 000000000..6ad302b03
--- /dev/null
+++ b/tests/specs/run/eval_context_throw_dom_exception/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run eval_context_throw_dom_exception.js",
+ "output": "eval_context_throw_dom_exception.js.out"
+}
diff --git a/tests/specs/run/eval_context_throw_dom_exception/eval_context_throw_dom_exception.js b/tests/specs/run/eval_context_throw_dom_exception/eval_context_throw_dom_exception.js
new file mode 100644
index 000000000..99eaa0f4a
--- /dev/null
+++ b/tests/specs/run/eval_context_throw_dom_exception/eval_context_throw_dom_exception.js
@@ -0,0 +1,5 @@
+const [, errorInfo] = Deno[Deno.internal].core.evalContext(
+ 'throw new DOMException("foo")',
+ new URL("..", import.meta.url).href,
+);
+console.log(errorInfo);
diff --git a/tests/specs/run/eval_context_throw_dom_exception/eval_context_throw_dom_exception.js.out b/tests/specs/run/eval_context_throw_dom_exception/eval_context_throw_dom_exception.js.out
new file mode 100644
index 000000000..24ea0cffc
--- /dev/null
+++ b/tests/specs/run/eval_context_throw_dom_exception/eval_context_throw_dom_exception.js.out
@@ -0,0 +1,8 @@
+{
+ thrown: Error: foo
+ at [WILDCARD]
+ at Object.evalContext (ext:core/01_core.js:[WILDCARD])
+ at file:///[WILDCARD]/eval_context_throw_dom_exception.js:1:48,
+ isNativeError: true,
+ isCompileError: false
+}
diff --git a/tests/specs/run/event_listener_error/__test__.jsonc b/tests/specs/run/event_listener_error/__test__.jsonc
new file mode 100644
index 000000000..b2540e03d
--- /dev/null
+++ b/tests/specs/run/event_listener_error/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run --quiet event_listener_error.ts",
+ "output": "event_listener_error.ts.out",
+ "exitCode": 1
+}
diff --git a/tests/specs/run/event_listener_error/event_listener_error.ts b/tests/specs/run/event_listener_error/event_listener_error.ts
new file mode 100644
index 000000000..1cbdf7bc2
--- /dev/null
+++ b/tests/specs/run/event_listener_error/event_listener_error.ts
@@ -0,0 +1,6 @@
+addEventListener("foo", () => {
+ throw new Error("bar");
+});
+console.log(1);
+dispatchEvent(new CustomEvent("foo"));
+console.log(2);
diff --git a/tests/specs/run/event_listener_error/event_listener_error.ts.out b/tests/specs/run/event_listener_error/event_listener_error.ts.out
new file mode 100644
index 000000000..a20a91dfd
--- /dev/null
+++ b/tests/specs/run/event_listener_error/event_listener_error.ts.out
@@ -0,0 +1,7 @@
+1
+error: Uncaught Error: bar
+ throw new Error("bar");
+ ^
+ at [WILDCARD]/event_listener_error.ts:2:9
+ at [WILDCARD]
+ at [WILDCARD]/event_listener_error.ts:5:1
diff --git a/tests/specs/run/event_listener_error_handled/__test__.jsonc b/tests/specs/run/event_listener_error_handled/__test__.jsonc
new file mode 100644
index 000000000..f1fdcd5db
--- /dev/null
+++ b/tests/specs/run/event_listener_error_handled/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --quiet event_listener_error_handled.ts",
+ "output": "event_listener_error_handled.ts.out"
+}
diff --git a/tests/specs/run/event_listener_error_handled/event_listener_error_handled.ts b/tests/specs/run/event_listener_error_handled/event_listener_error_handled.ts
new file mode 100644
index 000000000..c4c8fd1cd
--- /dev/null
+++ b/tests/specs/run/event_listener_error_handled/event_listener_error_handled.ts
@@ -0,0 +1,23 @@
+addEventListener("error", (event) => {
+ console.log({
+ cancelable: event.cancelable,
+ message: event.message,
+ filename: event.filename?.slice?.(-100),
+ lineno: event.lineno,
+ colno: event.colno,
+ error: event.error,
+ });
+ event.preventDefault();
+});
+
+onerror = (event) => {
+ console.log("onerror() called", event.error);
+};
+
+addEventListener("foo", () => {
+ throw new Error("bar");
+});
+
+console.log(1);
+dispatchEvent(new CustomEvent("foo"));
+console.log(2);
diff --git a/tests/specs/run/event_listener_error_handled/event_listener_error_handled.ts.out b/tests/specs/run/event_listener_error_handled/event_listener_error_handled.ts.out
new file mode 100644
index 000000000..d3cf525c3
--- /dev/null
+++ b/tests/specs/run/event_listener_error_handled/event_listener_error_handled.ts.out
@@ -0,0 +1,17 @@
+1
+{
+ cancelable: true,
+ message: "Uncaught Error: bar",
+ filename: "[WILDCARD]/event_listener_error_handled.ts",
+ lineno: 18,
+ colno: 9,
+ error: Error: bar
+ at [WILDCARD]/event_listener_error_handled.ts:18:9
+ at [WILDCARD]
+ at [WILDCARD]/event_listener_error_handled.ts:22:1
+}
+onerror() called Error: bar
+ at [WILDCARD]/event_listener_error_handled.ts:18:9
+ at [WILDCARD]
+ at [WILDCARD]/event_listener_error_handled.ts:22:1
+2
diff --git a/tests/specs/run/event_listener_error_immediate_exit/__test__.jsonc b/tests/specs/run/event_listener_error_immediate_exit/__test__.jsonc
new file mode 100644
index 000000000..2974c0e42
--- /dev/null
+++ b/tests/specs/run/event_listener_error_immediate_exit/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run --quiet event_listener_error_immediate_exit.ts",
+ "output": "event_listener_error_immediate_exit.ts.out",
+ "exitCode": 1
+}
diff --git a/tests/specs/run/event_listener_error_immediate_exit/event_listener_error_immediate_exit.ts b/tests/specs/run/event_listener_error_immediate_exit/event_listener_error_immediate_exit.ts
new file mode 100644
index 000000000..292a0df00
--- /dev/null
+++ b/tests/specs/run/event_listener_error_immediate_exit/event_listener_error_immediate_exit.ts
@@ -0,0 +1,12 @@
+addEventListener("foo", () => {
+ queueMicrotask(() => console.log("queueMicrotask"));
+ setTimeout(() => console.log("timer"), 0);
+ throw new Error("bar");
+});
+console.log(1);
+// @ts-ignore Deno[Deno.internal].core
+Deno[Deno.internal].core.setNextTickCallback(() => console.log("nextTick"));
+// @ts-ignore Deno[Deno.internal].core
+Deno[Deno.internal].core.setHasTickScheduled(true);
+dispatchEvent(new CustomEvent("foo"));
+console.log(2);
diff --git a/tests/specs/run/event_listener_error_immediate_exit/event_listener_error_immediate_exit.ts.out b/tests/specs/run/event_listener_error_immediate_exit/event_listener_error_immediate_exit.ts.out
new file mode 100644
index 000000000..8f03f71b8
--- /dev/null
+++ b/tests/specs/run/event_listener_error_immediate_exit/event_listener_error_immediate_exit.ts.out
@@ -0,0 +1,6 @@
+1
+error: Uncaught Error: bar
+ throw new Error("bar");
+ ^
+ at [WILDCARD]/event_listener_error_immediate_exit.ts:4:9[WILDCARD]
+ at [WILDCARD]/event_listener_error_immediate_exit.ts:11:1
diff --git a/tests/specs/run/event_listener_error_immediate_exit_worker/__test__.jsonc b/tests/specs/run/event_listener_error_immediate_exit_worker/__test__.jsonc
new file mode 100644
index 000000000..6ef3ef2ed
--- /dev/null
+++ b/tests/specs/run/event_listener_error_immediate_exit_worker/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run --quiet -A event_listener_error_immediate_exit_worker.ts",
+ "output": "event_listener_error_immediate_exit_worker.ts.out",
+ "exitCode": 1
+}
diff --git a/tests/specs/run/event_listener_error_immediate_exit_worker/event_listener_error_immediate_exit.ts b/tests/specs/run/event_listener_error_immediate_exit_worker/event_listener_error_immediate_exit.ts
new file mode 100644
index 000000000..292a0df00
--- /dev/null
+++ b/tests/specs/run/event_listener_error_immediate_exit_worker/event_listener_error_immediate_exit.ts
@@ -0,0 +1,12 @@
+addEventListener("foo", () => {
+ queueMicrotask(() => console.log("queueMicrotask"));
+ setTimeout(() => console.log("timer"), 0);
+ throw new Error("bar");
+});
+console.log(1);
+// @ts-ignore Deno[Deno.internal].core
+Deno[Deno.internal].core.setNextTickCallback(() => console.log("nextTick"));
+// @ts-ignore Deno[Deno.internal].core
+Deno[Deno.internal].core.setHasTickScheduled(true);
+dispatchEvent(new CustomEvent("foo"));
+console.log(2);
diff --git a/tests/specs/run/event_listener_error_immediate_exit_worker/event_listener_error_immediate_exit_worker.ts b/tests/specs/run/event_listener_error_immediate_exit_worker/event_listener_error_immediate_exit_worker.ts
new file mode 100644
index 000000000..58c45d1bb
--- /dev/null
+++ b/tests/specs/run/event_listener_error_immediate_exit_worker/event_listener_error_immediate_exit_worker.ts
@@ -0,0 +1,4 @@
+new Worker(
+ import.meta.resolve("./event_listener_error_immediate_exit.ts"),
+ { type: "module" },
+);
diff --git a/tests/specs/run/event_listener_error_immediate_exit_worker/event_listener_error_immediate_exit_worker.ts.out b/tests/specs/run/event_listener_error_immediate_exit_worker/event_listener_error_immediate_exit_worker.ts.out
new file mode 100644
index 000000000..85b52190b
--- /dev/null
+++ b/tests/specs/run/event_listener_error_immediate_exit_worker/event_listener_error_immediate_exit_worker.ts.out
@@ -0,0 +1,8 @@
+1
+error: Uncaught (in worker "") Error: bar
+ throw new Error("bar");
+ ^
+ at [WILDCARD]/event_listener_error_immediate_exit.ts:4:9[WILDCARD]
+ at [WILDCARD]/event_listener_error_immediate_exit.ts:11:1
+error: Uncaught (in promise) Error: Unhandled error in child worker.
+ at [WILDCARD]
diff --git a/tests/specs/run/exit_error42/__test__.jsonc b/tests/specs/run/exit_error42/__test__.jsonc
new file mode 100644
index 000000000..43d308956
--- /dev/null
+++ b/tests/specs/run/exit_error42/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run --quiet --reload exit_error42.ts",
+ "output": "exit_error42.ts.out",
+ "exitCode": 42
+}
diff --git a/tests/specs/run/exit_error42/exit_error42.ts b/tests/specs/run/exit_error42/exit_error42.ts
new file mode 100644
index 000000000..e4db41f3a
--- /dev/null
+++ b/tests/specs/run/exit_error42/exit_error42.ts
@@ -0,0 +1,3 @@
+console.log("before");
+Deno.exit(42);
+console.log("after");
diff --git a/tests/specs/run/exit_error42/exit_error42.ts.out b/tests/specs/run/exit_error42/exit_error42.ts.out
new file mode 100644
index 000000000..90be1f305
--- /dev/null
+++ b/tests/specs/run/exit_error42/exit_error42.ts.out
@@ -0,0 +1 @@
+before
diff --git a/tests/specs/run/explicit_resource_management/__test__.jsonc b/tests/specs/run/explicit_resource_management/__test__.jsonc
new file mode 100644
index 000000000..7062e6f36
--- /dev/null
+++ b/tests/specs/run/explicit_resource_management/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --quiet --check explicit_resource_management/main.ts",
+ "output": "explicit_resource_management/main.out"
+}
diff --git a/tests/specs/run/explicit_resource_management/explicit_resource_management/main.out b/tests/specs/run/explicit_resource_management/explicit_resource_management/main.out
new file mode 100644
index 000000000..ff5ac4b59
--- /dev/null
+++ b/tests/specs/run/explicit_resource_management/explicit_resource_management/main.out
@@ -0,0 +1,5 @@
+A
+Disposed
+B
+Async disposed
+C
diff --git a/tests/specs/run/explicit_resource_management/explicit_resource_management/main.ts b/tests/specs/run/explicit_resource_management/explicit_resource_management/main.ts
new file mode 100644
index 000000000..0201a51f9
--- /dev/null
+++ b/tests/specs/run/explicit_resource_management/explicit_resource_management/main.ts
@@ -0,0 +1,21 @@
+class Resource {
+ [Symbol.dispose]() {
+ console.log("Disposed");
+ }
+}
+class AsyncResource {
+ async [Symbol.asyncDispose]() {
+ await new Promise((resolve) => setTimeout(resolve, 10));
+ console.log("Async disposed");
+ }
+}
+
+{
+ using resource = new Resource();
+ console.log("A");
+}
+{
+ await using resource = new AsyncResource();
+ console.log("B");
+}
+console.log("C");
diff --git a/tests/specs/run/ext_flag_takes_precedence_over_extension/__test__.jsonc b/tests/specs/run/ext_flag_takes_precedence_over_extension/__test__.jsonc
new file mode 100644
index 000000000..0806088b4
--- /dev/null
+++ b/tests/specs/run/ext_flag_takes_precedence_over_extension/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run --ext ts --check ts_with_js_extension.js",
+ "output": "ts_with_js_extension.out",
+ "exitCode": 0
+}
diff --git a/tests/specs/run/ext_flag_takes_precedence_over_extension/ts_with_js_extension.js b/tests/specs/run/ext_flag_takes_precedence_over_extension/ts_with_js_extension.js
new file mode 100644
index 000000000..3c49f7484
--- /dev/null
+++ b/tests/specs/run/ext_flag_takes_precedence_over_extension/ts_with_js_extension.js
@@ -0,0 +1,5 @@
+interface Lollipop {
+ _: number;
+}
+
+console.log("executing typescript with extension");
diff --git a/tests/specs/run/ext_flag_takes_precedence_over_extension/ts_with_js_extension.out b/tests/specs/run/ext_flag_takes_precedence_over_extension/ts_with_js_extension.out
new file mode 100644
index 000000000..7ae7b9168
--- /dev/null
+++ b/tests/specs/run/ext_flag_takes_precedence_over_extension/ts_with_js_extension.out
@@ -0,0 +1,2 @@
+Check [WILDCARD]/ts_with_js_extension.js
+executing typescript with extension
diff --git a/tests/specs/run/fetch_async_error_stack/__test__.jsonc b/tests/specs/run/fetch_async_error_stack/__test__.jsonc
new file mode 100644
index 000000000..152f57807
--- /dev/null
+++ b/tests/specs/run/fetch_async_error_stack/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run --quiet -A fetch_async_error_stack.ts",
+ "output": "fetch_async_error_stack.ts.out",
+ "exitCode": 1
+}
diff --git a/tests/specs/run/fetch_async_error_stack/fetch_async_error_stack.ts b/tests/specs/run/fetch_async_error_stack/fetch_async_error_stack.ts
new file mode 100644
index 000000000..f583192c2
--- /dev/null
+++ b/tests/specs/run/fetch_async_error_stack/fetch_async_error_stack.ts
@@ -0,0 +1 @@
+await fetch("https://nonexistent.deno.land/");
diff --git a/tests/specs/run/fetch_async_error_stack/fetch_async_error_stack.ts.out b/tests/specs/run/fetch_async_error_stack/fetch_async_error_stack.ts.out
new file mode 100644
index 000000000..2722cc8a7
--- /dev/null
+++ b/tests/specs/run/fetch_async_error_stack/fetch_async_error_stack.ts.out
@@ -0,0 +1,5 @@
+error: Uncaught (in promise) TypeError: error sending request for url (https://nonexistent.deno.land/): client error[WILDCARD]
+await fetch("https://nonexistent.deno.land/");
+^[WILDCARD]
+ at async fetch (ext:[WILDCARD])
+ at async file:///[WILDCARD]/fetch_async_error_stack.ts:1:1
diff --git a/tests/specs/run/fetch_response_finalization/__test__.jsonc b/tests/specs/run/fetch_response_finalization/__test__.jsonc
new file mode 100644
index 000000000..51a7e2b04
--- /dev/null
+++ b/tests/specs/run/fetch_response_finalization/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run --v8-flags=--expose-gc --allow-net fetch_response_finalization.js",
+ "output": "fetch_response_finalization.js.out",
+ "exitCode": 0
+}
diff --git a/tests/specs/run/fetch_response_finalization/fetch_response_finalization.js b/tests/specs/run/fetch_response_finalization/fetch_response_finalization.js
new file mode 100644
index 000000000..85fc6afa3
--- /dev/null
+++ b/tests/specs/run/fetch_response_finalization/fetch_response_finalization.js
@@ -0,0 +1,16 @@
+async function doAFetch() {
+ const resp = await fetch("http://localhost:4545/README.md");
+ console.log(Deno[Deno.internal].core.resources()); // print the current resources
+ const _resp = resp;
+ // at this point resp can be GC'ed
+}
+
+await doAFetch(); // create a resource
+
+globalThis.gc(); // force GC
+
+// It is very important that there is a yield here, otherwise the finalizer for
+// the response body is not called and the resource is not closed.
+await new Promise((resolve) => setTimeout(resolve, 0));
+
+console.log(Deno[Deno.internal].core.resources()); // print the current resources
diff --git a/tests/specs/run/fetch_response_finalization/fetch_response_finalization.js.out b/tests/specs/run/fetch_response_finalization/fetch_response_finalization.js.out
new file mode 100644
index 000000000..645842a5b
--- /dev/null
+++ b/tests/specs/run/fetch_response_finalization/fetch_response_finalization.js.out
@@ -0,0 +1,2 @@
+{ "0": "stdin", "1": "stdout", "2": "stderr", "5": "fetchResponse" }
+{ "0": "stdin", "1": "stdout", "2": "stderr" }
diff --git a/tests/specs/run/finalization_registry/__test__.jsonc b/tests/specs/run/finalization_registry/__test__.jsonc
new file mode 100644
index 000000000..f7526506c
--- /dev/null
+++ b/tests/specs/run/finalization_registry/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --quiet --v8-flags=--expose-gc finalization_registry.js",
+ "output": "finalization_registry.js.out"
+}
diff --git a/tests/specs/run/finalization_registry/finalization_registry.js b/tests/specs/run/finalization_registry/finalization_registry.js
new file mode 100644
index 000000000..ee9dc384f
--- /dev/null
+++ b/tests/specs/run/finalization_registry/finalization_registry.js
@@ -0,0 +1,20 @@
+// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
+"use strict";
+
+function assertEquals(a, b) {
+ if (a === b) return;
+ throw a + " does not equal " + b;
+}
+
+const registry = new FinalizationRegistry((value) => {
+ assertEquals(value, "called!");
+ Deno[Deno.internal].core.print("FinalizationRegistry called!\n");
+});
+
+(function () {
+ let x = {};
+ registry.register(x, "called!");
+ x = null;
+})();
+
+gc();
diff --git a/tests/specs/run/finalization_registry/finalization_registry.js.out b/tests/specs/run/finalization_registry/finalization_registry.js.out
new file mode 100644
index 000000000..fee61413a
--- /dev/null
+++ b/tests/specs/run/finalization_registry/finalization_registry.js.out
@@ -0,0 +1 @@
+FinalizationRegistry called!
diff --git a/tests/specs/run/fix_dynamic_import_errors/__test__.jsonc b/tests/specs/run/fix_dynamic_import_errors/__test__.jsonc
new file mode 100644
index 000000000..d9302d2ca
--- /dev/null
+++ b/tests/specs/run/fix_dynamic_import_errors/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --reload fix_dynamic_import_errors.js",
+ "output": "fix_dynamic_import_errors.js.out"
+}
diff --git a/tests/specs/run/fix_dynamic_import_errors/b.js b/tests/specs/run/fix_dynamic_import_errors/b.js
new file mode 100644
index 000000000..6ea50d360
--- /dev/null
+++ b/tests/specs/run/fix_dynamic_import_errors/b.js
@@ -0,0 +1,2 @@
+import "./bad.mjs";
+export default () => "error";
diff --git a/tests/specs/run/fix_dynamic_import_errors/c.js b/tests/specs/run/fix_dynamic_import_errors/c.js
new file mode 100644
index 000000000..20546455e
--- /dev/null
+++ b/tests/specs/run/fix_dynamic_import_errors/c.js
@@ -0,0 +1,2 @@
+await import("./bad2.mjs");
+export default () => "error";
diff --git a/tests/specs/run/fix_dynamic_import_errors/fix_dynamic_import_errors.js b/tests/specs/run/fix_dynamic_import_errors/fix_dynamic_import_errors.js
new file mode 100644
index 000000000..e105cbada
--- /dev/null
+++ b/tests/specs/run/fix_dynamic_import_errors/fix_dynamic_import_errors.js
@@ -0,0 +1,7 @@
+import("./b.js").catch(() => {
+ console.log("caught import error from b.js");
+});
+
+import("./c.js").catch(() => {
+ console.log("caught import error from c.js");
+});
diff --git a/tests/specs/run/fix_dynamic_import_errors/fix_dynamic_import_errors.js.out b/tests/specs/run/fix_dynamic_import_errors/fix_dynamic_import_errors.js.out
new file mode 100644
index 000000000..e7856fb9c
--- /dev/null
+++ b/tests/specs/run/fix_dynamic_import_errors/fix_dynamic_import_errors.js.out
@@ -0,0 +1,2 @@
+caught import error from [WILDCARD].js
+caught import error from [WILDCARD].js
diff --git a/tests/specs/run/fix_emittable_skipped/__test__.jsonc b/tests/specs/run/fix_emittable_skipped/__test__.jsonc
new file mode 100644
index 000000000..ef1445e0e
--- /dev/null
+++ b/tests/specs/run/fix_emittable_skipped/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --reload fix_emittable_skipped.js",
+ "output": "fix_emittable_skipped.ts.out"
+}
diff --git a/tests/specs/run/fix_emittable_skipped/emittable.d.ts b/tests/specs/run/fix_emittable_skipped/emittable.d.ts
new file mode 100644
index 000000000..425b80f24
--- /dev/null
+++ b/tests/specs/run/fix_emittable_skipped/emittable.d.ts
@@ -0,0 +1 @@
+export const a: string;
diff --git a/tests/specs/run/fix_emittable_skipped/fix_emittable_skipped.js b/tests/specs/run/fix_emittable_skipped/fix_emittable_skipped.js
new file mode 100644
index 000000000..b94af2730
--- /dev/null
+++ b/tests/specs/run/fix_emittable_skipped/fix_emittable_skipped.js
@@ -0,0 +1,7 @@
+/// <reference types="./emittable.d.ts" />
+
+import "./polyfill.ts";
+
+export const a = "a";
+
+console.log(globalThis.polyfill);
diff --git a/tests/specs/run/fix_emittable_skipped/fix_emittable_skipped.ts.out b/tests/specs/run/fix_emittable_skipped/fix_emittable_skipped.ts.out
new file mode 100644
index 000000000..865759299
--- /dev/null
+++ b/tests/specs/run/fix_emittable_skipped/fix_emittable_skipped.ts.out
@@ -0,0 +1 @@
+[Function (anonymous)]
diff --git a/tests/specs/run/fix_emittable_skipped/polyfill.ts b/tests/specs/run/fix_emittable_skipped/polyfill.ts
new file mode 100644
index 000000000..7af67c4c0
--- /dev/null
+++ b/tests/specs/run/fix_emittable_skipped/polyfill.ts
@@ -0,0 +1,8 @@
+declare global {
+ const polyfill: () => void;
+}
+
+// deno-lint-ignore no-explicit-any
+(globalThis as any).polyfill = () => {
+ console.log("polyfill");
+};
diff --git a/tests/specs/run/fix_js_import_js/__test__.jsonc b/tests/specs/run/fix_js_import_js/__test__.jsonc
new file mode 100644
index 000000000..94b1df540
--- /dev/null
+++ b/tests/specs/run/fix_js_import_js/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --quiet --reload fix_js_import_js.ts",
+ "output": "fix_js_import_js.ts.out"
+}
diff --git a/tests/specs/run/fix_js_import_js/fix_js_import_js.ts b/tests/specs/run/fix_js_import_js/fix_js_import_js.ts
new file mode 100644
index 000000000..4862f03e1
--- /dev/null
+++ b/tests/specs/run/fix_js_import_js/fix_js_import_js.ts
@@ -0,0 +1,3 @@
+import { isMod4 } from "./mod6.js";
+
+console.log(isMod4);
diff --git a/tests/specs/run/fix_js_import_js/fix_js_import_js.ts.out b/tests/specs/run/fix_js_import_js/fix_js_import_js.ts.out
new file mode 100644
index 000000000..27ba77dda
--- /dev/null
+++ b/tests/specs/run/fix_js_import_js/fix_js_import_js.ts.out
@@ -0,0 +1 @@
+true
diff --git a/tests/specs/run/fix_js_import_js/mod4.js b/tests/specs/run/fix_js_import_js/mod4.js
new file mode 100644
index 000000000..71332dbc4
--- /dev/null
+++ b/tests/specs/run/fix_js_import_js/mod4.js
@@ -0,0 +1 @@
+export const isMod4 = true;
diff --git a/tests/specs/run/fix_js_import_js/mod6.js b/tests/specs/run/fix_js_import_js/mod6.js
new file mode 100644
index 000000000..5e17c9ee0
--- /dev/null
+++ b/tests/specs/run/fix_js_import_js/mod6.js
@@ -0,0 +1 @@
+export { isMod4 } from "./mod4.js";
diff --git a/tests/specs/run/fix_js_imports/__test__.jsonc b/tests/specs/run/fix_js_imports/__test__.jsonc
new file mode 100644
index 000000000..a3635d18c
--- /dev/null
+++ b/tests/specs/run/fix_js_imports/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --quiet --reload fix_js_imports.ts",
+ "output": "fix_js_imports.ts.out"
+}
diff --git a/tests/specs/run/fix_js_imports/amd_like.js b/tests/specs/run/fix_js_imports/amd_like.js
new file mode 100644
index 000000000..f27e505e4
--- /dev/null
+++ b/tests/specs/run/fix_js_imports/amd_like.js
@@ -0,0 +1,3 @@
+// looks like an AMD module, but isn't
+const define = () => {};
+define(["fake_module"], () => {});
diff --git a/tests/specs/run/fix_js_imports/fix_js_imports.ts b/tests/specs/run/fix_js_imports/fix_js_imports.ts
new file mode 100644
index 000000000..07e68a135
--- /dev/null
+++ b/tests/specs/run/fix_js_imports/fix_js_imports.ts
@@ -0,0 +1,3 @@
+import * as amdLike from "./amd_like.js";
+
+console.log(amdLike);
diff --git a/tests/specs/run/fix_js_imports/fix_js_imports.ts.out b/tests/specs/run/fix_js_imports/fix_js_imports.ts.out
new file mode 100644
index 000000000..c427932a4
--- /dev/null
+++ b/tests/specs/run/fix_js_imports/fix_js_imports.ts.out
@@ -0,0 +1 @@
+[Module: null prototype] { }
diff --git a/tests/specs/run/fix_tsc_file_exists/__test__.jsonc b/tests/specs/run/fix_tsc_file_exists/__test__.jsonc
new file mode 100644
index 000000000..d2b0bda29
--- /dev/null
+++ b/tests/specs/run/fix_tsc_file_exists/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --quiet --reload tsc/test.js",
+ "output": "fix_tsc_file_exists.out"
+}
diff --git a/tests/specs/run/fix_tsc_file_exists/fix_tsc_file_exists.out b/tests/specs/run/fix_tsc_file_exists/fix_tsc_file_exists.out
new file mode 100644
index 000000000..ce0136250
--- /dev/null
+++ b/tests/specs/run/fix_tsc_file_exists/fix_tsc_file_exists.out
@@ -0,0 +1 @@
+hello
diff --git a/tests/specs/run/fix_tsc_file_exists/tsc/a.js b/tests/specs/run/fix_tsc_file_exists/tsc/a.js
new file mode 100644
index 000000000..5a7b3ff93
--- /dev/null
+++ b/tests/specs/run/fix_tsc_file_exists/tsc/a.js
@@ -0,0 +1,2 @@
+import { v4 } from "./d.ts";
+export function a() {}
diff --git a/tests/specs/run/fix_tsc_file_exists/tsc/d.ts b/tests/specs/run/fix_tsc_file_exists/tsc/d.ts
new file mode 100644
index 000000000..3c74b8c83
--- /dev/null
+++ b/tests/specs/run/fix_tsc_file_exists/tsc/d.ts
@@ -0,0 +1,3 @@
+export function v4() {
+ return "hello";
+}
diff --git a/tests/specs/run/fix_tsc_file_exists/tsc/node_modules/b.js b/tests/specs/run/fix_tsc_file_exists/tsc/node_modules/b.js
new file mode 100644
index 000000000..191660935
--- /dev/null
+++ b/tests/specs/run/fix_tsc_file_exists/tsc/node_modules/b.js
@@ -0,0 +1,2 @@
+import c from "./c.js";
+export { c };
diff --git a/tests/specs/run/fix_tsc_file_exists/tsc/node_modules/c.js b/tests/specs/run/fix_tsc_file_exists/tsc/node_modules/c.js
new file mode 100644
index 000000000..cff71c44a
--- /dev/null
+++ b/tests/specs/run/fix_tsc_file_exists/tsc/node_modules/c.js
@@ -0,0 +1 @@
+export default function c() {}
diff --git a/tests/specs/run/fix_tsc_file_exists/tsc/test.js b/tests/specs/run/fix_tsc_file_exists/tsc/test.js
new file mode 100644
index 000000000..b7f46b351
--- /dev/null
+++ b/tests/specs/run/fix_tsc_file_exists/tsc/test.js
@@ -0,0 +1,4 @@
+import { a } from "./a.js";
+import { c } from "./node_modules/b.js";
+
+console.log("hello");
diff --git a/tests/specs/run/fix_worker_dispatchevent/__test__.jsonc b/tests/specs/run/fix_worker_dispatchevent/__test__.jsonc
new file mode 100644
index 000000000..45e49b87f
--- /dev/null
+++ b/tests/specs/run/fix_worker_dispatchevent/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --quiet --reload fix_worker_dispatchevent.ts",
+ "output": "fix_worker_dispatchevent.ts.out"
+}
diff --git a/tests/specs/run/fix_worker_dispatchevent/fix_worker_dispatchevent.ts b/tests/specs/run/fix_worker_dispatchevent/fix_worker_dispatchevent.ts
new file mode 100644
index 000000000..1b73b52dc
--- /dev/null
+++ b/tests/specs/run/fix_worker_dispatchevent/fix_worker_dispatchevent.ts
@@ -0,0 +1,43 @@
+const code = `
+addEventListener("message", () => {
+ postMessage("pong");
+});
+
+const context = new EventTarget();
+
+Object.defineProperty(globalThis, "dispatchEvent", {
+ value: context.dispatchEvent.bind(context),
+ writable: true,
+ enumerable: true,
+ configurable: true,
+});
+
+postMessage("start");
+`;
+
+const blob = new Blob([code], { type: "application/javascript" });
+
+const url = URL.createObjectURL(blob);
+
+const worker = new Worker(url, { type: "module" });
+
+let terminated = false;
+
+worker.addEventListener("message", (evt) => {
+ if (evt.data === "start") {
+ worker.postMessage("ping");
+ } else if (evt.data === "pong") {
+ worker.terminate();
+ terminated = true;
+ console.log("success");
+ } else {
+ throw new Error("unexpected message from worker");
+ }
+});
+
+setTimeout(() => {
+ if (!terminated) {
+ worker.terminate();
+ throw new Error("did not receive message from worker in time");
+ }
+}, 2000);
diff --git a/tests/specs/run/fix_worker_dispatchevent/fix_worker_dispatchevent.ts.out b/tests/specs/run/fix_worker_dispatchevent/fix_worker_dispatchevent.ts.out
new file mode 100644
index 000000000..2e9ba477f
--- /dev/null
+++ b/tests/specs/run/fix_worker_dispatchevent/fix_worker_dispatchevent.ts.out
@@ -0,0 +1 @@
+success
diff --git a/tests/specs/run/followup_dyn_import_resolved/__test__.jsonc b/tests/specs/run/followup_dyn_import_resolved/__test__.jsonc
new file mode 100644
index 000000000..b94e3d8c9
--- /dev/null
+++ b/tests/specs/run/followup_dyn_import_resolved/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --allow-read followup_dyn_import_resolves/main.ts",
+ "output": "followup_dyn_import_resolves/main.ts.out"
+}
diff --git a/tests/specs/run/followup_dyn_import_resolved/followup_dyn_import_resolves/main.ts b/tests/specs/run/followup_dyn_import_resolved/followup_dyn_import_resolves/main.ts
new file mode 100644
index 000000000..a8508f942
--- /dev/null
+++ b/tests/specs/run/followup_dyn_import_resolved/followup_dyn_import_resolves/main.ts
@@ -0,0 +1,14 @@
+// https://github.com/denoland/deno/issues/14726
+
+// Any dynamic modules that are only pending on a TLA import should be resolved
+// in the same event loop iteration as the imported module.
+
+// Long-running timer so the event loop doesn't have a next iteration for a
+// while.
+setTimeout(() => {}, 24 * 60 * 60 * 1000);
+
+await import("./sub1.ts");
+
+// If we reach here, the test is passed.
+console.log("Done.");
+Deno.exit();
diff --git a/tests/specs/run/followup_dyn_import_resolved/followup_dyn_import_resolves/main.ts.out b/tests/specs/run/followup_dyn_import_resolved/followup_dyn_import_resolves/main.ts.out
new file mode 100644
index 000000000..a19976d4a
--- /dev/null
+++ b/tests/specs/run/followup_dyn_import_resolved/followup_dyn_import_resolves/main.ts.out
@@ -0,0 +1,3 @@
+sub2
+sub1
+Done.
diff --git a/tests/specs/run/followup_dyn_import_resolved/followup_dyn_import_resolves/sub1.ts b/tests/specs/run/followup_dyn_import_resolved/followup_dyn_import_resolves/sub1.ts
new file mode 100644
index 000000000..d06c30221
--- /dev/null
+++ b/tests/specs/run/followup_dyn_import_resolved/followup_dyn_import_resolves/sub1.ts
@@ -0,0 +1,2 @@
+await import("./sub2.ts");
+console.log("sub1");
diff --git a/tests/specs/run/followup_dyn_import_resolved/followup_dyn_import_resolves/sub2.ts b/tests/specs/run/followup_dyn_import_resolved/followup_dyn_import_resolves/sub2.ts
new file mode 100644
index 000000000..cce2b524c
--- /dev/null
+++ b/tests/specs/run/followup_dyn_import_resolved/followup_dyn_import_resolves/sub2.ts
@@ -0,0 +1 @@
+console.log("sub2");
diff --git a/tests/specs/run/heapstats/__test__.jsonc b/tests/specs/run/heapstats/__test__.jsonc
new file mode 100644
index 000000000..6429d7cf5
--- /dev/null
+++ b/tests/specs/run/heapstats/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --quiet --v8-flags=--expose-gc heapstats.js",
+ "output": "heapstats.js.out"
+}
diff --git a/tests/specs/run/heapstats/heapstats.js b/tests/specs/run/heapstats/heapstats.js
new file mode 100644
index 000000000..b93c9c120
--- /dev/null
+++ b/tests/specs/run/heapstats/heapstats.js
@@ -0,0 +1,37 @@
+// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
+"use strict";
+
+function allocTest(alloc, allocAssert, deallocAssert) {
+ // Helper func that GCs then returns memory usage
+ const sample = () => {
+ // deno-lint-ignore no-undef
+ gc();
+ return Deno.memoryUsage();
+ };
+ const delta = (t1, t2) => t2.heapUsed - t1.heapUsed;
+
+ // Sample "clean" heap usage
+ const t1 = sample();
+
+ // Alloc
+ // deno-lint-ignore no-unused-vars
+ let x = alloc();
+ const t2 = sample();
+ allocAssert(delta(t1, t2));
+
+ // Free
+ x = null;
+ const t3 = sample();
+ deallocAssert(delta(t2, t3));
+}
+
+function main() {
+ // Large-array test, 1M slot array consumes ~4MB (4B per slot)
+ allocTest(
+ () => new Array(1e6),
+ (delta) => console.log("Allocated:", Math.round(delta / 1e6) + "MB"),
+ (delta) => console.log("Freed:", Math.round(delta / 1e6) + "MB"),
+ );
+}
+
+main();
diff --git a/tests/specs/run/heapstats/heapstats.js.out b/tests/specs/run/heapstats/heapstats.js.out
new file mode 100644
index 000000000..954266333
--- /dev/null
+++ b/tests/specs/run/heapstats/heapstats.js.out
@@ -0,0 +1,2 @@
+Allocated: 8MB
+Freed: -8MB
diff --git a/tests/specs/run/https_import/RootCA.pem b/tests/specs/run/https_import/RootCA.pem
new file mode 100644
index 000000000..c2f84ceeb
--- /dev/null
+++ b/tests/specs/run/https_import/RootCA.pem
@@ -0,0 +1,19 @@
+-----BEGIN CERTIFICATE-----
+MIIDIzCCAgugAwIBAgIJAMKPPW4tsOymMA0GCSqGSIb3DQEBCwUAMCcxCzAJBgNV
+BAYTAlVTMRgwFgYDVQQDDA9FeGFtcGxlLVJvb3QtQ0EwIBcNMTkxMDIxMTYyODIy
+WhgPMjExODA5MjcxNjI4MjJaMCcxCzAJBgNVBAYTAlVTMRgwFgYDVQQDDA9FeGFt
+cGxlLVJvb3QtQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDMH/IO
+2qtHfyBKwANNPB4K0q5JVSg8XxZdRpTTlz0CwU0oRO3uHrI52raCCfVeiQutyZop
+eFZTDWeXGudGAFA2B5m3orWt0s+touPi8MzjsG2TQ+WSI66QgbXTNDitDDBtTVcV
+5G3Ic+3SppQAYiHSekLISnYWgXLl+k5CnEfTowg6cjqjVr0KjL03cTN3H7b+6+0S
+ws4rYbW1j4ExR7K6BFNH6572yq5qR20E6GqlY+EcOZpw4CbCk9lS8/CWuXze/vMs
+OfDcc6K+B625d27wyEGZHedBomT2vAD7sBjvO8hn/DP1Qb46a8uCHR6NSfnJ7bXO
+G1igaIbgY1zXirNdAgMBAAGjUDBOMB0GA1UdDgQWBBTzut+pwwDfqmMYcI9KNWRD
+hxcIpTAfBgNVHSMEGDAWgBTzut+pwwDfqmMYcI9KNWRDhxcIpTAMBgNVHRMEBTAD
+AQH/MA0GCSqGSIb3DQEBCwUAA4IBAQB9AqSbZ+hEglAgSHxAMCqRFdhVu7MvaQM0
+P090mhGlOCt3yB7kdGfsIrUW6nQcTz7PPQFRaJMrFHPvFvPootkBUpTYR4hTkdce
+H6RCRu2Jxl4Y9bY/uezd9YhGCYfUtfjA6/TH9FcuZfttmOOlxOt01XfNvVMIR6RM
+z/AYhd+DeOXjr35F/VHeVpnk+55L0PYJsm1CdEbOs5Hy1ecR7ACuDkXnbM4fpz9I
+kyIWJwk2zJReKcJMgi1aIinDM9ao/dca1G99PHOw8dnr4oyoTiv8ao6PWiSRHHMi
+MNf4EgWfK+tZMnuqfpfO9740KzfcVoMNo4QJD4yn5YxroUOO/Azi
+-----END CERTIFICATE-----
diff --git a/tests/specs/run/https_import/__test__.jsonc b/tests/specs/run/https_import/__test__.jsonc
new file mode 100644
index 000000000..9a37230f2
--- /dev/null
+++ b/tests/specs/run/https_import/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --allow-import --quiet --reload --cert RootCA.pem https_import.ts",
+ "output": "https_import.ts.out"
+}
diff --git a/tests/specs/run/https_import/https_import.ts b/tests/specs/run/https_import/https_import.ts
new file mode 100644
index 000000000..d392f4a5d
--- /dev/null
+++ b/tests/specs/run/https_import/https_import.ts
@@ -0,0 +1,3 @@
+import { printHello } from "./print_hello.ts";
+
+printHello();
diff --git a/tests/specs/run/https_import/https_import.ts.out b/tests/specs/run/https_import/https_import.ts.out
new file mode 100644
index 000000000..e965047ad
--- /dev/null
+++ b/tests/specs/run/https_import/https_import.ts.out
@@ -0,0 +1 @@
+Hello
diff --git a/tests/specs/run/https_import/print_hello.ts b/tests/specs/run/https_import/print_hello.ts
new file mode 100644
index 000000000..b9c0ad527
--- /dev/null
+++ b/tests/specs/run/https_import/print_hello.ts
@@ -0,0 +1,3 @@
+export function printHello() {
+ console.log("Hello");
+}
diff --git a/tests/specs/run/if_main/__test__.jsonc b/tests/specs/run/if_main/__test__.jsonc
new file mode 100644
index 000000000..f6e2dbf27
--- /dev/null
+++ b/tests/specs/run/if_main/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --quiet --reload if_main.ts",
+ "output": "if_main.ts.out"
+}
diff --git a/tests/specs/run/if_main/if_main.ts b/tests/specs/run/if_main/if_main.ts
new file mode 100644
index 000000000..4dcfecea0
--- /dev/null
+++ b/tests/specs/run/if_main/if_main.ts
@@ -0,0 +1,6 @@
+if (import.meta.main) {
+ console.log("main");
+} else {
+ console.log("import.meta.url", import.meta.url);
+ throw Error("not main");
+}
diff --git a/tests/specs/run/if_main/if_main.ts.out b/tests/specs/run/if_main/if_main.ts.out
new file mode 100644
index 000000000..ba2906d06
--- /dev/null
+++ b/tests/specs/run/if_main/if_main.ts.out
@@ -0,0 +1 @@
+main
diff --git a/tests/specs/run/import_attributes_dynamic_error/__test__.jsonc b/tests/specs/run/import_attributes_dynamic_error/__test__.jsonc
new file mode 100644
index 000000000..0a6137a2b
--- /dev/null
+++ b/tests/specs/run/import_attributes_dynamic_error/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run --allow-read dynamic_error.ts",
+ "output": "dynamic_error.out",
+ "exitCode": 1
+}
diff --git a/tests/specs/run/import_attributes_dynamic_error/data.json b/tests/specs/run/import_attributes_dynamic_error/data.json
new file mode 100644
index 000000000..37b3ee1e0
--- /dev/null
+++ b/tests/specs/run/import_attributes_dynamic_error/data.json
@@ -0,0 +1,6 @@
+{
+ "a": "b",
+ "c": {
+ "d": 10
+ }
+}
diff --git a/tests/specs/run/import_attributes_dynamic_error/dynamic_error.out b/tests/specs/run/import_attributes_dynamic_error/dynamic_error.out
new file mode 100644
index 000000000..24f29de72
--- /dev/null
+++ b/tests/specs/run/import_attributes_dynamic_error/dynamic_error.out
@@ -0,0 +1,4 @@
+error: Uncaught (in promise) TypeError: Attempted to load JSON module without specifying "type": "json" attribute in the import statement.
+const data = await import("./data.json");
+ ^
+ at async [WILDCARD]dynamic_error.ts:1:14
diff --git a/tests/specs/run/import_attributes_dynamic_error/dynamic_error.ts b/tests/specs/run/import_attributes_dynamic_error/dynamic_error.ts
new file mode 100644
index 000000000..2d9c6757f
--- /dev/null
+++ b/tests/specs/run/import_attributes_dynamic_error/dynamic_error.ts
@@ -0,0 +1,3 @@
+const data = await import("./data.json");
+
+console.log(data);
diff --git a/tests/specs/run/import_attributes_dynamic_import/__test__.jsonc b/tests/specs/run/import_attributes_dynamic_import/__test__.jsonc
new file mode 100644
index 000000000..75962e88d
--- /dev/null
+++ b/tests/specs/run/import_attributes_dynamic_import/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --allow-read --check dynamic_import.ts",
+ "output": "dynamic_import.out"
+}
diff --git a/tests/specs/run/import_attributes_dynamic_import/data.json b/tests/specs/run/import_attributes_dynamic_import/data.json
new file mode 100644
index 000000000..37b3ee1e0
--- /dev/null
+++ b/tests/specs/run/import_attributes_dynamic_import/data.json
@@ -0,0 +1,6 @@
+{
+ "a": "b",
+ "c": {
+ "d": 10
+ }
+}
diff --git a/tests/specs/run/import_attributes_dynamic_import/dynamic_import.out b/tests/specs/run/import_attributes_dynamic_import/dynamic_import.out
new file mode 100644
index 000000000..7a7b4c91f
--- /dev/null
+++ b/tests/specs/run/import_attributes_dynamic_import/dynamic_import.out
@@ -0,0 +1,2 @@
+[WILDCARD]
+[Module: null prototype] { default: { a: "b", c: { d: 10 } } }
diff --git a/tests/specs/run/import_attributes_dynamic_import/dynamic_import.ts b/tests/specs/run/import_attributes_dynamic_import/dynamic_import.ts
new file mode 100644
index 000000000..093136fb0
--- /dev/null
+++ b/tests/specs/run/import_attributes_dynamic_import/dynamic_import.ts
@@ -0,0 +1,3 @@
+const data1 = await import("./data.json", { with: { type: "json" } });
+
+console.log(data1);
diff --git a/tests/specs/run/import_attributes_static_error/__test__.jsonc b/tests/specs/run/import_attributes_static_error/__test__.jsonc
new file mode 100644
index 000000000..2d08c66d3
--- /dev/null
+++ b/tests/specs/run/import_attributes_static_error/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run --allow-read static_error.ts",
+ "output": "static_error.out",
+ "exitCode": 1
+}
diff --git a/tests/specs/run/import_attributes_static_error/data.json b/tests/specs/run/import_attributes_static_error/data.json
new file mode 100644
index 000000000..37b3ee1e0
--- /dev/null
+++ b/tests/specs/run/import_attributes_static_error/data.json
@@ -0,0 +1,6 @@
+{
+ "a": "b",
+ "c": {
+ "d": 10
+ }
+}
diff --git a/tests/specs/run/import_attributes_static_error/static_error.out b/tests/specs/run/import_attributes_static_error/static_error.out
new file mode 100644
index 000000000..29b24b965
--- /dev/null
+++ b/tests/specs/run/import_attributes_static_error/static_error.out
@@ -0,0 +1,3 @@
+error: Expected a JavaScript or TypeScript module, but identified a Json module. Consider importing Json modules with an import attribute with the type of "json".
+ Specifier: [WILDCARD]/data.json
+ at [WILDCARD]static_error.ts:1:18
diff --git a/tests/specs/run/import_attributes_static_error/static_error.ts b/tests/specs/run/import_attributes_static_error/static_error.ts
new file mode 100644
index 000000000..0bc3a93f8
--- /dev/null
+++ b/tests/specs/run/import_attributes_static_error/static_error.ts
@@ -0,0 +1,3 @@
+import data from "./data.json";
+
+console.log(data);
diff --git a/tests/specs/run/import_attributes_static_export/__test__.jsonc b/tests/specs/run/import_attributes_static_export/__test__.jsonc
new file mode 100644
index 000000000..05a64aab5
--- /dev/null
+++ b/tests/specs/run/import_attributes_static_export/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --allow-read static_export.ts",
+ "output": "static_export.out"
+}
diff --git a/tests/specs/run/import_attributes_static_export/data.json b/tests/specs/run/import_attributes_static_export/data.json
new file mode 100644
index 000000000..37b3ee1e0
--- /dev/null
+++ b/tests/specs/run/import_attributes_static_export/data.json
@@ -0,0 +1,6 @@
+{
+ "a": "b",
+ "c": {
+ "d": 10
+ }
+}
diff --git a/tests/specs/run/import_attributes_static_export/static_export.out b/tests/specs/run/import_attributes_static_export/static_export.out
new file mode 100644
index 000000000..41af79d7c
--- /dev/null
+++ b/tests/specs/run/import_attributes_static_export/static_export.out
@@ -0,0 +1 @@
+{ a: "b", c: { d: 10 } }
diff --git a/tests/specs/run/import_attributes_static_export/static_export.ts b/tests/specs/run/import_attributes_static_export/static_export.ts
new file mode 100644
index 000000000..ac3ee694f
--- /dev/null
+++ b/tests/specs/run/import_attributes_static_export/static_export.ts
@@ -0,0 +1,3 @@
+import data from "./static_reexport.ts";
+
+console.log(data);
diff --git a/tests/specs/run/import_attributes_static_export/static_reexport.ts b/tests/specs/run/import_attributes_static_export/static_reexport.ts
new file mode 100644
index 000000000..e6175691c
--- /dev/null
+++ b/tests/specs/run/import_attributes_static_export/static_reexport.ts
@@ -0,0 +1 @@
+export { default } from "./data.json" with { type: "json" };
diff --git a/tests/specs/run/import_attributes_static_import/__test__.jsonc b/tests/specs/run/import_attributes_static_import/__test__.jsonc
new file mode 100644
index 000000000..4ea39e6d3
--- /dev/null
+++ b/tests/specs/run/import_attributes_static_import/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --allow-read static_import.ts",
+ "output": "static_import.out"
+}
diff --git a/tests/specs/run/import_attributes_static_import/data.json b/tests/specs/run/import_attributes_static_import/data.json
new file mode 100644
index 000000000..37b3ee1e0
--- /dev/null
+++ b/tests/specs/run/import_attributes_static_import/data.json
@@ -0,0 +1,6 @@
+{
+ "a": "b",
+ "c": {
+ "d": 10
+ }
+}
diff --git a/tests/specs/run/import_attributes_static_import/static_import.out b/tests/specs/run/import_attributes_static_import/static_import.out
new file mode 100644
index 000000000..e57dffa99
--- /dev/null
+++ b/tests/specs/run/import_attributes_static_import/static_import.out
@@ -0,0 +1,2 @@
+{ a: "b", c: { d: 10 } }
+{ a: "b", c: { d: 10 } }
diff --git a/tests/specs/run/import_attributes_static_import/static_import.ts b/tests/specs/run/import_attributes_static_import/static_import.ts
new file mode 100644
index 000000000..f585b893f
--- /dev/null
+++ b/tests/specs/run/import_attributes_static_import/static_import.ts
@@ -0,0 +1,5 @@
+import data1 from "./data.json" with { type: "json" };
+import data2 from "./data.json" with { type: "json" };
+
+console.log(data1);
+console.log(data2);
diff --git a/tests/specs/run/import_attributes_type_check/__test__.jsonc b/tests/specs/run/import_attributes_type_check/__test__.jsonc
new file mode 100644
index 000000000..89f6e0a79
--- /dev/null
+++ b/tests/specs/run/import_attributes_type_check/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run --allow-read --check type_check.ts",
+ "output": "type_check.out",
+ "exitCode": 1
+}
diff --git a/tests/specs/run/import_attributes_type_check/data.json b/tests/specs/run/import_attributes_type_check/data.json
new file mode 100644
index 000000000..37b3ee1e0
--- /dev/null
+++ b/tests/specs/run/import_attributes_type_check/data.json
@@ -0,0 +1,6 @@
+{
+ "a": "b",
+ "c": {
+ "d": 10
+ }
+}
diff --git a/tests/specs/run/import_attributes_type_check/type_check.out b/tests/specs/run/import_attributes_type_check/type_check.out
new file mode 100644
index 000000000..2fc26dae3
--- /dev/null
+++ b/tests/specs/run/import_attributes_type_check/type_check.out
@@ -0,0 +1,12 @@
+Check file:///[WILDCARD]/type_check.ts
+error: TS2339 [ERROR]: Property 'foo' does not exist on type '{ a: string; c: { d: number; }; }'.
+console.log(data1.foo);
+ ~~~
+ at [WILDCARD]type_check.ts:5:19
+
+TS2339 [ERROR]: Property 'foo' does not exist on type '{ a: string; c: { d: number; }; }'.
+console.log(data2.foo);
+ ~~~
+ at [WILDCARD]type_check.ts:6:19
+
+Found 2 errors.
diff --git a/tests/specs/run/import_attributes_type_check/type_check.ts b/tests/specs/run/import_attributes_type_check/type_check.ts
new file mode 100644
index 000000000..36e47bd5b
--- /dev/null
+++ b/tests/specs/run/import_attributes_type_check/type_check.ts
@@ -0,0 +1,6 @@
+import data1 from "./data.json" with { type: "json" };
+// deno-lint-ignore no-import-assertions
+import data2 from "./data.json" assert { type: "json" };
+
+console.log(data1.foo);
+console.log(data2.foo);
diff --git a/tests/specs/run/import_blob_url/__test__.jsonc b/tests/specs/run/import_blob_url/__test__.jsonc
new file mode 100644
index 000000000..9ae6b5a42
--- /dev/null
+++ b/tests/specs/run/import_blob_url/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --quiet --reload import_blob_url.ts",
+ "output": "import_blob_url.ts.out"
+}
diff --git a/tests/specs/run/import_blob_url/import_blob_url.ts b/tests/specs/run/import_blob_url/import_blob_url.ts
new file mode 100644
index 000000000..86bb634e1
--- /dev/null
+++ b/tests/specs/run/import_blob_url/import_blob_url.ts
@@ -0,0 +1,13 @@
+const blob = new Blob(
+ ['export const a = "a";\n\nexport enum A {\n A,\n B,\n C,\n}\n'],
+ {
+ type: "application/typescript",
+ },
+);
+const url = URL.createObjectURL(blob);
+
+const a = await import(url);
+
+console.log(a.a);
+console.log(a.A);
+console.log(a.A.A);
diff --git a/tests/specs/run/import_blob_url/import_blob_url.ts.out b/tests/specs/run/import_blob_url/import_blob_url.ts.out
new file mode 100644
index 000000000..bfa0b9d94
--- /dev/null
+++ b/tests/specs/run/import_blob_url/import_blob_url.ts.out
@@ -0,0 +1,3 @@
+a
+{ "0": "A", "1": "B", "2": "C", A: 0, B: 1, C: 2 }
+0
diff --git a/tests/specs/run/import_blob_url_error_stack/__test__.jsonc b/tests/specs/run/import_blob_url_error_stack/__test__.jsonc
new file mode 100644
index 000000000..56a1489cd
--- /dev/null
+++ b/tests/specs/run/import_blob_url_error_stack/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run --quiet --reload import_blob_url_error_stack.ts",
+ "output": "import_blob_url_error_stack.ts.out",
+ "exitCode": 1
+}
diff --git a/tests/specs/run/import_blob_url_error_stack/import_blob_url_error_stack.ts b/tests/specs/run/import_blob_url_error_stack/import_blob_url_error_stack.ts
new file mode 100644
index 000000000..f9c4f2e9d
--- /dev/null
+++ b/tests/specs/run/import_blob_url_error_stack/import_blob_url_error_stack.ts
@@ -0,0 +1,13 @@
+const blob = new Blob(
+ [
+ "enum A {\n A,\n B,\n C,\n }\n \n export function a() {\n throw new Error(`Hello ${A.C}`);\n }\n ",
+ ],
+ {
+ type: "application/typescript",
+ },
+);
+const url = URL.createObjectURL(blob);
+
+const { a } = await import(url);
+
+a();
diff --git a/tests/specs/run/import_blob_url_error_stack/import_blob_url_error_stack.ts.out b/tests/specs/run/import_blob_url_error_stack/import_blob_url_error_stack.ts.out
new file mode 100644
index 000000000..201556b8a
--- /dev/null
+++ b/tests/specs/run/import_blob_url_error_stack/import_blob_url_error_stack.ts.out
@@ -0,0 +1,5 @@
+error: Uncaught (in promise) Error: Hello 2
+ throw new Error(`Hello ${A.C}`);
+ ^
+ at a (blob:null/[WILDCARD]:8:10)
+ at file:///[WILDCARD]/import_blob_url_error_stack.ts:13:1
diff --git a/tests/specs/run/import_blob_url_import_relative/__test__.jsonc b/tests/specs/run/import_blob_url_import_relative/__test__.jsonc
new file mode 100644
index 000000000..4fda81b31
--- /dev/null
+++ b/tests/specs/run/import_blob_url_import_relative/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run --quiet --reload import_blob_url_import_relative.ts",
+ "output": "import_blob_url_import_relative.ts.out",
+ "exitCode": 1
+}
diff --git a/tests/specs/run/import_blob_url_import_relative/import_blob_url_import_relative.ts b/tests/specs/run/import_blob_url_import_relative/import_blob_url_import_relative.ts
new file mode 100644
index 000000000..ad130bdac
--- /dev/null
+++ b/tests/specs/run/import_blob_url_import_relative/import_blob_url_import_relative.ts
@@ -0,0 +1,8 @@
+const blob = new Blob(['export { a } from "./a.ts";'], {
+ type: "application/javascript",
+});
+const url = URL.createObjectURL(blob);
+
+const a = await import(url);
+
+console.log(a);
diff --git a/tests/specs/run/import_blob_url_import_relative/import_blob_url_import_relative.ts.out b/tests/specs/run/import_blob_url_import_relative/import_blob_url_import_relative.ts.out
new file mode 100644
index 000000000..59a6f07fb
--- /dev/null
+++ b/tests/specs/run/import_blob_url_import_relative/import_blob_url_import_relative.ts.out
@@ -0,0 +1,5 @@
+error: Uncaught (in promise) TypeError: invalid URL: relative URL with a cannot-be-a-base base
+ at blob:null/[WILDCARD]:1:19
+const a = await import(url);
+ ^
+ at async file://[WILDCARD]/import_blob_url_import_relative.ts:6:11
diff --git a/tests/specs/run/import_blob_url_imports/__test__.jsonc b/tests/specs/run/import_blob_url_imports/__test__.jsonc
new file mode 100644
index 000000000..511d22a59
--- /dev/null
+++ b/tests/specs/run/import_blob_url_imports/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --allow-import --quiet --reload --allow-net=localhost:4545 import_blob_url_imports.ts",
+ "output": "import_blob_url_imports.ts.out"
+}
diff --git a/tests/specs/run/import_blob_url_imports/import_blob_url_imports.ts b/tests/specs/run/import_blob_url_imports/import_blob_url_imports.ts
new file mode 100644
index 000000000..a7c639152
--- /dev/null
+++ b/tests/specs/run/import_blob_url_imports/import_blob_url_imports.ts
@@ -0,0 +1,11 @@
+const blob = new Blob(
+ [
+ 'export { printHello } from "http://localhost:4545/subdir/mod2.ts"',
+ ],
+ { type: "application/javascript" },
+);
+const url = URL.createObjectURL(blob);
+
+const { printHello } = await import(url);
+
+printHello();
diff --git a/tests/specs/run/import_blob_url_imports/import_blob_url_imports.ts.out b/tests/specs/run/import_blob_url_imports/import_blob_url_imports.ts.out
new file mode 100644
index 000000000..e965047ad
--- /dev/null
+++ b/tests/specs/run/import_blob_url_imports/import_blob_url_imports.ts.out
@@ -0,0 +1 @@
+Hello
diff --git a/tests/specs/run/import_blob_url_jsx/__test__.jsonc b/tests/specs/run/import_blob_url_jsx/__test__.jsonc
new file mode 100644
index 000000000..985c6f842
--- /dev/null
+++ b/tests/specs/run/import_blob_url_jsx/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --quiet --reload import_blob_url_jsx.ts",
+ "output": "import_blob_url_jsx.ts.out"
+}
diff --git a/tests/specs/run/import_blob_url_jsx/import_blob_url_jsx.ts b/tests/specs/run/import_blob_url_jsx/import_blob_url_jsx.ts
new file mode 100644
index 000000000..8d645796a
--- /dev/null
+++ b/tests/specs/run/import_blob_url_jsx/import_blob_url_jsx.ts
@@ -0,0 +1,16 @@
+const blob = new Blob(
+ ["export default function() {\n return <div>Hello Deno!</div>\n}\n"],
+ { type: "text/jsx" },
+);
+const url = URL.createObjectURL(blob);
+
+const { default: render } = await import(url);
+
+// deno-lint-ignore no-explicit-any
+(globalThis as any).React = {
+ createElement(...args: unknown[]) {
+ console.log(...args);
+ },
+};
+
+render();
diff --git a/tests/specs/run/import_blob_url_jsx/import_blob_url_jsx.ts.out b/tests/specs/run/import_blob_url_jsx/import_blob_url_jsx.ts.out
new file mode 100644
index 000000000..c1c85f250
--- /dev/null
+++ b/tests/specs/run/import_blob_url_jsx/import_blob_url_jsx.ts.out
@@ -0,0 +1 @@
+div null Hello Deno!
diff --git a/tests/specs/run/import_compression/__test__.jsonc b/tests/specs/run/import_compression/__test__.jsonc
new file mode 100644
index 000000000..c8f7af9e1
--- /dev/null
+++ b/tests/specs/run/import_compression/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --allow-import --quiet --reload --allow-net import_compression/main.ts",
+ "output": "import_compression/main.out"
+}
diff --git a/tests/specs/run/import_compression/import_compression/brotli b/tests/specs/run/import_compression/import_compression/brotli
new file mode 100644
index 000000000..65f679d57
--- /dev/null
+++ b/tests/specs/run/import_compression/import_compression/brotli
@@ -0,0 +1,2 @@
+‹
+€console.log('brotli'); \ No newline at end of file
diff --git a/tests/specs/run/import_compression/import_compression/gziped b/tests/specs/run/import_compression/import_compression/gziped
new file mode 100644
index 000000000..9f9a7bc69
--- /dev/null
+++ b/tests/specs/run/import_compression/import_compression/gziped
Binary files differ
diff --git a/tests/specs/run/import_compression/import_compression/main.out b/tests/specs/run/import_compression/import_compression/main.out
new file mode 100644
index 000000000..371994979
--- /dev/null
+++ b/tests/specs/run/import_compression/import_compression/main.out
@@ -0,0 +1,4 @@
+gzip
+brotli
+console.log('gzip')
+console.log('brotli');
diff --git a/tests/specs/run/import_compression/import_compression/main.ts b/tests/specs/run/import_compression/import_compression/main.ts
new file mode 100644
index 000000000..3dcd6fa24
--- /dev/null
+++ b/tests/specs/run/import_compression/import_compression/main.ts
@@ -0,0 +1,13 @@
+import "http://127.0.0.1:4545/run/import_compression/gziped";
+import "http://127.0.0.1:4545/run/import_compression/brotli";
+
+console.log(
+ await fetch(
+ "http://127.0.0.1:4545/run/import_compression/gziped",
+ ).then((res) => res.text()),
+);
+console.log(
+ await fetch(
+ "http://127.0.0.1:4545/run/import_compression/brotli",
+ ).then((res) => res.text()),
+);
diff --git a/tests/specs/run/import_data_url/__test__.jsonc b/tests/specs/run/import_data_url/__test__.jsonc
new file mode 100644
index 000000000..95d1c94a3
--- /dev/null
+++ b/tests/specs/run/import_data_url/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --quiet --reload import_data_url.ts",
+ "output": "import_data_url.ts.out"
+}
diff --git a/tests/specs/run/import_data_url/import_data_url.ts b/tests/specs/run/import_data_url/import_data_url.ts
new file mode 100644
index 000000000..258514a5e
--- /dev/null
+++ b/tests/specs/run/import_data_url/import_data_url.ts
@@ -0,0 +1,12 @@
+// export const a = "a";
+
+// export enum A {
+// A,
+// B,
+// C,
+// }
+import * as a from "data:application/typescript;base64,ZXhwb3J0IGNvbnN0IGEgPSAiYSI7CgpleHBvcnQgZW51bSBBIHsKICBBLAogIEIsCiAgQywKfQo=";
+
+console.log(a.a);
+console.log(a.A);
+console.log(a.A.A);
diff --git a/tests/specs/run/import_data_url/import_data_url.ts.out b/tests/specs/run/import_data_url/import_data_url.ts.out
new file mode 100644
index 000000000..bfa0b9d94
--- /dev/null
+++ b/tests/specs/run/import_data_url/import_data_url.ts.out
@@ -0,0 +1,3 @@
+a
+{ "0": "A", "1": "B", "2": "C", A: 0, B: 1, C: 2 }
+0
diff --git a/tests/specs/run/import_data_url_error_stack/__test__.jsonc b/tests/specs/run/import_data_url_error_stack/__test__.jsonc
new file mode 100644
index 000000000..851aae191
--- /dev/null
+++ b/tests/specs/run/import_data_url_error_stack/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run --quiet --reload import_data_url_error_stack.ts",
+ "output": "import_data_url_error_stack.ts.out",
+ "exitCode": 1
+}
diff --git a/tests/specs/run/import_data_url_error_stack/import_data_url_error_stack.ts b/tests/specs/run/import_data_url_error_stack/import_data_url_error_stack.ts
new file mode 100644
index 000000000..022e49fe1
--- /dev/null
+++ b/tests/specs/run/import_data_url_error_stack/import_data_url_error_stack.ts
@@ -0,0 +1,3 @@
+import { a } from "data:application/typescript;base64,ZW51bSBBIHsKICBBLAogIEIsCiAgQywKIH0KIAogZXhwb3J0IGZ1bmN0aW9uIGEoKSB7CiAgIHRocm93IG5ldyBFcnJvcihgSGVsbG8gJHtBLkN9YCk7CiB9CiA=";
+
+a();
diff --git a/tests/specs/run/import_data_url_error_stack/import_data_url_error_stack.ts.out b/tests/specs/run/import_data_url_error_stack/import_data_url_error_stack.ts.out
new file mode 100644
index 000000000..83eed611d
--- /dev/null
+++ b/tests/specs/run/import_data_url_error_stack/import_data_url_error_stack.ts.out
@@ -0,0 +1,5 @@
+error: Uncaught (in promise) Error: Hello 2
+ throw new Error(`Hello ${A.C}`);
+ ^
+ at a (data:application/typescript;base64,ZW51bSBBIHsKICBBLAog......JHtBLkN9YCk7CiB9CiA=:8:10)
+ at file:///[WILDCARD]/import_data_url_error_stack.ts:3:1
diff --git a/tests/specs/run/import_data_url_import_relative/__test__.jsonc b/tests/specs/run/import_data_url_import_relative/__test__.jsonc
new file mode 100644
index 000000000..b241bc917
--- /dev/null
+++ b/tests/specs/run/import_data_url_import_relative/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run --quiet --reload import_data_url_import_relative.ts",
+ "output": "import_data_url_import_relative.ts.out",
+ "exitCode": 1
+}
diff --git a/tests/specs/run/import_data_url_import_relative/import_data_url_import_relative.ts b/tests/specs/run/import_data_url_import_relative/import_data_url_import_relative.ts
new file mode 100644
index 000000000..23947fe60
--- /dev/null
+++ b/tests/specs/run/import_data_url_import_relative/import_data_url_import_relative.ts
@@ -0,0 +1,4 @@
+// export { a } from "./a.ts";
+import * as a from "data:application/javascript;base64,ZXhwb3J0IHsgYSB9IGZyb20gIi4vYS50cyI7Cg==";
+
+console.log(a);
diff --git a/tests/specs/run/import_data_url_import_relative/import_data_url_import_relative.ts.out b/tests/specs/run/import_data_url_import_relative/import_data_url_import_relative.ts.out
new file mode 100644
index 000000000..821c3e4df
--- /dev/null
+++ b/tests/specs/run/import_data_url_import_relative/import_data_url_import_relative.ts.out
@@ -0,0 +1,2 @@
+error: invalid URL: relative URL with a cannot-be-a-base base
+ at data:application/javascript;base64,ZXhwb3J0IHsgYSB9IGZyb20gIi4vYS50cyI7Cg==:1:19
diff --git a/tests/specs/run/import_data_url_imports/__test__.jsonc b/tests/specs/run/import_data_url_imports/__test__.jsonc
new file mode 100644
index 000000000..7fc8df315
--- /dev/null
+++ b/tests/specs/run/import_data_url_imports/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --allow-import --quiet --reload import_data_url_imports.ts",
+ "output": "import_data_url_imports.ts.out"
+}
diff --git a/tests/specs/run/import_data_url_imports/import_data_url_imports.ts b/tests/specs/run/import_data_url_imports/import_data_url_imports.ts
new file mode 100644
index 000000000..df7dae727
--- /dev/null
+++ b/tests/specs/run/import_data_url_imports/import_data_url_imports.ts
@@ -0,0 +1,4 @@
+// export { printHello } from "http://localhost:4545/subdir/mod2.ts";
+import { printHello } from "data:application/typescript;base64,ZXhwb3J0IHsgcHJpbnRIZWxsbyB9IGZyb20gImh0dHA6Ly9sb2NhbGhvc3Q6NDU0NS9zdWJkaXIvbW9kMi50cyI7";
+
+printHello();
diff --git a/tests/specs/run/import_data_url_imports/import_data_url_imports.ts.out b/tests/specs/run/import_data_url_imports/import_data_url_imports.ts.out
new file mode 100644
index 000000000..e965047ad
--- /dev/null
+++ b/tests/specs/run/import_data_url_imports/import_data_url_imports.ts.out
@@ -0,0 +1 @@
+Hello
diff --git a/tests/specs/run/import_data_url_jsx/__test__.jsonc b/tests/specs/run/import_data_url_jsx/__test__.jsonc
new file mode 100644
index 000000000..8fb1f9a1d
--- /dev/null
+++ b/tests/specs/run/import_data_url_jsx/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --quiet --reload import_data_url_jsx.ts",
+ "output": "import_data_url_jsx.ts.out"
+}
diff --git a/tests/specs/run/import_data_url_jsx/import_data_url_jsx.ts b/tests/specs/run/import_data_url_jsx/import_data_url_jsx.ts
new file mode 100644
index 000000000..1881211f9
--- /dev/null
+++ b/tests/specs/run/import_data_url_jsx/import_data_url_jsx.ts
@@ -0,0 +1,10 @@
+import render from "data:text/jsx;base64,ZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7CiAgcmV0dXJuIDxkaXY+SGVsbG8gRGVubyE8L2Rpdj4KfQo=";
+
+// deno-lint-ignore no-explicit-any
+(globalThis as any).React = {
+ createElement(...args: unknown[]) {
+ console.log(...args);
+ },
+};
+
+render();
diff --git a/tests/specs/run/import_data_url_jsx/import_data_url_jsx.ts.out b/tests/specs/run/import_data_url_jsx/import_data_url_jsx.ts.out
new file mode 100644
index 000000000..c1c85f250
--- /dev/null
+++ b/tests/specs/run/import_data_url_jsx/import_data_url_jsx.ts.out
@@ -0,0 +1 @@
+div null Hello Deno!
diff --git a/tests/specs/run/import_dynamic_data_url/__test__.jsonc b/tests/specs/run/import_dynamic_data_url/__test__.jsonc
new file mode 100644
index 000000000..09ff77f41
--- /dev/null
+++ b/tests/specs/run/import_dynamic_data_url/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --quiet --reload import_dynamic_data_url.ts",
+ "output": "import_dynamic_data_url.ts.out"
+}
diff --git a/tests/specs/run/import_dynamic_data_url/import_dynamic_data_url.ts b/tests/specs/run/import_dynamic_data_url/import_dynamic_data_url.ts
new file mode 100644
index 000000000..53a0fbcd3
--- /dev/null
+++ b/tests/specs/run/import_dynamic_data_url/import_dynamic_data_url.ts
@@ -0,0 +1,14 @@
+// export const a = "a";
+
+// export enum A {
+// A,
+// B,
+// C,
+// }
+const a = await import(
+ "data:application/typescript;base64,ZXhwb3J0IGNvbnN0IGEgPSAiYSI7CgpleHBvcnQgZW51bSBBIHsKICBBLAogIEIsCiAgQywKfQo="
+);
+
+console.log(a.a);
+console.log(a.A);
+console.log(a.A.A);
diff --git a/tests/specs/run/import_dynamic_data_url/import_dynamic_data_url.ts.out b/tests/specs/run/import_dynamic_data_url/import_dynamic_data_url.ts.out
new file mode 100644
index 000000000..bfa0b9d94
--- /dev/null
+++ b/tests/specs/run/import_dynamic_data_url/import_dynamic_data_url.ts.out
@@ -0,0 +1,3 @@
+a
+{ "0": "A", "1": "B", "2": "C", A: 0, B: 1, C: 2 }
+0
diff --git a/tests/specs/run/import_extensionless/__test__.jsonc b/tests/specs/run/import_extensionless/__test__.jsonc
new file mode 100644
index 000000000..cde59b5e2
--- /dev/null
+++ b/tests/specs/run/import_extensionless/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --allow-import --quiet --reload import_extensionless.ts",
+ "output": "import_extensionless.ts.out"
+}
diff --git a/tests/specs/run/import_extensionless/import_extensionless.ts b/tests/specs/run/import_extensionless/import_extensionless.ts
new file mode 100644
index 000000000..689d553ff
--- /dev/null
+++ b/tests/specs/run/import_extensionless/import_extensionless.ts
@@ -0,0 +1,3 @@
+import { printHello3 } from "http://localhost:4545/v1/extensionless";
+
+printHello3();
diff --git a/tests/specs/run/import_extensionless/import_extensionless.ts.out b/tests/specs/run/import_extensionless/import_extensionless.ts.out
new file mode 100644
index 000000000..e965047ad
--- /dev/null
+++ b/tests/specs/run/import_extensionless/import_extensionless.ts.out
@@ -0,0 +1 @@
+Hello
diff --git a/tests/specs/run/import_file_with_colon/__test__.jsonc b/tests/specs/run/import_file_with_colon/__test__.jsonc
new file mode 100644
index 000000000..5e6602ab3
--- /dev/null
+++ b/tests/specs/run/import_file_with_colon/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --allow-import --quiet --reload import_file_with_colon.ts",
+ "output": "import_file_with_colon.ts.out"
+}
diff --git a/tests/specs/run/import_file_with_colon/import_file_with_colon.ts b/tests/specs/run/import_file_with_colon/import_file_with_colon.ts
new file mode 100644
index 000000000..619bdd66d
--- /dev/null
+++ b/tests/specs/run/import_file_with_colon/import_file_with_colon.ts
@@ -0,0 +1 @@
+import "http://localhost:4545/subdir/file_with_:_in_name.ts";
diff --git a/tests/specs/run/import_file_with_colon/import_file_with_colon.ts.out b/tests/specs/run/import_file_with_colon/import_file_with_colon.ts.out
new file mode 100644
index 000000000..f60bbf4b1
--- /dev/null
+++ b/tests/specs/run/import_file_with_colon/import_file_with_colon.ts.out
@@ -0,0 +1 @@
+Hello from file_with_:_in_name.ts
diff --git a/tests/specs/run/import_type/__test__.jsonc b/tests/specs/run/import_type/__test__.jsonc
new file mode 100644
index 000000000..2958483d0
--- /dev/null
+++ b/tests/specs/run/import_type/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --reload import_type.ts",
+ "output": "import_type.ts.out"
+}
diff --git a/tests/specs/run/import_type/export_types.ts b/tests/specs/run/import_type/export_types.ts
new file mode 100644
index 000000000..18c8ed881
--- /dev/null
+++ b/tests/specs/run/import_type/export_types.ts
@@ -0,0 +1,11 @@
+export interface A {
+ a: string;
+}
+
+export class B implements A {
+ a = "a";
+}
+
+export function create(): B {
+ return new B();
+}
diff --git a/tests/specs/run/import_type/import_type.ts b/tests/specs/run/import_type/import_type.ts
new file mode 100644
index 000000000..91baba19a
--- /dev/null
+++ b/tests/specs/run/import_type/import_type.ts
@@ -0,0 +1,5 @@
+import { type B, create } from "./export_types.ts";
+
+const b: B = create();
+
+console.log(b);
diff --git a/tests/specs/run/import_type/import_type.ts.out b/tests/specs/run/import_type/import_type.ts.out
new file mode 100644
index 000000000..e35539e35
--- /dev/null
+++ b/tests/specs/run/import_type/import_type.ts.out
@@ -0,0 +1 @@
+B { a: "a" }
diff --git a/tests/specs/run/import_type_no_check/__test__.jsonc b/tests/specs/run/import_type_no_check/__test__.jsonc
new file mode 100644
index 000000000..d858f5fa1
--- /dev/null
+++ b/tests/specs/run/import_type_no_check/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --reload --no-check import_type.ts",
+ "output": "import_type.ts.out"
+}
diff --git a/tests/specs/run/import_type_no_check/export_types.ts b/tests/specs/run/import_type_no_check/export_types.ts
new file mode 100644
index 000000000..18c8ed881
--- /dev/null
+++ b/tests/specs/run/import_type_no_check/export_types.ts
@@ -0,0 +1,11 @@
+export interface A {
+ a: string;
+}
+
+export class B implements A {
+ a = "a";
+}
+
+export function create(): B {
+ return new B();
+}
diff --git a/tests/specs/run/import_type_no_check/import_type.ts b/tests/specs/run/import_type_no_check/import_type.ts
new file mode 100644
index 000000000..91baba19a
--- /dev/null
+++ b/tests/specs/run/import_type_no_check/import_type.ts
@@ -0,0 +1,5 @@
+import { type B, create } from "./export_types.ts";
+
+const b: B = create();
+
+console.log(b);
diff --git a/tests/specs/run/import_type_no_check/import_type.ts.out b/tests/specs/run/import_type_no_check/import_type.ts.out
new file mode 100644
index 000000000..e35539e35
--- /dev/null
+++ b/tests/specs/run/import_type_no_check/import_type.ts.out
@@ -0,0 +1 @@
+B { a: "a" }
diff --git a/tests/specs/run/inline_js_source_map_2/__test__.jsonc b/tests/specs/run/inline_js_source_map_2/__test__.jsonc
new file mode 100644
index 000000000..99ca6c1ae
--- /dev/null
+++ b/tests/specs/run/inline_js_source_map_2/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run --quiet inline_js_source_map_2.js",
+ "output": "inline_js_source_map_2.js.out",
+ "exitCode": 1
+}
diff --git a/tests/specs/run/inline_js_source_map_2/inline_js_source_map_2.js b/tests/specs/run/inline_js_source_map_2/inline_js_source_map_2.js
new file mode 100644
index 000000000..87132ee6a
--- /dev/null
+++ b/tests/specs/run/inline_js_source_map_2/inline_js_source_map_2.js
@@ -0,0 +1,4 @@
+"use strict";
+1 + 1;
+throw new Error("Hello world!");
+//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiaHR0cDovL2xvY2FsaG9zdDo0NTQ1L3J1bi9pbmxpbmVfanNfc291cmNlX21hcF8yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxDQUFDLEdBQUMsQ0FBQyxDQUFDO0FBS0osTUFBTSxJQUFJLEtBQUssQ0FBQyxjQUErQixDQUFDLENBQUMifQ==
diff --git a/tests/specs/run/inline_js_source_map_2/inline_js_source_map_2.js.out b/tests/specs/run/inline_js_source_map_2/inline_js_source_map_2.js.out
new file mode 100644
index 000000000..ba3053eba
--- /dev/null
+++ b/tests/specs/run/inline_js_source_map_2/inline_js_source_map_2.js.out
@@ -0,0 +1,2 @@
+error: Uncaught (in promise) Error: Hello world!
+ at http://localhost:4545/run/inline_js_source_map_2.ts:6:7
diff --git a/tests/specs/run/inline_js_source_map_2_with_inline_contents/__test__.jsonc b/tests/specs/run/inline_js_source_map_2_with_inline_contents/__test__.jsonc
new file mode 100644
index 000000000..45fe6eba6
--- /dev/null
+++ b/tests/specs/run/inline_js_source_map_2_with_inline_contents/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run --quiet inline_js_source_map_2_with_inline_contents.js",
+ "output": "inline_js_source_map_2_with_inline_contents.js.out",
+ "exitCode": 1
+}
diff --git a/tests/specs/run/inline_js_source_map_2_with_inline_contents/inline_js_source_map_2_with_inline_contents.js b/tests/specs/run/inline_js_source_map_2_with_inline_contents/inline_js_source_map_2_with_inline_contents.js
new file mode 100644
index 000000000..41bee7fe4
--- /dev/null
+++ b/tests/specs/run/inline_js_source_map_2_with_inline_contents/inline_js_source_map_2_with_inline_contents.js
@@ -0,0 +1,4 @@
+"use strict";
+
+throw new Error("Hello world!");
+//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiaHR0cDovL2xvY2FsaG9zdDo0NTQ1L3J1bi9pbmxpbmVfanNfc291cmNlX21hcF8yLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIjErMTtcbmludGVyZmFjZSBUZXN0IHtcbiAgaGVsbG86IHN0cmluZztcbn1cblxudGhyb3cgbmV3IEVycm9yKFwiSGVsbG8gd29ybGQhXCIgYXMgdW5rbm93biBhcyBzdHJpbmcpO1xuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxDQUFDLEdBQUMsQ0FBQyxDQUFDO0FBS0osTUFBTSxJQUFJLEtBQUssQ0FBQyxjQUErQixDQUFDLENBQUMifQ==
diff --git a/tests/specs/run/inline_js_source_map_2_with_inline_contents/inline_js_source_map_2_with_inline_contents.js.out b/tests/specs/run/inline_js_source_map_2_with_inline_contents/inline_js_source_map_2_with_inline_contents.js.out
new file mode 100644
index 000000000..ba3053eba
--- /dev/null
+++ b/tests/specs/run/inline_js_source_map_2_with_inline_contents/inline_js_source_map_2_with_inline_contents.js.out
@@ -0,0 +1,2 @@
+error: Uncaught (in promise) Error: Hello world!
+ at http://localhost:4545/run/inline_js_source_map_2.ts:6:7
diff --git a/tests/specs/run/inline_js_source_map_with_contents_from_graph/__test__.jsonc b/tests/specs/run/inline_js_source_map_with_contents_from_graph/__test__.jsonc
new file mode 100644
index 000000000..71dc4d509
--- /dev/null
+++ b/tests/specs/run/inline_js_source_map_with_contents_from_graph/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run --allow-import --quiet inline_js_source_map_with_contents_from_graph.js",
+ "output": "inline_js_source_map_with_contents_from_graph.js.out",
+ "exitCode": 1
+}
diff --git a/tests/specs/run/inline_js_source_map_with_contents_from_graph/inline_js_source_map_with_contents_from_graph.js b/tests/specs/run/inline_js_source_map_with_contents_from_graph/inline_js_source_map_with_contents_from_graph.js
new file mode 100644
index 000000000..12fa1644d
--- /dev/null
+++ b/tests/specs/run/inline_js_source_map_with_contents_from_graph/inline_js_source_map_with_contents_from_graph.js
@@ -0,0 +1,4 @@
+"use strict";
+import "http://localhost:4545/run/inline_js_source_map.ts";
+throw new Error("Hello world!");
+//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiaHR0cDovL2xvY2FsaG9zdDo0NTQ1L3J1bi9pbmxpbmVfanNfc291cmNlX21hcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsQ0FBQyxHQUFDLENBQUMsQ0FBQztBQUtKLE1BQU0sSUFBSSxLQUFLLENBQUMsY0FBK0IsQ0FBQyxDQUFDIn0=
diff --git a/tests/specs/run/inline_js_source_map_with_contents_from_graph/inline_js_source_map_with_contents_from_graph.js.out b/tests/specs/run/inline_js_source_map_with_contents_from_graph/inline_js_source_map_with_contents_from_graph.js.out
new file mode 100644
index 000000000..d80a1c7bb
--- /dev/null
+++ b/tests/specs/run/inline_js_source_map_with_contents_from_graph/inline_js_source_map_with_contents_from_graph.js.out
@@ -0,0 +1,4 @@
+error: Uncaught (in promise) Error: Hello world!
+// throw new Error("Hello world!" as string);
+ ^
+ at http://localhost:4545/run/inline_js_source_map.ts:6:7
diff --git a/tests/specs/run/issue_13562/__test__.jsonc b/tests/specs/run/issue_13562/__test__.jsonc
new file mode 100644
index 000000000..1971d552b
--- /dev/null
+++ b/tests/specs/run/issue_13562/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run issue13562.ts",
+ "output": "issue13562.ts.out"
+}
diff --git a/tests/specs/run/issue_13562/issue13562.ts b/tests/specs/run/issue_13562/issue13562.ts
new file mode 100644
index 000000000..51e97629b
--- /dev/null
+++ b/tests/specs/run/issue_13562/issue13562.ts
@@ -0,0 +1,3 @@
+import { printHello3 } from "./mod1.ts?q=.json";
+
+printHello3();
diff --git a/tests/specs/run/issue_13562/issue13562.ts.out b/tests/specs/run/issue_13562/issue13562.ts.out
new file mode 100644
index 000000000..e965047ad
--- /dev/null
+++ b/tests/specs/run/issue_13562/issue13562.ts.out
@@ -0,0 +1 @@
+Hello
diff --git a/tests/specs/run/issue_13562/mod1.ts b/tests/specs/run/issue_13562/mod1.ts
new file mode 100644
index 000000000..5e58f432e
--- /dev/null
+++ b/tests/specs/run/issue_13562/mod1.ts
@@ -0,0 +1,17 @@
+import { printHello2, returnsFoo } from "./subdir2/mod2.ts";
+
+export function returnsHi(): string {
+ return "Hi";
+}
+
+export function returnsFoo2(): string {
+ return returnsFoo();
+}
+
+export function printHello3() {
+ printHello2();
+}
+
+export function throwsError() {
+ throw Error("exception from mod1");
+}
diff --git a/tests/specs/run/issue_13562/print_hello.ts b/tests/specs/run/issue_13562/print_hello.ts
new file mode 100644
index 000000000..b9c0ad527
--- /dev/null
+++ b/tests/specs/run/issue_13562/print_hello.ts
@@ -0,0 +1,3 @@
+export function printHello() {
+ console.log("Hello");
+}
diff --git a/tests/specs/run/issue_13562/subdir2/dynamic_import.ts b/tests/specs/run/issue_13562/subdir2/dynamic_import.ts
new file mode 100644
index 000000000..59beb64c3
--- /dev/null
+++ b/tests/specs/run/issue_13562/subdir2/dynamic_import.ts
@@ -0,0 +1,4 @@
+(async () => {
+ const { printHello } = await import("../mod2.ts");
+ printHello();
+})();
diff --git a/tests/specs/run/issue_13562/subdir2/mod2.ts b/tests/specs/run/issue_13562/subdir2/mod2.ts
new file mode 100644
index 000000000..9071d0aeb
--- /dev/null
+++ b/tests/specs/run/issue_13562/subdir2/mod2.ts
@@ -0,0 +1,9 @@
+import { printHello } from "../print_hello.ts";
+
+export function returnsFoo(): string {
+ return "Foo";
+}
+
+export function printHello2() {
+ printHello();
+}
diff --git a/tests/specs/run/js_import_detect/__test__.jsonc b/tests/specs/run/js_import_detect/__test__.jsonc
new file mode 100644
index 000000000..6a648f476
--- /dev/null
+++ b/tests/specs/run/js_import_detect/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run --quiet --reload js_import_detect.ts",
+ "output": "js_import_detect.ts.out",
+ "exitCode": 0
+}
diff --git a/tests/specs/run/js_import_detect/js_import_detect.ts b/tests/specs/run/js_import_detect/js_import_detect.ts
new file mode 100644
index 000000000..751741996
--- /dev/null
+++ b/tests/specs/run/js_import_detect/js_import_detect.ts
@@ -0,0 +1,3 @@
+function define(_foo: string[]) {}
+define(["long"]);
+console.log("ok");
diff --git a/tests/specs/run/js_import_detect/js_import_detect.ts.out b/tests/specs/run/js_import_detect/js_import_detect.ts.out
new file mode 100644
index 000000000..9766475a4
--- /dev/null
+++ b/tests/specs/run/js_import_detect/js_import_detect.ts.out
@@ -0,0 +1 @@
+ok
diff --git a/tests/specs/run/js_root_with_ts_check/__test__.jsonc b/tests/specs/run/js_root_with_ts_check/__test__.jsonc
new file mode 100644
index 000000000..ebc4d7598
--- /dev/null
+++ b/tests/specs/run/js_root_with_ts_check/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run --quiet --check js_root_with_ts_check.js",
+ "output": "js_root_with_ts_check.js.out",
+ "exitCode": 1
+}
diff --git a/tests/specs/run/js_root_with_ts_check/js_root_with_ts_check.js b/tests/specs/run/js_root_with_ts_check/js_root_with_ts_check.js
new file mode 100644
index 000000000..adca847ee
--- /dev/null
+++ b/tests/specs/run/js_root_with_ts_check/js_root_with_ts_check.js
@@ -0,0 +1,5 @@
+// @ts-check
+
+/** @type {number} */
+const a = "";
+console.log(a);
diff --git a/tests/specs/run/js_root_with_ts_check/js_root_with_ts_check.js.out b/tests/specs/run/js_root_with_ts_check/js_root_with_ts_check.js.out
new file mode 100644
index 000000000..34e2fa61e
--- /dev/null
+++ b/tests/specs/run/js_root_with_ts_check/js_root_with_ts_check.js.out
@@ -0,0 +1,4 @@
+error: TS2322 [ERROR]: Type 'string' is not assignable to type 'number'.
+const a = "";
+ ^
+ at [WILDCARD]
diff --git a/tests/specs/run/js_without_extension/__test__.jsonc b/tests/specs/run/js_without_extension/__test__.jsonc
new file mode 100644
index 000000000..0d2aac73b
--- /dev/null
+++ b/tests/specs/run/js_without_extension/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run --ext js --check js_without_extension",
+ "output": "js_without_extension.out",
+ "exitCode": 0
+}
diff --git a/tests/specs/run/js_without_extension/js_without_extension b/tests/specs/run/js_without_extension/js_without_extension
new file mode 100644
index 000000000..4774be326
--- /dev/null
+++ b/tests/specs/run/js_without_extension/js_without_extension
@@ -0,0 +1,3 @@
+let i = 123;
+i = "hello"
+console.log("executing javascript with no extension");
diff --git a/tests/specs/run/js_without_extension/js_without_extension.out b/tests/specs/run/js_without_extension/js_without_extension.out
new file mode 100644
index 000000000..1236c1e53
--- /dev/null
+++ b/tests/specs/run/js_without_extension/js_without_extension.out
@@ -0,0 +1 @@
+executing javascript with no extension
diff --git a/tests/specs/run/jsx_import_from_ts/__test__.jsonc b/tests/specs/run/jsx_import_from_ts/__test__.jsonc
new file mode 100644
index 000000000..0f89205dc
--- /dev/null
+++ b/tests/specs/run/jsx_import_from_ts/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --quiet --reload jsx_import_from_ts.ts",
+ "output": "jsx_import_from_ts.ts.out"
+}
diff --git a/tests/specs/run/jsx_import_from_ts/jsx_import_from_ts.App.jsx b/tests/specs/run/jsx_import_from_ts/jsx_import_from_ts.App.jsx
new file mode 100644
index 000000000..649230613
--- /dev/null
+++ b/tests/specs/run/jsx_import_from_ts/jsx_import_from_ts.App.jsx
@@ -0,0 +1,11 @@
+const React = {
+ createElement() {},
+};
+
+export default function app() {
+ return (
+ <div>
+ <h2>asdf</h2>
+ </div>
+ );
+}
diff --git a/tests/specs/run/jsx_import_from_ts/jsx_import_from_ts.ts b/tests/specs/run/jsx_import_from_ts/jsx_import_from_ts.ts
new file mode 100644
index 000000000..3cc916698
--- /dev/null
+++ b/tests/specs/run/jsx_import_from_ts/jsx_import_from_ts.ts
@@ -0,0 +1,3 @@
+import app from "./jsx_import_from_ts.App.jsx";
+
+console.log(app);
diff --git a/tests/specs/run/jsx_import_from_ts/jsx_import_from_ts.ts.out b/tests/specs/run/jsx_import_from_ts/jsx_import_from_ts.ts.out
new file mode 100644
index 000000000..d449b8c9a
--- /dev/null
+++ b/tests/specs/run/jsx_import_from_ts/jsx_import_from_ts.ts.out
@@ -0,0 +1 @@
+[Function: app]
diff --git a/tests/specs/run/jsx_import_source_error/__test__.jsonc b/tests/specs/run/jsx_import_source_error/__test__.jsonc
new file mode 100644
index 000000000..22b1d29ca
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_error/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run --config jsx/deno-jsx-error.jsonc --check jsx_import_source_no_pragma.tsx",
+ "output": "jsx_import_source_error.out",
+ "exitCode": 1
+}
diff --git a/tests/specs/run/jsx_import_source_error/jsx/deno-jsx-error.jsonc b/tests/specs/run/jsx_import_source_error/jsx/deno-jsx-error.jsonc
new file mode 100644
index 000000000..37cb4dd91
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_error/jsx/deno-jsx-error.jsonc
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "react-jsx",
+ "jsxImportSource": "./nonexistent"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_error/jsx/deno-jsx-import-map.jsonc b/tests/specs/run/jsx_import_source_error/jsx/deno-jsx-import-map.jsonc
new file mode 100644
index 000000000..5adbfa8b5
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_error/jsx/deno-jsx-import-map.jsonc
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "react-jsx",
+ "jsxImportSource": "jsx"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_error/jsx/deno-jsx-precompile-skip.jsonc b/tests/specs/run/jsx_import_source_error/jsx/deno-jsx-precompile-skip.jsonc
new file mode 100644
index 000000000..3c9e4fa1f
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_error/jsx/deno-jsx-precompile-skip.jsonc
@@ -0,0 +1,7 @@
+{
+ "compilerOptions": {
+ "jsx": "precompile",
+ "jsxImportSource": "jsx-precompile",
+ "jsxPrecompileSkipElements": ["a", "img"]
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_error/jsx/deno-jsx-precompile.jsonc b/tests/specs/run/jsx_import_source_error/jsx/deno-jsx-precompile.jsonc
new file mode 100644
index 000000000..95ae1b9f3
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_error/jsx/deno-jsx-precompile.jsonc
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "precompile",
+ "jsxImportSource": "jsx-precompile"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_error/jsx/deno-jsx.json b/tests/specs/run/jsx_import_source_error/jsx/deno-jsx.json
new file mode 100644
index 000000000..311409ea3
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_error/jsx/deno-jsx.json
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "react-jsx",
+ "jsxImportSource": "http://localhost:4545/jsx"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_error/jsx/deno-jsx.jsonc b/tests/specs/run/jsx_import_source_error/jsx/deno-jsx.jsonc
new file mode 100644
index 000000000..311409ea3
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_error/jsx/deno-jsx.jsonc
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "react-jsx",
+ "jsxImportSource": "http://localhost:4545/jsx"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_error/jsx/deno-jsxdev-import-map.jsonc b/tests/specs/run/jsx_import_source_error/jsx/deno-jsxdev-import-map.jsonc
new file mode 100644
index 000000000..7481d5a2d
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_error/jsx/deno-jsxdev-import-map.jsonc
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "react-jsxdev",
+ "jsxImportSource": "jsx"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_error/jsx/deno-jsxdev.jsonc b/tests/specs/run/jsx_import_source_error/jsx/deno-jsxdev.jsonc
new file mode 100644
index 000000000..ae5bdf9f1
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_error/jsx/deno-jsxdev.jsonc
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "react-jsxdev",
+ "jsxImportSource": "http://localhost:4545/jsx"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_error/jsx/deno.lock b/tests/specs/run/jsx_import_source_error/jsx/deno.lock
new file mode 100644
index 000000000..011e8fe10
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_error/jsx/deno.lock
@@ -0,0 +1,6 @@
+{
+ "version": "2",
+ "remote": {
+ "http://localhost:4545/jsx/jsx-dev-runtime/index.ts": "183c5bf1cfb82b15fc1e8cca15593d4816035759532d851abd4476df378c8412"
+ }
+} \ No newline at end of file
diff --git a/tests/specs/run/jsx_import_source_error/jsx/import-map-scoped.json b/tests/specs/run/jsx_import_source_error/jsx/import-map-scoped.json
new file mode 100644
index 000000000..9b2005128
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_error/jsx/import-map-scoped.json
@@ -0,0 +1,8 @@
+{
+ "scopes": {
+ "../subdir/": {
+ "jsx/jsx-runtime": "http://localhost:4545/jsx/jsx-runtime/index.ts",
+ "jsx/jsx-dev-runtime": "http://localhost:4545/jsx/jsx-dev-runtime/index.ts"
+ }
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_error/jsx/import-map.json b/tests/specs/run/jsx_import_source_error/jsx/import-map.json
new file mode 100644
index 000000000..1bfa04e2f
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_error/jsx/import-map.json
@@ -0,0 +1,7 @@
+{
+ "imports": {
+ "jsx/jsx-runtime": "http://localhost:4545/jsx/jsx-runtime/index.ts",
+ "jsx/jsx-dev-runtime": "http://localhost:4545/jsx/jsx-dev-runtime/index.ts",
+ "jsx-precompile/jsx-runtime": "http://localhost:4545/jsx/jsx-precompile/index.ts"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_error/jsx/jsx-dev-runtime/index.ts b/tests/specs/run/jsx_import_source_error/jsx/jsx-dev-runtime/index.ts
new file mode 100644
index 000000000..15e2029c8
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_error/jsx/jsx-dev-runtime/index.ts
@@ -0,0 +1,12 @@
+// deno-lint-ignore-file no-explicit-any
+export function jsx(
+ _type: any,
+ _props: any,
+ _key: any,
+ _source: any,
+ _self: any,
+) {}
+export const jsxs = jsx;
+export const jsxDEV = jsx;
+export const Fragment = Symbol("Fragment");
+console.log("imported", import.meta.url);
diff --git a/tests/specs/run/jsx_import_source_error/jsx/jsx-precompile/index.ts b/tests/specs/run/jsx_import_source_error/jsx/jsx-precompile/index.ts
new file mode 100644
index 000000000..0d56095e0
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_error/jsx/jsx-precompile/index.ts
@@ -0,0 +1,23 @@
+// deno-lint-ignore-file no-explicit-any
+export function jsx(
+ _type: any,
+ _props: any,
+ _key: any,
+ _source: any,
+ _self: any,
+) {}
+// deno-lint-ignore-file no-explicit-any
+export const jsxAttr = (name: string, value: any) => `${name}="${value}"`;
+// deno-lint-ignore-file no-explicit-any
+export const jsxTemplate = (_template: string[], ..._exprs: any[]) => "";
+// deno-lint-ignore-file no-explicit-any
+export const jsxEscape = (_value: any) => "";
+console.log("imported", import.meta.url);
+
+declare global {
+ namespace JSX {
+ interface IntrinsicElements {
+ [tagName: string]: Record<string, any>;
+ }
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_error/jsx/jsx-runtime/index.ts b/tests/specs/run/jsx_import_source_error/jsx/jsx-runtime/index.ts
new file mode 100644
index 000000000..15e2029c8
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_error/jsx/jsx-runtime/index.ts
@@ -0,0 +1,12 @@
+// deno-lint-ignore-file no-explicit-any
+export function jsx(
+ _type: any,
+ _props: any,
+ _key: any,
+ _source: any,
+ _self: any,
+) {}
+export const jsxs = jsx;
+export const jsxDEV = jsx;
+export const Fragment = Symbol("Fragment");
+console.log("imported", import.meta.url);
diff --git a/tests/specs/run/jsx_import_source_error/jsx_import_source_error.out b/tests/specs/run/jsx_import_source_error/jsx_import_source_error.out
new file mode 100644
index 000000000..634a5b09b
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_error/jsx_import_source_error.out
@@ -0,0 +1,2 @@
+error: Module not found "file:///[WILDCARD]/nonexistent/jsx-runtime".
+ at file:///[WILDCARD]/jsx_import_source_no_pragma.tsx:1:1
diff --git a/tests/specs/run/jsx_import_source_error/jsx_import_source_no_pragma.tsx b/tests/specs/run/jsx_import_source_error/jsx_import_source_no_pragma.tsx
new file mode 100644
index 000000000..2c756054f
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_error/jsx_import_source_no_pragma.tsx
@@ -0,0 +1,7 @@
+function A() {
+ return "hello";
+}
+
+export function B() {
+ return <A></A>;
+}
diff --git a/tests/specs/run/jsx_import_source_import_map/__test__.jsonc b/tests/specs/run/jsx_import_source_import_map/__test__.jsonc
new file mode 100644
index 000000000..8a62c5243
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_import_map/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --allow-import --reload --import-map jsx/import-map.json --no-lock --config jsx/deno-jsx-import-map.jsonc jsx_import_source_no_pragma.tsx",
+ "output": "jsx_import_source_import_map.out"
+}
diff --git a/tests/specs/run/jsx_import_source_import_map/jsx/deno-jsx-error.jsonc b/tests/specs/run/jsx_import_source_import_map/jsx/deno-jsx-error.jsonc
new file mode 100644
index 000000000..37cb4dd91
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_import_map/jsx/deno-jsx-error.jsonc
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "react-jsx",
+ "jsxImportSource": "./nonexistent"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_import_map/jsx/deno-jsx-import-map.jsonc b/tests/specs/run/jsx_import_source_import_map/jsx/deno-jsx-import-map.jsonc
new file mode 100644
index 000000000..5adbfa8b5
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_import_map/jsx/deno-jsx-import-map.jsonc
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "react-jsx",
+ "jsxImportSource": "jsx"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_import_map/jsx/deno-jsx-precompile-skip.jsonc b/tests/specs/run/jsx_import_source_import_map/jsx/deno-jsx-precompile-skip.jsonc
new file mode 100644
index 000000000..3c9e4fa1f
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_import_map/jsx/deno-jsx-precompile-skip.jsonc
@@ -0,0 +1,7 @@
+{
+ "compilerOptions": {
+ "jsx": "precompile",
+ "jsxImportSource": "jsx-precompile",
+ "jsxPrecompileSkipElements": ["a", "img"]
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_import_map/jsx/deno-jsx-precompile.jsonc b/tests/specs/run/jsx_import_source_import_map/jsx/deno-jsx-precompile.jsonc
new file mode 100644
index 000000000..95ae1b9f3
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_import_map/jsx/deno-jsx-precompile.jsonc
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "precompile",
+ "jsxImportSource": "jsx-precompile"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_import_map/jsx/deno-jsx.json b/tests/specs/run/jsx_import_source_import_map/jsx/deno-jsx.json
new file mode 100644
index 000000000..311409ea3
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_import_map/jsx/deno-jsx.json
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "react-jsx",
+ "jsxImportSource": "http://localhost:4545/jsx"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_import_map/jsx/deno-jsx.jsonc b/tests/specs/run/jsx_import_source_import_map/jsx/deno-jsx.jsonc
new file mode 100644
index 000000000..311409ea3
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_import_map/jsx/deno-jsx.jsonc
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "react-jsx",
+ "jsxImportSource": "http://localhost:4545/jsx"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_import_map/jsx/deno-jsxdev-import-map.jsonc b/tests/specs/run/jsx_import_source_import_map/jsx/deno-jsxdev-import-map.jsonc
new file mode 100644
index 000000000..7481d5a2d
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_import_map/jsx/deno-jsxdev-import-map.jsonc
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "react-jsxdev",
+ "jsxImportSource": "jsx"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_import_map/jsx/deno-jsxdev.jsonc b/tests/specs/run/jsx_import_source_import_map/jsx/deno-jsxdev.jsonc
new file mode 100644
index 000000000..ae5bdf9f1
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_import_map/jsx/deno-jsxdev.jsonc
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "react-jsxdev",
+ "jsxImportSource": "http://localhost:4545/jsx"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_import_map/jsx/deno.lock b/tests/specs/run/jsx_import_source_import_map/jsx/deno.lock
new file mode 100644
index 000000000..011e8fe10
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_import_map/jsx/deno.lock
@@ -0,0 +1,6 @@
+{
+ "version": "2",
+ "remote": {
+ "http://localhost:4545/jsx/jsx-dev-runtime/index.ts": "183c5bf1cfb82b15fc1e8cca15593d4816035759532d851abd4476df378c8412"
+ }
+} \ No newline at end of file
diff --git a/tests/specs/run/jsx_import_source_import_map/jsx/import-map-scoped.json b/tests/specs/run/jsx_import_source_import_map/jsx/import-map-scoped.json
new file mode 100644
index 000000000..9b2005128
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_import_map/jsx/import-map-scoped.json
@@ -0,0 +1,8 @@
+{
+ "scopes": {
+ "../subdir/": {
+ "jsx/jsx-runtime": "http://localhost:4545/jsx/jsx-runtime/index.ts",
+ "jsx/jsx-dev-runtime": "http://localhost:4545/jsx/jsx-dev-runtime/index.ts"
+ }
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_import_map/jsx/import-map.json b/tests/specs/run/jsx_import_source_import_map/jsx/import-map.json
new file mode 100644
index 000000000..1bfa04e2f
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_import_map/jsx/import-map.json
@@ -0,0 +1,7 @@
+{
+ "imports": {
+ "jsx/jsx-runtime": "http://localhost:4545/jsx/jsx-runtime/index.ts",
+ "jsx/jsx-dev-runtime": "http://localhost:4545/jsx/jsx-dev-runtime/index.ts",
+ "jsx-precompile/jsx-runtime": "http://localhost:4545/jsx/jsx-precompile/index.ts"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_import_map/jsx/jsx-dev-runtime/index.ts b/tests/specs/run/jsx_import_source_import_map/jsx/jsx-dev-runtime/index.ts
new file mode 100644
index 000000000..15e2029c8
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_import_map/jsx/jsx-dev-runtime/index.ts
@@ -0,0 +1,12 @@
+// deno-lint-ignore-file no-explicit-any
+export function jsx(
+ _type: any,
+ _props: any,
+ _key: any,
+ _source: any,
+ _self: any,
+) {}
+export const jsxs = jsx;
+export const jsxDEV = jsx;
+export const Fragment = Symbol("Fragment");
+console.log("imported", import.meta.url);
diff --git a/tests/specs/run/jsx_import_source_import_map/jsx/jsx-precompile/index.ts b/tests/specs/run/jsx_import_source_import_map/jsx/jsx-precompile/index.ts
new file mode 100644
index 000000000..0d56095e0
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_import_map/jsx/jsx-precompile/index.ts
@@ -0,0 +1,23 @@
+// deno-lint-ignore-file no-explicit-any
+export function jsx(
+ _type: any,
+ _props: any,
+ _key: any,
+ _source: any,
+ _self: any,
+) {}
+// deno-lint-ignore-file no-explicit-any
+export const jsxAttr = (name: string, value: any) => `${name}="${value}"`;
+// deno-lint-ignore-file no-explicit-any
+export const jsxTemplate = (_template: string[], ..._exprs: any[]) => "";
+// deno-lint-ignore-file no-explicit-any
+export const jsxEscape = (_value: any) => "";
+console.log("imported", import.meta.url);
+
+declare global {
+ namespace JSX {
+ interface IntrinsicElements {
+ [tagName: string]: Record<string, any>;
+ }
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_import_map/jsx/jsx-runtime/index.ts b/tests/specs/run/jsx_import_source_import_map/jsx/jsx-runtime/index.ts
new file mode 100644
index 000000000..15e2029c8
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_import_map/jsx/jsx-runtime/index.ts
@@ -0,0 +1,12 @@
+// deno-lint-ignore-file no-explicit-any
+export function jsx(
+ _type: any,
+ _props: any,
+ _key: any,
+ _source: any,
+ _self: any,
+) {}
+export const jsxs = jsx;
+export const jsxDEV = jsx;
+export const Fragment = Symbol("Fragment");
+console.log("imported", import.meta.url);
diff --git a/tests/specs/run/jsx_import_source_import_map/jsx_import_source_import_map.out b/tests/specs/run/jsx_import_source_import_map/jsx_import_source_import_map.out
new file mode 100644
index 000000000..0d3238967
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_import_map/jsx_import_source_import_map.out
@@ -0,0 +1,2 @@
+[WILDCARD]
+imported http://localhost:4545/jsx/jsx-runtime/index.ts
diff --git a/tests/specs/run/jsx_import_source_import_map/jsx_import_source_no_pragma.tsx b/tests/specs/run/jsx_import_source_import_map/jsx_import_source_no_pragma.tsx
new file mode 100644
index 000000000..2c756054f
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_import_map/jsx_import_source_no_pragma.tsx
@@ -0,0 +1,7 @@
+function A() {
+ return "hello";
+}
+
+export function B() {
+ return <A></A>;
+}
diff --git a/tests/specs/run/jsx_import_source_import_map_dev/__test__.jsonc b/tests/specs/run/jsx_import_source_import_map_dev/__test__.jsonc
new file mode 100644
index 000000000..b62e7cb6f
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_import_map_dev/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --allow-import --reload --import-map jsx/import-map.json --no-lock --config jsx/deno-jsxdev-import-map.jsonc jsx_import_source_no_pragma.tsx",
+ "output": "jsx_import_source_import_map_dev.out"
+}
diff --git a/tests/specs/run/jsx_import_source_import_map_dev/jsx/deno-jsx-error.jsonc b/tests/specs/run/jsx_import_source_import_map_dev/jsx/deno-jsx-error.jsonc
new file mode 100644
index 000000000..37cb4dd91
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_import_map_dev/jsx/deno-jsx-error.jsonc
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "react-jsx",
+ "jsxImportSource": "./nonexistent"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_import_map_dev/jsx/deno-jsx-import-map.jsonc b/tests/specs/run/jsx_import_source_import_map_dev/jsx/deno-jsx-import-map.jsonc
new file mode 100644
index 000000000..5adbfa8b5
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_import_map_dev/jsx/deno-jsx-import-map.jsonc
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "react-jsx",
+ "jsxImportSource": "jsx"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_import_map_dev/jsx/deno-jsx-precompile-skip.jsonc b/tests/specs/run/jsx_import_source_import_map_dev/jsx/deno-jsx-precompile-skip.jsonc
new file mode 100644
index 000000000..3c9e4fa1f
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_import_map_dev/jsx/deno-jsx-precompile-skip.jsonc
@@ -0,0 +1,7 @@
+{
+ "compilerOptions": {
+ "jsx": "precompile",
+ "jsxImportSource": "jsx-precompile",
+ "jsxPrecompileSkipElements": ["a", "img"]
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_import_map_dev/jsx/deno-jsx-precompile.jsonc b/tests/specs/run/jsx_import_source_import_map_dev/jsx/deno-jsx-precompile.jsonc
new file mode 100644
index 000000000..95ae1b9f3
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_import_map_dev/jsx/deno-jsx-precompile.jsonc
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "precompile",
+ "jsxImportSource": "jsx-precompile"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_import_map_dev/jsx/deno-jsx.json b/tests/specs/run/jsx_import_source_import_map_dev/jsx/deno-jsx.json
new file mode 100644
index 000000000..311409ea3
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_import_map_dev/jsx/deno-jsx.json
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "react-jsx",
+ "jsxImportSource": "http://localhost:4545/jsx"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_import_map_dev/jsx/deno-jsx.jsonc b/tests/specs/run/jsx_import_source_import_map_dev/jsx/deno-jsx.jsonc
new file mode 100644
index 000000000..311409ea3
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_import_map_dev/jsx/deno-jsx.jsonc
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "react-jsx",
+ "jsxImportSource": "http://localhost:4545/jsx"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_import_map_dev/jsx/deno-jsxdev-import-map.jsonc b/tests/specs/run/jsx_import_source_import_map_dev/jsx/deno-jsxdev-import-map.jsonc
new file mode 100644
index 000000000..7481d5a2d
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_import_map_dev/jsx/deno-jsxdev-import-map.jsonc
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "react-jsxdev",
+ "jsxImportSource": "jsx"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_import_map_dev/jsx/deno-jsxdev.jsonc b/tests/specs/run/jsx_import_source_import_map_dev/jsx/deno-jsxdev.jsonc
new file mode 100644
index 000000000..ae5bdf9f1
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_import_map_dev/jsx/deno-jsxdev.jsonc
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "react-jsxdev",
+ "jsxImportSource": "http://localhost:4545/jsx"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_import_map_dev/jsx/deno.lock b/tests/specs/run/jsx_import_source_import_map_dev/jsx/deno.lock
new file mode 100644
index 000000000..011e8fe10
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_import_map_dev/jsx/deno.lock
@@ -0,0 +1,6 @@
+{
+ "version": "2",
+ "remote": {
+ "http://localhost:4545/jsx/jsx-dev-runtime/index.ts": "183c5bf1cfb82b15fc1e8cca15593d4816035759532d851abd4476df378c8412"
+ }
+} \ No newline at end of file
diff --git a/tests/specs/run/jsx_import_source_import_map_dev/jsx/import-map-scoped.json b/tests/specs/run/jsx_import_source_import_map_dev/jsx/import-map-scoped.json
new file mode 100644
index 000000000..9b2005128
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_import_map_dev/jsx/import-map-scoped.json
@@ -0,0 +1,8 @@
+{
+ "scopes": {
+ "../subdir/": {
+ "jsx/jsx-runtime": "http://localhost:4545/jsx/jsx-runtime/index.ts",
+ "jsx/jsx-dev-runtime": "http://localhost:4545/jsx/jsx-dev-runtime/index.ts"
+ }
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_import_map_dev/jsx/import-map.json b/tests/specs/run/jsx_import_source_import_map_dev/jsx/import-map.json
new file mode 100644
index 000000000..1bfa04e2f
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_import_map_dev/jsx/import-map.json
@@ -0,0 +1,7 @@
+{
+ "imports": {
+ "jsx/jsx-runtime": "http://localhost:4545/jsx/jsx-runtime/index.ts",
+ "jsx/jsx-dev-runtime": "http://localhost:4545/jsx/jsx-dev-runtime/index.ts",
+ "jsx-precompile/jsx-runtime": "http://localhost:4545/jsx/jsx-precompile/index.ts"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_import_map_dev/jsx/jsx-dev-runtime/index.ts b/tests/specs/run/jsx_import_source_import_map_dev/jsx/jsx-dev-runtime/index.ts
new file mode 100644
index 000000000..15e2029c8
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_import_map_dev/jsx/jsx-dev-runtime/index.ts
@@ -0,0 +1,12 @@
+// deno-lint-ignore-file no-explicit-any
+export function jsx(
+ _type: any,
+ _props: any,
+ _key: any,
+ _source: any,
+ _self: any,
+) {}
+export const jsxs = jsx;
+export const jsxDEV = jsx;
+export const Fragment = Symbol("Fragment");
+console.log("imported", import.meta.url);
diff --git a/tests/specs/run/jsx_import_source_import_map_dev/jsx/jsx-precompile/index.ts b/tests/specs/run/jsx_import_source_import_map_dev/jsx/jsx-precompile/index.ts
new file mode 100644
index 000000000..0d56095e0
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_import_map_dev/jsx/jsx-precompile/index.ts
@@ -0,0 +1,23 @@
+// deno-lint-ignore-file no-explicit-any
+export function jsx(
+ _type: any,
+ _props: any,
+ _key: any,
+ _source: any,
+ _self: any,
+) {}
+// deno-lint-ignore-file no-explicit-any
+export const jsxAttr = (name: string, value: any) => `${name}="${value}"`;
+// deno-lint-ignore-file no-explicit-any
+export const jsxTemplate = (_template: string[], ..._exprs: any[]) => "";
+// deno-lint-ignore-file no-explicit-any
+export const jsxEscape = (_value: any) => "";
+console.log("imported", import.meta.url);
+
+declare global {
+ namespace JSX {
+ interface IntrinsicElements {
+ [tagName: string]: Record<string, any>;
+ }
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_import_map_dev/jsx/jsx-runtime/index.ts b/tests/specs/run/jsx_import_source_import_map_dev/jsx/jsx-runtime/index.ts
new file mode 100644
index 000000000..15e2029c8
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_import_map_dev/jsx/jsx-runtime/index.ts
@@ -0,0 +1,12 @@
+// deno-lint-ignore-file no-explicit-any
+export function jsx(
+ _type: any,
+ _props: any,
+ _key: any,
+ _source: any,
+ _self: any,
+) {}
+export const jsxs = jsx;
+export const jsxDEV = jsx;
+export const Fragment = Symbol("Fragment");
+console.log("imported", import.meta.url);
diff --git a/tests/specs/run/jsx_import_source_import_map_dev/jsx_import_source_import_map_dev.out b/tests/specs/run/jsx_import_source_import_map_dev/jsx_import_source_import_map_dev.out
new file mode 100644
index 000000000..56f514d90
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_import_map_dev/jsx_import_source_import_map_dev.out
@@ -0,0 +1,2 @@
+[WILDCARD]
+imported http://localhost:4545/jsx/jsx-dev-runtime/index.ts
diff --git a/tests/specs/run/jsx_import_source_import_map_dev/jsx_import_source_no_pragma.tsx b/tests/specs/run/jsx_import_source_import_map_dev/jsx_import_source_no_pragma.tsx
new file mode 100644
index 000000000..2c756054f
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_import_map_dev/jsx_import_source_no_pragma.tsx
@@ -0,0 +1,7 @@
+function A() {
+ return "hello";
+}
+
+export function B() {
+ return <A></A>;
+}
diff --git a/tests/specs/run/jsx_import_source_import_map_no_check/__test__.jsonc b/tests/specs/run/jsx_import_source_import_map_no_check/__test__.jsonc
new file mode 100644
index 000000000..ea4265484
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_import_map_no_check/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --allow-import --reload --import-map jsx/import-map.json --no-lock --config jsx/deno-jsx-import-map.jsonc --no-check jsx_import_source_no_pragma.tsx",
+ "output": "jsx_import_source_import_map.out"
+}
diff --git a/tests/specs/run/jsx_import_source_import_map_no_check/jsx/deno-jsx-error.jsonc b/tests/specs/run/jsx_import_source_import_map_no_check/jsx/deno-jsx-error.jsonc
new file mode 100644
index 000000000..37cb4dd91
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_import_map_no_check/jsx/deno-jsx-error.jsonc
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "react-jsx",
+ "jsxImportSource": "./nonexistent"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_import_map_no_check/jsx/deno-jsx-import-map.jsonc b/tests/specs/run/jsx_import_source_import_map_no_check/jsx/deno-jsx-import-map.jsonc
new file mode 100644
index 000000000..5adbfa8b5
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_import_map_no_check/jsx/deno-jsx-import-map.jsonc
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "react-jsx",
+ "jsxImportSource": "jsx"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_import_map_no_check/jsx/deno-jsx-precompile-skip.jsonc b/tests/specs/run/jsx_import_source_import_map_no_check/jsx/deno-jsx-precompile-skip.jsonc
new file mode 100644
index 000000000..3c9e4fa1f
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_import_map_no_check/jsx/deno-jsx-precompile-skip.jsonc
@@ -0,0 +1,7 @@
+{
+ "compilerOptions": {
+ "jsx": "precompile",
+ "jsxImportSource": "jsx-precompile",
+ "jsxPrecompileSkipElements": ["a", "img"]
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_import_map_no_check/jsx/deno-jsx-precompile.jsonc b/tests/specs/run/jsx_import_source_import_map_no_check/jsx/deno-jsx-precompile.jsonc
new file mode 100644
index 000000000..95ae1b9f3
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_import_map_no_check/jsx/deno-jsx-precompile.jsonc
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "precompile",
+ "jsxImportSource": "jsx-precompile"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_import_map_no_check/jsx/deno-jsx.json b/tests/specs/run/jsx_import_source_import_map_no_check/jsx/deno-jsx.json
new file mode 100644
index 000000000..311409ea3
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_import_map_no_check/jsx/deno-jsx.json
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "react-jsx",
+ "jsxImportSource": "http://localhost:4545/jsx"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_import_map_no_check/jsx/deno-jsx.jsonc b/tests/specs/run/jsx_import_source_import_map_no_check/jsx/deno-jsx.jsonc
new file mode 100644
index 000000000..311409ea3
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_import_map_no_check/jsx/deno-jsx.jsonc
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "react-jsx",
+ "jsxImportSource": "http://localhost:4545/jsx"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_import_map_no_check/jsx/deno-jsxdev-import-map.jsonc b/tests/specs/run/jsx_import_source_import_map_no_check/jsx/deno-jsxdev-import-map.jsonc
new file mode 100644
index 000000000..7481d5a2d
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_import_map_no_check/jsx/deno-jsxdev-import-map.jsonc
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "react-jsxdev",
+ "jsxImportSource": "jsx"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_import_map_no_check/jsx/deno-jsxdev.jsonc b/tests/specs/run/jsx_import_source_import_map_no_check/jsx/deno-jsxdev.jsonc
new file mode 100644
index 000000000..ae5bdf9f1
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_import_map_no_check/jsx/deno-jsxdev.jsonc
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "react-jsxdev",
+ "jsxImportSource": "http://localhost:4545/jsx"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_import_map_no_check/jsx/deno.lock b/tests/specs/run/jsx_import_source_import_map_no_check/jsx/deno.lock
new file mode 100644
index 000000000..011e8fe10
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_import_map_no_check/jsx/deno.lock
@@ -0,0 +1,6 @@
+{
+ "version": "2",
+ "remote": {
+ "http://localhost:4545/jsx/jsx-dev-runtime/index.ts": "183c5bf1cfb82b15fc1e8cca15593d4816035759532d851abd4476df378c8412"
+ }
+} \ No newline at end of file
diff --git a/tests/specs/run/jsx_import_source_import_map_no_check/jsx/import-map-scoped.json b/tests/specs/run/jsx_import_source_import_map_no_check/jsx/import-map-scoped.json
new file mode 100644
index 000000000..9b2005128
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_import_map_no_check/jsx/import-map-scoped.json
@@ -0,0 +1,8 @@
+{
+ "scopes": {
+ "../subdir/": {
+ "jsx/jsx-runtime": "http://localhost:4545/jsx/jsx-runtime/index.ts",
+ "jsx/jsx-dev-runtime": "http://localhost:4545/jsx/jsx-dev-runtime/index.ts"
+ }
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_import_map_no_check/jsx/import-map.json b/tests/specs/run/jsx_import_source_import_map_no_check/jsx/import-map.json
new file mode 100644
index 000000000..1bfa04e2f
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_import_map_no_check/jsx/import-map.json
@@ -0,0 +1,7 @@
+{
+ "imports": {
+ "jsx/jsx-runtime": "http://localhost:4545/jsx/jsx-runtime/index.ts",
+ "jsx/jsx-dev-runtime": "http://localhost:4545/jsx/jsx-dev-runtime/index.ts",
+ "jsx-precompile/jsx-runtime": "http://localhost:4545/jsx/jsx-precompile/index.ts"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_import_map_no_check/jsx/jsx-dev-runtime/index.ts b/tests/specs/run/jsx_import_source_import_map_no_check/jsx/jsx-dev-runtime/index.ts
new file mode 100644
index 000000000..15e2029c8
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_import_map_no_check/jsx/jsx-dev-runtime/index.ts
@@ -0,0 +1,12 @@
+// deno-lint-ignore-file no-explicit-any
+export function jsx(
+ _type: any,
+ _props: any,
+ _key: any,
+ _source: any,
+ _self: any,
+) {}
+export const jsxs = jsx;
+export const jsxDEV = jsx;
+export const Fragment = Symbol("Fragment");
+console.log("imported", import.meta.url);
diff --git a/tests/specs/run/jsx_import_source_import_map_no_check/jsx/jsx-precompile/index.ts b/tests/specs/run/jsx_import_source_import_map_no_check/jsx/jsx-precompile/index.ts
new file mode 100644
index 000000000..0d56095e0
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_import_map_no_check/jsx/jsx-precompile/index.ts
@@ -0,0 +1,23 @@
+// deno-lint-ignore-file no-explicit-any
+export function jsx(
+ _type: any,
+ _props: any,
+ _key: any,
+ _source: any,
+ _self: any,
+) {}
+// deno-lint-ignore-file no-explicit-any
+export const jsxAttr = (name: string, value: any) => `${name}="${value}"`;
+// deno-lint-ignore-file no-explicit-any
+export const jsxTemplate = (_template: string[], ..._exprs: any[]) => "";
+// deno-lint-ignore-file no-explicit-any
+export const jsxEscape = (_value: any) => "";
+console.log("imported", import.meta.url);
+
+declare global {
+ namespace JSX {
+ interface IntrinsicElements {
+ [tagName: string]: Record<string, any>;
+ }
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_import_map_no_check/jsx/jsx-runtime/index.ts b/tests/specs/run/jsx_import_source_import_map_no_check/jsx/jsx-runtime/index.ts
new file mode 100644
index 000000000..15e2029c8
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_import_map_no_check/jsx/jsx-runtime/index.ts
@@ -0,0 +1,12 @@
+// deno-lint-ignore-file no-explicit-any
+export function jsx(
+ _type: any,
+ _props: any,
+ _key: any,
+ _source: any,
+ _self: any,
+) {}
+export const jsxs = jsx;
+export const jsxDEV = jsx;
+export const Fragment = Symbol("Fragment");
+console.log("imported", import.meta.url);
diff --git a/tests/specs/run/jsx_import_source_import_map_no_check/jsx_import_source_import_map.out b/tests/specs/run/jsx_import_source_import_map_no_check/jsx_import_source_import_map.out
new file mode 100644
index 000000000..0d3238967
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_import_map_no_check/jsx_import_source_import_map.out
@@ -0,0 +1,2 @@
+[WILDCARD]
+imported http://localhost:4545/jsx/jsx-runtime/index.ts
diff --git a/tests/specs/run/jsx_import_source_import_map_no_check/jsx_import_source_no_pragma.tsx b/tests/specs/run/jsx_import_source_import_map_no_check/jsx_import_source_no_pragma.tsx
new file mode 100644
index 000000000..2c756054f
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_import_map_no_check/jsx_import_source_no_pragma.tsx
@@ -0,0 +1,7 @@
+function A() {
+ return "hello";
+}
+
+export function B() {
+ return <A></A>;
+}
diff --git a/tests/specs/run/jsx_import_source_no_pragma/__test__.jsonc b/tests/specs/run/jsx_import_source_no_pragma/__test__.jsonc
new file mode 100644
index 000000000..7678e18f4
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_no_pragma/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --allow-import --reload --config jsx/deno-jsx.jsonc --no-lock jsx_import_source_no_pragma.tsx",
+ "output": "jsx_import_source.out"
+}
diff --git a/tests/specs/run/jsx_import_source_no_pragma/jsx/deno-jsx-error.jsonc b/tests/specs/run/jsx_import_source_no_pragma/jsx/deno-jsx-error.jsonc
new file mode 100644
index 000000000..37cb4dd91
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_no_pragma/jsx/deno-jsx-error.jsonc
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "react-jsx",
+ "jsxImportSource": "./nonexistent"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_no_pragma/jsx/deno-jsx-import-map.jsonc b/tests/specs/run/jsx_import_source_no_pragma/jsx/deno-jsx-import-map.jsonc
new file mode 100644
index 000000000..5adbfa8b5
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_no_pragma/jsx/deno-jsx-import-map.jsonc
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "react-jsx",
+ "jsxImportSource": "jsx"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_no_pragma/jsx/deno-jsx-precompile-skip.jsonc b/tests/specs/run/jsx_import_source_no_pragma/jsx/deno-jsx-precompile-skip.jsonc
new file mode 100644
index 000000000..3c9e4fa1f
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_no_pragma/jsx/deno-jsx-precompile-skip.jsonc
@@ -0,0 +1,7 @@
+{
+ "compilerOptions": {
+ "jsx": "precompile",
+ "jsxImportSource": "jsx-precompile",
+ "jsxPrecompileSkipElements": ["a", "img"]
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_no_pragma/jsx/deno-jsx-precompile.jsonc b/tests/specs/run/jsx_import_source_no_pragma/jsx/deno-jsx-precompile.jsonc
new file mode 100644
index 000000000..95ae1b9f3
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_no_pragma/jsx/deno-jsx-precompile.jsonc
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "precompile",
+ "jsxImportSource": "jsx-precompile"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_no_pragma/jsx/deno-jsx.json b/tests/specs/run/jsx_import_source_no_pragma/jsx/deno-jsx.json
new file mode 100644
index 000000000..311409ea3
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_no_pragma/jsx/deno-jsx.json
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "react-jsx",
+ "jsxImportSource": "http://localhost:4545/jsx"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_no_pragma/jsx/deno-jsx.jsonc b/tests/specs/run/jsx_import_source_no_pragma/jsx/deno-jsx.jsonc
new file mode 100644
index 000000000..311409ea3
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_no_pragma/jsx/deno-jsx.jsonc
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "react-jsx",
+ "jsxImportSource": "http://localhost:4545/jsx"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_no_pragma/jsx/deno-jsxdev-import-map.jsonc b/tests/specs/run/jsx_import_source_no_pragma/jsx/deno-jsxdev-import-map.jsonc
new file mode 100644
index 000000000..7481d5a2d
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_no_pragma/jsx/deno-jsxdev-import-map.jsonc
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "react-jsxdev",
+ "jsxImportSource": "jsx"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_no_pragma/jsx/deno-jsxdev.jsonc b/tests/specs/run/jsx_import_source_no_pragma/jsx/deno-jsxdev.jsonc
new file mode 100644
index 000000000..ae5bdf9f1
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_no_pragma/jsx/deno-jsxdev.jsonc
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "react-jsxdev",
+ "jsxImportSource": "http://localhost:4545/jsx"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_no_pragma/jsx/deno.lock b/tests/specs/run/jsx_import_source_no_pragma/jsx/deno.lock
new file mode 100644
index 000000000..011e8fe10
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_no_pragma/jsx/deno.lock
@@ -0,0 +1,6 @@
+{
+ "version": "2",
+ "remote": {
+ "http://localhost:4545/jsx/jsx-dev-runtime/index.ts": "183c5bf1cfb82b15fc1e8cca15593d4816035759532d851abd4476df378c8412"
+ }
+} \ No newline at end of file
diff --git a/tests/specs/run/jsx_import_source_no_pragma/jsx/import-map-scoped.json b/tests/specs/run/jsx_import_source_no_pragma/jsx/import-map-scoped.json
new file mode 100644
index 000000000..9b2005128
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_no_pragma/jsx/import-map-scoped.json
@@ -0,0 +1,8 @@
+{
+ "scopes": {
+ "../subdir/": {
+ "jsx/jsx-runtime": "http://localhost:4545/jsx/jsx-runtime/index.ts",
+ "jsx/jsx-dev-runtime": "http://localhost:4545/jsx/jsx-dev-runtime/index.ts"
+ }
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_no_pragma/jsx/import-map.json b/tests/specs/run/jsx_import_source_no_pragma/jsx/import-map.json
new file mode 100644
index 000000000..1bfa04e2f
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_no_pragma/jsx/import-map.json
@@ -0,0 +1,7 @@
+{
+ "imports": {
+ "jsx/jsx-runtime": "http://localhost:4545/jsx/jsx-runtime/index.ts",
+ "jsx/jsx-dev-runtime": "http://localhost:4545/jsx/jsx-dev-runtime/index.ts",
+ "jsx-precompile/jsx-runtime": "http://localhost:4545/jsx/jsx-precompile/index.ts"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_no_pragma/jsx/jsx-dev-runtime/index.ts b/tests/specs/run/jsx_import_source_no_pragma/jsx/jsx-dev-runtime/index.ts
new file mode 100644
index 000000000..15e2029c8
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_no_pragma/jsx/jsx-dev-runtime/index.ts
@@ -0,0 +1,12 @@
+// deno-lint-ignore-file no-explicit-any
+export function jsx(
+ _type: any,
+ _props: any,
+ _key: any,
+ _source: any,
+ _self: any,
+) {}
+export const jsxs = jsx;
+export const jsxDEV = jsx;
+export const Fragment = Symbol("Fragment");
+console.log("imported", import.meta.url);
diff --git a/tests/specs/run/jsx_import_source_no_pragma/jsx/jsx-precompile/index.ts b/tests/specs/run/jsx_import_source_no_pragma/jsx/jsx-precompile/index.ts
new file mode 100644
index 000000000..0d56095e0
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_no_pragma/jsx/jsx-precompile/index.ts
@@ -0,0 +1,23 @@
+// deno-lint-ignore-file no-explicit-any
+export function jsx(
+ _type: any,
+ _props: any,
+ _key: any,
+ _source: any,
+ _self: any,
+) {}
+// deno-lint-ignore-file no-explicit-any
+export const jsxAttr = (name: string, value: any) => `${name}="${value}"`;
+// deno-lint-ignore-file no-explicit-any
+export const jsxTemplate = (_template: string[], ..._exprs: any[]) => "";
+// deno-lint-ignore-file no-explicit-any
+export const jsxEscape = (_value: any) => "";
+console.log("imported", import.meta.url);
+
+declare global {
+ namespace JSX {
+ interface IntrinsicElements {
+ [tagName: string]: Record<string, any>;
+ }
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_no_pragma/jsx/jsx-runtime/index.ts b/tests/specs/run/jsx_import_source_no_pragma/jsx/jsx-runtime/index.ts
new file mode 100644
index 000000000..15e2029c8
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_no_pragma/jsx/jsx-runtime/index.ts
@@ -0,0 +1,12 @@
+// deno-lint-ignore-file no-explicit-any
+export function jsx(
+ _type: any,
+ _props: any,
+ _key: any,
+ _source: any,
+ _self: any,
+) {}
+export const jsxs = jsx;
+export const jsxDEV = jsx;
+export const Fragment = Symbol("Fragment");
+console.log("imported", import.meta.url);
diff --git a/tests/specs/run/jsx_import_source_no_pragma/jsx_import_source.out b/tests/specs/run/jsx_import_source_no_pragma/jsx_import_source.out
new file mode 100644
index 000000000..b9555987a
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_no_pragma/jsx_import_source.out
@@ -0,0 +1,2 @@
+[WILDCARD]
+imported http://localhost:4545/jsx/jsx-runtime
diff --git a/tests/specs/run/jsx_import_source_no_pragma/jsx_import_source_no_pragma.tsx b/tests/specs/run/jsx_import_source_no_pragma/jsx_import_source_no_pragma.tsx
new file mode 100644
index 000000000..2c756054f
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_no_pragma/jsx_import_source_no_pragma.tsx
@@ -0,0 +1,7 @@
+function A() {
+ return "hello";
+}
+
+export function B() {
+ return <A></A>;
+}
diff --git a/tests/specs/run/jsx_import_source_no_pragma_dev/__test__.jsonc b/tests/specs/run/jsx_import_source_no_pragma_dev/__test__.jsonc
new file mode 100644
index 000000000..8f9ee81f6
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_no_pragma_dev/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --allow-import --reload --config jsx/deno-jsxdev.jsonc --no-lock jsx_import_source_no_pragma.tsx",
+ "output": "jsx_import_source_dev.out"
+}
diff --git a/tests/specs/run/jsx_import_source_no_pragma_dev/jsx/deno-jsx-error.jsonc b/tests/specs/run/jsx_import_source_no_pragma_dev/jsx/deno-jsx-error.jsonc
new file mode 100644
index 000000000..37cb4dd91
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_no_pragma_dev/jsx/deno-jsx-error.jsonc
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "react-jsx",
+ "jsxImportSource": "./nonexistent"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_no_pragma_dev/jsx/deno-jsx-import-map.jsonc b/tests/specs/run/jsx_import_source_no_pragma_dev/jsx/deno-jsx-import-map.jsonc
new file mode 100644
index 000000000..5adbfa8b5
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_no_pragma_dev/jsx/deno-jsx-import-map.jsonc
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "react-jsx",
+ "jsxImportSource": "jsx"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_no_pragma_dev/jsx/deno-jsx-precompile-skip.jsonc b/tests/specs/run/jsx_import_source_no_pragma_dev/jsx/deno-jsx-precompile-skip.jsonc
new file mode 100644
index 000000000..3c9e4fa1f
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_no_pragma_dev/jsx/deno-jsx-precompile-skip.jsonc
@@ -0,0 +1,7 @@
+{
+ "compilerOptions": {
+ "jsx": "precompile",
+ "jsxImportSource": "jsx-precompile",
+ "jsxPrecompileSkipElements": ["a", "img"]
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_no_pragma_dev/jsx/deno-jsx-precompile.jsonc b/tests/specs/run/jsx_import_source_no_pragma_dev/jsx/deno-jsx-precompile.jsonc
new file mode 100644
index 000000000..95ae1b9f3
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_no_pragma_dev/jsx/deno-jsx-precompile.jsonc
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "precompile",
+ "jsxImportSource": "jsx-precompile"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_no_pragma_dev/jsx/deno-jsx.json b/tests/specs/run/jsx_import_source_no_pragma_dev/jsx/deno-jsx.json
new file mode 100644
index 000000000..311409ea3
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_no_pragma_dev/jsx/deno-jsx.json
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "react-jsx",
+ "jsxImportSource": "http://localhost:4545/jsx"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_no_pragma_dev/jsx/deno-jsx.jsonc b/tests/specs/run/jsx_import_source_no_pragma_dev/jsx/deno-jsx.jsonc
new file mode 100644
index 000000000..311409ea3
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_no_pragma_dev/jsx/deno-jsx.jsonc
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "react-jsx",
+ "jsxImportSource": "http://localhost:4545/jsx"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_no_pragma_dev/jsx/deno-jsxdev-import-map.jsonc b/tests/specs/run/jsx_import_source_no_pragma_dev/jsx/deno-jsxdev-import-map.jsonc
new file mode 100644
index 000000000..7481d5a2d
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_no_pragma_dev/jsx/deno-jsxdev-import-map.jsonc
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "react-jsxdev",
+ "jsxImportSource": "jsx"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_no_pragma_dev/jsx/deno-jsxdev.jsonc b/tests/specs/run/jsx_import_source_no_pragma_dev/jsx/deno-jsxdev.jsonc
new file mode 100644
index 000000000..ae5bdf9f1
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_no_pragma_dev/jsx/deno-jsxdev.jsonc
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "react-jsxdev",
+ "jsxImportSource": "http://localhost:4545/jsx"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_no_pragma_dev/jsx/deno.lock b/tests/specs/run/jsx_import_source_no_pragma_dev/jsx/deno.lock
new file mode 100644
index 000000000..011e8fe10
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_no_pragma_dev/jsx/deno.lock
@@ -0,0 +1,6 @@
+{
+ "version": "2",
+ "remote": {
+ "http://localhost:4545/jsx/jsx-dev-runtime/index.ts": "183c5bf1cfb82b15fc1e8cca15593d4816035759532d851abd4476df378c8412"
+ }
+} \ No newline at end of file
diff --git a/tests/specs/run/jsx_import_source_no_pragma_dev/jsx/import-map-scoped.json b/tests/specs/run/jsx_import_source_no_pragma_dev/jsx/import-map-scoped.json
new file mode 100644
index 000000000..9b2005128
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_no_pragma_dev/jsx/import-map-scoped.json
@@ -0,0 +1,8 @@
+{
+ "scopes": {
+ "../subdir/": {
+ "jsx/jsx-runtime": "http://localhost:4545/jsx/jsx-runtime/index.ts",
+ "jsx/jsx-dev-runtime": "http://localhost:4545/jsx/jsx-dev-runtime/index.ts"
+ }
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_no_pragma_dev/jsx/import-map.json b/tests/specs/run/jsx_import_source_no_pragma_dev/jsx/import-map.json
new file mode 100644
index 000000000..1bfa04e2f
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_no_pragma_dev/jsx/import-map.json
@@ -0,0 +1,7 @@
+{
+ "imports": {
+ "jsx/jsx-runtime": "http://localhost:4545/jsx/jsx-runtime/index.ts",
+ "jsx/jsx-dev-runtime": "http://localhost:4545/jsx/jsx-dev-runtime/index.ts",
+ "jsx-precompile/jsx-runtime": "http://localhost:4545/jsx/jsx-precompile/index.ts"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_no_pragma_dev/jsx/jsx-dev-runtime/index.ts b/tests/specs/run/jsx_import_source_no_pragma_dev/jsx/jsx-dev-runtime/index.ts
new file mode 100644
index 000000000..15e2029c8
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_no_pragma_dev/jsx/jsx-dev-runtime/index.ts
@@ -0,0 +1,12 @@
+// deno-lint-ignore-file no-explicit-any
+export function jsx(
+ _type: any,
+ _props: any,
+ _key: any,
+ _source: any,
+ _self: any,
+) {}
+export const jsxs = jsx;
+export const jsxDEV = jsx;
+export const Fragment = Symbol("Fragment");
+console.log("imported", import.meta.url);
diff --git a/tests/specs/run/jsx_import_source_no_pragma_dev/jsx/jsx-precompile/index.ts b/tests/specs/run/jsx_import_source_no_pragma_dev/jsx/jsx-precompile/index.ts
new file mode 100644
index 000000000..0d56095e0
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_no_pragma_dev/jsx/jsx-precompile/index.ts
@@ -0,0 +1,23 @@
+// deno-lint-ignore-file no-explicit-any
+export function jsx(
+ _type: any,
+ _props: any,
+ _key: any,
+ _source: any,
+ _self: any,
+) {}
+// deno-lint-ignore-file no-explicit-any
+export const jsxAttr = (name: string, value: any) => `${name}="${value}"`;
+// deno-lint-ignore-file no-explicit-any
+export const jsxTemplate = (_template: string[], ..._exprs: any[]) => "";
+// deno-lint-ignore-file no-explicit-any
+export const jsxEscape = (_value: any) => "";
+console.log("imported", import.meta.url);
+
+declare global {
+ namespace JSX {
+ interface IntrinsicElements {
+ [tagName: string]: Record<string, any>;
+ }
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_no_pragma_dev/jsx/jsx-runtime/index.ts b/tests/specs/run/jsx_import_source_no_pragma_dev/jsx/jsx-runtime/index.ts
new file mode 100644
index 000000000..15e2029c8
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_no_pragma_dev/jsx/jsx-runtime/index.ts
@@ -0,0 +1,12 @@
+// deno-lint-ignore-file no-explicit-any
+export function jsx(
+ _type: any,
+ _props: any,
+ _key: any,
+ _source: any,
+ _self: any,
+) {}
+export const jsxs = jsx;
+export const jsxDEV = jsx;
+export const Fragment = Symbol("Fragment");
+console.log("imported", import.meta.url);
diff --git a/tests/specs/run/jsx_import_source_no_pragma_dev/jsx_import_source_dev.out b/tests/specs/run/jsx_import_source_no_pragma_dev/jsx_import_source_dev.out
new file mode 100644
index 000000000..38d7a12f0
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_no_pragma_dev/jsx_import_source_dev.out
@@ -0,0 +1,2 @@
+[WILDCARD]
+imported http://localhost:4545/jsx/jsx-dev-runtime
diff --git a/tests/specs/run/jsx_import_source_no_pragma_dev/jsx_import_source_no_pragma.tsx b/tests/specs/run/jsx_import_source_no_pragma_dev/jsx_import_source_no_pragma.tsx
new file mode 100644
index 000000000..2c756054f
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_no_pragma_dev/jsx_import_source_no_pragma.tsx
@@ -0,0 +1,7 @@
+function A() {
+ return "hello";
+}
+
+export function B() {
+ return <A></A>;
+}
diff --git a/tests/specs/run/jsx_import_source_no_pragma_no_check/__test__.jsonc b/tests/specs/run/jsx_import_source_no_pragma_no_check/__test__.jsonc
new file mode 100644
index 000000000..12cc9b076
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_no_pragma_no_check/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --allow-import --reload --config jsx/deno-jsx.jsonc --no-lock --no-check jsx_import_source_no_pragma.tsx",
+ "output": "jsx_import_source.out"
+}
diff --git a/tests/specs/run/jsx_import_source_no_pragma_no_check/jsx/deno-jsx-error.jsonc b/tests/specs/run/jsx_import_source_no_pragma_no_check/jsx/deno-jsx-error.jsonc
new file mode 100644
index 000000000..37cb4dd91
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_no_pragma_no_check/jsx/deno-jsx-error.jsonc
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "react-jsx",
+ "jsxImportSource": "./nonexistent"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_no_pragma_no_check/jsx/deno-jsx-import-map.jsonc b/tests/specs/run/jsx_import_source_no_pragma_no_check/jsx/deno-jsx-import-map.jsonc
new file mode 100644
index 000000000..5adbfa8b5
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_no_pragma_no_check/jsx/deno-jsx-import-map.jsonc
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "react-jsx",
+ "jsxImportSource": "jsx"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_no_pragma_no_check/jsx/deno-jsx-precompile-skip.jsonc b/tests/specs/run/jsx_import_source_no_pragma_no_check/jsx/deno-jsx-precompile-skip.jsonc
new file mode 100644
index 000000000..3c9e4fa1f
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_no_pragma_no_check/jsx/deno-jsx-precompile-skip.jsonc
@@ -0,0 +1,7 @@
+{
+ "compilerOptions": {
+ "jsx": "precompile",
+ "jsxImportSource": "jsx-precompile",
+ "jsxPrecompileSkipElements": ["a", "img"]
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_no_pragma_no_check/jsx/deno-jsx-precompile.jsonc b/tests/specs/run/jsx_import_source_no_pragma_no_check/jsx/deno-jsx-precompile.jsonc
new file mode 100644
index 000000000..95ae1b9f3
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_no_pragma_no_check/jsx/deno-jsx-precompile.jsonc
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "precompile",
+ "jsxImportSource": "jsx-precompile"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_no_pragma_no_check/jsx/deno-jsx.json b/tests/specs/run/jsx_import_source_no_pragma_no_check/jsx/deno-jsx.json
new file mode 100644
index 000000000..311409ea3
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_no_pragma_no_check/jsx/deno-jsx.json
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "react-jsx",
+ "jsxImportSource": "http://localhost:4545/jsx"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_no_pragma_no_check/jsx/deno-jsx.jsonc b/tests/specs/run/jsx_import_source_no_pragma_no_check/jsx/deno-jsx.jsonc
new file mode 100644
index 000000000..311409ea3
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_no_pragma_no_check/jsx/deno-jsx.jsonc
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "react-jsx",
+ "jsxImportSource": "http://localhost:4545/jsx"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_no_pragma_no_check/jsx/deno-jsxdev-import-map.jsonc b/tests/specs/run/jsx_import_source_no_pragma_no_check/jsx/deno-jsxdev-import-map.jsonc
new file mode 100644
index 000000000..7481d5a2d
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_no_pragma_no_check/jsx/deno-jsxdev-import-map.jsonc
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "react-jsxdev",
+ "jsxImportSource": "jsx"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_no_pragma_no_check/jsx/deno-jsxdev.jsonc b/tests/specs/run/jsx_import_source_no_pragma_no_check/jsx/deno-jsxdev.jsonc
new file mode 100644
index 000000000..ae5bdf9f1
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_no_pragma_no_check/jsx/deno-jsxdev.jsonc
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "react-jsxdev",
+ "jsxImportSource": "http://localhost:4545/jsx"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_no_pragma_no_check/jsx/deno.lock b/tests/specs/run/jsx_import_source_no_pragma_no_check/jsx/deno.lock
new file mode 100644
index 000000000..011e8fe10
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_no_pragma_no_check/jsx/deno.lock
@@ -0,0 +1,6 @@
+{
+ "version": "2",
+ "remote": {
+ "http://localhost:4545/jsx/jsx-dev-runtime/index.ts": "183c5bf1cfb82b15fc1e8cca15593d4816035759532d851abd4476df378c8412"
+ }
+} \ No newline at end of file
diff --git a/tests/specs/run/jsx_import_source_no_pragma_no_check/jsx/import-map-scoped.json b/tests/specs/run/jsx_import_source_no_pragma_no_check/jsx/import-map-scoped.json
new file mode 100644
index 000000000..9b2005128
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_no_pragma_no_check/jsx/import-map-scoped.json
@@ -0,0 +1,8 @@
+{
+ "scopes": {
+ "../subdir/": {
+ "jsx/jsx-runtime": "http://localhost:4545/jsx/jsx-runtime/index.ts",
+ "jsx/jsx-dev-runtime": "http://localhost:4545/jsx/jsx-dev-runtime/index.ts"
+ }
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_no_pragma_no_check/jsx/import-map.json b/tests/specs/run/jsx_import_source_no_pragma_no_check/jsx/import-map.json
new file mode 100644
index 000000000..1bfa04e2f
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_no_pragma_no_check/jsx/import-map.json
@@ -0,0 +1,7 @@
+{
+ "imports": {
+ "jsx/jsx-runtime": "http://localhost:4545/jsx/jsx-runtime/index.ts",
+ "jsx/jsx-dev-runtime": "http://localhost:4545/jsx/jsx-dev-runtime/index.ts",
+ "jsx-precompile/jsx-runtime": "http://localhost:4545/jsx/jsx-precompile/index.ts"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_no_pragma_no_check/jsx/jsx-dev-runtime/index.ts b/tests/specs/run/jsx_import_source_no_pragma_no_check/jsx/jsx-dev-runtime/index.ts
new file mode 100644
index 000000000..15e2029c8
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_no_pragma_no_check/jsx/jsx-dev-runtime/index.ts
@@ -0,0 +1,12 @@
+// deno-lint-ignore-file no-explicit-any
+export function jsx(
+ _type: any,
+ _props: any,
+ _key: any,
+ _source: any,
+ _self: any,
+) {}
+export const jsxs = jsx;
+export const jsxDEV = jsx;
+export const Fragment = Symbol("Fragment");
+console.log("imported", import.meta.url);
diff --git a/tests/specs/run/jsx_import_source_no_pragma_no_check/jsx/jsx-precompile/index.ts b/tests/specs/run/jsx_import_source_no_pragma_no_check/jsx/jsx-precompile/index.ts
new file mode 100644
index 000000000..0d56095e0
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_no_pragma_no_check/jsx/jsx-precompile/index.ts
@@ -0,0 +1,23 @@
+// deno-lint-ignore-file no-explicit-any
+export function jsx(
+ _type: any,
+ _props: any,
+ _key: any,
+ _source: any,
+ _self: any,
+) {}
+// deno-lint-ignore-file no-explicit-any
+export const jsxAttr = (name: string, value: any) => `${name}="${value}"`;
+// deno-lint-ignore-file no-explicit-any
+export const jsxTemplate = (_template: string[], ..._exprs: any[]) => "";
+// deno-lint-ignore-file no-explicit-any
+export const jsxEscape = (_value: any) => "";
+console.log("imported", import.meta.url);
+
+declare global {
+ namespace JSX {
+ interface IntrinsicElements {
+ [tagName: string]: Record<string, any>;
+ }
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_no_pragma_no_check/jsx/jsx-runtime/index.ts b/tests/specs/run/jsx_import_source_no_pragma_no_check/jsx/jsx-runtime/index.ts
new file mode 100644
index 000000000..15e2029c8
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_no_pragma_no_check/jsx/jsx-runtime/index.ts
@@ -0,0 +1,12 @@
+// deno-lint-ignore-file no-explicit-any
+export function jsx(
+ _type: any,
+ _props: any,
+ _key: any,
+ _source: any,
+ _self: any,
+) {}
+export const jsxs = jsx;
+export const jsxDEV = jsx;
+export const Fragment = Symbol("Fragment");
+console.log("imported", import.meta.url);
diff --git a/tests/specs/run/jsx_import_source_no_pragma_no_check/jsx_import_source.out b/tests/specs/run/jsx_import_source_no_pragma_no_check/jsx_import_source.out
new file mode 100644
index 000000000..b9555987a
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_no_pragma_no_check/jsx_import_source.out
@@ -0,0 +1,2 @@
+[WILDCARD]
+imported http://localhost:4545/jsx/jsx-runtime
diff --git a/tests/specs/run/jsx_import_source_no_pragma_no_check/jsx_import_source_no_pragma.tsx b/tests/specs/run/jsx_import_source_no_pragma_no_check/jsx_import_source_no_pragma.tsx
new file mode 100644
index 000000000..2c756054f
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_no_pragma_no_check/jsx_import_source_no_pragma.tsx
@@ -0,0 +1,7 @@
+function A() {
+ return "hello";
+}
+
+export function B() {
+ return <A></A>;
+}
diff --git a/tests/specs/run/jsx_import_source_pragma/__test__.jsonc b/tests/specs/run/jsx_import_source_pragma/__test__.jsonc
new file mode 100644
index 000000000..9d704c065
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --reload --allow-import jsx_import_source_pragma.tsx",
+ "output": "jsx_import_source.out"
+}
diff --git a/tests/specs/run/jsx_import_source_pragma/jsx/deno-jsx-error.jsonc b/tests/specs/run/jsx_import_source_pragma/jsx/deno-jsx-error.jsonc
new file mode 100644
index 000000000..37cb4dd91
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma/jsx/deno-jsx-error.jsonc
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "react-jsx",
+ "jsxImportSource": "./nonexistent"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_pragma/jsx/deno-jsx-import-map.jsonc b/tests/specs/run/jsx_import_source_pragma/jsx/deno-jsx-import-map.jsonc
new file mode 100644
index 000000000..5adbfa8b5
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma/jsx/deno-jsx-import-map.jsonc
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "react-jsx",
+ "jsxImportSource": "jsx"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_pragma/jsx/deno-jsx-precompile-skip.jsonc b/tests/specs/run/jsx_import_source_pragma/jsx/deno-jsx-precompile-skip.jsonc
new file mode 100644
index 000000000..3c9e4fa1f
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma/jsx/deno-jsx-precompile-skip.jsonc
@@ -0,0 +1,7 @@
+{
+ "compilerOptions": {
+ "jsx": "precompile",
+ "jsxImportSource": "jsx-precompile",
+ "jsxPrecompileSkipElements": ["a", "img"]
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_pragma/jsx/deno-jsx-precompile.jsonc b/tests/specs/run/jsx_import_source_pragma/jsx/deno-jsx-precompile.jsonc
new file mode 100644
index 000000000..95ae1b9f3
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma/jsx/deno-jsx-precompile.jsonc
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "precompile",
+ "jsxImportSource": "jsx-precompile"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_pragma/jsx/deno-jsx.json b/tests/specs/run/jsx_import_source_pragma/jsx/deno-jsx.json
new file mode 100644
index 000000000..311409ea3
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma/jsx/deno-jsx.json
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "react-jsx",
+ "jsxImportSource": "http://localhost:4545/jsx"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_pragma/jsx/deno-jsx.jsonc b/tests/specs/run/jsx_import_source_pragma/jsx/deno-jsx.jsonc
new file mode 100644
index 000000000..311409ea3
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma/jsx/deno-jsx.jsonc
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "react-jsx",
+ "jsxImportSource": "http://localhost:4545/jsx"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_pragma/jsx/deno-jsxdev-import-map.jsonc b/tests/specs/run/jsx_import_source_pragma/jsx/deno-jsxdev-import-map.jsonc
new file mode 100644
index 000000000..7481d5a2d
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma/jsx/deno-jsxdev-import-map.jsonc
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "react-jsxdev",
+ "jsxImportSource": "jsx"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_pragma/jsx/deno-jsxdev.jsonc b/tests/specs/run/jsx_import_source_pragma/jsx/deno-jsxdev.jsonc
new file mode 100644
index 000000000..ae5bdf9f1
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma/jsx/deno-jsxdev.jsonc
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "react-jsxdev",
+ "jsxImportSource": "http://localhost:4545/jsx"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_pragma/jsx/deno.lock b/tests/specs/run/jsx_import_source_pragma/jsx/deno.lock
new file mode 100644
index 000000000..011e8fe10
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma/jsx/deno.lock
@@ -0,0 +1,6 @@
+{
+ "version": "2",
+ "remote": {
+ "http://localhost:4545/jsx/jsx-dev-runtime/index.ts": "183c5bf1cfb82b15fc1e8cca15593d4816035759532d851abd4476df378c8412"
+ }
+} \ No newline at end of file
diff --git a/tests/specs/run/jsx_import_source_pragma/jsx/import-map-scoped.json b/tests/specs/run/jsx_import_source_pragma/jsx/import-map-scoped.json
new file mode 100644
index 000000000..9b2005128
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma/jsx/import-map-scoped.json
@@ -0,0 +1,8 @@
+{
+ "scopes": {
+ "../subdir/": {
+ "jsx/jsx-runtime": "http://localhost:4545/jsx/jsx-runtime/index.ts",
+ "jsx/jsx-dev-runtime": "http://localhost:4545/jsx/jsx-dev-runtime/index.ts"
+ }
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_pragma/jsx/import-map.json b/tests/specs/run/jsx_import_source_pragma/jsx/import-map.json
new file mode 100644
index 000000000..1bfa04e2f
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma/jsx/import-map.json
@@ -0,0 +1,7 @@
+{
+ "imports": {
+ "jsx/jsx-runtime": "http://localhost:4545/jsx/jsx-runtime/index.ts",
+ "jsx/jsx-dev-runtime": "http://localhost:4545/jsx/jsx-dev-runtime/index.ts",
+ "jsx-precompile/jsx-runtime": "http://localhost:4545/jsx/jsx-precompile/index.ts"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_pragma/jsx/jsx-dev-runtime/index.ts b/tests/specs/run/jsx_import_source_pragma/jsx/jsx-dev-runtime/index.ts
new file mode 100644
index 000000000..15e2029c8
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma/jsx/jsx-dev-runtime/index.ts
@@ -0,0 +1,12 @@
+// deno-lint-ignore-file no-explicit-any
+export function jsx(
+ _type: any,
+ _props: any,
+ _key: any,
+ _source: any,
+ _self: any,
+) {}
+export const jsxs = jsx;
+export const jsxDEV = jsx;
+export const Fragment = Symbol("Fragment");
+console.log("imported", import.meta.url);
diff --git a/tests/specs/run/jsx_import_source_pragma/jsx/jsx-precompile/index.ts b/tests/specs/run/jsx_import_source_pragma/jsx/jsx-precompile/index.ts
new file mode 100644
index 000000000..0d56095e0
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma/jsx/jsx-precompile/index.ts
@@ -0,0 +1,23 @@
+// deno-lint-ignore-file no-explicit-any
+export function jsx(
+ _type: any,
+ _props: any,
+ _key: any,
+ _source: any,
+ _self: any,
+) {}
+// deno-lint-ignore-file no-explicit-any
+export const jsxAttr = (name: string, value: any) => `${name}="${value}"`;
+// deno-lint-ignore-file no-explicit-any
+export const jsxTemplate = (_template: string[], ..._exprs: any[]) => "";
+// deno-lint-ignore-file no-explicit-any
+export const jsxEscape = (_value: any) => "";
+console.log("imported", import.meta.url);
+
+declare global {
+ namespace JSX {
+ interface IntrinsicElements {
+ [tagName: string]: Record<string, any>;
+ }
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_pragma/jsx/jsx-runtime/index.ts b/tests/specs/run/jsx_import_source_pragma/jsx/jsx-runtime/index.ts
new file mode 100644
index 000000000..15e2029c8
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma/jsx/jsx-runtime/index.ts
@@ -0,0 +1,12 @@
+// deno-lint-ignore-file no-explicit-any
+export function jsx(
+ _type: any,
+ _props: any,
+ _key: any,
+ _source: any,
+ _self: any,
+) {}
+export const jsxs = jsx;
+export const jsxDEV = jsx;
+export const Fragment = Symbol("Fragment");
+console.log("imported", import.meta.url);
diff --git a/tests/specs/run/jsx_import_source_pragma/jsx_import_source.out b/tests/specs/run/jsx_import_source_pragma/jsx_import_source.out
new file mode 100644
index 000000000..b9555987a
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma/jsx_import_source.out
@@ -0,0 +1,2 @@
+[WILDCARD]
+imported http://localhost:4545/jsx/jsx-runtime
diff --git a/tests/specs/run/jsx_import_source_pragma/jsx_import_source_pragma.tsx b/tests/specs/run/jsx_import_source_pragma/jsx_import_source_pragma.tsx
new file mode 100644
index 000000000..c19e53d4f
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma/jsx_import_source_pragma.tsx
@@ -0,0 +1,9 @@
+/** @jsxImportSource http://localhost:4545/jsx */
+
+function A() {
+ return "hello";
+}
+
+export function B() {
+ return <A></A>;
+}
diff --git a/tests/specs/run/jsx_import_source_pragma_import_map/__test__.jsonc b/tests/specs/run/jsx_import_source_pragma_import_map/__test__.jsonc
new file mode 100644
index 000000000..9eafe5196
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_import_map/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --allow-import --reload --import-map jsx/import-map.json jsx_import_source_pragma_import_map.tsx",
+ "output": "jsx_import_source_import_map.out"
+}
diff --git a/tests/specs/run/jsx_import_source_pragma_import_map/jsx/deno-jsx-error.jsonc b/tests/specs/run/jsx_import_source_pragma_import_map/jsx/deno-jsx-error.jsonc
new file mode 100644
index 000000000..37cb4dd91
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_import_map/jsx/deno-jsx-error.jsonc
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "react-jsx",
+ "jsxImportSource": "./nonexistent"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_pragma_import_map/jsx/deno-jsx-import-map.jsonc b/tests/specs/run/jsx_import_source_pragma_import_map/jsx/deno-jsx-import-map.jsonc
new file mode 100644
index 000000000..5adbfa8b5
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_import_map/jsx/deno-jsx-import-map.jsonc
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "react-jsx",
+ "jsxImportSource": "jsx"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_pragma_import_map/jsx/deno-jsx-precompile-skip.jsonc b/tests/specs/run/jsx_import_source_pragma_import_map/jsx/deno-jsx-precompile-skip.jsonc
new file mode 100644
index 000000000..3c9e4fa1f
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_import_map/jsx/deno-jsx-precompile-skip.jsonc
@@ -0,0 +1,7 @@
+{
+ "compilerOptions": {
+ "jsx": "precompile",
+ "jsxImportSource": "jsx-precompile",
+ "jsxPrecompileSkipElements": ["a", "img"]
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_pragma_import_map/jsx/deno-jsx-precompile.jsonc b/tests/specs/run/jsx_import_source_pragma_import_map/jsx/deno-jsx-precompile.jsonc
new file mode 100644
index 000000000..95ae1b9f3
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_import_map/jsx/deno-jsx-precompile.jsonc
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "precompile",
+ "jsxImportSource": "jsx-precompile"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_pragma_import_map/jsx/deno-jsx.json b/tests/specs/run/jsx_import_source_pragma_import_map/jsx/deno-jsx.json
new file mode 100644
index 000000000..311409ea3
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_import_map/jsx/deno-jsx.json
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "react-jsx",
+ "jsxImportSource": "http://localhost:4545/jsx"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_pragma_import_map/jsx/deno-jsx.jsonc b/tests/specs/run/jsx_import_source_pragma_import_map/jsx/deno-jsx.jsonc
new file mode 100644
index 000000000..311409ea3
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_import_map/jsx/deno-jsx.jsonc
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "react-jsx",
+ "jsxImportSource": "http://localhost:4545/jsx"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_pragma_import_map/jsx/deno-jsxdev-import-map.jsonc b/tests/specs/run/jsx_import_source_pragma_import_map/jsx/deno-jsxdev-import-map.jsonc
new file mode 100644
index 000000000..7481d5a2d
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_import_map/jsx/deno-jsxdev-import-map.jsonc
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "react-jsxdev",
+ "jsxImportSource": "jsx"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_pragma_import_map/jsx/deno-jsxdev.jsonc b/tests/specs/run/jsx_import_source_pragma_import_map/jsx/deno-jsxdev.jsonc
new file mode 100644
index 000000000..ae5bdf9f1
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_import_map/jsx/deno-jsxdev.jsonc
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "react-jsxdev",
+ "jsxImportSource": "http://localhost:4545/jsx"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_pragma_import_map/jsx/deno.lock b/tests/specs/run/jsx_import_source_pragma_import_map/jsx/deno.lock
new file mode 100644
index 000000000..011e8fe10
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_import_map/jsx/deno.lock
@@ -0,0 +1,6 @@
+{
+ "version": "2",
+ "remote": {
+ "http://localhost:4545/jsx/jsx-dev-runtime/index.ts": "183c5bf1cfb82b15fc1e8cca15593d4816035759532d851abd4476df378c8412"
+ }
+} \ No newline at end of file
diff --git a/tests/specs/run/jsx_import_source_pragma_import_map/jsx/import-map-scoped.json b/tests/specs/run/jsx_import_source_pragma_import_map/jsx/import-map-scoped.json
new file mode 100644
index 000000000..9b2005128
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_import_map/jsx/import-map-scoped.json
@@ -0,0 +1,8 @@
+{
+ "scopes": {
+ "../subdir/": {
+ "jsx/jsx-runtime": "http://localhost:4545/jsx/jsx-runtime/index.ts",
+ "jsx/jsx-dev-runtime": "http://localhost:4545/jsx/jsx-dev-runtime/index.ts"
+ }
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_pragma_import_map/jsx/import-map.json b/tests/specs/run/jsx_import_source_pragma_import_map/jsx/import-map.json
new file mode 100644
index 000000000..1bfa04e2f
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_import_map/jsx/import-map.json
@@ -0,0 +1,7 @@
+{
+ "imports": {
+ "jsx/jsx-runtime": "http://localhost:4545/jsx/jsx-runtime/index.ts",
+ "jsx/jsx-dev-runtime": "http://localhost:4545/jsx/jsx-dev-runtime/index.ts",
+ "jsx-precompile/jsx-runtime": "http://localhost:4545/jsx/jsx-precompile/index.ts"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_pragma_import_map/jsx/jsx-dev-runtime/index.ts b/tests/specs/run/jsx_import_source_pragma_import_map/jsx/jsx-dev-runtime/index.ts
new file mode 100644
index 000000000..15e2029c8
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_import_map/jsx/jsx-dev-runtime/index.ts
@@ -0,0 +1,12 @@
+// deno-lint-ignore-file no-explicit-any
+export function jsx(
+ _type: any,
+ _props: any,
+ _key: any,
+ _source: any,
+ _self: any,
+) {}
+export const jsxs = jsx;
+export const jsxDEV = jsx;
+export const Fragment = Symbol("Fragment");
+console.log("imported", import.meta.url);
diff --git a/tests/specs/run/jsx_import_source_pragma_import_map/jsx/jsx-precompile/index.ts b/tests/specs/run/jsx_import_source_pragma_import_map/jsx/jsx-precompile/index.ts
new file mode 100644
index 000000000..0d56095e0
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_import_map/jsx/jsx-precompile/index.ts
@@ -0,0 +1,23 @@
+// deno-lint-ignore-file no-explicit-any
+export function jsx(
+ _type: any,
+ _props: any,
+ _key: any,
+ _source: any,
+ _self: any,
+) {}
+// deno-lint-ignore-file no-explicit-any
+export const jsxAttr = (name: string, value: any) => `${name}="${value}"`;
+// deno-lint-ignore-file no-explicit-any
+export const jsxTemplate = (_template: string[], ..._exprs: any[]) => "";
+// deno-lint-ignore-file no-explicit-any
+export const jsxEscape = (_value: any) => "";
+console.log("imported", import.meta.url);
+
+declare global {
+ namespace JSX {
+ interface IntrinsicElements {
+ [tagName: string]: Record<string, any>;
+ }
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_pragma_import_map/jsx/jsx-runtime/index.ts b/tests/specs/run/jsx_import_source_pragma_import_map/jsx/jsx-runtime/index.ts
new file mode 100644
index 000000000..15e2029c8
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_import_map/jsx/jsx-runtime/index.ts
@@ -0,0 +1,12 @@
+// deno-lint-ignore-file no-explicit-any
+export function jsx(
+ _type: any,
+ _props: any,
+ _key: any,
+ _source: any,
+ _self: any,
+) {}
+export const jsxs = jsx;
+export const jsxDEV = jsx;
+export const Fragment = Symbol("Fragment");
+console.log("imported", import.meta.url);
diff --git a/tests/specs/run/jsx_import_source_pragma_import_map/jsx_import_source_import_map.out b/tests/specs/run/jsx_import_source_pragma_import_map/jsx_import_source_import_map.out
new file mode 100644
index 000000000..0d3238967
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_import_map/jsx_import_source_import_map.out
@@ -0,0 +1,2 @@
+[WILDCARD]
+imported http://localhost:4545/jsx/jsx-runtime/index.ts
diff --git a/tests/specs/run/jsx_import_source_pragma_import_map/jsx_import_source_pragma_import_map.tsx b/tests/specs/run/jsx_import_source_pragma_import_map/jsx_import_source_pragma_import_map.tsx
new file mode 100644
index 000000000..548365f18
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_import_map/jsx_import_source_pragma_import_map.tsx
@@ -0,0 +1,9 @@
+/** @jsxImportSource jsx */
+
+function A() {
+ return "hello";
+}
+
+export function B() {
+ return <A></A>;
+}
diff --git a/tests/specs/run/jsx_import_source_pragma_import_map_dev/__test__.jsonc b/tests/specs/run/jsx_import_source_pragma_import_map_dev/__test__.jsonc
new file mode 100644
index 000000000..bb271c0ee
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_import_map_dev/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --allow-import --reload --import-map jsx/import-map.json --config jsx/deno-jsxdev-import-map.jsonc jsx_import_source_pragma_import_map.tsx",
+ "output": "jsx_import_source_import_map_dev.out"
+}
diff --git a/tests/specs/run/jsx_import_source_pragma_import_map_dev/jsx/deno-jsx-error.jsonc b/tests/specs/run/jsx_import_source_pragma_import_map_dev/jsx/deno-jsx-error.jsonc
new file mode 100644
index 000000000..37cb4dd91
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_import_map_dev/jsx/deno-jsx-error.jsonc
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "react-jsx",
+ "jsxImportSource": "./nonexistent"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_pragma_import_map_dev/jsx/deno-jsx-import-map.jsonc b/tests/specs/run/jsx_import_source_pragma_import_map_dev/jsx/deno-jsx-import-map.jsonc
new file mode 100644
index 000000000..5adbfa8b5
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_import_map_dev/jsx/deno-jsx-import-map.jsonc
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "react-jsx",
+ "jsxImportSource": "jsx"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_pragma_import_map_dev/jsx/deno-jsx-precompile-skip.jsonc b/tests/specs/run/jsx_import_source_pragma_import_map_dev/jsx/deno-jsx-precompile-skip.jsonc
new file mode 100644
index 000000000..3c9e4fa1f
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_import_map_dev/jsx/deno-jsx-precompile-skip.jsonc
@@ -0,0 +1,7 @@
+{
+ "compilerOptions": {
+ "jsx": "precompile",
+ "jsxImportSource": "jsx-precompile",
+ "jsxPrecompileSkipElements": ["a", "img"]
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_pragma_import_map_dev/jsx/deno-jsx-precompile.jsonc b/tests/specs/run/jsx_import_source_pragma_import_map_dev/jsx/deno-jsx-precompile.jsonc
new file mode 100644
index 000000000..95ae1b9f3
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_import_map_dev/jsx/deno-jsx-precompile.jsonc
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "precompile",
+ "jsxImportSource": "jsx-precompile"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_pragma_import_map_dev/jsx/deno-jsx.json b/tests/specs/run/jsx_import_source_pragma_import_map_dev/jsx/deno-jsx.json
new file mode 100644
index 000000000..311409ea3
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_import_map_dev/jsx/deno-jsx.json
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "react-jsx",
+ "jsxImportSource": "http://localhost:4545/jsx"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_pragma_import_map_dev/jsx/deno-jsx.jsonc b/tests/specs/run/jsx_import_source_pragma_import_map_dev/jsx/deno-jsx.jsonc
new file mode 100644
index 000000000..311409ea3
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_import_map_dev/jsx/deno-jsx.jsonc
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "react-jsx",
+ "jsxImportSource": "http://localhost:4545/jsx"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_pragma_import_map_dev/jsx/deno-jsxdev-import-map.jsonc b/tests/specs/run/jsx_import_source_pragma_import_map_dev/jsx/deno-jsxdev-import-map.jsonc
new file mode 100644
index 000000000..7481d5a2d
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_import_map_dev/jsx/deno-jsxdev-import-map.jsonc
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "react-jsxdev",
+ "jsxImportSource": "jsx"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_pragma_import_map_dev/jsx/deno-jsxdev.jsonc b/tests/specs/run/jsx_import_source_pragma_import_map_dev/jsx/deno-jsxdev.jsonc
new file mode 100644
index 000000000..ae5bdf9f1
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_import_map_dev/jsx/deno-jsxdev.jsonc
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "react-jsxdev",
+ "jsxImportSource": "http://localhost:4545/jsx"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_pragma_import_map_dev/jsx/deno.lock b/tests/specs/run/jsx_import_source_pragma_import_map_dev/jsx/deno.lock
new file mode 100644
index 000000000..011e8fe10
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_import_map_dev/jsx/deno.lock
@@ -0,0 +1,6 @@
+{
+ "version": "2",
+ "remote": {
+ "http://localhost:4545/jsx/jsx-dev-runtime/index.ts": "183c5bf1cfb82b15fc1e8cca15593d4816035759532d851abd4476df378c8412"
+ }
+} \ No newline at end of file
diff --git a/tests/specs/run/jsx_import_source_pragma_import_map_dev/jsx/import-map-scoped.json b/tests/specs/run/jsx_import_source_pragma_import_map_dev/jsx/import-map-scoped.json
new file mode 100644
index 000000000..9b2005128
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_import_map_dev/jsx/import-map-scoped.json
@@ -0,0 +1,8 @@
+{
+ "scopes": {
+ "../subdir/": {
+ "jsx/jsx-runtime": "http://localhost:4545/jsx/jsx-runtime/index.ts",
+ "jsx/jsx-dev-runtime": "http://localhost:4545/jsx/jsx-dev-runtime/index.ts"
+ }
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_pragma_import_map_dev/jsx/import-map.json b/tests/specs/run/jsx_import_source_pragma_import_map_dev/jsx/import-map.json
new file mode 100644
index 000000000..1bfa04e2f
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_import_map_dev/jsx/import-map.json
@@ -0,0 +1,7 @@
+{
+ "imports": {
+ "jsx/jsx-runtime": "http://localhost:4545/jsx/jsx-runtime/index.ts",
+ "jsx/jsx-dev-runtime": "http://localhost:4545/jsx/jsx-dev-runtime/index.ts",
+ "jsx-precompile/jsx-runtime": "http://localhost:4545/jsx/jsx-precompile/index.ts"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_pragma_import_map_dev/jsx/jsx-dev-runtime/index.ts b/tests/specs/run/jsx_import_source_pragma_import_map_dev/jsx/jsx-dev-runtime/index.ts
new file mode 100644
index 000000000..15e2029c8
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_import_map_dev/jsx/jsx-dev-runtime/index.ts
@@ -0,0 +1,12 @@
+// deno-lint-ignore-file no-explicit-any
+export function jsx(
+ _type: any,
+ _props: any,
+ _key: any,
+ _source: any,
+ _self: any,
+) {}
+export const jsxs = jsx;
+export const jsxDEV = jsx;
+export const Fragment = Symbol("Fragment");
+console.log("imported", import.meta.url);
diff --git a/tests/specs/run/jsx_import_source_pragma_import_map_dev/jsx/jsx-precompile/index.ts b/tests/specs/run/jsx_import_source_pragma_import_map_dev/jsx/jsx-precompile/index.ts
new file mode 100644
index 000000000..0d56095e0
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_import_map_dev/jsx/jsx-precompile/index.ts
@@ -0,0 +1,23 @@
+// deno-lint-ignore-file no-explicit-any
+export function jsx(
+ _type: any,
+ _props: any,
+ _key: any,
+ _source: any,
+ _self: any,
+) {}
+// deno-lint-ignore-file no-explicit-any
+export const jsxAttr = (name: string, value: any) => `${name}="${value}"`;
+// deno-lint-ignore-file no-explicit-any
+export const jsxTemplate = (_template: string[], ..._exprs: any[]) => "";
+// deno-lint-ignore-file no-explicit-any
+export const jsxEscape = (_value: any) => "";
+console.log("imported", import.meta.url);
+
+declare global {
+ namespace JSX {
+ interface IntrinsicElements {
+ [tagName: string]: Record<string, any>;
+ }
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_pragma_import_map_dev/jsx/jsx-runtime/index.ts b/tests/specs/run/jsx_import_source_pragma_import_map_dev/jsx/jsx-runtime/index.ts
new file mode 100644
index 000000000..15e2029c8
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_import_map_dev/jsx/jsx-runtime/index.ts
@@ -0,0 +1,12 @@
+// deno-lint-ignore-file no-explicit-any
+export function jsx(
+ _type: any,
+ _props: any,
+ _key: any,
+ _source: any,
+ _self: any,
+) {}
+export const jsxs = jsx;
+export const jsxDEV = jsx;
+export const Fragment = Symbol("Fragment");
+console.log("imported", import.meta.url);
diff --git a/tests/specs/run/jsx_import_source_pragma_import_map_dev/jsx_import_source_import_map_dev.out b/tests/specs/run/jsx_import_source_pragma_import_map_dev/jsx_import_source_import_map_dev.out
new file mode 100644
index 000000000..56f514d90
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_import_map_dev/jsx_import_source_import_map_dev.out
@@ -0,0 +1,2 @@
+[WILDCARD]
+imported http://localhost:4545/jsx/jsx-dev-runtime/index.ts
diff --git a/tests/specs/run/jsx_import_source_pragma_import_map_dev/jsx_import_source_pragma_import_map.tsx b/tests/specs/run/jsx_import_source_pragma_import_map_dev/jsx_import_source_pragma_import_map.tsx
new file mode 100644
index 000000000..548365f18
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_import_map_dev/jsx_import_source_pragma_import_map.tsx
@@ -0,0 +1,9 @@
+/** @jsxImportSource jsx */
+
+function A() {
+ return "hello";
+}
+
+export function B() {
+ return <A></A>;
+}
diff --git a/tests/specs/run/jsx_import_source_pragma_import_map_no_check/__test__.jsonc b/tests/specs/run/jsx_import_source_pragma_import_map_no_check/__test__.jsonc
new file mode 100644
index 000000000..dd42b71fd
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_import_map_no_check/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --allow-import --reload --import-map jsx/import-map.json --no-check jsx_import_source_pragma_import_map.tsx",
+ "output": "jsx_import_source_import_map.out"
+}
diff --git a/tests/specs/run/jsx_import_source_pragma_import_map_no_check/jsx/deno-jsx-error.jsonc b/tests/specs/run/jsx_import_source_pragma_import_map_no_check/jsx/deno-jsx-error.jsonc
new file mode 100644
index 000000000..37cb4dd91
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_import_map_no_check/jsx/deno-jsx-error.jsonc
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "react-jsx",
+ "jsxImportSource": "./nonexistent"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_pragma_import_map_no_check/jsx/deno-jsx-import-map.jsonc b/tests/specs/run/jsx_import_source_pragma_import_map_no_check/jsx/deno-jsx-import-map.jsonc
new file mode 100644
index 000000000..5adbfa8b5
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_import_map_no_check/jsx/deno-jsx-import-map.jsonc
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "react-jsx",
+ "jsxImportSource": "jsx"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_pragma_import_map_no_check/jsx/deno-jsx-precompile-skip.jsonc b/tests/specs/run/jsx_import_source_pragma_import_map_no_check/jsx/deno-jsx-precompile-skip.jsonc
new file mode 100644
index 000000000..3c9e4fa1f
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_import_map_no_check/jsx/deno-jsx-precompile-skip.jsonc
@@ -0,0 +1,7 @@
+{
+ "compilerOptions": {
+ "jsx": "precompile",
+ "jsxImportSource": "jsx-precompile",
+ "jsxPrecompileSkipElements": ["a", "img"]
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_pragma_import_map_no_check/jsx/deno-jsx-precompile.jsonc b/tests/specs/run/jsx_import_source_pragma_import_map_no_check/jsx/deno-jsx-precompile.jsonc
new file mode 100644
index 000000000..95ae1b9f3
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_import_map_no_check/jsx/deno-jsx-precompile.jsonc
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "precompile",
+ "jsxImportSource": "jsx-precompile"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_pragma_import_map_no_check/jsx/deno-jsx.json b/tests/specs/run/jsx_import_source_pragma_import_map_no_check/jsx/deno-jsx.json
new file mode 100644
index 000000000..311409ea3
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_import_map_no_check/jsx/deno-jsx.json
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "react-jsx",
+ "jsxImportSource": "http://localhost:4545/jsx"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_pragma_import_map_no_check/jsx/deno-jsx.jsonc b/tests/specs/run/jsx_import_source_pragma_import_map_no_check/jsx/deno-jsx.jsonc
new file mode 100644
index 000000000..311409ea3
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_import_map_no_check/jsx/deno-jsx.jsonc
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "react-jsx",
+ "jsxImportSource": "http://localhost:4545/jsx"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_pragma_import_map_no_check/jsx/deno-jsxdev-import-map.jsonc b/tests/specs/run/jsx_import_source_pragma_import_map_no_check/jsx/deno-jsxdev-import-map.jsonc
new file mode 100644
index 000000000..7481d5a2d
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_import_map_no_check/jsx/deno-jsxdev-import-map.jsonc
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "react-jsxdev",
+ "jsxImportSource": "jsx"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_pragma_import_map_no_check/jsx/deno-jsxdev.jsonc b/tests/specs/run/jsx_import_source_pragma_import_map_no_check/jsx/deno-jsxdev.jsonc
new file mode 100644
index 000000000..ae5bdf9f1
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_import_map_no_check/jsx/deno-jsxdev.jsonc
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "react-jsxdev",
+ "jsxImportSource": "http://localhost:4545/jsx"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_pragma_import_map_no_check/jsx/deno.lock b/tests/specs/run/jsx_import_source_pragma_import_map_no_check/jsx/deno.lock
new file mode 100644
index 000000000..011e8fe10
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_import_map_no_check/jsx/deno.lock
@@ -0,0 +1,6 @@
+{
+ "version": "2",
+ "remote": {
+ "http://localhost:4545/jsx/jsx-dev-runtime/index.ts": "183c5bf1cfb82b15fc1e8cca15593d4816035759532d851abd4476df378c8412"
+ }
+} \ No newline at end of file
diff --git a/tests/specs/run/jsx_import_source_pragma_import_map_no_check/jsx/import-map-scoped.json b/tests/specs/run/jsx_import_source_pragma_import_map_no_check/jsx/import-map-scoped.json
new file mode 100644
index 000000000..9b2005128
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_import_map_no_check/jsx/import-map-scoped.json
@@ -0,0 +1,8 @@
+{
+ "scopes": {
+ "../subdir/": {
+ "jsx/jsx-runtime": "http://localhost:4545/jsx/jsx-runtime/index.ts",
+ "jsx/jsx-dev-runtime": "http://localhost:4545/jsx/jsx-dev-runtime/index.ts"
+ }
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_pragma_import_map_no_check/jsx/import-map.json b/tests/specs/run/jsx_import_source_pragma_import_map_no_check/jsx/import-map.json
new file mode 100644
index 000000000..1bfa04e2f
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_import_map_no_check/jsx/import-map.json
@@ -0,0 +1,7 @@
+{
+ "imports": {
+ "jsx/jsx-runtime": "http://localhost:4545/jsx/jsx-runtime/index.ts",
+ "jsx/jsx-dev-runtime": "http://localhost:4545/jsx/jsx-dev-runtime/index.ts",
+ "jsx-precompile/jsx-runtime": "http://localhost:4545/jsx/jsx-precompile/index.ts"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_pragma_import_map_no_check/jsx/jsx-dev-runtime/index.ts b/tests/specs/run/jsx_import_source_pragma_import_map_no_check/jsx/jsx-dev-runtime/index.ts
new file mode 100644
index 000000000..15e2029c8
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_import_map_no_check/jsx/jsx-dev-runtime/index.ts
@@ -0,0 +1,12 @@
+// deno-lint-ignore-file no-explicit-any
+export function jsx(
+ _type: any,
+ _props: any,
+ _key: any,
+ _source: any,
+ _self: any,
+) {}
+export const jsxs = jsx;
+export const jsxDEV = jsx;
+export const Fragment = Symbol("Fragment");
+console.log("imported", import.meta.url);
diff --git a/tests/specs/run/jsx_import_source_pragma_import_map_no_check/jsx/jsx-precompile/index.ts b/tests/specs/run/jsx_import_source_pragma_import_map_no_check/jsx/jsx-precompile/index.ts
new file mode 100644
index 000000000..0d56095e0
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_import_map_no_check/jsx/jsx-precompile/index.ts
@@ -0,0 +1,23 @@
+// deno-lint-ignore-file no-explicit-any
+export function jsx(
+ _type: any,
+ _props: any,
+ _key: any,
+ _source: any,
+ _self: any,
+) {}
+// deno-lint-ignore-file no-explicit-any
+export const jsxAttr = (name: string, value: any) => `${name}="${value}"`;
+// deno-lint-ignore-file no-explicit-any
+export const jsxTemplate = (_template: string[], ..._exprs: any[]) => "";
+// deno-lint-ignore-file no-explicit-any
+export const jsxEscape = (_value: any) => "";
+console.log("imported", import.meta.url);
+
+declare global {
+ namespace JSX {
+ interface IntrinsicElements {
+ [tagName: string]: Record<string, any>;
+ }
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_pragma_import_map_no_check/jsx/jsx-runtime/index.ts b/tests/specs/run/jsx_import_source_pragma_import_map_no_check/jsx/jsx-runtime/index.ts
new file mode 100644
index 000000000..15e2029c8
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_import_map_no_check/jsx/jsx-runtime/index.ts
@@ -0,0 +1,12 @@
+// deno-lint-ignore-file no-explicit-any
+export function jsx(
+ _type: any,
+ _props: any,
+ _key: any,
+ _source: any,
+ _self: any,
+) {}
+export const jsxs = jsx;
+export const jsxDEV = jsx;
+export const Fragment = Symbol("Fragment");
+console.log("imported", import.meta.url);
diff --git a/tests/specs/run/jsx_import_source_pragma_import_map_no_check/jsx_import_source_import_map.out b/tests/specs/run/jsx_import_source_pragma_import_map_no_check/jsx_import_source_import_map.out
new file mode 100644
index 000000000..0d3238967
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_import_map_no_check/jsx_import_source_import_map.out
@@ -0,0 +1,2 @@
+[WILDCARD]
+imported http://localhost:4545/jsx/jsx-runtime/index.ts
diff --git a/tests/specs/run/jsx_import_source_pragma_import_map_no_check/jsx_import_source_pragma_import_map.tsx b/tests/specs/run/jsx_import_source_pragma_import_map_no_check/jsx_import_source_pragma_import_map.tsx
new file mode 100644
index 000000000..548365f18
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_import_map_no_check/jsx_import_source_pragma_import_map.tsx
@@ -0,0 +1,9 @@
+/** @jsxImportSource jsx */
+
+function A() {
+ return "hello";
+}
+
+export function B() {
+ return <A></A>;
+}
diff --git a/tests/specs/run/jsx_import_source_pragma_no_check/__test__.jsonc b/tests/specs/run/jsx_import_source_pragma_no_check/__test__.jsonc
new file mode 100644
index 000000000..0956b94a7
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_no_check/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --allow-import --reload --no-check jsx_import_source_pragma.tsx",
+ "output": "jsx_import_source.out"
+}
diff --git a/tests/specs/run/jsx_import_source_pragma_no_check/jsx/deno-jsx-error.jsonc b/tests/specs/run/jsx_import_source_pragma_no_check/jsx/deno-jsx-error.jsonc
new file mode 100644
index 000000000..37cb4dd91
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_no_check/jsx/deno-jsx-error.jsonc
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "react-jsx",
+ "jsxImportSource": "./nonexistent"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_pragma_no_check/jsx/deno-jsx-import-map.jsonc b/tests/specs/run/jsx_import_source_pragma_no_check/jsx/deno-jsx-import-map.jsonc
new file mode 100644
index 000000000..5adbfa8b5
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_no_check/jsx/deno-jsx-import-map.jsonc
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "react-jsx",
+ "jsxImportSource": "jsx"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_pragma_no_check/jsx/deno-jsx-precompile-skip.jsonc b/tests/specs/run/jsx_import_source_pragma_no_check/jsx/deno-jsx-precompile-skip.jsonc
new file mode 100644
index 000000000..3c9e4fa1f
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_no_check/jsx/deno-jsx-precompile-skip.jsonc
@@ -0,0 +1,7 @@
+{
+ "compilerOptions": {
+ "jsx": "precompile",
+ "jsxImportSource": "jsx-precompile",
+ "jsxPrecompileSkipElements": ["a", "img"]
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_pragma_no_check/jsx/deno-jsx-precompile.jsonc b/tests/specs/run/jsx_import_source_pragma_no_check/jsx/deno-jsx-precompile.jsonc
new file mode 100644
index 000000000..95ae1b9f3
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_no_check/jsx/deno-jsx-precompile.jsonc
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "precompile",
+ "jsxImportSource": "jsx-precompile"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_pragma_no_check/jsx/deno-jsx.json b/tests/specs/run/jsx_import_source_pragma_no_check/jsx/deno-jsx.json
new file mode 100644
index 000000000..311409ea3
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_no_check/jsx/deno-jsx.json
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "react-jsx",
+ "jsxImportSource": "http://localhost:4545/jsx"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_pragma_no_check/jsx/deno-jsx.jsonc b/tests/specs/run/jsx_import_source_pragma_no_check/jsx/deno-jsx.jsonc
new file mode 100644
index 000000000..311409ea3
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_no_check/jsx/deno-jsx.jsonc
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "react-jsx",
+ "jsxImportSource": "http://localhost:4545/jsx"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_pragma_no_check/jsx/deno-jsxdev-import-map.jsonc b/tests/specs/run/jsx_import_source_pragma_no_check/jsx/deno-jsxdev-import-map.jsonc
new file mode 100644
index 000000000..7481d5a2d
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_no_check/jsx/deno-jsxdev-import-map.jsonc
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "react-jsxdev",
+ "jsxImportSource": "jsx"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_pragma_no_check/jsx/deno-jsxdev.jsonc b/tests/specs/run/jsx_import_source_pragma_no_check/jsx/deno-jsxdev.jsonc
new file mode 100644
index 000000000..ae5bdf9f1
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_no_check/jsx/deno-jsxdev.jsonc
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "react-jsxdev",
+ "jsxImportSource": "http://localhost:4545/jsx"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_pragma_no_check/jsx/deno.lock b/tests/specs/run/jsx_import_source_pragma_no_check/jsx/deno.lock
new file mode 100644
index 000000000..011e8fe10
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_no_check/jsx/deno.lock
@@ -0,0 +1,6 @@
+{
+ "version": "2",
+ "remote": {
+ "http://localhost:4545/jsx/jsx-dev-runtime/index.ts": "183c5bf1cfb82b15fc1e8cca15593d4816035759532d851abd4476df378c8412"
+ }
+} \ No newline at end of file
diff --git a/tests/specs/run/jsx_import_source_pragma_no_check/jsx/import-map-scoped.json b/tests/specs/run/jsx_import_source_pragma_no_check/jsx/import-map-scoped.json
new file mode 100644
index 000000000..9b2005128
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_no_check/jsx/import-map-scoped.json
@@ -0,0 +1,8 @@
+{
+ "scopes": {
+ "../subdir/": {
+ "jsx/jsx-runtime": "http://localhost:4545/jsx/jsx-runtime/index.ts",
+ "jsx/jsx-dev-runtime": "http://localhost:4545/jsx/jsx-dev-runtime/index.ts"
+ }
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_pragma_no_check/jsx/import-map.json b/tests/specs/run/jsx_import_source_pragma_no_check/jsx/import-map.json
new file mode 100644
index 000000000..1bfa04e2f
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_no_check/jsx/import-map.json
@@ -0,0 +1,7 @@
+{
+ "imports": {
+ "jsx/jsx-runtime": "http://localhost:4545/jsx/jsx-runtime/index.ts",
+ "jsx/jsx-dev-runtime": "http://localhost:4545/jsx/jsx-dev-runtime/index.ts",
+ "jsx-precompile/jsx-runtime": "http://localhost:4545/jsx/jsx-precompile/index.ts"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_pragma_no_check/jsx/jsx-dev-runtime/index.ts b/tests/specs/run/jsx_import_source_pragma_no_check/jsx/jsx-dev-runtime/index.ts
new file mode 100644
index 000000000..15e2029c8
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_no_check/jsx/jsx-dev-runtime/index.ts
@@ -0,0 +1,12 @@
+// deno-lint-ignore-file no-explicit-any
+export function jsx(
+ _type: any,
+ _props: any,
+ _key: any,
+ _source: any,
+ _self: any,
+) {}
+export const jsxs = jsx;
+export const jsxDEV = jsx;
+export const Fragment = Symbol("Fragment");
+console.log("imported", import.meta.url);
diff --git a/tests/specs/run/jsx_import_source_pragma_no_check/jsx/jsx-precompile/index.ts b/tests/specs/run/jsx_import_source_pragma_no_check/jsx/jsx-precompile/index.ts
new file mode 100644
index 000000000..0d56095e0
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_no_check/jsx/jsx-precompile/index.ts
@@ -0,0 +1,23 @@
+// deno-lint-ignore-file no-explicit-any
+export function jsx(
+ _type: any,
+ _props: any,
+ _key: any,
+ _source: any,
+ _self: any,
+) {}
+// deno-lint-ignore-file no-explicit-any
+export const jsxAttr = (name: string, value: any) => `${name}="${value}"`;
+// deno-lint-ignore-file no-explicit-any
+export const jsxTemplate = (_template: string[], ..._exprs: any[]) => "";
+// deno-lint-ignore-file no-explicit-any
+export const jsxEscape = (_value: any) => "";
+console.log("imported", import.meta.url);
+
+declare global {
+ namespace JSX {
+ interface IntrinsicElements {
+ [tagName: string]: Record<string, any>;
+ }
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_pragma_no_check/jsx/jsx-runtime/index.ts b/tests/specs/run/jsx_import_source_pragma_no_check/jsx/jsx-runtime/index.ts
new file mode 100644
index 000000000..15e2029c8
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_no_check/jsx/jsx-runtime/index.ts
@@ -0,0 +1,12 @@
+// deno-lint-ignore-file no-explicit-any
+export function jsx(
+ _type: any,
+ _props: any,
+ _key: any,
+ _source: any,
+ _self: any,
+) {}
+export const jsxs = jsx;
+export const jsxDEV = jsx;
+export const Fragment = Symbol("Fragment");
+console.log("imported", import.meta.url);
diff --git a/tests/specs/run/jsx_import_source_pragma_no_check/jsx_import_source.out b/tests/specs/run/jsx_import_source_pragma_no_check/jsx_import_source.out
new file mode 100644
index 000000000..b9555987a
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_no_check/jsx_import_source.out
@@ -0,0 +1,2 @@
+[WILDCARD]
+imported http://localhost:4545/jsx/jsx-runtime
diff --git a/tests/specs/run/jsx_import_source_pragma_no_check/jsx_import_source_pragma.tsx b/tests/specs/run/jsx_import_source_pragma_no_check/jsx_import_source_pragma.tsx
new file mode 100644
index 000000000..c19e53d4f
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_no_check/jsx_import_source_pragma.tsx
@@ -0,0 +1,9 @@
+/** @jsxImportSource http://localhost:4545/jsx */
+
+function A() {
+ return "hello";
+}
+
+export function B() {
+ return <A></A>;
+}
diff --git a/tests/specs/run/jsx_import_source_pragma_with_config/__test__.jsonc b/tests/specs/run/jsx_import_source_pragma_with_config/__test__.jsonc
new file mode 100644
index 000000000..aeaf209c3
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_with_config/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --reload --allow-import --config jsx/deno-jsx.jsonc --no-lock jsx_import_source_pragma.tsx",
+ "output": "jsx_import_source.out"
+}
diff --git a/tests/specs/run/jsx_import_source_pragma_with_config/jsx/deno-jsx-error.jsonc b/tests/specs/run/jsx_import_source_pragma_with_config/jsx/deno-jsx-error.jsonc
new file mode 100644
index 000000000..37cb4dd91
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_with_config/jsx/deno-jsx-error.jsonc
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "react-jsx",
+ "jsxImportSource": "./nonexistent"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_pragma_with_config/jsx/deno-jsx-import-map.jsonc b/tests/specs/run/jsx_import_source_pragma_with_config/jsx/deno-jsx-import-map.jsonc
new file mode 100644
index 000000000..5adbfa8b5
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_with_config/jsx/deno-jsx-import-map.jsonc
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "react-jsx",
+ "jsxImportSource": "jsx"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_pragma_with_config/jsx/deno-jsx-precompile-skip.jsonc b/tests/specs/run/jsx_import_source_pragma_with_config/jsx/deno-jsx-precompile-skip.jsonc
new file mode 100644
index 000000000..3c9e4fa1f
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_with_config/jsx/deno-jsx-precompile-skip.jsonc
@@ -0,0 +1,7 @@
+{
+ "compilerOptions": {
+ "jsx": "precompile",
+ "jsxImportSource": "jsx-precompile",
+ "jsxPrecompileSkipElements": ["a", "img"]
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_pragma_with_config/jsx/deno-jsx-precompile.jsonc b/tests/specs/run/jsx_import_source_pragma_with_config/jsx/deno-jsx-precompile.jsonc
new file mode 100644
index 000000000..95ae1b9f3
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_with_config/jsx/deno-jsx-precompile.jsonc
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "precompile",
+ "jsxImportSource": "jsx-precompile"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_pragma_with_config/jsx/deno-jsx.json b/tests/specs/run/jsx_import_source_pragma_with_config/jsx/deno-jsx.json
new file mode 100644
index 000000000..311409ea3
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_with_config/jsx/deno-jsx.json
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "react-jsx",
+ "jsxImportSource": "http://localhost:4545/jsx"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_pragma_with_config/jsx/deno-jsx.jsonc b/tests/specs/run/jsx_import_source_pragma_with_config/jsx/deno-jsx.jsonc
new file mode 100644
index 000000000..311409ea3
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_with_config/jsx/deno-jsx.jsonc
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "react-jsx",
+ "jsxImportSource": "http://localhost:4545/jsx"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_pragma_with_config/jsx/deno-jsxdev-import-map.jsonc b/tests/specs/run/jsx_import_source_pragma_with_config/jsx/deno-jsxdev-import-map.jsonc
new file mode 100644
index 000000000..7481d5a2d
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_with_config/jsx/deno-jsxdev-import-map.jsonc
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "react-jsxdev",
+ "jsxImportSource": "jsx"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_pragma_with_config/jsx/deno-jsxdev.jsonc b/tests/specs/run/jsx_import_source_pragma_with_config/jsx/deno-jsxdev.jsonc
new file mode 100644
index 000000000..ae5bdf9f1
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_with_config/jsx/deno-jsxdev.jsonc
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "react-jsxdev",
+ "jsxImportSource": "http://localhost:4545/jsx"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_pragma_with_config/jsx/deno.lock b/tests/specs/run/jsx_import_source_pragma_with_config/jsx/deno.lock
new file mode 100644
index 000000000..011e8fe10
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_with_config/jsx/deno.lock
@@ -0,0 +1,6 @@
+{
+ "version": "2",
+ "remote": {
+ "http://localhost:4545/jsx/jsx-dev-runtime/index.ts": "183c5bf1cfb82b15fc1e8cca15593d4816035759532d851abd4476df378c8412"
+ }
+} \ No newline at end of file
diff --git a/tests/specs/run/jsx_import_source_pragma_with_config/jsx/import-map-scoped.json b/tests/specs/run/jsx_import_source_pragma_with_config/jsx/import-map-scoped.json
new file mode 100644
index 000000000..9b2005128
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_with_config/jsx/import-map-scoped.json
@@ -0,0 +1,8 @@
+{
+ "scopes": {
+ "../subdir/": {
+ "jsx/jsx-runtime": "http://localhost:4545/jsx/jsx-runtime/index.ts",
+ "jsx/jsx-dev-runtime": "http://localhost:4545/jsx/jsx-dev-runtime/index.ts"
+ }
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_pragma_with_config/jsx/import-map.json b/tests/specs/run/jsx_import_source_pragma_with_config/jsx/import-map.json
new file mode 100644
index 000000000..1bfa04e2f
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_with_config/jsx/import-map.json
@@ -0,0 +1,7 @@
+{
+ "imports": {
+ "jsx/jsx-runtime": "http://localhost:4545/jsx/jsx-runtime/index.ts",
+ "jsx/jsx-dev-runtime": "http://localhost:4545/jsx/jsx-dev-runtime/index.ts",
+ "jsx-precompile/jsx-runtime": "http://localhost:4545/jsx/jsx-precompile/index.ts"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_pragma_with_config/jsx/jsx-dev-runtime/index.ts b/tests/specs/run/jsx_import_source_pragma_with_config/jsx/jsx-dev-runtime/index.ts
new file mode 100644
index 000000000..15e2029c8
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_with_config/jsx/jsx-dev-runtime/index.ts
@@ -0,0 +1,12 @@
+// deno-lint-ignore-file no-explicit-any
+export function jsx(
+ _type: any,
+ _props: any,
+ _key: any,
+ _source: any,
+ _self: any,
+) {}
+export const jsxs = jsx;
+export const jsxDEV = jsx;
+export const Fragment = Symbol("Fragment");
+console.log("imported", import.meta.url);
diff --git a/tests/specs/run/jsx_import_source_pragma_with_config/jsx/jsx-precompile/index.ts b/tests/specs/run/jsx_import_source_pragma_with_config/jsx/jsx-precompile/index.ts
new file mode 100644
index 000000000..0d56095e0
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_with_config/jsx/jsx-precompile/index.ts
@@ -0,0 +1,23 @@
+// deno-lint-ignore-file no-explicit-any
+export function jsx(
+ _type: any,
+ _props: any,
+ _key: any,
+ _source: any,
+ _self: any,
+) {}
+// deno-lint-ignore-file no-explicit-any
+export const jsxAttr = (name: string, value: any) => `${name}="${value}"`;
+// deno-lint-ignore-file no-explicit-any
+export const jsxTemplate = (_template: string[], ..._exprs: any[]) => "";
+// deno-lint-ignore-file no-explicit-any
+export const jsxEscape = (_value: any) => "";
+console.log("imported", import.meta.url);
+
+declare global {
+ namespace JSX {
+ interface IntrinsicElements {
+ [tagName: string]: Record<string, any>;
+ }
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_pragma_with_config/jsx/jsx-runtime/index.ts b/tests/specs/run/jsx_import_source_pragma_with_config/jsx/jsx-runtime/index.ts
new file mode 100644
index 000000000..15e2029c8
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_with_config/jsx/jsx-runtime/index.ts
@@ -0,0 +1,12 @@
+// deno-lint-ignore-file no-explicit-any
+export function jsx(
+ _type: any,
+ _props: any,
+ _key: any,
+ _source: any,
+ _self: any,
+) {}
+export const jsxs = jsx;
+export const jsxDEV = jsx;
+export const Fragment = Symbol("Fragment");
+console.log("imported", import.meta.url);
diff --git a/tests/specs/run/jsx_import_source_pragma_with_config/jsx_import_source.out b/tests/specs/run/jsx_import_source_pragma_with_config/jsx_import_source.out
new file mode 100644
index 000000000..b9555987a
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_with_config/jsx_import_source.out
@@ -0,0 +1,2 @@
+[WILDCARD]
+imported http://localhost:4545/jsx/jsx-runtime
diff --git a/tests/specs/run/jsx_import_source_pragma_with_config/jsx_import_source_pragma.tsx b/tests/specs/run/jsx_import_source_pragma_with_config/jsx_import_source_pragma.tsx
new file mode 100644
index 000000000..c19e53d4f
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_with_config/jsx_import_source_pragma.tsx
@@ -0,0 +1,9 @@
+/** @jsxImportSource http://localhost:4545/jsx */
+
+function A() {
+ return "hello";
+}
+
+export function B() {
+ return <A></A>;
+}
diff --git a/tests/specs/run/jsx_import_source_pragma_with_config_no_check/__test__.jsonc b/tests/specs/run/jsx_import_source_pragma_with_config_no_check/__test__.jsonc
new file mode 100644
index 000000000..3e8089fd2
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_with_config_no_check/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --allow-import --reload --config jsx/deno-jsx.jsonc --no-lock --no-check jsx_import_source_pragma.tsx",
+ "output": "jsx_import_source.out"
+}
diff --git a/tests/specs/run/jsx_import_source_pragma_with_config_no_check/jsx/deno-jsx-error.jsonc b/tests/specs/run/jsx_import_source_pragma_with_config_no_check/jsx/deno-jsx-error.jsonc
new file mode 100644
index 000000000..37cb4dd91
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_with_config_no_check/jsx/deno-jsx-error.jsonc
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "react-jsx",
+ "jsxImportSource": "./nonexistent"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_pragma_with_config_no_check/jsx/deno-jsx-import-map.jsonc b/tests/specs/run/jsx_import_source_pragma_with_config_no_check/jsx/deno-jsx-import-map.jsonc
new file mode 100644
index 000000000..5adbfa8b5
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_with_config_no_check/jsx/deno-jsx-import-map.jsonc
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "react-jsx",
+ "jsxImportSource": "jsx"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_pragma_with_config_no_check/jsx/deno-jsx-precompile-skip.jsonc b/tests/specs/run/jsx_import_source_pragma_with_config_no_check/jsx/deno-jsx-precompile-skip.jsonc
new file mode 100644
index 000000000..3c9e4fa1f
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_with_config_no_check/jsx/deno-jsx-precompile-skip.jsonc
@@ -0,0 +1,7 @@
+{
+ "compilerOptions": {
+ "jsx": "precompile",
+ "jsxImportSource": "jsx-precompile",
+ "jsxPrecompileSkipElements": ["a", "img"]
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_pragma_with_config_no_check/jsx/deno-jsx-precompile.jsonc b/tests/specs/run/jsx_import_source_pragma_with_config_no_check/jsx/deno-jsx-precompile.jsonc
new file mode 100644
index 000000000..95ae1b9f3
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_with_config_no_check/jsx/deno-jsx-precompile.jsonc
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "precompile",
+ "jsxImportSource": "jsx-precompile"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_pragma_with_config_no_check/jsx/deno-jsx.json b/tests/specs/run/jsx_import_source_pragma_with_config_no_check/jsx/deno-jsx.json
new file mode 100644
index 000000000..311409ea3
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_with_config_no_check/jsx/deno-jsx.json
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "react-jsx",
+ "jsxImportSource": "http://localhost:4545/jsx"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_pragma_with_config_no_check/jsx/deno-jsx.jsonc b/tests/specs/run/jsx_import_source_pragma_with_config_no_check/jsx/deno-jsx.jsonc
new file mode 100644
index 000000000..311409ea3
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_with_config_no_check/jsx/deno-jsx.jsonc
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "react-jsx",
+ "jsxImportSource": "http://localhost:4545/jsx"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_pragma_with_config_no_check/jsx/deno-jsxdev-import-map.jsonc b/tests/specs/run/jsx_import_source_pragma_with_config_no_check/jsx/deno-jsxdev-import-map.jsonc
new file mode 100644
index 000000000..7481d5a2d
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_with_config_no_check/jsx/deno-jsxdev-import-map.jsonc
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "react-jsxdev",
+ "jsxImportSource": "jsx"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_pragma_with_config_no_check/jsx/deno-jsxdev.jsonc b/tests/specs/run/jsx_import_source_pragma_with_config_no_check/jsx/deno-jsxdev.jsonc
new file mode 100644
index 000000000..ae5bdf9f1
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_with_config_no_check/jsx/deno-jsxdev.jsonc
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "react-jsxdev",
+ "jsxImportSource": "http://localhost:4545/jsx"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_pragma_with_config_no_check/jsx/deno.lock b/tests/specs/run/jsx_import_source_pragma_with_config_no_check/jsx/deno.lock
new file mode 100644
index 000000000..011e8fe10
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_with_config_no_check/jsx/deno.lock
@@ -0,0 +1,6 @@
+{
+ "version": "2",
+ "remote": {
+ "http://localhost:4545/jsx/jsx-dev-runtime/index.ts": "183c5bf1cfb82b15fc1e8cca15593d4816035759532d851abd4476df378c8412"
+ }
+} \ No newline at end of file
diff --git a/tests/specs/run/jsx_import_source_pragma_with_config_no_check/jsx/import-map-scoped.json b/tests/specs/run/jsx_import_source_pragma_with_config_no_check/jsx/import-map-scoped.json
new file mode 100644
index 000000000..9b2005128
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_with_config_no_check/jsx/import-map-scoped.json
@@ -0,0 +1,8 @@
+{
+ "scopes": {
+ "../subdir/": {
+ "jsx/jsx-runtime": "http://localhost:4545/jsx/jsx-runtime/index.ts",
+ "jsx/jsx-dev-runtime": "http://localhost:4545/jsx/jsx-dev-runtime/index.ts"
+ }
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_pragma_with_config_no_check/jsx/import-map.json b/tests/specs/run/jsx_import_source_pragma_with_config_no_check/jsx/import-map.json
new file mode 100644
index 000000000..1bfa04e2f
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_with_config_no_check/jsx/import-map.json
@@ -0,0 +1,7 @@
+{
+ "imports": {
+ "jsx/jsx-runtime": "http://localhost:4545/jsx/jsx-runtime/index.ts",
+ "jsx/jsx-dev-runtime": "http://localhost:4545/jsx/jsx-dev-runtime/index.ts",
+ "jsx-precompile/jsx-runtime": "http://localhost:4545/jsx/jsx-precompile/index.ts"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_pragma_with_config_no_check/jsx/jsx-dev-runtime/index.ts b/tests/specs/run/jsx_import_source_pragma_with_config_no_check/jsx/jsx-dev-runtime/index.ts
new file mode 100644
index 000000000..15e2029c8
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_with_config_no_check/jsx/jsx-dev-runtime/index.ts
@@ -0,0 +1,12 @@
+// deno-lint-ignore-file no-explicit-any
+export function jsx(
+ _type: any,
+ _props: any,
+ _key: any,
+ _source: any,
+ _self: any,
+) {}
+export const jsxs = jsx;
+export const jsxDEV = jsx;
+export const Fragment = Symbol("Fragment");
+console.log("imported", import.meta.url);
diff --git a/tests/specs/run/jsx_import_source_pragma_with_config_no_check/jsx/jsx-precompile/index.ts b/tests/specs/run/jsx_import_source_pragma_with_config_no_check/jsx/jsx-precompile/index.ts
new file mode 100644
index 000000000..0d56095e0
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_with_config_no_check/jsx/jsx-precompile/index.ts
@@ -0,0 +1,23 @@
+// deno-lint-ignore-file no-explicit-any
+export function jsx(
+ _type: any,
+ _props: any,
+ _key: any,
+ _source: any,
+ _self: any,
+) {}
+// deno-lint-ignore-file no-explicit-any
+export const jsxAttr = (name: string, value: any) => `${name}="${value}"`;
+// deno-lint-ignore-file no-explicit-any
+export const jsxTemplate = (_template: string[], ..._exprs: any[]) => "";
+// deno-lint-ignore-file no-explicit-any
+export const jsxEscape = (_value: any) => "";
+console.log("imported", import.meta.url);
+
+declare global {
+ namespace JSX {
+ interface IntrinsicElements {
+ [tagName: string]: Record<string, any>;
+ }
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_pragma_with_config_no_check/jsx/jsx-runtime/index.ts b/tests/specs/run/jsx_import_source_pragma_with_config_no_check/jsx/jsx-runtime/index.ts
new file mode 100644
index 000000000..15e2029c8
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_with_config_no_check/jsx/jsx-runtime/index.ts
@@ -0,0 +1,12 @@
+// deno-lint-ignore-file no-explicit-any
+export function jsx(
+ _type: any,
+ _props: any,
+ _key: any,
+ _source: any,
+ _self: any,
+) {}
+export const jsxs = jsx;
+export const jsxDEV = jsx;
+export const Fragment = Symbol("Fragment");
+console.log("imported", import.meta.url);
diff --git a/tests/specs/run/jsx_import_source_pragma_with_config_no_check/jsx_import_source.out b/tests/specs/run/jsx_import_source_pragma_with_config_no_check/jsx_import_source.out
new file mode 100644
index 000000000..b9555987a
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_with_config_no_check/jsx_import_source.out
@@ -0,0 +1,2 @@
+[WILDCARD]
+imported http://localhost:4545/jsx/jsx-runtime
diff --git a/tests/specs/run/jsx_import_source_pragma_with_config_no_check/jsx_import_source_pragma.tsx b/tests/specs/run/jsx_import_source_pragma_with_config_no_check/jsx_import_source_pragma.tsx
new file mode 100644
index 000000000..c19e53d4f
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_with_config_no_check/jsx_import_source_pragma.tsx
@@ -0,0 +1,9 @@
+/** @jsxImportSource http://localhost:4545/jsx */
+
+function A() {
+ return "hello";
+}
+
+export function B() {
+ return <A></A>;
+}
diff --git a/tests/specs/run/jsx_import_source_pragma_with_config_vendor_dir/__test__.jsonc b/tests/specs/run/jsx_import_source_pragma_with_config_vendor_dir/__test__.jsonc
new file mode 100644
index 000000000..03ed1af1b
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_with_config_vendor_dir/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --allow-import --reload --config jsx/deno-jsx.jsonc --no-lock --vendor jsx_import_source_pragma.tsx",
+ "output": "jsx_import_source.out"
+}
diff --git a/tests/specs/run/jsx_import_source_pragma_with_config_vendor_dir/jsx/deno-jsx-error.jsonc b/tests/specs/run/jsx_import_source_pragma_with_config_vendor_dir/jsx/deno-jsx-error.jsonc
new file mode 100644
index 000000000..37cb4dd91
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_with_config_vendor_dir/jsx/deno-jsx-error.jsonc
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "react-jsx",
+ "jsxImportSource": "./nonexistent"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_pragma_with_config_vendor_dir/jsx/deno-jsx-import-map.jsonc b/tests/specs/run/jsx_import_source_pragma_with_config_vendor_dir/jsx/deno-jsx-import-map.jsonc
new file mode 100644
index 000000000..5adbfa8b5
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_with_config_vendor_dir/jsx/deno-jsx-import-map.jsonc
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "react-jsx",
+ "jsxImportSource": "jsx"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_pragma_with_config_vendor_dir/jsx/deno-jsx-precompile-skip.jsonc b/tests/specs/run/jsx_import_source_pragma_with_config_vendor_dir/jsx/deno-jsx-precompile-skip.jsonc
new file mode 100644
index 000000000..3c9e4fa1f
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_with_config_vendor_dir/jsx/deno-jsx-precompile-skip.jsonc
@@ -0,0 +1,7 @@
+{
+ "compilerOptions": {
+ "jsx": "precompile",
+ "jsxImportSource": "jsx-precompile",
+ "jsxPrecompileSkipElements": ["a", "img"]
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_pragma_with_config_vendor_dir/jsx/deno-jsx-precompile.jsonc b/tests/specs/run/jsx_import_source_pragma_with_config_vendor_dir/jsx/deno-jsx-precompile.jsonc
new file mode 100644
index 000000000..95ae1b9f3
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_with_config_vendor_dir/jsx/deno-jsx-precompile.jsonc
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "precompile",
+ "jsxImportSource": "jsx-precompile"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_pragma_with_config_vendor_dir/jsx/deno-jsx.json b/tests/specs/run/jsx_import_source_pragma_with_config_vendor_dir/jsx/deno-jsx.json
new file mode 100644
index 000000000..311409ea3
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_with_config_vendor_dir/jsx/deno-jsx.json
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "react-jsx",
+ "jsxImportSource": "http://localhost:4545/jsx"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_pragma_with_config_vendor_dir/jsx/deno-jsx.jsonc b/tests/specs/run/jsx_import_source_pragma_with_config_vendor_dir/jsx/deno-jsx.jsonc
new file mode 100644
index 000000000..311409ea3
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_with_config_vendor_dir/jsx/deno-jsx.jsonc
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "react-jsx",
+ "jsxImportSource": "http://localhost:4545/jsx"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_pragma_with_config_vendor_dir/jsx/deno-jsxdev-import-map.jsonc b/tests/specs/run/jsx_import_source_pragma_with_config_vendor_dir/jsx/deno-jsxdev-import-map.jsonc
new file mode 100644
index 000000000..7481d5a2d
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_with_config_vendor_dir/jsx/deno-jsxdev-import-map.jsonc
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "react-jsxdev",
+ "jsxImportSource": "jsx"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_pragma_with_config_vendor_dir/jsx/deno-jsxdev.jsonc b/tests/specs/run/jsx_import_source_pragma_with_config_vendor_dir/jsx/deno-jsxdev.jsonc
new file mode 100644
index 000000000..ae5bdf9f1
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_with_config_vendor_dir/jsx/deno-jsxdev.jsonc
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "react-jsxdev",
+ "jsxImportSource": "http://localhost:4545/jsx"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_pragma_with_config_vendor_dir/jsx/deno.lock b/tests/specs/run/jsx_import_source_pragma_with_config_vendor_dir/jsx/deno.lock
new file mode 100644
index 000000000..011e8fe10
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_with_config_vendor_dir/jsx/deno.lock
@@ -0,0 +1,6 @@
+{
+ "version": "2",
+ "remote": {
+ "http://localhost:4545/jsx/jsx-dev-runtime/index.ts": "183c5bf1cfb82b15fc1e8cca15593d4816035759532d851abd4476df378c8412"
+ }
+} \ No newline at end of file
diff --git a/tests/specs/run/jsx_import_source_pragma_with_config_vendor_dir/jsx/import-map-scoped.json b/tests/specs/run/jsx_import_source_pragma_with_config_vendor_dir/jsx/import-map-scoped.json
new file mode 100644
index 000000000..9b2005128
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_with_config_vendor_dir/jsx/import-map-scoped.json
@@ -0,0 +1,8 @@
+{
+ "scopes": {
+ "../subdir/": {
+ "jsx/jsx-runtime": "http://localhost:4545/jsx/jsx-runtime/index.ts",
+ "jsx/jsx-dev-runtime": "http://localhost:4545/jsx/jsx-dev-runtime/index.ts"
+ }
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_pragma_with_config_vendor_dir/jsx/import-map.json b/tests/specs/run/jsx_import_source_pragma_with_config_vendor_dir/jsx/import-map.json
new file mode 100644
index 000000000..1bfa04e2f
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_with_config_vendor_dir/jsx/import-map.json
@@ -0,0 +1,7 @@
+{
+ "imports": {
+ "jsx/jsx-runtime": "http://localhost:4545/jsx/jsx-runtime/index.ts",
+ "jsx/jsx-dev-runtime": "http://localhost:4545/jsx/jsx-dev-runtime/index.ts",
+ "jsx-precompile/jsx-runtime": "http://localhost:4545/jsx/jsx-precompile/index.ts"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_pragma_with_config_vendor_dir/jsx/jsx-dev-runtime/index.ts b/tests/specs/run/jsx_import_source_pragma_with_config_vendor_dir/jsx/jsx-dev-runtime/index.ts
new file mode 100644
index 000000000..15e2029c8
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_with_config_vendor_dir/jsx/jsx-dev-runtime/index.ts
@@ -0,0 +1,12 @@
+// deno-lint-ignore-file no-explicit-any
+export function jsx(
+ _type: any,
+ _props: any,
+ _key: any,
+ _source: any,
+ _self: any,
+) {}
+export const jsxs = jsx;
+export const jsxDEV = jsx;
+export const Fragment = Symbol("Fragment");
+console.log("imported", import.meta.url);
diff --git a/tests/specs/run/jsx_import_source_pragma_with_config_vendor_dir/jsx/jsx-precompile/index.ts b/tests/specs/run/jsx_import_source_pragma_with_config_vendor_dir/jsx/jsx-precompile/index.ts
new file mode 100644
index 000000000..0d56095e0
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_with_config_vendor_dir/jsx/jsx-precompile/index.ts
@@ -0,0 +1,23 @@
+// deno-lint-ignore-file no-explicit-any
+export function jsx(
+ _type: any,
+ _props: any,
+ _key: any,
+ _source: any,
+ _self: any,
+) {}
+// deno-lint-ignore-file no-explicit-any
+export const jsxAttr = (name: string, value: any) => `${name}="${value}"`;
+// deno-lint-ignore-file no-explicit-any
+export const jsxTemplate = (_template: string[], ..._exprs: any[]) => "";
+// deno-lint-ignore-file no-explicit-any
+export const jsxEscape = (_value: any) => "";
+console.log("imported", import.meta.url);
+
+declare global {
+ namespace JSX {
+ interface IntrinsicElements {
+ [tagName: string]: Record<string, any>;
+ }
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_pragma_with_config_vendor_dir/jsx/jsx-runtime/index.ts b/tests/specs/run/jsx_import_source_pragma_with_config_vendor_dir/jsx/jsx-runtime/index.ts
new file mode 100644
index 000000000..15e2029c8
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_with_config_vendor_dir/jsx/jsx-runtime/index.ts
@@ -0,0 +1,12 @@
+// deno-lint-ignore-file no-explicit-any
+export function jsx(
+ _type: any,
+ _props: any,
+ _key: any,
+ _source: any,
+ _self: any,
+) {}
+export const jsxs = jsx;
+export const jsxDEV = jsx;
+export const Fragment = Symbol("Fragment");
+console.log("imported", import.meta.url);
diff --git a/tests/specs/run/jsx_import_source_pragma_with_config_vendor_dir/jsx/vendor/http_localhost_4545/jsx/#jsx-runtime_62ac8.js b/tests/specs/run/jsx_import_source_pragma_with_config_vendor_dir/jsx/vendor/http_localhost_4545/jsx/#jsx-runtime_62ac8.js
new file mode 100644
index 000000000..c8f0a908d
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_with_config_vendor_dir/jsx/vendor/http_localhost_4545/jsx/#jsx-runtime_62ac8.js
@@ -0,0 +1,11 @@
+export function jsx(
+ _type,
+ _props,
+ _key,
+ _source,
+ _self,
+) {}
+export const jsxs = jsx;
+export const jsxDEV = jsx;
+export const Fragment = Symbol("Fragment");
+console.log("imported", import.meta.url);
diff --git a/tests/specs/run/jsx_import_source_pragma_with_config_vendor_dir/jsx/vendor/manifest.json b/tests/specs/run/jsx_import_source_pragma_with_config_vendor_dir/jsx/vendor/manifest.json
new file mode 100644
index 000000000..a770c3366
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_with_config_vendor_dir/jsx/vendor/manifest.json
@@ -0,0 +1,9 @@
+{
+ "modules": {
+ "http://localhost:4545/jsx/jsx-runtime": {
+ "headers": {
+ "content-type": "application/javascript"
+ }
+ }
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_pragma_with_config_vendor_dir/jsx_import_source.out b/tests/specs/run/jsx_import_source_pragma_with_config_vendor_dir/jsx_import_source.out
new file mode 100644
index 000000000..b9555987a
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_with_config_vendor_dir/jsx_import_source.out
@@ -0,0 +1,2 @@
+[WILDCARD]
+imported http://localhost:4545/jsx/jsx-runtime
diff --git a/tests/specs/run/jsx_import_source_pragma_with_config_vendor_dir/jsx_import_source_pragma.tsx b/tests/specs/run/jsx_import_source_pragma_with_config_vendor_dir/jsx_import_source_pragma.tsx
new file mode 100644
index 000000000..c19e53d4f
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_with_config_vendor_dir/jsx_import_source_pragma.tsx
@@ -0,0 +1,9 @@
+/** @jsxImportSource http://localhost:4545/jsx */
+
+function A() {
+ return "hello";
+}
+
+export function B() {
+ return <A></A>;
+}
diff --git a/tests/specs/run/jsx_import_source_pragma_with_dev_config/__test__.jsonc b/tests/specs/run/jsx_import_source_pragma_with_dev_config/__test__.jsonc
new file mode 100644
index 000000000..56734e467
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_with_dev_config/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --reload --allow-import --config jsx/deno-jsxdev.jsonc --no-lock jsx_import_source_pragma.tsx",
+ "output": "jsx_import_source_dev.out"
+}
diff --git a/tests/specs/run/jsx_import_source_pragma_with_dev_config/jsx/deno-jsx-error.jsonc b/tests/specs/run/jsx_import_source_pragma_with_dev_config/jsx/deno-jsx-error.jsonc
new file mode 100644
index 000000000..37cb4dd91
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_with_dev_config/jsx/deno-jsx-error.jsonc
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "react-jsx",
+ "jsxImportSource": "./nonexistent"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_pragma_with_dev_config/jsx/deno-jsx-import-map.jsonc b/tests/specs/run/jsx_import_source_pragma_with_dev_config/jsx/deno-jsx-import-map.jsonc
new file mode 100644
index 000000000..5adbfa8b5
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_with_dev_config/jsx/deno-jsx-import-map.jsonc
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "react-jsx",
+ "jsxImportSource": "jsx"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_pragma_with_dev_config/jsx/deno-jsx-precompile-skip.jsonc b/tests/specs/run/jsx_import_source_pragma_with_dev_config/jsx/deno-jsx-precompile-skip.jsonc
new file mode 100644
index 000000000..3c9e4fa1f
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_with_dev_config/jsx/deno-jsx-precompile-skip.jsonc
@@ -0,0 +1,7 @@
+{
+ "compilerOptions": {
+ "jsx": "precompile",
+ "jsxImportSource": "jsx-precompile",
+ "jsxPrecompileSkipElements": ["a", "img"]
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_pragma_with_dev_config/jsx/deno-jsx-precompile.jsonc b/tests/specs/run/jsx_import_source_pragma_with_dev_config/jsx/deno-jsx-precompile.jsonc
new file mode 100644
index 000000000..95ae1b9f3
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_with_dev_config/jsx/deno-jsx-precompile.jsonc
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "precompile",
+ "jsxImportSource": "jsx-precompile"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_pragma_with_dev_config/jsx/deno-jsx.json b/tests/specs/run/jsx_import_source_pragma_with_dev_config/jsx/deno-jsx.json
new file mode 100644
index 000000000..311409ea3
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_with_dev_config/jsx/deno-jsx.json
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "react-jsx",
+ "jsxImportSource": "http://localhost:4545/jsx"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_pragma_with_dev_config/jsx/deno-jsx.jsonc b/tests/specs/run/jsx_import_source_pragma_with_dev_config/jsx/deno-jsx.jsonc
new file mode 100644
index 000000000..311409ea3
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_with_dev_config/jsx/deno-jsx.jsonc
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "react-jsx",
+ "jsxImportSource": "http://localhost:4545/jsx"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_pragma_with_dev_config/jsx/deno-jsxdev-import-map.jsonc b/tests/specs/run/jsx_import_source_pragma_with_dev_config/jsx/deno-jsxdev-import-map.jsonc
new file mode 100644
index 000000000..7481d5a2d
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_with_dev_config/jsx/deno-jsxdev-import-map.jsonc
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "react-jsxdev",
+ "jsxImportSource": "jsx"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_pragma_with_dev_config/jsx/deno-jsxdev.jsonc b/tests/specs/run/jsx_import_source_pragma_with_dev_config/jsx/deno-jsxdev.jsonc
new file mode 100644
index 000000000..ae5bdf9f1
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_with_dev_config/jsx/deno-jsxdev.jsonc
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "react-jsxdev",
+ "jsxImportSource": "http://localhost:4545/jsx"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_pragma_with_dev_config/jsx/deno.lock b/tests/specs/run/jsx_import_source_pragma_with_dev_config/jsx/deno.lock
new file mode 100644
index 000000000..011e8fe10
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_with_dev_config/jsx/deno.lock
@@ -0,0 +1,6 @@
+{
+ "version": "2",
+ "remote": {
+ "http://localhost:4545/jsx/jsx-dev-runtime/index.ts": "183c5bf1cfb82b15fc1e8cca15593d4816035759532d851abd4476df378c8412"
+ }
+} \ No newline at end of file
diff --git a/tests/specs/run/jsx_import_source_pragma_with_dev_config/jsx/import-map-scoped.json b/tests/specs/run/jsx_import_source_pragma_with_dev_config/jsx/import-map-scoped.json
new file mode 100644
index 000000000..9b2005128
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_with_dev_config/jsx/import-map-scoped.json
@@ -0,0 +1,8 @@
+{
+ "scopes": {
+ "../subdir/": {
+ "jsx/jsx-runtime": "http://localhost:4545/jsx/jsx-runtime/index.ts",
+ "jsx/jsx-dev-runtime": "http://localhost:4545/jsx/jsx-dev-runtime/index.ts"
+ }
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_pragma_with_dev_config/jsx/import-map.json b/tests/specs/run/jsx_import_source_pragma_with_dev_config/jsx/import-map.json
new file mode 100644
index 000000000..1bfa04e2f
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_with_dev_config/jsx/import-map.json
@@ -0,0 +1,7 @@
+{
+ "imports": {
+ "jsx/jsx-runtime": "http://localhost:4545/jsx/jsx-runtime/index.ts",
+ "jsx/jsx-dev-runtime": "http://localhost:4545/jsx/jsx-dev-runtime/index.ts",
+ "jsx-precompile/jsx-runtime": "http://localhost:4545/jsx/jsx-precompile/index.ts"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_pragma_with_dev_config/jsx/jsx-dev-runtime/index.ts b/tests/specs/run/jsx_import_source_pragma_with_dev_config/jsx/jsx-dev-runtime/index.ts
new file mode 100644
index 000000000..15e2029c8
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_with_dev_config/jsx/jsx-dev-runtime/index.ts
@@ -0,0 +1,12 @@
+// deno-lint-ignore-file no-explicit-any
+export function jsx(
+ _type: any,
+ _props: any,
+ _key: any,
+ _source: any,
+ _self: any,
+) {}
+export const jsxs = jsx;
+export const jsxDEV = jsx;
+export const Fragment = Symbol("Fragment");
+console.log("imported", import.meta.url);
diff --git a/tests/specs/run/jsx_import_source_pragma_with_dev_config/jsx/jsx-precompile/index.ts b/tests/specs/run/jsx_import_source_pragma_with_dev_config/jsx/jsx-precompile/index.ts
new file mode 100644
index 000000000..0d56095e0
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_with_dev_config/jsx/jsx-precompile/index.ts
@@ -0,0 +1,23 @@
+// deno-lint-ignore-file no-explicit-any
+export function jsx(
+ _type: any,
+ _props: any,
+ _key: any,
+ _source: any,
+ _self: any,
+) {}
+// deno-lint-ignore-file no-explicit-any
+export const jsxAttr = (name: string, value: any) => `${name}="${value}"`;
+// deno-lint-ignore-file no-explicit-any
+export const jsxTemplate = (_template: string[], ..._exprs: any[]) => "";
+// deno-lint-ignore-file no-explicit-any
+export const jsxEscape = (_value: any) => "";
+console.log("imported", import.meta.url);
+
+declare global {
+ namespace JSX {
+ interface IntrinsicElements {
+ [tagName: string]: Record<string, any>;
+ }
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_pragma_with_dev_config/jsx/jsx-runtime/index.ts b/tests/specs/run/jsx_import_source_pragma_with_dev_config/jsx/jsx-runtime/index.ts
new file mode 100644
index 000000000..15e2029c8
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_with_dev_config/jsx/jsx-runtime/index.ts
@@ -0,0 +1,12 @@
+// deno-lint-ignore-file no-explicit-any
+export function jsx(
+ _type: any,
+ _props: any,
+ _key: any,
+ _source: any,
+ _self: any,
+) {}
+export const jsxs = jsx;
+export const jsxDEV = jsx;
+export const Fragment = Symbol("Fragment");
+console.log("imported", import.meta.url);
diff --git a/tests/specs/run/jsx_import_source_pragma_with_dev_config/jsx_import_source_dev.out b/tests/specs/run/jsx_import_source_pragma_with_dev_config/jsx_import_source_dev.out
new file mode 100644
index 000000000..38d7a12f0
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_with_dev_config/jsx_import_source_dev.out
@@ -0,0 +1,2 @@
+[WILDCARD]
+imported http://localhost:4545/jsx/jsx-dev-runtime
diff --git a/tests/specs/run/jsx_import_source_pragma_with_dev_config/jsx_import_source_pragma.tsx b/tests/specs/run/jsx_import_source_pragma_with_dev_config/jsx_import_source_pragma.tsx
new file mode 100644
index 000000000..c19e53d4f
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_pragma_with_dev_config/jsx_import_source_pragma.tsx
@@ -0,0 +1,9 @@
+/** @jsxImportSource http://localhost:4545/jsx */
+
+function A() {
+ return "hello";
+}
+
+export function B() {
+ return <A></A>;
+}
diff --git a/tests/specs/run/jsx_import_source_precompile_import_map/__test__.jsonc b/tests/specs/run/jsx_import_source_precompile_import_map/__test__.jsonc
new file mode 100644
index 000000000..c795a9d8e
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_precompile_import_map/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --allow-import --reload --check --import-map jsx/import-map.json --no-lock --config jsx/deno-jsx-precompile.jsonc jsx_precompile/no_pragma.tsx",
+ "output": "jsx_precompile/no_pragma.out"
+}
diff --git a/tests/specs/run/jsx_import_source_precompile_import_map/jsx/deno-jsx-error.jsonc b/tests/specs/run/jsx_import_source_precompile_import_map/jsx/deno-jsx-error.jsonc
new file mode 100644
index 000000000..37cb4dd91
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_precompile_import_map/jsx/deno-jsx-error.jsonc
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "react-jsx",
+ "jsxImportSource": "./nonexistent"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_precompile_import_map/jsx/deno-jsx-import-map.jsonc b/tests/specs/run/jsx_import_source_precompile_import_map/jsx/deno-jsx-import-map.jsonc
new file mode 100644
index 000000000..5adbfa8b5
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_precompile_import_map/jsx/deno-jsx-import-map.jsonc
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "react-jsx",
+ "jsxImportSource": "jsx"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_precompile_import_map/jsx/deno-jsx-precompile-skip.jsonc b/tests/specs/run/jsx_import_source_precompile_import_map/jsx/deno-jsx-precompile-skip.jsonc
new file mode 100644
index 000000000..3c9e4fa1f
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_precompile_import_map/jsx/deno-jsx-precompile-skip.jsonc
@@ -0,0 +1,7 @@
+{
+ "compilerOptions": {
+ "jsx": "precompile",
+ "jsxImportSource": "jsx-precompile",
+ "jsxPrecompileSkipElements": ["a", "img"]
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_precompile_import_map/jsx/deno-jsx-precompile.jsonc b/tests/specs/run/jsx_import_source_precompile_import_map/jsx/deno-jsx-precompile.jsonc
new file mode 100644
index 000000000..95ae1b9f3
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_precompile_import_map/jsx/deno-jsx-precompile.jsonc
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "precompile",
+ "jsxImportSource": "jsx-precompile"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_precompile_import_map/jsx/deno-jsx.json b/tests/specs/run/jsx_import_source_precompile_import_map/jsx/deno-jsx.json
new file mode 100644
index 000000000..311409ea3
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_precompile_import_map/jsx/deno-jsx.json
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "react-jsx",
+ "jsxImportSource": "http://localhost:4545/jsx"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_precompile_import_map/jsx/deno-jsx.jsonc b/tests/specs/run/jsx_import_source_precompile_import_map/jsx/deno-jsx.jsonc
new file mode 100644
index 000000000..311409ea3
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_precompile_import_map/jsx/deno-jsx.jsonc
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "react-jsx",
+ "jsxImportSource": "http://localhost:4545/jsx"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_precompile_import_map/jsx/deno-jsxdev-import-map.jsonc b/tests/specs/run/jsx_import_source_precompile_import_map/jsx/deno-jsxdev-import-map.jsonc
new file mode 100644
index 000000000..7481d5a2d
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_precompile_import_map/jsx/deno-jsxdev-import-map.jsonc
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "react-jsxdev",
+ "jsxImportSource": "jsx"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_precompile_import_map/jsx/deno-jsxdev.jsonc b/tests/specs/run/jsx_import_source_precompile_import_map/jsx/deno-jsxdev.jsonc
new file mode 100644
index 000000000..ae5bdf9f1
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_precompile_import_map/jsx/deno-jsxdev.jsonc
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "react-jsxdev",
+ "jsxImportSource": "http://localhost:4545/jsx"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_precompile_import_map/jsx/deno.lock b/tests/specs/run/jsx_import_source_precompile_import_map/jsx/deno.lock
new file mode 100644
index 000000000..011e8fe10
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_precompile_import_map/jsx/deno.lock
@@ -0,0 +1,6 @@
+{
+ "version": "2",
+ "remote": {
+ "http://localhost:4545/jsx/jsx-dev-runtime/index.ts": "183c5bf1cfb82b15fc1e8cca15593d4816035759532d851abd4476df378c8412"
+ }
+} \ No newline at end of file
diff --git a/tests/specs/run/jsx_import_source_precompile_import_map/jsx/import-map-scoped.json b/tests/specs/run/jsx_import_source_precompile_import_map/jsx/import-map-scoped.json
new file mode 100644
index 000000000..9b2005128
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_precompile_import_map/jsx/import-map-scoped.json
@@ -0,0 +1,8 @@
+{
+ "scopes": {
+ "../subdir/": {
+ "jsx/jsx-runtime": "http://localhost:4545/jsx/jsx-runtime/index.ts",
+ "jsx/jsx-dev-runtime": "http://localhost:4545/jsx/jsx-dev-runtime/index.ts"
+ }
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_precompile_import_map/jsx/import-map.json b/tests/specs/run/jsx_import_source_precompile_import_map/jsx/import-map.json
new file mode 100644
index 000000000..1bfa04e2f
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_precompile_import_map/jsx/import-map.json
@@ -0,0 +1,7 @@
+{
+ "imports": {
+ "jsx/jsx-runtime": "http://localhost:4545/jsx/jsx-runtime/index.ts",
+ "jsx/jsx-dev-runtime": "http://localhost:4545/jsx/jsx-dev-runtime/index.ts",
+ "jsx-precompile/jsx-runtime": "http://localhost:4545/jsx/jsx-precompile/index.ts"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_precompile_import_map/jsx/jsx-dev-runtime/index.ts b/tests/specs/run/jsx_import_source_precompile_import_map/jsx/jsx-dev-runtime/index.ts
new file mode 100644
index 000000000..15e2029c8
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_precompile_import_map/jsx/jsx-dev-runtime/index.ts
@@ -0,0 +1,12 @@
+// deno-lint-ignore-file no-explicit-any
+export function jsx(
+ _type: any,
+ _props: any,
+ _key: any,
+ _source: any,
+ _self: any,
+) {}
+export const jsxs = jsx;
+export const jsxDEV = jsx;
+export const Fragment = Symbol("Fragment");
+console.log("imported", import.meta.url);
diff --git a/tests/specs/run/jsx_import_source_precompile_import_map/jsx/jsx-precompile/index.ts b/tests/specs/run/jsx_import_source_precompile_import_map/jsx/jsx-precompile/index.ts
new file mode 100644
index 000000000..0d56095e0
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_precompile_import_map/jsx/jsx-precompile/index.ts
@@ -0,0 +1,23 @@
+// deno-lint-ignore-file no-explicit-any
+export function jsx(
+ _type: any,
+ _props: any,
+ _key: any,
+ _source: any,
+ _self: any,
+) {}
+// deno-lint-ignore-file no-explicit-any
+export const jsxAttr = (name: string, value: any) => `${name}="${value}"`;
+// deno-lint-ignore-file no-explicit-any
+export const jsxTemplate = (_template: string[], ..._exprs: any[]) => "";
+// deno-lint-ignore-file no-explicit-any
+export const jsxEscape = (_value: any) => "";
+console.log("imported", import.meta.url);
+
+declare global {
+ namespace JSX {
+ interface IntrinsicElements {
+ [tagName: string]: Record<string, any>;
+ }
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_precompile_import_map/jsx/jsx-runtime/index.ts b/tests/specs/run/jsx_import_source_precompile_import_map/jsx/jsx-runtime/index.ts
new file mode 100644
index 000000000..15e2029c8
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_precompile_import_map/jsx/jsx-runtime/index.ts
@@ -0,0 +1,12 @@
+// deno-lint-ignore-file no-explicit-any
+export function jsx(
+ _type: any,
+ _props: any,
+ _key: any,
+ _source: any,
+ _self: any,
+) {}
+export const jsxs = jsx;
+export const jsxDEV = jsx;
+export const Fragment = Symbol("Fragment");
+console.log("imported", import.meta.url);
diff --git a/tests/specs/run/jsx_import_source_precompile_import_map/jsx_precompile/no_pragma.out b/tests/specs/run/jsx_import_source_precompile_import_map/jsx_precompile/no_pragma.out
new file mode 100644
index 000000000..f26984258
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_precompile_import_map/jsx_precompile/no_pragma.out
@@ -0,0 +1,3 @@
+Download http://localhost:4545/jsx/jsx-precompile/index.ts
+Check file:///[WILDCARD]/jsx_precompile/no_pragma.tsx
+imported http://localhost:4545/jsx/jsx-precompile/index.ts
diff --git a/tests/specs/run/jsx_import_source_precompile_import_map/jsx_precompile/no_pragma.tsx b/tests/specs/run/jsx_import_source_precompile_import_map/jsx_precompile/no_pragma.tsx
new file mode 100644
index 000000000..7ba21d80d
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_precompile_import_map/jsx_precompile/no_pragma.tsx
@@ -0,0 +1,3 @@
+export function A() {
+ return <h1>hello</h1>;
+}
diff --git a/tests/specs/run/jsx_import_source_precompile_import_map/jsx_precompile/skip.out b/tests/specs/run/jsx_import_source_precompile_import_map/jsx_precompile/skip.out
new file mode 100644
index 000000000..a32b616f0
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_precompile_import_map/jsx_precompile/skip.out
@@ -0,0 +1,3 @@
+Download http://localhost:4545/jsx/jsx-precompile/index.ts
+Check file:///[WILDCARD]/run/jsx_precompile/skip.tsx
+imported http://localhost:4545/jsx/jsx-precompile/index.ts
diff --git a/tests/specs/run/jsx_import_source_precompile_import_map/jsx_precompile/skip.tsx b/tests/specs/run/jsx_import_source_precompile_import_map/jsx_precompile/skip.tsx
new file mode 100644
index 000000000..49bc4e2b7
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_precompile_import_map/jsx_precompile/skip.tsx
@@ -0,0 +1,9 @@
+export function A() {
+ return (
+ <div>
+ <a href="#">foo</a>
+ <p>hello</p>
+ <img src="#" alt="" />
+ </div>
+ );
+}
diff --git a/tests/specs/run/jsx_import_source_precompile_import_map_skip_element/__test__.jsonc b/tests/specs/run/jsx_import_source_precompile_import_map_skip_element/__test__.jsonc
new file mode 100644
index 000000000..7163c83d0
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_precompile_import_map_skip_element/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --allow-import --reload --check --import-map jsx/import-map.json --no-lock --config jsx/deno-jsx-precompile-skip.jsonc jsx_precompile/skip.tsx",
+ "output": "jsx_precompile/skip.out"
+}
diff --git a/tests/specs/run/jsx_import_source_precompile_import_map_skip_element/jsx/deno-jsx-error.jsonc b/tests/specs/run/jsx_import_source_precompile_import_map_skip_element/jsx/deno-jsx-error.jsonc
new file mode 100644
index 000000000..37cb4dd91
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_precompile_import_map_skip_element/jsx/deno-jsx-error.jsonc
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "react-jsx",
+ "jsxImportSource": "./nonexistent"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_precompile_import_map_skip_element/jsx/deno-jsx-import-map.jsonc b/tests/specs/run/jsx_import_source_precompile_import_map_skip_element/jsx/deno-jsx-import-map.jsonc
new file mode 100644
index 000000000..5adbfa8b5
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_precompile_import_map_skip_element/jsx/deno-jsx-import-map.jsonc
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "react-jsx",
+ "jsxImportSource": "jsx"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_precompile_import_map_skip_element/jsx/deno-jsx-precompile-skip.jsonc b/tests/specs/run/jsx_import_source_precompile_import_map_skip_element/jsx/deno-jsx-precompile-skip.jsonc
new file mode 100644
index 000000000..3c9e4fa1f
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_precompile_import_map_skip_element/jsx/deno-jsx-precompile-skip.jsonc
@@ -0,0 +1,7 @@
+{
+ "compilerOptions": {
+ "jsx": "precompile",
+ "jsxImportSource": "jsx-precompile",
+ "jsxPrecompileSkipElements": ["a", "img"]
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_precompile_import_map_skip_element/jsx/deno-jsx-precompile.jsonc b/tests/specs/run/jsx_import_source_precompile_import_map_skip_element/jsx/deno-jsx-precompile.jsonc
new file mode 100644
index 000000000..95ae1b9f3
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_precompile_import_map_skip_element/jsx/deno-jsx-precompile.jsonc
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "precompile",
+ "jsxImportSource": "jsx-precompile"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_precompile_import_map_skip_element/jsx/deno-jsx.json b/tests/specs/run/jsx_import_source_precompile_import_map_skip_element/jsx/deno-jsx.json
new file mode 100644
index 000000000..311409ea3
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_precompile_import_map_skip_element/jsx/deno-jsx.json
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "react-jsx",
+ "jsxImportSource": "http://localhost:4545/jsx"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_precompile_import_map_skip_element/jsx/deno-jsx.jsonc b/tests/specs/run/jsx_import_source_precompile_import_map_skip_element/jsx/deno-jsx.jsonc
new file mode 100644
index 000000000..311409ea3
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_precompile_import_map_skip_element/jsx/deno-jsx.jsonc
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "react-jsx",
+ "jsxImportSource": "http://localhost:4545/jsx"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_precompile_import_map_skip_element/jsx/deno-jsxdev-import-map.jsonc b/tests/specs/run/jsx_import_source_precompile_import_map_skip_element/jsx/deno-jsxdev-import-map.jsonc
new file mode 100644
index 000000000..7481d5a2d
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_precompile_import_map_skip_element/jsx/deno-jsxdev-import-map.jsonc
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "react-jsxdev",
+ "jsxImportSource": "jsx"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_precompile_import_map_skip_element/jsx/deno-jsxdev.jsonc b/tests/specs/run/jsx_import_source_precompile_import_map_skip_element/jsx/deno-jsxdev.jsonc
new file mode 100644
index 000000000..ae5bdf9f1
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_precompile_import_map_skip_element/jsx/deno-jsxdev.jsonc
@@ -0,0 +1,6 @@
+{
+ "compilerOptions": {
+ "jsx": "react-jsxdev",
+ "jsxImportSource": "http://localhost:4545/jsx"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_precompile_import_map_skip_element/jsx/deno.lock b/tests/specs/run/jsx_import_source_precompile_import_map_skip_element/jsx/deno.lock
new file mode 100644
index 000000000..011e8fe10
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_precompile_import_map_skip_element/jsx/deno.lock
@@ -0,0 +1,6 @@
+{
+ "version": "2",
+ "remote": {
+ "http://localhost:4545/jsx/jsx-dev-runtime/index.ts": "183c5bf1cfb82b15fc1e8cca15593d4816035759532d851abd4476df378c8412"
+ }
+} \ No newline at end of file
diff --git a/tests/specs/run/jsx_import_source_precompile_import_map_skip_element/jsx/import-map-scoped.json b/tests/specs/run/jsx_import_source_precompile_import_map_skip_element/jsx/import-map-scoped.json
new file mode 100644
index 000000000..9b2005128
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_precompile_import_map_skip_element/jsx/import-map-scoped.json
@@ -0,0 +1,8 @@
+{
+ "scopes": {
+ "../subdir/": {
+ "jsx/jsx-runtime": "http://localhost:4545/jsx/jsx-runtime/index.ts",
+ "jsx/jsx-dev-runtime": "http://localhost:4545/jsx/jsx-dev-runtime/index.ts"
+ }
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_precompile_import_map_skip_element/jsx/import-map.json b/tests/specs/run/jsx_import_source_precompile_import_map_skip_element/jsx/import-map.json
new file mode 100644
index 000000000..1bfa04e2f
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_precompile_import_map_skip_element/jsx/import-map.json
@@ -0,0 +1,7 @@
+{
+ "imports": {
+ "jsx/jsx-runtime": "http://localhost:4545/jsx/jsx-runtime/index.ts",
+ "jsx/jsx-dev-runtime": "http://localhost:4545/jsx/jsx-dev-runtime/index.ts",
+ "jsx-precompile/jsx-runtime": "http://localhost:4545/jsx/jsx-precompile/index.ts"
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_precompile_import_map_skip_element/jsx/jsx-dev-runtime/index.ts b/tests/specs/run/jsx_import_source_precompile_import_map_skip_element/jsx/jsx-dev-runtime/index.ts
new file mode 100644
index 000000000..15e2029c8
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_precompile_import_map_skip_element/jsx/jsx-dev-runtime/index.ts
@@ -0,0 +1,12 @@
+// deno-lint-ignore-file no-explicit-any
+export function jsx(
+ _type: any,
+ _props: any,
+ _key: any,
+ _source: any,
+ _self: any,
+) {}
+export const jsxs = jsx;
+export const jsxDEV = jsx;
+export const Fragment = Symbol("Fragment");
+console.log("imported", import.meta.url);
diff --git a/tests/specs/run/jsx_import_source_precompile_import_map_skip_element/jsx/jsx-precompile/index.ts b/tests/specs/run/jsx_import_source_precompile_import_map_skip_element/jsx/jsx-precompile/index.ts
new file mode 100644
index 000000000..0d56095e0
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_precompile_import_map_skip_element/jsx/jsx-precompile/index.ts
@@ -0,0 +1,23 @@
+// deno-lint-ignore-file no-explicit-any
+export function jsx(
+ _type: any,
+ _props: any,
+ _key: any,
+ _source: any,
+ _self: any,
+) {}
+// deno-lint-ignore-file no-explicit-any
+export const jsxAttr = (name: string, value: any) => `${name}="${value}"`;
+// deno-lint-ignore-file no-explicit-any
+export const jsxTemplate = (_template: string[], ..._exprs: any[]) => "";
+// deno-lint-ignore-file no-explicit-any
+export const jsxEscape = (_value: any) => "";
+console.log("imported", import.meta.url);
+
+declare global {
+ namespace JSX {
+ interface IntrinsicElements {
+ [tagName: string]: Record<string, any>;
+ }
+ }
+}
diff --git a/tests/specs/run/jsx_import_source_precompile_import_map_skip_element/jsx/jsx-runtime/index.ts b/tests/specs/run/jsx_import_source_precompile_import_map_skip_element/jsx/jsx-runtime/index.ts
new file mode 100644
index 000000000..15e2029c8
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_precompile_import_map_skip_element/jsx/jsx-runtime/index.ts
@@ -0,0 +1,12 @@
+// deno-lint-ignore-file no-explicit-any
+export function jsx(
+ _type: any,
+ _props: any,
+ _key: any,
+ _source: any,
+ _self: any,
+) {}
+export const jsxs = jsx;
+export const jsxDEV = jsx;
+export const Fragment = Symbol("Fragment");
+console.log("imported", import.meta.url);
diff --git a/tests/specs/run/jsx_import_source_precompile_import_map_skip_element/jsx_precompile/no_pragma.out b/tests/specs/run/jsx_import_source_precompile_import_map_skip_element/jsx_precompile/no_pragma.out
new file mode 100644
index 000000000..f26984258
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_precompile_import_map_skip_element/jsx_precompile/no_pragma.out
@@ -0,0 +1,3 @@
+Download http://localhost:4545/jsx/jsx-precompile/index.ts
+Check file:///[WILDCARD]/jsx_precompile/no_pragma.tsx
+imported http://localhost:4545/jsx/jsx-precompile/index.ts
diff --git a/tests/specs/run/jsx_import_source_precompile_import_map_skip_element/jsx_precompile/no_pragma.tsx b/tests/specs/run/jsx_import_source_precompile_import_map_skip_element/jsx_precompile/no_pragma.tsx
new file mode 100644
index 000000000..7ba21d80d
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_precompile_import_map_skip_element/jsx_precompile/no_pragma.tsx
@@ -0,0 +1,3 @@
+export function A() {
+ return <h1>hello</h1>;
+}
diff --git a/tests/specs/run/jsx_import_source_precompile_import_map_skip_element/jsx_precompile/skip.out b/tests/specs/run/jsx_import_source_precompile_import_map_skip_element/jsx_precompile/skip.out
new file mode 100644
index 000000000..6696c550c
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_precompile_import_map_skip_element/jsx_precompile/skip.out
@@ -0,0 +1,3 @@
+Download http://localhost:4545/jsx/jsx-precompile/index.ts
+Check file:///[WILDCARD]/jsx_precompile/skip.tsx
+imported http://localhost:4545/jsx/jsx-precompile/index.ts
diff --git a/tests/specs/run/jsx_import_source_precompile_import_map_skip_element/jsx_precompile/skip.tsx b/tests/specs/run/jsx_import_source_precompile_import_map_skip_element/jsx_precompile/skip.tsx
new file mode 100644
index 000000000..49bc4e2b7
--- /dev/null
+++ b/tests/specs/run/jsx_import_source_precompile_import_map_skip_element/jsx_precompile/skip.tsx
@@ -0,0 +1,9 @@
+export function A() {
+ return (
+ <div>
+ <a href="#">foo</a>
+ <p>hello</p>
+ <img src="#" alt="" />
+ </div>
+ );
+}
diff --git a/tests/specs/run/lock_check_ok/003_relative_import.ts b/tests/specs/run/lock_check_ok/003_relative_import.ts
new file mode 100644
index 000000000..d392f4a5d
--- /dev/null
+++ b/tests/specs/run/lock_check_ok/003_relative_import.ts
@@ -0,0 +1,3 @@
+import { printHello } from "./print_hello.ts";
+
+printHello();
diff --git a/tests/specs/run/lock_check_ok/003_relative_import.ts.out b/tests/specs/run/lock_check_ok/003_relative_import.ts.out
new file mode 100644
index 000000000..e965047ad
--- /dev/null
+++ b/tests/specs/run/lock_check_ok/003_relative_import.ts.out
@@ -0,0 +1 @@
+Hello
diff --git a/tests/specs/run/lock_check_ok/__test__.jsonc b/tests/specs/run/lock_check_ok/__test__.jsonc
new file mode 100644
index 000000000..e8ce4572e
--- /dev/null
+++ b/tests/specs/run/lock_check_ok/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --quiet --allow-import --lock=lock_check_ok.json 003_relative_import.ts",
+ "output": "003_relative_import.ts.out"
+}
diff --git a/tests/specs/run/lock_check_ok/lock_check_ok.json b/tests/specs/run/lock_check_ok/lock_check_ok.json
new file mode 100644
index 000000000..20f7e2000
--- /dev/null
+++ b/tests/specs/run/lock_check_ok/lock_check_ok.json
@@ -0,0 +1,4 @@
+{
+ "http://127.0.0.1:4545/print_hello.ts": "fa6692c8f9ff3fb107e773c3ece5274e9d08be282867a1e3ded1d9c00fcaa63c",
+ "http://127.0.0.1:4545/003_relative_import.ts": "a1572e8fd2c2712b33f04aed2561505b5feb2c8696f1f2cded3de7127931b97e"
+}
diff --git a/tests/specs/run/lock_check_ok/print_hello.ts b/tests/specs/run/lock_check_ok/print_hello.ts
new file mode 100644
index 000000000..b9c0ad527
--- /dev/null
+++ b/tests/specs/run/lock_check_ok/print_hello.ts
@@ -0,0 +1,3 @@
+export function printHello() {
+ console.log("Hello");
+}
diff --git a/tests/specs/run/lock_check_ok2/019_media_types.ts b/tests/specs/run/lock_check_ok2/019_media_types.ts
new file mode 100644
index 000000000..d985bd249
--- /dev/null
+++ b/tests/specs/run/lock_check_ok2/019_media_types.ts
@@ -0,0 +1,24 @@
+// When run against the test HTTP server, it will serve different media types
+// based on the URL containing `.t#.` strings, which exercises the different
+// mapping of media types end to end.
+
+import { loaded as loadedTs1 } from "http://localhost:4545/subdir/mt_text_typescript.t1.ts";
+import { loaded as loadedTs2 } from "http://localhost:4545/subdir/mt_video_vdn.t2.ts";
+import { loaded as loadedTs3 } from "http://localhost:4545/subdir/mt_video_mp2t.t3.ts";
+import { loaded as loadedTs4 } from "http://localhost:4545/subdir/mt_application_x_typescript.t4.ts";
+import { loaded as loadedJs1 } from "http://localhost:4545/subdir/mt_text_javascript.j1.js";
+import { loaded as loadedJs2 } from "http://localhost:4545/subdir/mt_application_ecmascript.j2.js";
+import { loaded as loadedJs3 } from "http://localhost:4545/subdir/mt_text_ecmascript.j3.js";
+import { loaded as loadedJs4 } from "http://localhost:4545/subdir/mt_application_x_javascript.j4.js";
+
+console.log(
+ "success",
+ loadedTs1,
+ loadedTs2,
+ loadedTs3,
+ loadedTs4,
+ loadedJs1,
+ loadedJs2,
+ loadedJs3,
+ loadedJs4,
+);
diff --git a/tests/specs/run/lock_check_ok2/019_media_types.ts.out b/tests/specs/run/lock_check_ok2/019_media_types.ts.out
new file mode 100644
index 000000000..b3e94678c
--- /dev/null
+++ b/tests/specs/run/lock_check_ok2/019_media_types.ts.out
@@ -0,0 +1 @@
+[WILDCARD]success true true true true true true true true
diff --git a/tests/specs/run/lock_check_ok2/__test__.jsonc b/tests/specs/run/lock_check_ok2/__test__.jsonc
new file mode 100644
index 000000000..dc790528a
--- /dev/null
+++ b/tests/specs/run/lock_check_ok2/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --allow-import --lock=lock_check_ok2.json 019_media_types.ts",
+ "output": "019_media_types.ts.out"
+}
diff --git a/tests/specs/run/lock_check_ok2/lock_check_ok2.json b/tests/specs/run/lock_check_ok2/lock_check_ok2.json
new file mode 100644
index 000000000..55a6f9892
--- /dev/null
+++ b/tests/specs/run/lock_check_ok2/lock_check_ok2.json
@@ -0,0 +1,13 @@
+{
+ "version": "4",
+ "remote": {
+ "http://localhost:4545/subdir/mt_application_ecmascript.j2.js": "3a3e002e2f92dc8f045bd4a7c66b4791453ad0417b038dd2b2d9d0f277c44f18",
+ "http://localhost:4545/subdir/mt_application_x_javascript.j4.js": "3a3e002e2f92dc8f045bd4a7c66b4791453ad0417b038dd2b2d9d0f277c44f18",
+ "http://localhost:4545/subdir/mt_application_x_typescript.t4.ts": "3a3e002e2f92dc8f045bd4a7c66b4791453ad0417b038dd2b2d9d0f277c44f18",
+ "http://localhost:4545/subdir/mt_text_ecmascript.j3.js": "3a3e002e2f92dc8f045bd4a7c66b4791453ad0417b038dd2b2d9d0f277c44f18",
+ "http://localhost:4545/subdir/mt_text_javascript.j1.js": "3a3e002e2f92dc8f045bd4a7c66b4791453ad0417b038dd2b2d9d0f277c44f18",
+ "http://localhost:4545/subdir/mt_text_typescript.t1.ts": "3a3e002e2f92dc8f045bd4a7c66b4791453ad0417b038dd2b2d9d0f277c44f18",
+ "http://localhost:4545/subdir/mt_video_mp2t.t3.ts": "3a3e002e2f92dc8f045bd4a7c66b4791453ad0417b038dd2b2d9d0f277c44f18",
+ "http://localhost:4545/subdir/mt_video_vdn.t2.ts": "3a3e002e2f92dc8f045bd4a7c66b4791453ad0417b038dd2b2d9d0f277c44f18"
+ }
+}
diff --git a/tests/specs/run/lock_v2_check_ok/003_relative_import.ts b/tests/specs/run/lock_v2_check_ok/003_relative_import.ts
new file mode 100644
index 000000000..d392f4a5d
--- /dev/null
+++ b/tests/specs/run/lock_v2_check_ok/003_relative_import.ts
@@ -0,0 +1,3 @@
+import { printHello } from "./print_hello.ts";
+
+printHello();
diff --git a/tests/specs/run/lock_v2_check_ok/003_relative_import.ts.out b/tests/specs/run/lock_v2_check_ok/003_relative_import.ts.out
new file mode 100644
index 000000000..e965047ad
--- /dev/null
+++ b/tests/specs/run/lock_v2_check_ok/003_relative_import.ts.out
@@ -0,0 +1 @@
+Hello
diff --git a/tests/specs/run/lock_v2_check_ok/__test__.jsonc b/tests/specs/run/lock_v2_check_ok/__test__.jsonc
new file mode 100644
index 000000000..d7b819d56
--- /dev/null
+++ b/tests/specs/run/lock_v2_check_ok/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --allow-import --quiet --lock=lock_v2_check_ok.json 003_relative_import.ts",
+ "output": "003_relative_import.ts.out"
+}
diff --git a/tests/specs/run/lock_v2_check_ok/lock_v2_check_ok.json b/tests/specs/run/lock_v2_check_ok/lock_v2_check_ok.json
new file mode 100644
index 000000000..47a761fbd
--- /dev/null
+++ b/tests/specs/run/lock_v2_check_ok/lock_v2_check_ok.json
@@ -0,0 +1,7 @@
+{
+ "version": "2",
+ "remote": {
+ "http://127.0.0.1:4545/print_hello.ts": "fa6692c8f9ff3fb107e773c3ece5274e9d08be282867a1e3ded1d9c00fcaa63c",
+ "http://127.0.0.1:4545/003_relative_import.ts": "a1572e8fd2c2712b33f04aed2561505b5feb2c8696f1f2cded3de7127931b97e"
+ }
+}
diff --git a/tests/specs/run/lock_v2_check_ok/print_hello.ts b/tests/specs/run/lock_v2_check_ok/print_hello.ts
new file mode 100644
index 000000000..b9c0ad527
--- /dev/null
+++ b/tests/specs/run/lock_v2_check_ok/print_hello.ts
@@ -0,0 +1,3 @@
+export function printHello() {
+ console.log("Hello");
+}
diff --git a/tests/specs/run/lock_v2_check_ok2/019_media_types.ts b/tests/specs/run/lock_v2_check_ok2/019_media_types.ts
new file mode 100644
index 000000000..d985bd249
--- /dev/null
+++ b/tests/specs/run/lock_v2_check_ok2/019_media_types.ts
@@ -0,0 +1,24 @@
+// When run against the test HTTP server, it will serve different media types
+// based on the URL containing `.t#.` strings, which exercises the different
+// mapping of media types end to end.
+
+import { loaded as loadedTs1 } from "http://localhost:4545/subdir/mt_text_typescript.t1.ts";
+import { loaded as loadedTs2 } from "http://localhost:4545/subdir/mt_video_vdn.t2.ts";
+import { loaded as loadedTs3 } from "http://localhost:4545/subdir/mt_video_mp2t.t3.ts";
+import { loaded as loadedTs4 } from "http://localhost:4545/subdir/mt_application_x_typescript.t4.ts";
+import { loaded as loadedJs1 } from "http://localhost:4545/subdir/mt_text_javascript.j1.js";
+import { loaded as loadedJs2 } from "http://localhost:4545/subdir/mt_application_ecmascript.j2.js";
+import { loaded as loadedJs3 } from "http://localhost:4545/subdir/mt_text_ecmascript.j3.js";
+import { loaded as loadedJs4 } from "http://localhost:4545/subdir/mt_application_x_javascript.j4.js";
+
+console.log(
+ "success",
+ loadedTs1,
+ loadedTs2,
+ loadedTs3,
+ loadedTs4,
+ loadedJs1,
+ loadedJs2,
+ loadedJs3,
+ loadedJs4,
+);
diff --git a/tests/specs/run/lock_v2_check_ok2/019_media_types.ts.out b/tests/specs/run/lock_v2_check_ok2/019_media_types.ts.out
new file mode 100644
index 000000000..b3e94678c
--- /dev/null
+++ b/tests/specs/run/lock_v2_check_ok2/019_media_types.ts.out
@@ -0,0 +1 @@
+[WILDCARD]success true true true true true true true true
diff --git a/tests/specs/run/lock_v2_check_ok2/__test__.jsonc b/tests/specs/run/lock_v2_check_ok2/__test__.jsonc
new file mode 100644
index 000000000..a9430b4bc
--- /dev/null
+++ b/tests/specs/run/lock_v2_check_ok2/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --allow-import --lock=lock_v2_check_ok2.json 019_media_types.ts",
+ "output": "019_media_types.ts.out"
+}
diff --git a/tests/specs/run/lock_v2_check_ok2/lock_v2_check_ok2.json b/tests/specs/run/lock_v2_check_ok2/lock_v2_check_ok2.json
new file mode 100644
index 000000000..4356c9421
--- /dev/null
+++ b/tests/specs/run/lock_v2_check_ok2/lock_v2_check_ok2.json
@@ -0,0 +1,13 @@
+{
+ "version": "2",
+ "remote": {
+ "http://localhost:4545/subdir/mt_application_ecmascript.j2.js": "3a3e002e2f92dc8f045bd4a7c66b4791453ad0417b038dd2b2d9d0f277c44f18",
+ "http://localhost:4545/subdir/mt_application_x_javascript.j4.js": "3a3e002e2f92dc8f045bd4a7c66b4791453ad0417b038dd2b2d9d0f277c44f18",
+ "http://localhost:4545/subdir/mt_application_x_typescript.t4.ts": "3a3e002e2f92dc8f045bd4a7c66b4791453ad0417b038dd2b2d9d0f277c44f18",
+ "http://localhost:4545/subdir/mt_text_ecmascript.j3.js": "3a3e002e2f92dc8f045bd4a7c66b4791453ad0417b038dd2b2d9d0f277c44f18",
+ "http://localhost:4545/subdir/mt_text_javascript.j1.js": "3a3e002e2f92dc8f045bd4a7c66b4791453ad0417b038dd2b2d9d0f277c44f18",
+ "http://localhost:4545/subdir/mt_text_typescript.t1.ts": "3a3e002e2f92dc8f045bd4a7c66b4791453ad0417b038dd2b2d9d0f277c44f18",
+ "http://localhost:4545/subdir/mt_video_mp2t.t3.ts": "3a3e002e2f92dc8f045bd4a7c66b4791453ad0417b038dd2b2d9d0f277c44f18",
+ "http://localhost:4545/subdir/mt_video_vdn.t2.ts": "3a3e002e2f92dc8f045bd4a7c66b4791453ad0417b038dd2b2d9d0f277c44f18"
+ }
+}
diff --git a/tests/specs/run/long_data_url_formatting/__test__.jsonc b/tests/specs/run/long_data_url_formatting/__test__.jsonc
new file mode 100644
index 000000000..f7ae56c63
--- /dev/null
+++ b/tests/specs/run/long_data_url_formatting/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run long_data_url_formatting.ts",
+ "output": "long_data_url_formatting.ts.out",
+ "exitCode": 1
+}
diff --git a/tests/specs/run/long_data_url_formatting/long_data_url_formatting.ts b/tests/specs/run/long_data_url_formatting/long_data_url_formatting.ts
new file mode 100644
index 000000000..2ed2d5a03
--- /dev/null
+++ b/tests/specs/run/long_data_url_formatting/long_data_url_formatting.ts
@@ -0,0 +1,3 @@
+await import(
+ 'data:application/typescript,console.trace("foo"); const error = new Error("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"); console.log(error.stack); throw error;'
+);
diff --git a/tests/specs/run/long_data_url_formatting/long_data_url_formatting.ts.out b/tests/specs/run/long_data_url_formatting/long_data_url_formatting.ts.out
new file mode 100644
index 000000000..ea78c2591
--- /dev/null
+++ b/tests/specs/run/long_data_url_formatting/long_data_url_formatting.ts.out
@@ -0,0 +1,8 @@
+[WILDCARD]Trace: foo
+ at data:application/typescript,console.trace("foo")......stack); throw error;:1:9
+Error: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ at data:application/typescript,console.trace("foo")......stack); throw error;:1:37
+error: Uncaught (in promise) Error: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+console.trace("foo"); const error = new Error("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"); console.log(error.stack); throw error;
+ ^
+ at data:application/typescript,console.trace("foo")......stack); throw error;:1:37
diff --git a/tests/specs/run/main_module/__test__.jsonc b/tests/specs/run/main_module/__test__.jsonc
new file mode 100644
index 000000000..0d70eddbd
--- /dev/null
+++ b/tests/specs/run/main_module/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --quiet --reload main_module/main.ts",
+ "output": "main_module/main.out"
+}
diff --git a/tests/specs/run/main_module/main_module/main.out b/tests/specs/run/main_module/main_module/main.out
new file mode 100644
index 000000000..29f592c2a
--- /dev/null
+++ b/tests/specs/run/main_module/main_module/main.out
@@ -0,0 +1,2 @@
+other [WILDCARD]/main.ts
+main [WILDCARD]/main.ts
diff --git a/tests/specs/run/main_module/main_module/main.ts b/tests/specs/run/main_module/main_module/main.ts
new file mode 100644
index 000000000..d2f2c66ee
--- /dev/null
+++ b/tests/specs/run/main_module/main_module/main.ts
@@ -0,0 +1,3 @@
+console.log("main", Deno.mainModule);
+
+import "./other.ts";
diff --git a/tests/specs/run/main_module/main_module/other.ts b/tests/specs/run/main_module/main_module/other.ts
new file mode 100644
index 000000000..b3e524b0a
--- /dev/null
+++ b/tests/specs/run/main_module/main_module/other.ts
@@ -0,0 +1 @@
+console.log("other", Deno.mainModule);
diff --git a/tests/specs/run/mts_dmts_mjs/__test__.jsonc b/tests/specs/run/mts_dmts_mjs/__test__.jsonc
new file mode 100644
index 000000000..b50bb4b19
--- /dev/null
+++ b/tests/specs/run/mts_dmts_mjs/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run import.mts",
+ "output": "mts_dmts_mjs.out"
+}
diff --git a/tests/specs/run/mts_dmts_mjs/import.mts b/tests/specs/run/mts_dmts_mjs/import.mts
new file mode 100644
index 000000000..eeb200f59
--- /dev/null
+++ b/tests/specs/run/mts_dmts_mjs/import.mts
@@ -0,0 +1,4 @@
+import * as a from "./mod.mjs";
+import { type A } from "./types.d.mts";
+
+console.log(a.a as A);
diff --git a/tests/specs/run/mts_dmts_mjs/mod.mjs b/tests/specs/run/mts_dmts_mjs/mod.mjs
new file mode 100644
index 000000000..9233cce2f
--- /dev/null
+++ b/tests/specs/run/mts_dmts_mjs/mod.mjs
@@ -0,0 +1 @@
+export const a = "a";
diff --git a/tests/specs/run/mts_dmts_mjs/mts_dmts_mjs.out b/tests/specs/run/mts_dmts_mjs/mts_dmts_mjs.out
new file mode 100644
index 000000000..789819226
--- /dev/null
+++ b/tests/specs/run/mts_dmts_mjs/mts_dmts_mjs.out
@@ -0,0 +1 @@
+a
diff --git a/tests/specs/run/mts_dmts_mjs/types.d.mts b/tests/specs/run/mts_dmts_mjs/types.d.mts
new file mode 100644
index 000000000..28c282146
--- /dev/null
+++ b/tests/specs/run/mts_dmts_mjs/types.d.mts
@@ -0,0 +1 @@
+export type A = "a";
diff --git a/tests/specs/run/mts_dmts_mjs_no_check/__test__.jsonc b/tests/specs/run/mts_dmts_mjs_no_check/__test__.jsonc
new file mode 100644
index 000000000..0d36517bc
--- /dev/null
+++ b/tests/specs/run/mts_dmts_mjs_no_check/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --no-check import.mts",
+ "output": "mts_dmts_mjs.out"
+}
diff --git a/tests/specs/run/mts_dmts_mjs_no_check/import.mts b/tests/specs/run/mts_dmts_mjs_no_check/import.mts
new file mode 100644
index 000000000..eeb200f59
--- /dev/null
+++ b/tests/specs/run/mts_dmts_mjs_no_check/import.mts
@@ -0,0 +1,4 @@
+import * as a from "./mod.mjs";
+import { type A } from "./types.d.mts";
+
+console.log(a.a as A);
diff --git a/tests/specs/run/mts_dmts_mjs_no_check/mod.mjs b/tests/specs/run/mts_dmts_mjs_no_check/mod.mjs
new file mode 100644
index 000000000..9233cce2f
--- /dev/null
+++ b/tests/specs/run/mts_dmts_mjs_no_check/mod.mjs
@@ -0,0 +1 @@
+export const a = "a";
diff --git a/tests/specs/run/mts_dmts_mjs_no_check/mts_dmts_mjs.out b/tests/specs/run/mts_dmts_mjs_no_check/mts_dmts_mjs.out
new file mode 100644
index 000000000..789819226
--- /dev/null
+++ b/tests/specs/run/mts_dmts_mjs_no_check/mts_dmts_mjs.out
@@ -0,0 +1 @@
+a
diff --git a/tests/specs/run/mts_dmts_mjs_no_check/types.d.mts b/tests/specs/run/mts_dmts_mjs_no_check/types.d.mts
new file mode 100644
index 000000000..28c282146
--- /dev/null
+++ b/tests/specs/run/mts_dmts_mjs_no_check/types.d.mts
@@ -0,0 +1 @@
+export type A = "a";
diff --git a/tests/specs/run/nested_error/__test__.jsonc b/tests/specs/run/nested_error/__test__.jsonc
new file mode 100644
index 000000000..d167832ba
--- /dev/null
+++ b/tests/specs/run/nested_error/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run nested_error/main.ts",
+ "output": "nested_error/main.ts.out",
+ "exitCode": 1
+}
diff --git a/tests/specs/run/nested_error/nested_error/main.ts b/tests/specs/run/nested_error/nested_error/main.ts
new file mode 100644
index 000000000..69828e1ca
--- /dev/null
+++ b/tests/specs/run/nested_error/nested_error/main.ts
@@ -0,0 +1,3 @@
+throw {
+ foo: new Error(),
+};
diff --git a/tests/specs/run/nested_error/nested_error/main.ts.out b/tests/specs/run/nested_error/nested_error/main.ts.out
new file mode 100644
index 000000000..05780bc6a
--- /dev/null
+++ b/tests/specs/run/nested_error/nested_error/main.ts.out
@@ -0,0 +1,4 @@
+error: Uncaught (in promise) {
+ foo: Error
+ at file:///[WILDCARD]/main.ts:2:8
+}
diff --git a/tests/specs/run/no_check/006_url_imports.ts b/tests/specs/run/no_check/006_url_imports.ts
new file mode 100644
index 000000000..ad2d25915
--- /dev/null
+++ b/tests/specs/run/no_check/006_url_imports.ts
@@ -0,0 +1,3 @@
+import { printHello } from "./mod2.ts";
+printHello();
+console.log("success");
diff --git a/tests/specs/run/no_check/006_url_imports.ts.out b/tests/specs/run/no_check/006_url_imports.ts.out
new file mode 100644
index 000000000..989ce33e9
--- /dev/null
+++ b/tests/specs/run/no_check/006_url_imports.ts.out
@@ -0,0 +1,2 @@
+Hello
+success
diff --git a/tests/specs/run/no_check/__test__.jsonc b/tests/specs/run/no_check/__test__.jsonc
new file mode 100644
index 000000000..696e08e2a
--- /dev/null
+++ b/tests/specs/run/no_check/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --allow-import --quiet --reload --no-check 006_url_imports.ts",
+ "output": "006_url_imports.ts.out"
+}
diff --git a/tests/specs/run/no_check/mod2.ts b/tests/specs/run/no_check/mod2.ts
new file mode 100644
index 000000000..ce1adc0e8
--- /dev/null
+++ b/tests/specs/run/no_check/mod2.ts
@@ -0,0 +1 @@
+export { printHello } from "./print_hello.ts";
diff --git a/tests/specs/run/no_check/print_hello.ts b/tests/specs/run/no_check/print_hello.ts
new file mode 100644
index 000000000..b9c0ad527
--- /dev/null
+++ b/tests/specs/run/no_check/print_hello.ts
@@ -0,0 +1,3 @@
+export function printHello() {
+ console.log("Hello");
+}
diff --git a/tests/specs/run/no_check_decorators/__test__.jsonc b/tests/specs/run/no_check_decorators/__test__.jsonc
new file mode 100644
index 000000000..da50d30a0
--- /dev/null
+++ b/tests/specs/run/no_check_decorators/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --quiet --reload --no-check decorators/experimental/no_check/main.ts",
+ "output": "decorators/experimental/no_check/main.out"
+}
diff --git a/tests/specs/run/no_check_decorators/decorators/experimental/deno.json b/tests/specs/run/no_check_decorators/decorators/experimental/deno.json
new file mode 100644
index 000000000..504cd646e
--- /dev/null
+++ b/tests/specs/run/no_check_decorators/decorators/experimental/deno.json
@@ -0,0 +1,5 @@
+{
+ "compilerOptions": {
+ "experimentalDecorators": true
+ }
+}
diff --git a/tests/specs/run/no_check_decorators/decorators/experimental/no_check/main.out b/tests/specs/run/no_check_decorators/decorators/experimental/no_check/main.out
new file mode 100644
index 000000000..015f7076e
--- /dev/null
+++ b/tests/specs/run/no_check_decorators/decorators/experimental/no_check/main.out
@@ -0,0 +1,3 @@
+a(): evaluated
+a(): called
+method
diff --git a/tests/specs/run/no_check_decorators/decorators/experimental/no_check/main.ts b/tests/specs/run/no_check_decorators/decorators/experimental/no_check/main.ts
new file mode 100644
index 000000000..9f7ec550d
--- /dev/null
+++ b/tests/specs/run/no_check_decorators/decorators/experimental/no_check/main.ts
@@ -0,0 +1,21 @@
+// deno-lint-ignore-file
+function a() {
+ console.log("a(): evaluated");
+ return (
+ _target: any,
+ _propertyKey: string,
+ _descriptor: PropertyDescriptor,
+ ) => {
+ console.log("a(): called");
+ };
+}
+
+class B {
+ @a()
+ method() {
+ console.log("method");
+ }
+}
+
+const b = new B();
+b.method();
diff --git a/tests/specs/run/no_check_decorators/decorators/experimental/runtime/main.out b/tests/specs/run/no_check_decorators/decorators/experimental/runtime/main.out
new file mode 100644
index 000000000..0fc1d4590
--- /dev/null
+++ b/tests/specs/run/no_check_decorators/decorators/experimental/runtime/main.out
@@ -0,0 +1,7 @@
+@A evaluated
+@B evaluated
+@B called
+@A called
+fn() called from @A
+fn() called from @B
+C.test() called
diff --git a/tests/specs/run/no_check_decorators/decorators/experimental/runtime/main.ts b/tests/specs/run/no_check_decorators/decorators/experimental/runtime/main.ts
new file mode 100644
index 000000000..40a26bbd4
--- /dev/null
+++ b/tests/specs/run/no_check_decorators/decorators/experimental/runtime/main.ts
@@ -0,0 +1,42 @@
+// deno-lint-ignore-file
+function a() {
+ console.log("@A evaluated");
+ return function (
+ target: any,
+ propertyKey: string,
+ descriptor: PropertyDescriptor,
+ ) {
+ console.log("@A called");
+ const fn = descriptor.value;
+ descriptor.value = function () {
+ console.log("fn() called from @A");
+ fn();
+ };
+ };
+}
+
+function b() {
+ console.log("@B evaluated");
+ return function (
+ target: any,
+ propertyKey: string,
+ descriptor: PropertyDescriptor,
+ ) {
+ console.log("@B called");
+ const fn = descriptor.value;
+ descriptor.value = function () {
+ console.log("fn() called from @B");
+ fn();
+ };
+ };
+}
+
+class C {
+ @a()
+ @b()
+ static test() {
+ console.log("C.test() called");
+ }
+}
+
+C.test();
diff --git a/tests/specs/run/no_check_decorators/decorators/experimental/ts/main.out b/tests/specs/run/no_check_decorators/decorators/experimental/ts/main.out
new file mode 100644
index 000000000..ea64fbaa6
--- /dev/null
+++ b/tests/specs/run/no_check_decorators/decorators/experimental/ts/main.out
@@ -0,0 +1,3 @@
+Warning experimentalDecorators compiler option is deprecated and may be removed at any time
+Check [WILDCARD]
+SomeClass { someField: "asdf" }
diff --git a/tests/specs/run/no_check_decorators/decorators/experimental/ts/main.ts b/tests/specs/run/no_check_decorators/decorators/experimental/ts/main.ts
new file mode 100644
index 000000000..95fba6cd4
--- /dev/null
+++ b/tests/specs/run/no_check_decorators/decorators/experimental/ts/main.ts
@@ -0,0 +1,14 @@
+// deno-lint-ignore-file
+
+function Decorate() {
+ return function (constructor: any): any {
+ return class extends constructor {
+ protected someField: string = "asdf";
+ };
+ };
+}
+
+@Decorate()
+class SomeClass {}
+
+console.log(new SomeClass());
diff --git a/tests/specs/run/no_check_decorators/decorators/tc39_proposal/main.out b/tests/specs/run/no_check_decorators/decorators/tc39_proposal/main.out
new file mode 100644
index 000000000..39394952e
--- /dev/null
+++ b/tests/specs/run/no_check_decorators/decorators/tc39_proposal/main.out
@@ -0,0 +1,3 @@
+starting m with arguments 1
+C.m 1
+ending m
diff --git a/tests/specs/run/no_check_decorators/decorators/tc39_proposal/main.ts b/tests/specs/run/no_check_decorators/decorators/tc39_proposal/main.ts
new file mode 100644
index 000000000..00c8a8502
--- /dev/null
+++ b/tests/specs/run/no_check_decorators/decorators/tc39_proposal/main.ts
@@ -0,0 +1,21 @@
+// deno-lint-ignore no-explicit-any
+function logged(value: any, { kind, name }: { kind: string; name: string }) {
+ if (kind === "method") {
+ return function (...args: unknown[]) {
+ console.log(`starting ${name} with arguments ${args.join(", ")}`);
+ // @ts-ignore this has implicit any type
+ const ret = value.call(this, ...args);
+ console.log(`ending ${name}`);
+ return ret;
+ };
+ }
+}
+
+class C {
+ @logged
+ m(arg: number) {
+ console.log("C.m", arg);
+ }
+}
+
+new C().m(1);
diff --git a/tests/specs/run/no_config_auto_discovery_for_local_script/__test__.jsonc b/tests/specs/run/no_config_auto_discovery_for_local_script/__test__.jsonc
new file mode 100644
index 000000000..0a03dbc22
--- /dev/null
+++ b/tests/specs/run/no_config_auto_discovery_for_local_script/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run --quiet --no-config --check frontend_work.ts",
+ "output": "no_auto_discovery.out",
+ "exitCode": 1
+}
diff --git a/tests/specs/run/no_config_auto_discovery_for_local_script/frontend_work.ts b/tests/specs/run/no_config_auto_discovery_for_local_script/frontend_work.ts
new file mode 100644
index 000000000..783af44e4
--- /dev/null
+++ b/tests/specs/run/no_config_auto_discovery_for_local_script/frontend_work.ts
@@ -0,0 +1,4 @@
+function _main() {
+ console.log(document);
+}
+console.log("ok");
diff --git a/tests/specs/run/no_config_auto_discovery_for_local_script/no_auto_discovery.out b/tests/specs/run/no_config_auto_discovery_for_local_script/no_auto_discovery.out
new file mode 100644
index 000000000..f45a1097c
--- /dev/null
+++ b/tests/specs/run/no_config_auto_discovery_for_local_script/no_auto_discovery.out
@@ -0,0 +1,4 @@
+error: TS2584 [ERROR]: Cannot find name 'document'. Do you need to change your target library? Try changing the 'lib' compiler option to include 'dom'.
+ console.log(document);
+ ~~~~~~~~
+ at [WILDCARD]frontend_work.ts:2:15
diff --git a/tests/specs/run/no_lock_flag/__test__.jsonc b/tests/specs/run/no_lock_flag/__test__.jsonc
new file mode 100644
index 000000000..b8485c845
--- /dev/null
+++ b/tests/specs/run/no_lock_flag/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run --allow-import --no-lock no_lock_flag/main.ts",
+ "output": "no_lock_flag/main.out",
+ "exitCode": 0
+}
diff --git a/tests/specs/run/no_lock_flag/no_lock_flag/deno.json b/tests/specs/run/no_lock_flag/no_lock_flag/deno.json
new file mode 100644
index 000000000..90faa728a
--- /dev/null
+++ b/tests/specs/run/no_lock_flag/no_lock_flag/deno.json
@@ -0,0 +1,3 @@
+{
+ "tasks": {}
+}
diff --git a/tests/specs/run/no_lock_flag/no_lock_flag/deno.lock b/tests/specs/run/no_lock_flag/no_lock_flag/deno.lock
new file mode 100644
index 000000000..059f66789
--- /dev/null
+++ b/tests/specs/run/no_lock_flag/no_lock_flag/deno.lock
@@ -0,0 +1,7 @@
+{
+ "version": "2",
+ "remote": {
+ "http://localhost:4545/subdir/mod2.ts": "cae1d3e9f3c38cd415ff52dff854be8f3d17d35f8d7b3d285e813fb0f6393a2f",
+ "http://localhost:4545/subdir/print_hello.ts": "foobar"
+ }
+}
diff --git a/tests/specs/run/no_lock_flag/no_lock_flag/main.out b/tests/specs/run/no_lock_flag/no_lock_flag/main.out
new file mode 100644
index 000000000..0d8f0a237
--- /dev/null
+++ b/tests/specs/run/no_lock_flag/no_lock_flag/main.out
@@ -0,0 +1,2 @@
+Download http://localhost:4545/subdir/mod2.ts
+Download http://localhost:4545/subdir/print_hello.ts
diff --git a/tests/specs/run/no_lock_flag/no_lock_flag/main.ts b/tests/specs/run/no_lock_flag/no_lock_flag/main.ts
new file mode 100644
index 000000000..baa52775d
--- /dev/null
+++ b/tests/specs/run/no_lock_flag/no_lock_flag/main.ts
@@ -0,0 +1 @@
+import "http://localhost:4545/subdir/mod2.ts";
diff --git a/tests/specs/run/no_prompt_flag/__test__.jsonc b/tests/specs/run/no_prompt_flag/__test__.jsonc
new file mode 100644
index 000000000..2342a63e8
--- /dev/null
+++ b/tests/specs/run/no_prompt_flag/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --quiet --no-prompt no_prompt.ts",
+ "output": ""
+}
diff --git a/tests/specs/run/no_prompt_flag/no_prompt.ts b/tests/specs/run/no_prompt_flag/no_prompt.ts
new file mode 100644
index 000000000..17d54b92c
--- /dev/null
+++ b/tests/specs/run/no_prompt_flag/no_prompt.ts
@@ -0,0 +1,10 @@
+new Worker("data:,setTimeout(() => Deno.exit(2), 200)", { type: "module" });
+
+try {
+ await new Deno.Command("ps", {
+ stdout: "inherit",
+ stderr: "inherit",
+ }).output();
+} catch {
+ Deno.exit(0);
+}
diff --git a/tests/specs/run/node_env_var_allowlist/__test__.jsonc b/tests/specs/run/node_env_var_allowlist/__test__.jsonc
new file mode 100644
index 000000000..055ac62e8
--- /dev/null
+++ b/tests/specs/run/node_env_var_allowlist/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run --no-prompt node_env_var_allowlist.ts",
+ "output": "node_env_var_allowlist.ts.out",
+ "exitCode": 1
+}
diff --git a/tests/specs/run/node_env_var_allowlist/node_env_var_allowlist.ts b/tests/specs/run/node_env_var_allowlist/node_env_var_allowlist.ts
new file mode 100644
index 000000000..95da38c24
--- /dev/null
+++ b/tests/specs/run/node_env_var_allowlist/node_env_var_allowlist.ts
@@ -0,0 +1,2 @@
+console.log(Deno.env.get("NODE_DEBUG") ?? "ok");
+Deno.env.get("NOT_NODE_DEBUG");
diff --git a/tests/specs/run/node_env_var_allowlist/node_env_var_allowlist.ts.out b/tests/specs/run/node_env_var_allowlist/node_env_var_allowlist.ts.out
new file mode 100644
index 000000000..2dcffd67b
--- /dev/null
+++ b/tests/specs/run/node_env_var_allowlist/node_env_var_allowlist.ts.out
@@ -0,0 +1,5 @@
+ok
+[WILDCARD]error: Uncaught (in promise) NotCapable: Requires env access to "NOT_NODE_DEBUG", run again with the --allow-env flag
+Deno.env.get("NOT_NODE_DEBUG");
+ ^
+ at [WILDCARD]
diff --git a/tests/specs/run/onload/__test__.jsonc b/tests/specs/run/onload/__test__.jsonc
new file mode 100644
index 000000000..b17dc665d
--- /dev/null
+++ b/tests/specs/run/onload/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --quiet --reload --config deno.json onload/main.ts",
+ "output": "onload/main.out"
+}
diff --git a/tests/specs/run/onload/deno.json b/tests/specs/run/onload/deno.json
new file mode 100644
index 000000000..105514e13
--- /dev/null
+++ b/tests/specs/run/onload/deno.json
@@ -0,0 +1,4 @@
+{
+ "lock": false,
+ "importMap": "../../../../import_map.json"
+}
diff --git a/tests/specs/run/onload/onload/imported.ts b/tests/specs/run/onload/onload/imported.ts
new file mode 100644
index 000000000..643e2fc78
--- /dev/null
+++ b/tests/specs/run/onload/onload/imported.ts
@@ -0,0 +1,12 @@
+import { assert } from "@std/assert";
+import "./nest_imported.ts";
+
+const handler = (e: Event) => {
+ assert(e.type === "beforeunload" ? e.cancelable : !e.cancelable);
+ console.log(`got ${e.type} event in event handler (imported)`);
+};
+
+globalThis.addEventListener("load", handler);
+globalThis.addEventListener("beforeunload", handler);
+globalThis.addEventListener("unload", handler);
+console.log("log from imported script");
diff --git a/tests/specs/run/onload/onload/main.out b/tests/specs/run/onload/onload/main.out
new file mode 100644
index 000000000..b25d33fa8
--- /dev/null
+++ b/tests/specs/run/onload/onload/main.out
@@ -0,0 +1,15 @@
+log from nest_imported script
+log from imported script
+log from main
+got load event in event handler (nest_imported)
+got load event in event handler (imported)
+got load event in event handler (main)
+got load event in onload function
+got beforeunload event in event handler (nest_imported)
+got beforeunload event in event handler (imported)
+got beforeunload event in event handler (main)
+got beforeunload event in onbeforeunload function
+got unload event in event handler (nest_imported)
+got unload event in event handler (imported)
+got unload event in event handler (main)
+got unload event in onunload function
diff --git a/tests/specs/run/onload/onload/main.ts b/tests/specs/run/onload/onload/main.ts
new file mode 100644
index 000000000..c4b8424fb
--- /dev/null
+++ b/tests/specs/run/onload/onload/main.ts
@@ -0,0 +1,34 @@
+// deno-lint-ignore-file no-prototype-builtins
+import { assert } from "@std/assert";
+import "./imported.ts";
+
+assert(globalThis.hasOwnProperty("onload"));
+assert(globalThis.onload === null);
+
+const eventHandler = (e: Event) => {
+ assert(e.type === "beforeunload" ? e.cancelable : !e.cancelable);
+ console.log(`got ${e.type} event in event handler (main)`);
+};
+
+globalThis.addEventListener("load", eventHandler);
+
+globalThis.addEventListener("beforeunload", eventHandler);
+
+globalThis.addEventListener("unload", eventHandler);
+
+globalThis.onload = (e: Event) => {
+ assert(!e.cancelable);
+ console.log(`got ${e.type} event in onload function`);
+};
+
+globalThis.onbeforeunload = (e: BeforeUnloadEvent) => {
+ assert(e.cancelable);
+ console.log(`got ${e.type} event in onbeforeunload function`);
+};
+
+globalThis.onunload = (e: Event) => {
+ assert(!e.cancelable);
+ console.log(`got ${e.type} event in onunload function`);
+};
+
+console.log("log from main");
diff --git a/tests/specs/run/onload/onload/nest_imported.ts b/tests/specs/run/onload/onload/nest_imported.ts
new file mode 100644
index 000000000..f1d28e8dc
--- /dev/null
+++ b/tests/specs/run/onload/onload/nest_imported.ts
@@ -0,0 +1,11 @@
+import { assert } from "@std/assert";
+
+const handler = (e: Event) => {
+ assert(e.type === "beforeunload" ? e.cancelable : !e.cancelable);
+ console.log(`got ${e.type} event in event handler (nest_imported)`);
+};
+
+globalThis.addEventListener("load", handler);
+globalThis.addEventListener("beforeunload", handler);
+globalThis.addEventListener("unload", handler);
+console.log("log from nest_imported script");
diff --git a/tests/specs/run/op_exit_op_set_exit_code_in_worker/__test__.jsonc b/tests/specs/run/op_exit_op_set_exit_code_in_worker/__test__.jsonc
new file mode 100644
index 000000000..664fcb5c1
--- /dev/null
+++ b/tests/specs/run/op_exit_op_set_exit_code_in_worker/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run --no-check --allow-read op_exit_op_set_exit_code_in_worker.ts",
+ "output": "",
+ "exitCode": 21
+}
diff --git a/tests/specs/run/op_exit_op_set_exit_code_in_worker/op_exit_op_set_exit_code_in_worker.ts b/tests/specs/run/op_exit_op_set_exit_code_in_worker/op_exit_op_set_exit_code_in_worker.ts
new file mode 100644
index 000000000..b6a776439
--- /dev/null
+++ b/tests/specs/run/op_exit_op_set_exit_code_in_worker/op_exit_op_set_exit_code_in_worker.ts
@@ -0,0 +1,13 @@
+// Set exit code to some value, we'll ensure that `Deno.exit()` and
+// setting exit code in worker context is a no-op and is an alias for
+// `self.close()`.
+
+// @ts-ignore Deno[Deno.internal].core doesn't have type-defs
+Deno[Deno.internal].core.ops.op_set_exit_code(21);
+
+const worker = new Worker(
+ import.meta.resolve("./op_exit_op_set_exit_code_worker.js"),
+ { type: "module" },
+);
+
+worker.postMessage("go");
diff --git a/tests/specs/run/op_exit_op_set_exit_code_in_worker/op_exit_op_set_exit_code_worker.js b/tests/specs/run/op_exit_op_set_exit_code_in_worker/op_exit_op_set_exit_code_worker.js
new file mode 100644
index 000000000..9b284c37d
--- /dev/null
+++ b/tests/specs/run/op_exit_op_set_exit_code_in_worker/op_exit_op_set_exit_code_worker.js
@@ -0,0 +1,4 @@
+self.onmessage = () => {
+ Deno[Deno.internal].core.ops.op_set_exit_code(42);
+ Deno.exit();
+};
diff --git a/tests/specs/run/package_json_auto_discovered_for_local_script_arg_with_stop/__test__.jsonc b/tests/specs/run/package_json_auto_discovered_for_local_script_arg_with_stop/__test__.jsonc
new file mode 100644
index 000000000..ac66ccdf1
--- /dev/null
+++ b/tests/specs/run/package_json_auto_discovered_for_local_script_arg_with_stop/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run -L debug main.ts",
+ "output": "main.out",
+ "exitCode": 1
+}
diff --git a/tests/specs/run/package_json_auto_discovered_for_local_script_arg_with_stop/deno.json b/tests/specs/run/package_json_auto_discovered_for_local_script_arg_with_stop/deno.json
new file mode 100644
index 000000000..36e1765d1
--- /dev/null
+++ b/tests/specs/run/package_json_auto_discovered_for_local_script_arg_with_stop/deno.json
@@ -0,0 +1,5 @@
+{
+ "tasks": {
+ "dev": "deno run main.ts"
+ }
+}
diff --git a/tests/specs/run/package_json_auto_discovered_for_local_script_arg_with_stop/main.out b/tests/specs/run/package_json_auto_discovered_for_local_script_arg_with_stop/main.out
new file mode 100644
index 000000000..5ab43ac47
--- /dev/null
+++ b/tests/specs/run/package_json_auto_discovered_for_local_script_arg_with_stop/main.out
@@ -0,0 +1,5 @@
+[WILDCARD]Config file found at '[WILDCARD]deno.json'
+[WILDCARD]
+error: Relative import path "chalk" not prefixed with / or ./ or ../
+ hint: If you want to use a JSR or npm package, try running `deno add jsr:chalk` or `deno add npm:chalk`
+ at file:///[WILDCARD]/main.ts:3:19
diff --git a/tests/specs/run/package_json_auto_discovered_for_local_script_arg_with_stop/main.ts b/tests/specs/run/package_json_auto_discovered_for_local_script_arg_with_stop/main.ts
new file mode 100644
index 000000000..6016470a1
--- /dev/null
+++ b/tests/specs/run/package_json_auto_discovered_for_local_script_arg_with_stop/main.ts
@@ -0,0 +1,6 @@
+// This import should fail, because `package.json` is not discovered, as we're
+// stopping the discovery when encountering `deno.json`.
+import chalk from "chalk";
+
+console.log("ok");
+console.log(chalk);
diff --git a/tests/specs/run/permission_args/001_hello.js b/tests/specs/run/permission_args/001_hello.js
new file mode 100644
index 000000000..accefceba
--- /dev/null
+++ b/tests/specs/run/permission_args/001_hello.js
@@ -0,0 +1 @@
+console.log("Hello World");
diff --git a/tests/specs/run/permission_args/__test__.jsonc b/tests/specs/run/permission_args/__test__.jsonc
new file mode 100644
index 000000000..2843ee395
--- /dev/null
+++ b/tests/specs/run/permission_args/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run 001_hello.js --allow-net",
+ "output": "permission_args.out"
+}
diff --git a/tests/specs/run/permission_args/permission_args.out b/tests/specs/run/permission_args/permission_args.out
new file mode 100644
index 000000000..6a1e1787c
--- /dev/null
+++ b/tests/specs/run/permission_args/permission_args.out
@@ -0,0 +1,4 @@
+Permission flags have likely been incorrectly set after the script argument.
+To grant permissions, set them before the script argument. For example:
+ deno run --allow-read=. main.js
+Hello World
diff --git a/tests/specs/run/permission_args_quiet/001_hello.js b/tests/specs/run/permission_args_quiet/001_hello.js
new file mode 100644
index 000000000..accefceba
--- /dev/null
+++ b/tests/specs/run/permission_args_quiet/001_hello.js
@@ -0,0 +1 @@
+console.log("Hello World");
diff --git a/tests/specs/run/permission_args_quiet/001_hello.js.out b/tests/specs/run/permission_args_quiet/001_hello.js.out
new file mode 100644
index 000000000..557db03de
--- /dev/null
+++ b/tests/specs/run/permission_args_quiet/001_hello.js.out
@@ -0,0 +1 @@
+Hello World
diff --git a/tests/specs/run/permission_args_quiet/__test__.jsonc b/tests/specs/run/permission_args_quiet/__test__.jsonc
new file mode 100644
index 000000000..2b98b963e
--- /dev/null
+++ b/tests/specs/run/permission_args_quiet/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --quiet 001_hello.js --allow-net",
+ "output": "001_hello.js.out"
+}
diff --git a/tests/specs/run/private_field_presence/__test__.jsonc b/tests/specs/run/private_field_presence/__test__.jsonc
new file mode 100644
index 000000000..982b88289
--- /dev/null
+++ b/tests/specs/run/private_field_presence/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --reload private_field_presence.ts",
+ "output": "private_field_presence.ts.out"
+}
diff --git a/tests/specs/run/private_field_presence/private_field_presence.ts b/tests/specs/run/private_field_presence/private_field_presence.ts
new file mode 100644
index 000000000..7ce2840d8
--- /dev/null
+++ b/tests/specs/run/private_field_presence/private_field_presence.ts
@@ -0,0 +1,20 @@
+export class Person {
+ #name: string;
+ constructor(name: string) {
+ this.#name = name;
+ }
+
+ equals(other: unknown) {
+ return other &&
+ typeof other === "object" &&
+ #name in other &&
+ this.#name === other.#name;
+ }
+}
+
+const a = new Person("alice");
+const b = new Person("bob");
+const c = new Person("alice");
+
+console.log(a.equals(b));
+console.log(a.equals(c));
diff --git a/tests/specs/run/private_field_presence/private_field_presence.ts.out b/tests/specs/run/private_field_presence/private_field_presence.ts.out
new file mode 100644
index 000000000..1d474d525
--- /dev/null
+++ b/tests/specs/run/private_field_presence/private_field_presence.ts.out
@@ -0,0 +1,2 @@
+false
+true
diff --git a/tests/specs/run/private_field_presence_no_check/__test__.jsonc b/tests/specs/run/private_field_presence_no_check/__test__.jsonc
new file mode 100644
index 000000000..b7a26db25
--- /dev/null
+++ b/tests/specs/run/private_field_presence_no_check/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --reload --no-check private_field_presence.ts",
+ "output": "private_field_presence.ts.out"
+}
diff --git a/tests/specs/run/private_field_presence_no_check/private_field_presence.ts b/tests/specs/run/private_field_presence_no_check/private_field_presence.ts
new file mode 100644
index 000000000..7ce2840d8
--- /dev/null
+++ b/tests/specs/run/private_field_presence_no_check/private_field_presence.ts
@@ -0,0 +1,20 @@
+export class Person {
+ #name: string;
+ constructor(name: string) {
+ this.#name = name;
+ }
+
+ equals(other: unknown) {
+ return other &&
+ typeof other === "object" &&
+ #name in other &&
+ this.#name === other.#name;
+ }
+}
+
+const a = new Person("alice");
+const b = new Person("bob");
+const c = new Person("alice");
+
+console.log(a.equals(b));
+console.log(a.equals(c));
diff --git a/tests/specs/run/private_field_presence_no_check/private_field_presence.ts.out b/tests/specs/run/private_field_presence_no_check/private_field_presence.ts.out
new file mode 100644
index 000000000..1d474d525
--- /dev/null
+++ b/tests/specs/run/private_field_presence_no_check/private_field_presence.ts.out
@@ -0,0 +1,2 @@
+false
+true
diff --git a/tests/specs/run/proto_exploit/__test__.jsonc b/tests/specs/run/proto_exploit/__test__.jsonc
new file mode 100644
index 000000000..218f38654
--- /dev/null
+++ b/tests/specs/run/proto_exploit/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run proto_exploit.js",
+ "output": "proto_exploit.js.out"
+}
diff --git a/tests/specs/run/proto_exploit/proto_exploit.js b/tests/specs/run/proto_exploit/proto_exploit.js
new file mode 100644
index 000000000..8bd22cfe5
--- /dev/null
+++ b/tests/specs/run/proto_exploit/proto_exploit.js
@@ -0,0 +1,5 @@
+const payload = `{ "__proto__": null }`;
+const obj = {};
+console.log("Before: " + obj);
+Object.assign(obj, JSON.parse(payload));
+console.log("After: " + obj);
diff --git a/tests/specs/run/proto_exploit/proto_exploit.js.out b/tests/specs/run/proto_exploit/proto_exploit.js.out
new file mode 100644
index 000000000..fde881dc5
--- /dev/null
+++ b/tests/specs/run/proto_exploit/proto_exploit.js.out
@@ -0,0 +1,2 @@
+Before: [object Object]
+After: [object Object]
diff --git a/tests/specs/run/queue_microtask_error/__test__.jsonc b/tests/specs/run/queue_microtask_error/__test__.jsonc
new file mode 100644
index 000000000..30821d67f
--- /dev/null
+++ b/tests/specs/run/queue_microtask_error/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run --quiet queue_microtask_error.ts",
+ "output": "queue_microtask_error.ts.out",
+ "exitCode": 1
+}
diff --git a/tests/specs/run/queue_microtask_error/queue_microtask_error.ts b/tests/specs/run/queue_microtask_error/queue_microtask_error.ts
new file mode 100644
index 000000000..b2e9642c5
--- /dev/null
+++ b/tests/specs/run/queue_microtask_error/queue_microtask_error.ts
@@ -0,0 +1,5 @@
+queueMicrotask(() => {
+ throw new Error("foo");
+});
+console.log(1);
+Promise.resolve().then(() => console.log(2));
diff --git a/tests/specs/run/queue_microtask_error/queue_microtask_error.ts.out b/tests/specs/run/queue_microtask_error/queue_microtask_error.ts.out
new file mode 100644
index 000000000..a8ce13170
--- /dev/null
+++ b/tests/specs/run/queue_microtask_error/queue_microtask_error.ts.out
@@ -0,0 +1,6 @@
+1
+error: Uncaught Error: foo
+ throw new Error("foo");
+ ^
+ at [WILDCARD]/queue_microtask_error.ts:2:9
+ at ext:core/[WILDCARD]
diff --git a/tests/specs/run/queue_microtask_error_handled/__test__.jsonc b/tests/specs/run/queue_microtask_error_handled/__test__.jsonc
new file mode 100644
index 000000000..c343acfb4
--- /dev/null
+++ b/tests/specs/run/queue_microtask_error_handled/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --quiet queue_microtask_error_handled.ts",
+ "output": "queue_microtask_error_handled.ts.out"
+}
diff --git a/tests/specs/run/queue_microtask_error_handled/queue_microtask_error_handled.ts b/tests/specs/run/queue_microtask_error_handled/queue_microtask_error_handled.ts
new file mode 100644
index 000000000..47ea2d32e
--- /dev/null
+++ b/tests/specs/run/queue_microtask_error_handled/queue_microtask_error_handled.ts
@@ -0,0 +1,21 @@
+addEventListener("error", (event) => {
+ console.log({
+ cancelable: event.cancelable,
+ message: event.message,
+ filename: event.filename?.slice?.(-100),
+ lineno: event.lineno,
+ colno: event.colno,
+ error: event.error,
+ });
+ event.preventDefault();
+});
+
+onerror = (event) => {
+ console.log("onerror() called", event.error);
+};
+
+queueMicrotask(() => {
+ throw new Error("foo");
+});
+console.log(1);
+Promise.resolve().then(() => console.log(2));
diff --git a/tests/specs/run/queue_microtask_error_handled/queue_microtask_error_handled.ts.out b/tests/specs/run/queue_microtask_error_handled/queue_microtask_error_handled.ts.out
new file mode 100644
index 000000000..bdc8eafa1
--- /dev/null
+++ b/tests/specs/run/queue_microtask_error_handled/queue_microtask_error_handled.ts.out
@@ -0,0 +1,15 @@
+1
+{
+ cancelable: true,
+ message: "Uncaught Error: foo",
+ filename: "[WILDCARD]/queue_microtask_error_handled.ts",
+ lineno: 18,
+ colno: 9,
+ error: Error: foo
+ at [WILDCARD]/queue_microtask_error_handled.ts:18:9
+ at ext:core/[WILDCARD]
+}
+onerror() called Error: foo
+ at [WILDCARD]/queue_microtask_error_handled.ts:18:9
+ at ext:core/[WILDCARD]
+2
diff --git a/tests/specs/run/reference_types/__test__.jsonc b/tests/specs/run/reference_types/__test__.jsonc
new file mode 100644
index 000000000..4e4bd08b8
--- /dev/null
+++ b/tests/specs/run/reference_types/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --reload --quiet reference_types.ts",
+ "output": "reference_types.ts.out"
+}
diff --git a/tests/specs/run/reference_types/reference_types.ts b/tests/specs/run/reference_types/reference_types.ts
new file mode 100644
index 000000000..105e23b37
--- /dev/null
+++ b/tests/specs/run/reference_types/reference_types.ts
@@ -0,0 +1,3 @@
+/// <reference types="./subdir/types.d.ts" />
+
+console.log(globalThis.a);
diff --git a/tests/specs/run/reference_types/reference_types.ts.out b/tests/specs/run/reference_types/reference_types.ts.out
new file mode 100644
index 000000000..417b7b537
--- /dev/null
+++ b/tests/specs/run/reference_types/reference_types.ts.out
@@ -0,0 +1 @@
+undefined
diff --git a/tests/specs/run/reference_types_error/__test__.jsonc b/tests/specs/run/reference_types_error/__test__.jsonc
new file mode 100644
index 000000000..08450acc1
--- /dev/null
+++ b/tests/specs/run/reference_types_error/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run --config checkjs.tsconfig.json --check reference_types_error.js",
+ "output": "reference_types_error.js.out",
+ "exitCode": 1
+}
diff --git a/tests/specs/run/reference_types_error/checkjs.tsconfig.json b/tests/specs/run/reference_types_error/checkjs.tsconfig.json
new file mode 100644
index 000000000..08ac60b6c
--- /dev/null
+++ b/tests/specs/run/reference_types_error/checkjs.tsconfig.json
@@ -0,0 +1,5 @@
+{
+ "compilerOptions": {
+ "checkJs": true
+ }
+}
diff --git a/tests/specs/run/reference_types_error/reference_types_error.js b/tests/specs/run/reference_types_error/reference_types_error.js
new file mode 100644
index 000000000..68b6c2136
--- /dev/null
+++ b/tests/specs/run/reference_types_error/reference_types_error.js
@@ -0,0 +1,2 @@
+/// <reference types="./nonexistent.d.ts" />
+export const a = 1;
diff --git a/tests/specs/run/reference_types_error/reference_types_error.js.out b/tests/specs/run/reference_types_error/reference_types_error.js.out
new file mode 100644
index 000000000..86055f3ac
--- /dev/null
+++ b/tests/specs/run/reference_types_error/reference_types_error.js.out
@@ -0,0 +1,2 @@
+error: Module not found "file:///[WILDCARD]/nonexistent.d.ts".
+ at file:///[WILDCARD]/reference_types_error.js:1:22
diff --git a/tests/specs/run/reference_types_error_no_check/__test__.jsonc b/tests/specs/run/reference_types_error_no_check/__test__.jsonc
new file mode 100644
index 000000000..78744759d
--- /dev/null
+++ b/tests/specs/run/reference_types_error_no_check/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --no-check reference_types_error.js",
+ "output": ""
+}
diff --git a/tests/specs/run/reference_types_error_no_check/reference_types_error.js b/tests/specs/run/reference_types_error_no_check/reference_types_error.js
new file mode 100644
index 000000000..68b6c2136
--- /dev/null
+++ b/tests/specs/run/reference_types_error_no_check/reference_types_error.js
@@ -0,0 +1,2 @@
+/// <reference types="./nonexistent.d.ts" />
+export const a = 1;
diff --git a/tests/specs/run/reference_types_error_vendor_dir/__test__.jsonc b/tests/specs/run/reference_types_error_vendor_dir/__test__.jsonc
new file mode 100644
index 000000000..c48dd1d5e
--- /dev/null
+++ b/tests/specs/run/reference_types_error_vendor_dir/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run --config checkjs.tsconfig.json --check --vendor reference_types_error.js",
+ "output": "reference_types_error.js.out",
+ "exitCode": 1
+}
diff --git a/tests/specs/run/reference_types_error_vendor_dir/checkjs.tsconfig.json b/tests/specs/run/reference_types_error_vendor_dir/checkjs.tsconfig.json
new file mode 100644
index 000000000..08ac60b6c
--- /dev/null
+++ b/tests/specs/run/reference_types_error_vendor_dir/checkjs.tsconfig.json
@@ -0,0 +1,5 @@
+{
+ "compilerOptions": {
+ "checkJs": true
+ }
+}
diff --git a/tests/specs/run/reference_types_error_vendor_dir/reference_types_error.js b/tests/specs/run/reference_types_error_vendor_dir/reference_types_error.js
new file mode 100644
index 000000000..68b6c2136
--- /dev/null
+++ b/tests/specs/run/reference_types_error_vendor_dir/reference_types_error.js
@@ -0,0 +1,2 @@
+/// <reference types="./nonexistent.d.ts" />
+export const a = 1;
diff --git a/tests/specs/run/reference_types_error_vendor_dir/reference_types_error.js.out b/tests/specs/run/reference_types_error_vendor_dir/reference_types_error.js.out
new file mode 100644
index 000000000..86055f3ac
--- /dev/null
+++ b/tests/specs/run/reference_types_error_vendor_dir/reference_types_error.js.out
@@ -0,0 +1,2 @@
+error: Module not found "file:///[WILDCARD]/nonexistent.d.ts".
+ at file:///[WILDCARD]/reference_types_error.js:1:22
diff --git a/tests/specs/run/references_types_remote/__test__.jsonc b/tests/specs/run/references_types_remote/__test__.jsonc
new file mode 100644
index 000000000..3f7f27c26
--- /dev/null
+++ b/tests/specs/run/references_types_remote/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --reload --quiet reference_types_remote.ts",
+ "output": "reference_types_remote.ts.out"
+}
diff --git a/tests/specs/run/references_types_remote/reference_types_remote.ts b/tests/specs/run/references_types_remote/reference_types_remote.ts
new file mode 100644
index 000000000..e7fa81b2c
--- /dev/null
+++ b/tests/specs/run/references_types_remote/reference_types_remote.ts
@@ -0,0 +1,3 @@
+/// <reference types="http://localhost:4545/subdir/types.d.ts" />
+
+console.log(globalThis.a);
diff --git a/tests/specs/run/references_types_remote/reference_types_remote.ts.out b/tests/specs/run/references_types_remote/reference_types_remote.ts.out
new file mode 100644
index 000000000..417b7b537
--- /dev/null
+++ b/tests/specs/run/references_types_remote/reference_types_remote.ts.out
@@ -0,0 +1 @@
+undefined
diff --git a/tests/specs/run/rejection_handled/__test__.jsonc b/tests/specs/run/rejection_handled/__test__.jsonc
new file mode 100644
index 000000000..7565a7dd1
--- /dev/null
+++ b/tests/specs/run/rejection_handled/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --check rejection_handled.ts",
+ "output": "rejection_handled.out"
+}
diff --git a/tests/specs/run/rejection_handled/rejection_handled.out b/tests/specs/run/rejection_handled/rejection_handled.out
new file mode 100644
index 000000000..5c06fcd2b
--- /dev/null
+++ b/tests/specs/run/rejection_handled/rejection_handled.out
@@ -0,0 +1,5 @@
+[WILDCARD]
+unhandledrejection 1 Promise { <rejected> 1 }
+Added catch handler to the promise
+rejectionhandled 1 Promise { <rejected> 1 }
+Success
diff --git a/tests/specs/run/rejection_handled/rejection_handled.ts b/tests/specs/run/rejection_handled/rejection_handled.ts
new file mode 100644
index 000000000..8822203f1
--- /dev/null
+++ b/tests/specs/run/rejection_handled/rejection_handled.ts
@@ -0,0 +1,17 @@
+globalThis.addEventListener("unhandledrejection", (event) => {
+ console.log("unhandledrejection", event.reason, event.promise);
+ event.preventDefault();
+});
+
+globalThis.addEventListener("rejectionhandled", (event) => {
+ console.log("rejectionhandled", event.reason, event.promise);
+});
+
+const a = Promise.reject(1);
+setTimeout(async () => {
+ a.catch(() => console.log("Added catch handler to the promise"));
+}, 10);
+
+setTimeout(() => {
+ console.log("Success");
+}, 1000);
diff --git a/tests/specs/run/replace_self/__test__.jsonc b/tests/specs/run/replace_self/__test__.jsonc
new file mode 100644
index 000000000..cfadbf791
--- /dev/null
+++ b/tests/specs/run/replace_self/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run replace_self.js",
+ "output": "replace_self.js.out"
+}
diff --git a/tests/specs/run/replace_self/replace_self.js b/tests/specs/run/replace_self/replace_self.js
new file mode 100644
index 000000000..cfd473cd3
--- /dev/null
+++ b/tests/specs/run/replace_self/replace_self.js
@@ -0,0 +1,21 @@
+// Test that setting `self` in the main thread to some other value doesn't break
+// the world, in particular for events fired on the global scope.
+
+// deno-lint-ignore no-global-assign
+self = null;
+
+addEventListener("load", () => {
+ console.log("load event (event listener)");
+});
+
+addEventListener("unload", () => {
+ console.log("unload event (event listener)");
+});
+
+globalThis.onload = () => {
+ console.log("load event (event handler)");
+};
+
+globalThis.onunload = () => {
+ console.log("unload event (event handler)");
+};
diff --git a/tests/specs/run/replace_self/replace_self.js.out b/tests/specs/run/replace_self/replace_self.js.out
new file mode 100644
index 000000000..aaffb5a62
--- /dev/null
+++ b/tests/specs/run/replace_self/replace_self.js.out
@@ -0,0 +1,4 @@
+load event (event listener)
+load event (event handler)
+unload event (event listener)
+unload event (event handler)
diff --git a/tests/specs/run/report_error/__test__.jsonc b/tests/specs/run/report_error/__test__.jsonc
new file mode 100644
index 000000000..0577ad245
--- /dev/null
+++ b/tests/specs/run/report_error/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run --quiet report_error.ts",
+ "output": "report_error.ts.out",
+ "exitCode": 1
+}
diff --git a/tests/specs/run/report_error/report_error.ts b/tests/specs/run/report_error/report_error.ts
new file mode 100644
index 000000000..a6d4af1fd
--- /dev/null
+++ b/tests/specs/run/report_error/report_error.ts
@@ -0,0 +1,3 @@
+console.log(1);
+reportError(new Error("foo"));
+console.log(2);
diff --git a/tests/specs/run/report_error/report_error.ts.out b/tests/specs/run/report_error/report_error.ts.out
new file mode 100644
index 000000000..185db62a5
--- /dev/null
+++ b/tests/specs/run/report_error/report_error.ts.out
@@ -0,0 +1,5 @@
+1
+error: Uncaught Error: foo
+reportError(new Error("foo"));
+ ^
+ at [WILDCARD]/report_error.ts:2:13
diff --git a/tests/specs/run/report_error_end_of_program/__test__.jsonc b/tests/specs/run/report_error_end_of_program/__test__.jsonc
new file mode 100644
index 000000000..c34956b74
--- /dev/null
+++ b/tests/specs/run/report_error_end_of_program/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run --quiet report_error_end_of_program.ts",
+ "output": "report_error_end_of_program.ts.out",
+ "exitCode": 1
+}
diff --git a/tests/specs/run/report_error_end_of_program/report_error_end_of_program.ts b/tests/specs/run/report_error_end_of_program/report_error_end_of_program.ts
new file mode 100644
index 000000000..cd7ce7f9c
--- /dev/null
+++ b/tests/specs/run/report_error_end_of_program/report_error_end_of_program.ts
@@ -0,0 +1 @@
+reportError(new Error("foo"));
diff --git a/tests/specs/run/report_error_end_of_program/report_error_end_of_program.ts.out b/tests/specs/run/report_error_end_of_program/report_error_end_of_program.ts.out
new file mode 100644
index 000000000..ecca63389
--- /dev/null
+++ b/tests/specs/run/report_error_end_of_program/report_error_end_of_program.ts.out
@@ -0,0 +1,4 @@
+error: Uncaught Error: foo
+reportError(new Error("foo"));
+ ^
+ at [WILDCARD]/report_error_end_of_program.ts:1:13
diff --git a/tests/specs/run/report_error_handled/__test__.jsonc b/tests/specs/run/report_error_handled/__test__.jsonc
new file mode 100644
index 000000000..126687b95
--- /dev/null
+++ b/tests/specs/run/report_error_handled/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --quiet report_error_handled.ts",
+ "output": "report_error_handled.ts.out"
+}
diff --git a/tests/specs/run/report_error_handled/report_error_handled.ts b/tests/specs/run/report_error_handled/report_error_handled.ts
new file mode 100644
index 000000000..d18996c13
--- /dev/null
+++ b/tests/specs/run/report_error_handled/report_error_handled.ts
@@ -0,0 +1,19 @@
+addEventListener("error", (event) => {
+ console.log({
+ cancelable: event.cancelable,
+ message: event.message,
+ filename: event.filename?.slice?.(-100),
+ lineno: event.lineno,
+ colno: event.colno,
+ error: event.error,
+ });
+ event.preventDefault();
+});
+
+onerror = (event) => {
+ console.log("onerror() called", event.error);
+};
+
+console.log(1);
+reportError(new Error("foo"));
+console.log(2);
diff --git a/tests/specs/run/report_error_handled/report_error_handled.ts.out b/tests/specs/run/report_error_handled/report_error_handled.ts.out
new file mode 100644
index 000000000..89fa30314
--- /dev/null
+++ b/tests/specs/run/report_error_handled/report_error_handled.ts.out
@@ -0,0 +1,13 @@
+1
+{
+ cancelable: true,
+ message: "Uncaught Error: foo",
+ filename: "[WILDCARD]/report_error_handled.ts",
+ lineno: 18,
+ colno: 13,
+ error: Error: foo
+ at [WILDCARD]/report_error_handled.ts:18:13
+}
+onerror() called Error: foo
+ at [WILDCARD]/report_error_handled.ts:18:13
+2
diff --git a/tests/specs/run/runtime_decorators/__test__.jsonc b/tests/specs/run/runtime_decorators/__test__.jsonc
new file mode 100644
index 000000000..286fd377d
--- /dev/null
+++ b/tests/specs/run/runtime_decorators/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --quiet --reload --no-check decorators/experimental/runtime/main.ts",
+ "output": "decorators/experimental/runtime/main.out"
+}
diff --git a/tests/specs/run/runtime_decorators/decorators/experimental/deno.json b/tests/specs/run/runtime_decorators/decorators/experimental/deno.json
new file mode 100644
index 000000000..504cd646e
--- /dev/null
+++ b/tests/specs/run/runtime_decorators/decorators/experimental/deno.json
@@ -0,0 +1,5 @@
+{
+ "compilerOptions": {
+ "experimentalDecorators": true
+ }
+}
diff --git a/tests/specs/run/runtime_decorators/decorators/experimental/no_check/main.out b/tests/specs/run/runtime_decorators/decorators/experimental/no_check/main.out
new file mode 100644
index 000000000..015f7076e
--- /dev/null
+++ b/tests/specs/run/runtime_decorators/decorators/experimental/no_check/main.out
@@ -0,0 +1,3 @@
+a(): evaluated
+a(): called
+method
diff --git a/tests/specs/run/runtime_decorators/decorators/experimental/no_check/main.ts b/tests/specs/run/runtime_decorators/decorators/experimental/no_check/main.ts
new file mode 100644
index 000000000..9f7ec550d
--- /dev/null
+++ b/tests/specs/run/runtime_decorators/decorators/experimental/no_check/main.ts
@@ -0,0 +1,21 @@
+// deno-lint-ignore-file
+function a() {
+ console.log("a(): evaluated");
+ return (
+ _target: any,
+ _propertyKey: string,
+ _descriptor: PropertyDescriptor,
+ ) => {
+ console.log("a(): called");
+ };
+}
+
+class B {
+ @a()
+ method() {
+ console.log("method");
+ }
+}
+
+const b = new B();
+b.method();
diff --git a/tests/specs/run/runtime_decorators/decorators/experimental/runtime/main.out b/tests/specs/run/runtime_decorators/decorators/experimental/runtime/main.out
new file mode 100644
index 000000000..0fc1d4590
--- /dev/null
+++ b/tests/specs/run/runtime_decorators/decorators/experimental/runtime/main.out
@@ -0,0 +1,7 @@
+@A evaluated
+@B evaluated
+@B called
+@A called
+fn() called from @A
+fn() called from @B
+C.test() called
diff --git a/tests/specs/run/runtime_decorators/decorators/experimental/runtime/main.ts b/tests/specs/run/runtime_decorators/decorators/experimental/runtime/main.ts
new file mode 100644
index 000000000..40a26bbd4
--- /dev/null
+++ b/tests/specs/run/runtime_decorators/decorators/experimental/runtime/main.ts
@@ -0,0 +1,42 @@
+// deno-lint-ignore-file
+function a() {
+ console.log("@A evaluated");
+ return function (
+ target: any,
+ propertyKey: string,
+ descriptor: PropertyDescriptor,
+ ) {
+ console.log("@A called");
+ const fn = descriptor.value;
+ descriptor.value = function () {
+ console.log("fn() called from @A");
+ fn();
+ };
+ };
+}
+
+function b() {
+ console.log("@B evaluated");
+ return function (
+ target: any,
+ propertyKey: string,
+ descriptor: PropertyDescriptor,
+ ) {
+ console.log("@B called");
+ const fn = descriptor.value;
+ descriptor.value = function () {
+ console.log("fn() called from @B");
+ fn();
+ };
+ };
+}
+
+class C {
+ @a()
+ @b()
+ static test() {
+ console.log("C.test() called");
+ }
+}
+
+C.test();
diff --git a/tests/specs/run/runtime_decorators/decorators/experimental/ts/main.out b/tests/specs/run/runtime_decorators/decorators/experimental/ts/main.out
new file mode 100644
index 000000000..ea64fbaa6
--- /dev/null
+++ b/tests/specs/run/runtime_decorators/decorators/experimental/ts/main.out
@@ -0,0 +1,3 @@
+Warning experimentalDecorators compiler option is deprecated and may be removed at any time
+Check [WILDCARD]
+SomeClass { someField: "asdf" }
diff --git a/tests/specs/run/runtime_decorators/decorators/experimental/ts/main.ts b/tests/specs/run/runtime_decorators/decorators/experimental/ts/main.ts
new file mode 100644
index 000000000..95fba6cd4
--- /dev/null
+++ b/tests/specs/run/runtime_decorators/decorators/experimental/ts/main.ts
@@ -0,0 +1,14 @@
+// deno-lint-ignore-file
+
+function Decorate() {
+ return function (constructor: any): any {
+ return class extends constructor {
+ protected someField: string = "asdf";
+ };
+ };
+}
+
+@Decorate()
+class SomeClass {}
+
+console.log(new SomeClass());
diff --git a/tests/specs/run/runtime_decorators/decorators/tc39_proposal/main.out b/tests/specs/run/runtime_decorators/decorators/tc39_proposal/main.out
new file mode 100644
index 000000000..39394952e
--- /dev/null
+++ b/tests/specs/run/runtime_decorators/decorators/tc39_proposal/main.out
@@ -0,0 +1,3 @@
+starting m with arguments 1
+C.m 1
+ending m
diff --git a/tests/specs/run/runtime_decorators/decorators/tc39_proposal/main.ts b/tests/specs/run/runtime_decorators/decorators/tc39_proposal/main.ts
new file mode 100644
index 000000000..00c8a8502
--- /dev/null
+++ b/tests/specs/run/runtime_decorators/decorators/tc39_proposal/main.ts
@@ -0,0 +1,21 @@
+// deno-lint-ignore no-explicit-any
+function logged(value: any, { kind, name }: { kind: string; name: string }) {
+ if (kind === "method") {
+ return function (...args: unknown[]) {
+ console.log(`starting ${name} with arguments ${args.join(", ")}`);
+ // @ts-ignore this has implicit any type
+ const ret = value.call(this, ...args);
+ console.log(`ending ${name}`);
+ return ret;
+ };
+ }
+}
+
+class C {
+ @logged
+ m(arg: number) {
+ console.log("C.m", arg);
+ }
+}
+
+new C().m(1);
diff --git a/tests/specs/run/seed_random/__test__.jsonc b/tests/specs/run/seed_random/__test__.jsonc
new file mode 100644
index 000000000..5a1876d6c
--- /dev/null
+++ b/tests/specs/run/seed_random/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --seed=100 seed_random.js",
+ "output": "seed_random.js.out"
+}
diff --git a/tests/specs/run/seed_random/seed_random.js b/tests/specs/run/seed_random/seed_random.js
new file mode 100644
index 000000000..7f6e336df
--- /dev/null
+++ b/tests/specs/run/seed_random/seed_random.js
@@ -0,0 +1,11 @@
+for (let i = 0; i < 10; ++i) {
+ console.log(Math.random());
+}
+
+const arr = new Uint8Array(32);
+
+crypto.getRandomValues(arr);
+console.log(arr);
+
+crypto.getRandomValues(arr);
+console.log(arr);
diff --git a/tests/specs/run/seed_random/seed_random.js.out b/tests/specs/run/seed_random/seed_random.js.out
new file mode 100644
index 000000000..4d1ebd081
--- /dev/null
+++ b/tests/specs/run/seed_random/seed_random.js.out
@@ -0,0 +1,22 @@
+0.858562739044346
+0.8973397944553141
+0.15335012655691727
+0.36867387434349963
+0.3591039342838782
+0.7044499748617652
+0.7461423057751548
+0.3824611207183364
+0.5950178237266042
+0.22440633214343908
+Uint8Array(32) [
+ 153, 221, 127, 193, 173, 88, 77, 155,
+ 23, 66, 117, 239, 157, 231, 189, 160,
+ 79, 198, 30, 56, 137, 159, 220, 226,
+ 47, 211, 26, 73, 243, 252, 71, 214
+]
+Uint8Array(32) [
+ 18, 98, 66, 131, 76, 87, 93, 76,
+ 205, 81, 250, 112, 129, 119, 92, 9,
+ 116, 99, 5, 171, 8, 137, 132, 79,
+ 255, 9, 194, 1, 138, 85, 72, 189
+]
diff --git a/tests/specs/run/set_exit_code_0/__test__.jsonc b/tests/specs/run/set_exit_code_0/__test__.jsonc
new file mode 100644
index 000000000..a5866e8c6
--- /dev/null
+++ b/tests/specs/run/set_exit_code_0/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run --no-check set_exit_code_0.ts",
+ "output": "",
+ "exitCode": 0
+}
diff --git a/tests/specs/run/set_exit_code_0/set_exit_code_0.ts b/tests/specs/run/set_exit_code_0/set_exit_code_0.ts
new file mode 100644
index 000000000..8a0103c8f
--- /dev/null
+++ b/tests/specs/run/set_exit_code_0/set_exit_code_0.ts
@@ -0,0 +1,2 @@
+Deno[Deno.internal].core.ops.op_set_exit_code(42);
+Deno.exit(0); // Takes precedence.
diff --git a/tests/specs/run/set_exit_code_1/__test__.jsonc b/tests/specs/run/set_exit_code_1/__test__.jsonc
new file mode 100644
index 000000000..1ca50c982
--- /dev/null
+++ b/tests/specs/run/set_exit_code_1/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run --no-check set_exit_code_1.ts",
+ "output": "",
+ "exitCode": 42
+}
diff --git a/tests/specs/run/set_exit_code_1/set_exit_code_1.ts b/tests/specs/run/set_exit_code_1/set_exit_code_1.ts
new file mode 100644
index 000000000..45027ccf7
--- /dev/null
+++ b/tests/specs/run/set_exit_code_1/set_exit_code_1.ts
@@ -0,0 +1,2 @@
+Deno[Deno.internal].core.ops.op_set_exit_code(42);
+Deno.exit();
diff --git a/tests/specs/run/set_exit_code_2/__test__.jsonc b/tests/specs/run/set_exit_code_2/__test__.jsonc
new file mode 100644
index 000000000..af7411f7c
--- /dev/null
+++ b/tests/specs/run/set_exit_code_2/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run --no-check set_exit_code_2.ts",
+ "output": "",
+ "exitCode": 42
+}
diff --git a/tests/specs/run/set_exit_code_2/set_exit_code_2.ts b/tests/specs/run/set_exit_code_2/set_exit_code_2.ts
new file mode 100644
index 000000000..48469c17d
--- /dev/null
+++ b/tests/specs/run/set_exit_code_2/set_exit_code_2.ts
@@ -0,0 +1,2 @@
+Deno[Deno.internal].core.ops.op_set_exit_code(42);
+// Exits naturally.
diff --git a/tests/specs/run/set_timeout_error/__test__.jsonc b/tests/specs/run/set_timeout_error/__test__.jsonc
new file mode 100644
index 000000000..eea730fd8
--- /dev/null
+++ b/tests/specs/run/set_timeout_error/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run --quiet set_timeout_error.ts",
+ "output": "set_timeout_error.ts.out",
+ "exitCode": 1
+}
diff --git a/tests/specs/run/set_timeout_error/set_timeout_error.ts b/tests/specs/run/set_timeout_error/set_timeout_error.ts
new file mode 100644
index 000000000..2864574e7
--- /dev/null
+++ b/tests/specs/run/set_timeout_error/set_timeout_error.ts
@@ -0,0 +1,3 @@
+setTimeout(() => {
+ throw new Error("foo");
+}, 0);
diff --git a/tests/specs/run/set_timeout_error/set_timeout_error.ts.out b/tests/specs/run/set_timeout_error/set_timeout_error.ts.out
new file mode 100644
index 000000000..9db053f6c
--- /dev/null
+++ b/tests/specs/run/set_timeout_error/set_timeout_error.ts.out
@@ -0,0 +1,5 @@
+error: Uncaught Error: foo
+ throw new Error("foo");
+ ^
+ at [WILDCARD]/set_timeout_error.ts:2:9
+ at [WILDCARD]
diff --git a/tests/specs/run/set_timeout_error_handled/__test__.jsonc b/tests/specs/run/set_timeout_error_handled/__test__.jsonc
new file mode 100644
index 000000000..39a9424bb
--- /dev/null
+++ b/tests/specs/run/set_timeout_error_handled/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --quiet set_timeout_error_handled.ts",
+ "output": "set_timeout_error_handled.ts.out"
+}
diff --git a/tests/specs/run/set_timeout_error_handled/set_timeout_error_handled.ts b/tests/specs/run/set_timeout_error_handled/set_timeout_error_handled.ts
new file mode 100644
index 000000000..aee2d97d2
--- /dev/null
+++ b/tests/specs/run/set_timeout_error_handled/set_timeout_error_handled.ts
@@ -0,0 +1,19 @@
+addEventListener("error", (event) => {
+ console.log({
+ cancelable: event.cancelable,
+ message: event.message,
+ filename: event.filename?.slice?.(-100),
+ lineno: event.lineno,
+ colno: event.colno,
+ error: event.error,
+ });
+ event.preventDefault();
+});
+
+onerror = (event) => {
+ console.log("onerror() called", event.error);
+};
+
+setTimeout(() => {
+ throw new Error("foo");
+}, 0);
diff --git a/tests/specs/run/set_timeout_error_handled/set_timeout_error_handled.ts.out b/tests/specs/run/set_timeout_error_handled/set_timeout_error_handled.ts.out
new file mode 100644
index 000000000..054dd9b6b
--- /dev/null
+++ b/tests/specs/run/set_timeout_error_handled/set_timeout_error_handled.ts.out
@@ -0,0 +1,13 @@
+{
+ cancelable: true,
+ message: "Uncaught Error: foo",
+ filename: "[WILDCARD]/set_timeout_error_handled.ts",
+ lineno: 18,
+ colno: 9,
+ error: Error: foo
+ at [WILDCARD]/set_timeout_error_handled.ts:18:9
+ at [WILDCARD]
+}
+onerror() called Error: foo
+ at [WILDCARD]/set_timeout_error_handled.ts:18:9
+ at [WILDCARD]
diff --git a/tests/specs/run/shebang_swc/__test__.jsonc b/tests/specs/run/shebang_swc/__test__.jsonc
new file mode 100644
index 000000000..65e0b5c9b
--- /dev/null
+++ b/tests/specs/run/shebang_swc/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --quiet shebang.ts",
+ "output": "shebang.ts.out"
+}
diff --git a/tests/specs/run/shebang_swc/shebang.ts b/tests/specs/run/shebang_swc/shebang.ts
new file mode 100644
index 000000000..00feb2da0
--- /dev/null
+++ b/tests/specs/run/shebang_swc/shebang.ts
@@ -0,0 +1,5 @@
+#!/usr/bin/env -S deno run
+
+import test from "./shebang2.ts";
+
+console.log(test as number);
diff --git a/tests/specs/run/shebang_swc/shebang.ts.out b/tests/specs/run/shebang_swc/shebang.ts.out
new file mode 100644
index 000000000..d81cc0710
--- /dev/null
+++ b/tests/specs/run/shebang_swc/shebang.ts.out
@@ -0,0 +1 @@
+42
diff --git a/tests/specs/run/shebang_swc/shebang2.ts b/tests/specs/run/shebang_swc/shebang2.ts
new file mode 100644
index 000000000..da0d7bf0c
--- /dev/null
+++ b/tests/specs/run/shebang_swc/shebang2.ts
@@ -0,0 +1,3 @@
+#!/usr/bin/env -S deno run
+
+export default 42;
diff --git a/tests/specs/run/shebang_tsc/__test__.jsonc b/tests/specs/run/shebang_tsc/__test__.jsonc
new file mode 100644
index 000000000..f78971d57
--- /dev/null
+++ b/tests/specs/run/shebang_tsc/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --quiet --check shebang.ts",
+ "output": "shebang.ts.out"
+}
diff --git a/tests/specs/run/shebang_tsc/shebang.ts b/tests/specs/run/shebang_tsc/shebang.ts
new file mode 100644
index 000000000..00feb2da0
--- /dev/null
+++ b/tests/specs/run/shebang_tsc/shebang.ts
@@ -0,0 +1,5 @@
+#!/usr/bin/env -S deno run
+
+import test from "./shebang2.ts";
+
+console.log(test as number);
diff --git a/tests/specs/run/shebang_tsc/shebang.ts.out b/tests/specs/run/shebang_tsc/shebang.ts.out
new file mode 100644
index 000000000..d81cc0710
--- /dev/null
+++ b/tests/specs/run/shebang_tsc/shebang.ts.out
@@ -0,0 +1 @@
+42
diff --git a/tests/specs/run/shebang_tsc/shebang2.ts b/tests/specs/run/shebang_tsc/shebang2.ts
new file mode 100644
index 000000000..da0d7bf0c
--- /dev/null
+++ b/tests/specs/run/shebang_tsc/shebang2.ts
@@ -0,0 +1,3 @@
+#!/usr/bin/env -S deno run
+
+export default 42;
diff --git a/tests/specs/run/shebang_with_json_imports_swc/__test__.jsonc b/tests/specs/run/shebang_with_json_imports_swc/__test__.jsonc
new file mode 100644
index 000000000..90592757f
--- /dev/null
+++ b/tests/specs/run/shebang_with_json_imports_swc/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run --quiet --no-check json_with_shebang.ts",
+ "output": "json_with_shebang.ts.out",
+ "exitCode": 1
+}
diff --git a/tests/specs/run/shebang_with_json_imports_swc/json_with_shebang.json b/tests/specs/run/shebang_with_json_imports_swc/json_with_shebang.json
new file mode 100644
index 000000000..b695e4457
--- /dev/null
+++ b/tests/specs/run/shebang_with_json_imports_swc/json_with_shebang.json
@@ -0,0 +1,4 @@
+#!/usr/env -S deno run
+{
+ "test": null
+}
diff --git a/tests/specs/run/shebang_with_json_imports_swc/json_with_shebang.ts b/tests/specs/run/shebang_with_json_imports_swc/json_with_shebang.ts
new file mode 100644
index 000000000..9524026bc
--- /dev/null
+++ b/tests/specs/run/shebang_with_json_imports_swc/json_with_shebang.ts
@@ -0,0 +1,3 @@
+import json from "./json_with_shebang.json" with { type: "json" };
+
+console.log(json);
diff --git a/tests/specs/run/shebang_with_json_imports_swc/json_with_shebang.ts.out b/tests/specs/run/shebang_with_json_imports_swc/json_with_shebang.ts.out
new file mode 100644
index 000000000..23eb03720
--- /dev/null
+++ b/tests/specs/run/shebang_with_json_imports_swc/json_with_shebang.ts.out
@@ -0,0 +1 @@
+error: Uncaught SyntaxError: Unexpected token '#', "#!/usr/env"... is not valid JSON
diff --git a/tests/specs/run/shebang_with_json_imports_tsc/__test__.jsonc b/tests/specs/run/shebang_with_json_imports_tsc/__test__.jsonc
new file mode 100644
index 000000000..7fbb8a5d3
--- /dev/null
+++ b/tests/specs/run/shebang_with_json_imports_tsc/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run --quiet json_with_shebang.ts",
+ "output": "json_with_shebang.ts.out",
+ "exitCode": 1
+}
diff --git a/tests/specs/run/shebang_with_json_imports_tsc/json_with_shebang.json b/tests/specs/run/shebang_with_json_imports_tsc/json_with_shebang.json
new file mode 100644
index 000000000..b695e4457
--- /dev/null
+++ b/tests/specs/run/shebang_with_json_imports_tsc/json_with_shebang.json
@@ -0,0 +1,4 @@
+#!/usr/env -S deno run
+{
+ "test": null
+}
diff --git a/tests/specs/run/shebang_with_json_imports_tsc/json_with_shebang.ts b/tests/specs/run/shebang_with_json_imports_tsc/json_with_shebang.ts
new file mode 100644
index 000000000..9524026bc
--- /dev/null
+++ b/tests/specs/run/shebang_with_json_imports_tsc/json_with_shebang.ts
@@ -0,0 +1,3 @@
+import json from "./json_with_shebang.json" with { type: "json" };
+
+console.log(json);
diff --git a/tests/specs/run/shebang_with_json_imports_tsc/json_with_shebang.ts.out b/tests/specs/run/shebang_with_json_imports_tsc/json_with_shebang.ts.out
new file mode 100644
index 000000000..23eb03720
--- /dev/null
+++ b/tests/specs/run/shebang_with_json_imports_tsc/json_with_shebang.ts.out
@@ -0,0 +1 @@
+error: Uncaught SyntaxError: Unexpected token '#', "#!/usr/env"... is not valid JSON
diff --git a/tests/specs/run/single_compile_with_reload/__test__.jsonc b/tests/specs/run/single_compile_with_reload/__test__.jsonc
new file mode 100644
index 000000000..3e2e04379
--- /dev/null
+++ b/tests/specs/run/single_compile_with_reload/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --reload --allow-read single_compile_with_reload.ts",
+ "output": "single_compile_with_reload.ts.out"
+}
diff --git a/tests/specs/run/single_compile_with_reload/mod1.ts b/tests/specs/run/single_compile_with_reload/mod1.ts
new file mode 100644
index 000000000..5e58f432e
--- /dev/null
+++ b/tests/specs/run/single_compile_with_reload/mod1.ts
@@ -0,0 +1,17 @@
+import { printHello2, returnsFoo } from "./subdir2/mod2.ts";
+
+export function returnsHi(): string {
+ return "Hi";
+}
+
+export function returnsFoo2(): string {
+ return returnsFoo();
+}
+
+export function printHello3() {
+ printHello2();
+}
+
+export function throwsError() {
+ throw Error("exception from mod1");
+}
diff --git a/tests/specs/run/single_compile_with_reload/print_hello.ts b/tests/specs/run/single_compile_with_reload/print_hello.ts
new file mode 100644
index 000000000..b9c0ad527
--- /dev/null
+++ b/tests/specs/run/single_compile_with_reload/print_hello.ts
@@ -0,0 +1,3 @@
+export function printHello() {
+ console.log("Hello");
+}
diff --git a/tests/specs/run/single_compile_with_reload/single_compile_with_reload.ts b/tests/specs/run/single_compile_with_reload/single_compile_with_reload.ts
new file mode 100644
index 000000000..9478ad523
--- /dev/null
+++ b/tests/specs/run/single_compile_with_reload/single_compile_with_reload.ts
@@ -0,0 +1,18 @@
+await import("./single_compile_with_reload_dyn.ts");
+console.log("1");
+await import("./single_compile_with_reload_dyn.ts");
+console.log("2");
+await new Promise((r) =>
+ new Worker(
+ import.meta.resolve("./single_compile_with_reload_worker.ts"),
+ { type: "module" },
+ ).onmessage = r
+);
+console.log("3");
+await new Promise((r) =>
+ new Worker(
+ import.meta.resolve("./single_compile_with_reload_worker.ts"),
+ { type: "module" },
+ ).onmessage = r
+);
+console.log("4");
diff --git a/tests/specs/run/single_compile_with_reload/single_compile_with_reload.ts.out b/tests/specs/run/single_compile_with_reload/single_compile_with_reload.ts.out
new file mode 100644
index 000000000..a3986e3af
--- /dev/null
+++ b/tests/specs/run/single_compile_with_reload/single_compile_with_reload.ts.out
@@ -0,0 +1,7 @@
+Hello
+1
+2
+Hello from worker
+3
+Hello from worker
+4
diff --git a/tests/specs/run/single_compile_with_reload/single_compile_with_reload_dyn.ts b/tests/specs/run/single_compile_with_reload/single_compile_with_reload_dyn.ts
new file mode 100644
index 000000000..c69556be1
--- /dev/null
+++ b/tests/specs/run/single_compile_with_reload/single_compile_with_reload_dyn.ts
@@ -0,0 +1,11 @@
+import { printHello3, returnsFoo2, returnsHi } from "./mod1.ts";
+
+printHello3();
+
+if (returnsHi() !== "Hi") {
+ throw Error("Unexpected");
+}
+
+if (returnsFoo2() !== "Foo") {
+ throw Error("Unexpected");
+}
diff --git a/tests/specs/run/single_compile_with_reload/single_compile_with_reload_worker.ts b/tests/specs/run/single_compile_with_reload/single_compile_with_reload_worker.ts
new file mode 100644
index 000000000..103cafe20
--- /dev/null
+++ b/tests/specs/run/single_compile_with_reload/single_compile_with_reload_worker.ts
@@ -0,0 +1,3 @@
+console.log("Hello from worker");
+postMessage(null);
+close();
diff --git a/tests/specs/run/single_compile_with_reload/subdir2/dynamic_import.ts b/tests/specs/run/single_compile_with_reload/subdir2/dynamic_import.ts
new file mode 100644
index 000000000..59beb64c3
--- /dev/null
+++ b/tests/specs/run/single_compile_with_reload/subdir2/dynamic_import.ts
@@ -0,0 +1,4 @@
+(async () => {
+ const { printHello } = await import("../mod2.ts");
+ printHello();
+})();
diff --git a/tests/specs/run/single_compile_with_reload/subdir2/mod2.ts b/tests/specs/run/single_compile_with_reload/subdir2/mod2.ts
new file mode 100644
index 000000000..9071d0aeb
--- /dev/null
+++ b/tests/specs/run/single_compile_with_reload/subdir2/mod2.ts
@@ -0,0 +1,9 @@
+import { printHello } from "../print_hello.ts";
+
+export function returnsFoo(): string {
+ return "Foo";
+}
+
+export function printHello2() {
+ printHello();
+}
diff --git a/tests/specs/run/spawn_stdout_inherit/__test__.jsonc b/tests/specs/run/spawn_stdout_inherit/__test__.jsonc
new file mode 100644
index 000000000..4dd5fe54c
--- /dev/null
+++ b/tests/specs/run/spawn_stdout_inherit/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --quiet -A spawn_stdout_inherit.ts",
+ "output": "spawn_stdout_inherit.ts.out"
+}
diff --git a/tests/specs/run/spawn_stdout_inherit/spawn_stdout_inherit.ts b/tests/specs/run/spawn_stdout_inherit/spawn_stdout_inherit.ts
new file mode 100644
index 000000000..04f635cea
--- /dev/null
+++ b/tests/specs/run/spawn_stdout_inherit/spawn_stdout_inherit.ts
@@ -0,0 +1,8 @@
+await new Deno.Command(Deno.execPath(), {
+ args: ["eval", "--quiet", "console.log('Hello, world! 1')"],
+ stdout: "inherit",
+}).output();
+new Deno.Command(Deno.execPath(), {
+ args: ["eval", "--quiet", "console.log('Hello, world! 2')"],
+ stdout: "inherit",
+}).outputSync();
diff --git a/tests/specs/run/spawn_stdout_inherit/spawn_stdout_inherit.ts.out b/tests/specs/run/spawn_stdout_inherit/spawn_stdout_inherit.ts.out
new file mode 100644
index 000000000..474891cf2
--- /dev/null
+++ b/tests/specs/run/spawn_stdout_inherit/spawn_stdout_inherit.ts.out
@@ -0,0 +1,2 @@
+Hello, world! 1
+Hello, world! 2
diff --git a/tests/specs/run/stdin_read_all/__test__.jsonc b/tests/specs/run/stdin_read_all/__test__.jsonc
new file mode 100644
index 000000000..6fc035aab
--- /dev/null
+++ b/tests/specs/run/stdin_read_all/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run --quiet stdin_read_all.ts",
+ "output": "stdin_read_all.out",
+ "input": "01234567890123456789012345678901234567890123456789"
+}
diff --git a/tests/specs/run/stdin_read_all/stdin_read_all.out b/tests/specs/run/stdin_read_all/stdin_read_all.out
new file mode 100644
index 000000000..2f0dfb71a
--- /dev/null
+++ b/tests/specs/run/stdin_read_all/stdin_read_all.out
@@ -0,0 +1 @@
+01234567890123456789012345678901234567890123456789
diff --git a/tests/specs/run/stdin_read_all/stdin_read_all.ts b/tests/specs/run/stdin_read_all/stdin_read_all.ts
new file mode 100644
index 000000000..d683a2bf6
--- /dev/null
+++ b/tests/specs/run/stdin_read_all/stdin_read_all.ts
@@ -0,0 +1,17 @@
+const encoder = new TextEncoder();
+
+const pending = [];
+
+// do this a bunch of times to ensure it doesn't race
+// and everything happens in order
+for (let i = 0; i < 50; i++) {
+ const buf = new Uint8Array(1);
+ pending.push(
+ Deno.stdin.read(buf).then(() => {
+ return Deno.stdout.write(buf);
+ }),
+ );
+}
+
+await Promise.all(pending);
+await Deno.stdout.write(encoder.encode("\n"));
diff --git a/tests/specs/run/stdout_write_all/__test__.jsonc b/tests/specs/run/stdout_write_all/__test__.jsonc
new file mode 100644
index 000000000..2057f4a11
--- /dev/null
+++ b/tests/specs/run/stdout_write_all/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --quiet stdout_write_all.ts",
+ "output": "stdout_write_all.out"
+}
diff --git a/tests/specs/run/stdout_write_all/stdout_write_all.out b/tests/specs/run/stdout_write_all/stdout_write_all.out
new file mode 100644
index 000000000..d0e667fd4
--- /dev/null
+++ b/tests/specs/run/stdout_write_all/stdout_write_all.out
@@ -0,0 +1,100 @@
+Hello, world! 0
+Hello, world! 1
+Hello, world! 2
+Hello, world! 3
+Hello, world! 4
+Hello, world! 5
+Hello, world! 6
+Hello, world! 7
+Hello, world! 8
+Hello, world! 9
+Hello, world! 10
+Hello, world! 11
+Hello, world! 12
+Hello, world! 13
+Hello, world! 14
+Hello, world! 15
+Hello, world! 16
+Hello, world! 17
+Hello, world! 18
+Hello, world! 19
+Hello, world! 20
+Hello, world! 21
+Hello, world! 22
+Hello, world! 23
+Hello, world! 24
+Hello, world! 25
+Hello, world! 26
+Hello, world! 27
+Hello, world! 28
+Hello, world! 29
+Hello, world! 30
+Hello, world! 31
+Hello, world! 32
+Hello, world! 33
+Hello, world! 34
+Hello, world! 35
+Hello, world! 36
+Hello, world! 37
+Hello, world! 38
+Hello, world! 39
+Hello, world! 40
+Hello, world! 41
+Hello, world! 42
+Hello, world! 43
+Hello, world! 44
+Hello, world! 45
+Hello, world! 46
+Hello, world! 47
+Hello, world! 48
+Hello, world! 49
+Hello, world! 50
+Hello, world! 51
+Hello, world! 52
+Hello, world! 53
+Hello, world! 54
+Hello, world! 55
+Hello, world! 56
+Hello, world! 57
+Hello, world! 58
+Hello, world! 59
+Hello, world! 60
+Hello, world! 61
+Hello, world! 62
+Hello, world! 63
+Hello, world! 64
+Hello, world! 65
+Hello, world! 66
+Hello, world! 67
+Hello, world! 68
+Hello, world! 69
+Hello, world! 70
+Hello, world! 71
+Hello, world! 72
+Hello, world! 73
+Hello, world! 74
+Hello, world! 75
+Hello, world! 76
+Hello, world! 77
+Hello, world! 78
+Hello, world! 79
+Hello, world! 80
+Hello, world! 81
+Hello, world! 82
+Hello, world! 83
+Hello, world! 84
+Hello, world! 85
+Hello, world! 86
+Hello, world! 87
+Hello, world! 88
+Hello, world! 89
+Hello, world! 90
+Hello, world! 91
+Hello, world! 92
+Hello, world! 93
+Hello, world! 94
+Hello, world! 95
+Hello, world! 96
+Hello, world! 97
+Hello, world! 98
+Hello, world! 99
diff --git a/tests/specs/run/stdout_write_all/stdout_write_all.ts b/tests/specs/run/stdout_write_all/stdout_write_all.ts
new file mode 100644
index 000000000..cfb2981e4
--- /dev/null
+++ b/tests/specs/run/stdout_write_all/stdout_write_all.ts
@@ -0,0 +1,13 @@
+const encoder = new TextEncoder();
+
+const pending = [];
+
+// do this a bunch of times to ensure it doesn't race
+// and everything happens in order
+for (let i = 0; i < 100; i++) {
+ pending.push(Deno.stdout.write(encoder.encode("Hello, ")));
+ pending.push(Deno.stdout.write(encoder.encode(`world! ${i}`)));
+ pending.push(Deno.stdout.write(encoder.encode("\n")));
+}
+
+await Promise.all(pending);
diff --git a/tests/specs/run/stdout_write_sync_async/__test__.jsonc b/tests/specs/run/stdout_write_sync_async/__test__.jsonc
new file mode 100644
index 000000000..5032ca015
--- /dev/null
+++ b/tests/specs/run/stdout_write_sync_async/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --quiet stdout_write_sync_async.ts",
+ "output": "stdout_write_sync_async.out"
+}
diff --git a/tests/specs/run/stdout_write_sync_async/stdout_write_sync_async.out b/tests/specs/run/stdout_write_sync_async/stdout_write_sync_async.out
new file mode 100644
index 000000000..91ebda1ca
--- /dev/null
+++ b/tests/specs/run/stdout_write_sync_async/stdout_write_sync_async.out
@@ -0,0 +1,200 @@
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
+Hello
diff --git a/tests/specs/run/stdout_write_sync_async/stdout_write_sync_async.ts b/tests/specs/run/stdout_write_sync_async/stdout_write_sync_async.ts
new file mode 100644
index 000000000..648999d8a
--- /dev/null
+++ b/tests/specs/run/stdout_write_sync_async/stdout_write_sync_async.ts
@@ -0,0 +1,14 @@
+const encoder = new TextEncoder();
+const pending = [];
+
+for (let i = 0; i < 100; i++) {
+ // some code that will cause stdout to be written
+ // synchronously while the async write might be occurring
+ console.log("Hello");
+ pending.push(Deno.stdout.write(encoder.encode("Hello\n")));
+ if (i % 10) {
+ await new Promise((resolve) => setTimeout(resolve, 0));
+ }
+}
+
+await Promise.all(pending);
diff --git a/tests/specs/run/swc_syntax_error/__test__.jsonc b/tests/specs/run/swc_syntax_error/__test__.jsonc
new file mode 100644
index 000000000..842a4fcf8
--- /dev/null
+++ b/tests/specs/run/swc_syntax_error/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run --reload --check swc_syntax_error.ts",
+ "output": "swc_syntax_error.ts.out",
+ "exitCode": 1
+}
diff --git a/tests/specs/run/swc_syntax_error/swc_syntax_error.ts b/tests/specs/run/swc_syntax_error/swc_syntax_error.ts
new file mode 100644
index 000000000..991ca9214
--- /dev/null
+++ b/tests/specs/run/swc_syntax_error/swc_syntax_error.ts
@@ -0,0 +1,4 @@
+// deno-fmt-ignore-file
+for await (const req of s) {
+ let something:
+}
diff --git a/tests/specs/run/swc_syntax_error/swc_syntax_error.ts.out b/tests/specs/run/swc_syntax_error/swc_syntax_error.ts.out
new file mode 100644
index 000000000..81b0c1949
--- /dev/null
+++ b/tests/specs/run/swc_syntax_error/swc_syntax_error.ts.out
@@ -0,0 +1,4 @@
+error: The module's source code could not be parsed: Unexpected token `}`. Expected an identifier, void, yield, null, await, break, a string literal, a numeric literal, true, false, `, -, import, this, typeof, {, [, ( at [WILDCARD]syntax_error.ts:4:1
+
+ }
+ ~
diff --git a/tests/specs/run/test_and_bench_are_noops_in_run/__test__.jsonc b/tests/specs/run/test_and_bench_are_noops_in_run/__test__.jsonc
new file mode 100644
index 000000000..3d8d2ba56
--- /dev/null
+++ b/tests/specs/run/test_and_bench_are_noops_in_run/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run test_and_bench_in_run.js",
+ "output": ""
+}
diff --git a/tests/specs/run/test_and_bench_are_noops_in_run/test_and_bench_in_run.js b/tests/specs/run/test_and_bench_are_noops_in_run/test_and_bench_in_run.js
new file mode 100644
index 000000000..108ae937a
--- /dev/null
+++ b/tests/specs/run/test_and_bench_are_noops_in_run/test_and_bench_in_run.js
@@ -0,0 +1,5 @@
+Deno.test(function foo() {
+});
+
+Deno.bench(function bar() {
+});
diff --git a/tests/specs/run/tls_connecttls/RootCA.pem b/tests/specs/run/tls_connecttls/RootCA.pem
new file mode 100644
index 000000000..c2f84ceeb
--- /dev/null
+++ b/tests/specs/run/tls_connecttls/RootCA.pem
@@ -0,0 +1,19 @@
+-----BEGIN CERTIFICATE-----
+MIIDIzCCAgugAwIBAgIJAMKPPW4tsOymMA0GCSqGSIb3DQEBCwUAMCcxCzAJBgNV
+BAYTAlVTMRgwFgYDVQQDDA9FeGFtcGxlLVJvb3QtQ0EwIBcNMTkxMDIxMTYyODIy
+WhgPMjExODA5MjcxNjI4MjJaMCcxCzAJBgNVBAYTAlVTMRgwFgYDVQQDDA9FeGFt
+cGxlLVJvb3QtQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDMH/IO
+2qtHfyBKwANNPB4K0q5JVSg8XxZdRpTTlz0CwU0oRO3uHrI52raCCfVeiQutyZop
+eFZTDWeXGudGAFA2B5m3orWt0s+touPi8MzjsG2TQ+WSI66QgbXTNDitDDBtTVcV
+5G3Ic+3SppQAYiHSekLISnYWgXLl+k5CnEfTowg6cjqjVr0KjL03cTN3H7b+6+0S
+ws4rYbW1j4ExR7K6BFNH6572yq5qR20E6GqlY+EcOZpw4CbCk9lS8/CWuXze/vMs
+OfDcc6K+B625d27wyEGZHedBomT2vAD7sBjvO8hn/DP1Qb46a8uCHR6NSfnJ7bXO
+G1igaIbgY1zXirNdAgMBAAGjUDBOMB0GA1UdDgQWBBTzut+pwwDfqmMYcI9KNWRD
+hxcIpTAfBgNVHSMEGDAWgBTzut+pwwDfqmMYcI9KNWRDhxcIpTAMBgNVHRMEBTAD
+AQH/MA0GCSqGSIb3DQEBCwUAA4IBAQB9AqSbZ+hEglAgSHxAMCqRFdhVu7MvaQM0
+P090mhGlOCt3yB7kdGfsIrUW6nQcTz7PPQFRaJMrFHPvFvPootkBUpTYR4hTkdce
+H6RCRu2Jxl4Y9bY/uezd9YhGCYfUtfjA6/TH9FcuZfttmOOlxOt01XfNvVMIR6RM
+z/AYhd+DeOXjr35F/VHeVpnk+55L0PYJsm1CdEbOs5Hy1ecR7ACuDkXnbM4fpz9I
+kyIWJwk2zJReKcJMgi1aIinDM9ao/dca1G99PHOw8dnr4oyoTiv8ao6PWiSRHHMi
+MNf4EgWfK+tZMnuqfpfO9740KzfcVoMNo4QJD4yn5YxroUOO/Azi
+-----END CERTIFICATE-----
diff --git a/tests/specs/run/tls_connecttls/__test__.jsonc b/tests/specs/run/tls_connecttls/__test__.jsonc
new file mode 100644
index 000000000..2e8f88339
--- /dev/null
+++ b/tests/specs/run/tls_connecttls/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --quiet --reload --allow-net --allow-read --cert RootCA.pem --config deno.json tls_connecttls.js",
+ "output": "tls.out"
+}
diff --git a/tests/specs/run/tls_connecttls/deno.json b/tests/specs/run/tls_connecttls/deno.json
new file mode 100644
index 000000000..105514e13
--- /dev/null
+++ b/tests/specs/run/tls_connecttls/deno.json
@@ -0,0 +1,4 @@
+{
+ "lock": false,
+ "importMap": "../../../../import_map.json"
+}
diff --git a/tests/specs/run/tls_connecttls/localhost.crt b/tests/specs/run/tls_connecttls/localhost.crt
new file mode 100644
index 000000000..a71ae9050
--- /dev/null
+++ b/tests/specs/run/tls_connecttls/localhost.crt
@@ -0,0 +1,21 @@
+-----BEGIN CERTIFICATE-----
+MIIDajCCAlKgAwIBAgIJAOPyQVdy/UpPMA0GCSqGSIb3DQEBCwUAMCcxCzAJBgNV
+BAYTAlVTMRgwFgYDVQQDDA9FeGFtcGxlLVJvb3QtQ0EwIBcNMTkxMDIxMTYyODU4
+WhgPMjExODA5MjcxNjI4NThaMG0xCzAJBgNVBAYTAlVTMRIwEAYDVQQIDAlZb3Vy
+U3RhdGUxETAPBgNVBAcMCFlvdXJDaXR5MR0wGwYDVQQKDBRFeGFtcGxlLUNlcnRp
+ZmljYXRlczEYMBYGA1UEAwwPbG9jYWxob3N0LmxvY2FsMIIBIjANBgkqhkiG9w0B
+AQEFAAOCAQ8AMIIBCgKCAQEAz9svjVdf5jihUBtofd84XKdb8dEHQRJfDNKaJ4Ar
+baqMHAdnqi/fWtlqEEMn8gweZ7+4hshECY5mnx4Hhy7IAbePDsTTbSm01dChhlxF
+uvd9QuvzvrqSjSq+v4Jlau+pQIhUzzV12dF5bFvrIrGWxCZp+W7lLDZI6Pd6Su+y
+ZIeiwrUaPMzdUePNf2hZI/IvWCUMCIyoqrrKHdHoPuvQCW17IyxsnFQJNbmN+Rtp
+BQilhtwvBbggCBWhHxEdiqBaZHDw6Zl+bU7ejx1mu9A95wpQ9SCL2cRkAlz2LDOy
+wznrTAwGcvqvFKxlV+3HsaD7rba4kCA1Ihp5mm/dS2k94QIDAQABo1EwTzAfBgNV
+HSMEGDAWgBTzut+pwwDfqmMYcI9KNWRDhxcIpTAJBgNVHRMEAjAAMAsGA1UdDwQE
+AwIE8DAUBgNVHREEDTALgglsb2NhbGhvc3QwDQYJKoZIhvcNAQELBQADggEBAKVu
+vVpu5nPGAGn1SX4FQUcbn9Z5wgBkjnZxfJHJQX4sYIRlcirZviPHCZGPWex4VHC+
+lFMm+70YEN2uoe5jGrdgcugzx2Amc7/mLrsvvpMsaS0PlxNMcqhdM1WHbGjjdNln
+XICVITSKnB1fSGH6uo9CMCWw5kgPS9o4QWrLLkxnds3hoz7gVEUyi/6V65mcfFNA
+lof9iKcK9JsSHdBs35vpv7UKLX+96RM7Nm2Mu0yue5JiS79/zuMA/Kryxot4jv5z
+ecdWFl0eIyQBZmBzMw2zPUqkxEnXLiKjV8jutEg/4qovTOB6YiA41qbARXdzNA2V
+FYuchcTcWmnmVVRFyyU=
+-----END CERTIFICATE-----
diff --git a/tests/specs/run/tls_connecttls/localhost.key b/tests/specs/run/tls_connecttls/localhost.key
new file mode 100644
index 000000000..42774c977
--- /dev/null
+++ b/tests/specs/run/tls_connecttls/localhost.key
@@ -0,0 +1,28 @@
+-----BEGIN PRIVATE KEY-----
+MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDP2y+NV1/mOKFQ
+G2h93zhcp1vx0QdBEl8M0pongCttqowcB2eqL99a2WoQQyfyDB5nv7iGyEQJjmaf
+HgeHLsgBt48OxNNtKbTV0KGGXEW6931C6/O+upKNKr6/gmVq76lAiFTPNXXZ0Xls
+W+sisZbEJmn5buUsNkjo93pK77Jkh6LCtRo8zN1R481/aFkj8i9YJQwIjKiqusod
+0eg+69AJbXsjLGycVAk1uY35G2kFCKWG3C8FuCAIFaEfER2KoFpkcPDpmX5tTt6P
+HWa70D3nClD1IIvZxGQCXPYsM7LDOetMDAZy+q8UrGVX7cexoPuttriQIDUiGnma
+b91LaT3hAgMBAAECggEBAJABfn+BQorBP1m9s3ZJmcXvmW7+7/SwYrQCkRS+4te2
+6h1dMAAj7K4HpUkhDeLPbJ1aoeCXjTPFuemRp4uL6Lvvzahgy059L7FXOyFYemMf
+pmQgDx5cKr6tF7yc/eDJrExuZ7urgTvouiRNxqmhuh+psZBDuXkZHwhwtQSH7uNg
+KBDKu0qWO73vFLcLckdGEU3+H9oIWs5xcvvOkWzyvHbRGFJSihgcRpPPHodF5xB9
+T/gZIoJHMmCbUMlWaSasUyNXTuvCnkvBDol8vXrMJCVzKZj9GpPDcIFdc08GSn4I
+pTdSNwzUcHbdERzdVU28Xt+t6W5rvp/4FWrssi4IzkUCgYEA//ZcEcBguRD4OFrx
+6wbSjzCcUW1NWhzA8uTOORZi4SvndcH1cU4S2wznuHNubU1XlrGwJX6PUGebmY/l
+53B5PJvStbVtZCVIxllR+ZVzRuL8wLodRHzlYH8GOzHwoa4ivSupkzl72ij1u/tI
+NMLGfYEKVdNd8zXIESUY88NszvsCgYEAz+MDp3xOhFaCe+CPv80A592cJcfzc8Al
++rahEOu+VdN2QBZf86PIf2Bfv/t0QvnRvs1z648TuH6h83YSggOAbmfHyd789jkq
+UWlktIaXbVn+VaHmPTcBWTg3ZTlvG+fiFCbZXiYhm+UUf1MDqZHdiifAoyVIjV/Z
+YhCNJo3q39MCgYEAknrpK5t9fstwUcfyA/9OhnVaL9suVjB4V0iLn+3ovlXCywgp
+ryLv9X3IKi2c9144jtu3I23vFCOGz3WjKzSZnQ7LogNmy9XudNxu5jcZ1mpWHPEl
+iKk1F2j6Juwoek5OQRX4oHFYKHwiTOa75r3Em9Q6Fu20KVgQ24bwZafj3/sCgYAy
+k0AoVw2jFIjaKl/Ogclen4OFjYek+XJD9Hpq62964d866Dafx5DXrFKfGkXGpZBp
+owI4pK5fjC9KU8dc6g0szwLEEgPowy+QbtuZL8VXTTWbD7A75E3nrs2LStXFLDzM
+OkdXqF801h6Oe1vAvUPwgItVJZTpEBCK0wwD/TLPEQKBgQDRkhlTtAoHW7W6STd0
+A/OWc0dxhzMurpxg0bLgCqUjw1ESGrSCGhffFn0IWa8sv19VWsZuBhTgjNatZsYB
+AhDs/6OosT/3nJoh2/t0hYDj1FBI0lPXWYD4pesuZ5yIMrmSaAOtIzp4BGY7ui8N
+wOqcq/jdiHj/MKEdqOXy3YAJrA==
+-----END PRIVATE KEY-----
diff --git a/tests/specs/run/tls_connecttls/textproto.ts b/tests/specs/run/tls_connecttls/textproto.ts
new file mode 100644
index 000000000..9e0f5f5f0
--- /dev/null
+++ b/tests/specs/run/tls_connecttls/textproto.ts
@@ -0,0 +1,170 @@
+// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
+// Copyright 2009 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+/** **Deprecated**. Use `TextLineStream` from `std/steams` for line-by-line text reading instead.
+ *
+ * A reader for dealing with low level text based protocols.
+ *
+ * Based on
+ * [net/textproto](https://github.com/golang/go/tree/master/src/net/textproto).
+ *
+ * @deprecated (will be removed after 0.159.0) Use `TextLineStream` from `std/steams` for line-by-line text reading instead.
+ * @module
+ */
+
+import type { BufReader, ReadLineResult } from "@std/io/buf-reader";
+import { concat } from "@std/bytes/concat";
+
+// Constants created for DRY
+const CHAR_SPACE: number = " ".charCodeAt(0);
+const CHAR_TAB: number = "\t".charCodeAt(0);
+const CHAR_COLON: number = ":".charCodeAt(0);
+
+const WHITESPACES: Array<number> = [CHAR_SPACE, CHAR_TAB];
+
+const decoder = new TextDecoder();
+
+// FROM https://github.com/denoland/deno/blob/b34628a26ab0187a827aa4ebe256e23178e25d39/cli/js/web/headers.ts#L9
+const invalidHeaderCharRegex = /[^\t\x20-\x7e\x80-\xff]/g;
+
+function str(buf: Uint8Array | null | undefined): string {
+ return !buf ? "" : decoder.decode(buf);
+}
+
+/**
+ * @deprecated (will be removed after 0.159.0) Use `TextLineStream` from `std/steams` for line-by-line text reading instead.
+ */
+export class TextProtoReader {
+ constructor(readonly r: BufReader) {}
+
+ /** readLine() reads a single line from the TextProtoReader,
+ * eliding the final \n or \r\n from the returned string.
+ */
+ async readLine(): Promise<string | null> {
+ const s = await this.readLineSlice();
+ return s === null ? null : str(s);
+ }
+
+ /** ReadMimeHeader reads a MIME-style header from r.
+ * The header is a sequence of possibly continued Key: Value lines
+ * ending in a blank line.
+ * The returned map m maps CanonicalMIMEHeaderKey(key) to a
+ * sequence of values in the same order encountered in the input.
+ *
+ * For example, consider this input:
+ *
+ * My-Key: Value 1
+ * Long-Key: Even
+ * Longer Value
+ * My-Key: Value 2
+ *
+ * Given that input, ReadMIMEHeader returns the map:
+ *
+ * map[string][]string{
+ * "My-Key": {"Value 1", "Value 2"},
+ * "Long-Key": {"Even Longer Value"},
+ * }
+ */
+ async readMimeHeader(): Promise<Headers | null> {
+ const m = new Headers();
+ let line: Uint8Array | undefined;
+
+ // The first line cannot start with a leading space.
+ let buf = await this.r.peek(1);
+ if (buf === null) {
+ return null;
+ } else if (WHITESPACES.includes(buf[0])) {
+ line = (await this.readLineSlice()) as Uint8Array;
+ }
+
+ buf = await this.r.peek(1);
+ if (buf === null) {
+ throw new Deno.errors.UnexpectedEof();
+ } else if (WHITESPACES.includes(buf[0])) {
+ throw new Deno.errors.InvalidData(
+ `malformed MIME header initial line: ${str(line)}`,
+ );
+ }
+
+ while (true) {
+ const kv = await this.readLineSlice(); // readContinuedLineSlice
+ if (kv === null) throw new Deno.errors.UnexpectedEof();
+ if (kv.byteLength === 0) return m;
+
+ // Key ends at first colon
+ let i = kv.indexOf(CHAR_COLON);
+ if (i < 0) {
+ throw new Deno.errors.InvalidData(
+ `malformed MIME header line: ${str(kv)}`,
+ );
+ }
+
+ //let key = canonicalMIMEHeaderKey(kv.subarray(0, endKey));
+ const key = str(kv.subarray(0, i));
+
+ // As per RFC 7230 field-name is a token,
+ // tokens consist of one or more chars.
+ // We could throw `Deno.errors.InvalidData` here,
+ // but better to be liberal in what we
+ // accept, so if we get an empty key, skip it.
+ if (key == "") {
+ continue;
+ }
+
+ // Skip initial spaces in value.
+ i++; // skip colon
+ while (
+ i < kv.byteLength &&
+ (WHITESPACES.includes(kv[i]))
+ ) {
+ i++;
+ }
+ const value = str(kv.subarray(i)).replace(
+ invalidHeaderCharRegex,
+ encodeURI,
+ );
+
+ // In case of invalid header we swallow the error
+ // example: "Audio Mode" => invalid due to space in the key
+ try {
+ m.append(key, value);
+ } catch {
+ // Pass
+ }
+ }
+ }
+
+ async readLineSlice(): Promise<Uint8Array | null> {
+ let line = new Uint8Array(0);
+ let r: ReadLineResult | null = null;
+
+ do {
+ r = await this.r.readLine();
+ // TODO(ry):
+ // This skipSpace() is definitely misplaced, but I don't know where it
+ // comes from nor how to fix it.
+
+ //TODO(SmashingQuasar): Kept skipSpace to preserve behavior but it should be looked into to check if it makes sense when this is used.
+
+ if (r !== null && this.skipSpace(r.line) !== 0) {
+ line = concat([line, r.line]);
+ }
+ } while (r !== null && r.more);
+
+ return r === null ? null : line;
+ }
+
+ skipSpace(l: Uint8Array): number {
+ let n = 0;
+
+ for (const val of l) {
+ if (!WHITESPACES.includes(val)) {
+ n++;
+ }
+ }
+
+ return n;
+ }
+}
diff --git a/tests/specs/run/tls_connecttls/tls.out b/tests/specs/run/tls_connecttls/tls.out
new file mode 100644
index 000000000..c8e8a135c
--- /dev/null
+++ b/tests/specs/run/tls_connecttls/tls.out
@@ -0,0 +1 @@
+DONE
diff --git a/tests/specs/run/tls_connecttls/tls_connecttls.js b/tests/specs/run/tls_connecttls/tls_connecttls.js
new file mode 100644
index 000000000..686b13aea
--- /dev/null
+++ b/tests/specs/run/tls_connecttls/tls_connecttls.js
@@ -0,0 +1,65 @@
+import { assert, assertEquals } from "@std/assert";
+import { BufReader, BufWriter } from "@std/io";
+import { TextProtoReader } from "./textproto.ts";
+
+const encoder = new TextEncoder();
+const decoder = new TextDecoder();
+
+const { promise, resolve } = Promise.withResolvers();
+const hostname = "localhost";
+const port = 3505;
+
+const listener = Deno.listenTls({
+ hostname,
+ port,
+ cert: Deno.readTextFileSync("./localhost.crt"),
+ key: Deno.readTextFileSync("./localhost.key"),
+});
+
+const response = encoder.encode(
+ "HTTP/1.1 200 OK\r\nContent-Length: 12\r\n\r\nHello World\n",
+);
+
+listener.accept().then(
+ async (conn) => {
+ assert(conn.remoteAddr != null);
+ assert(conn.localAddr != null);
+ await conn.write(response);
+ // TODO(bartlomieju): this might be a bug
+ setTimeout(() => {
+ conn.close();
+ resolve();
+ }, 0);
+ },
+);
+
+const conn = await Deno.connectTls({
+ hostname,
+ port,
+});
+const w = new BufWriter(conn);
+const r = new BufReader(conn);
+const body = `GET / HTTP/1.1\r\nHost: ${hostname}:${port}\r\n\r\n`;
+const writeResult = await w.write(encoder.encode(body));
+assertEquals(body.length, writeResult);
+await w.flush();
+const tpr = new TextProtoReader(r);
+const statusLine = await tpr.readLine();
+assert(statusLine !== null, `line must be read: ${String(statusLine)}`);
+const m = statusLine.match(/^(.+?) (.+?) (.+?)$/);
+assert(m !== null, "must be matched");
+const [_, proto, status, ok] = m;
+assertEquals(proto, "HTTP/1.1");
+assertEquals(status, "200");
+assertEquals(ok, "OK");
+const headers = await tpr.readMimeHeader();
+assert(headers !== null);
+const contentLength = parseInt(headers.get("content-length"));
+const bodyBuf = new Uint8Array(contentLength);
+await r.readFull(bodyBuf);
+assertEquals(decoder.decode(bodyBuf), "Hello World\n");
+conn.close();
+listener.close();
+await promise;
+
+console.log("DONE");
diff --git a/tests/specs/run/tls_starttls/RootCA.pem b/tests/specs/run/tls_starttls/RootCA.pem
new file mode 100644
index 000000000..c2f84ceeb
--- /dev/null
+++ b/tests/specs/run/tls_starttls/RootCA.pem
@@ -0,0 +1,19 @@
+-----BEGIN CERTIFICATE-----
+MIIDIzCCAgugAwIBAgIJAMKPPW4tsOymMA0GCSqGSIb3DQEBCwUAMCcxCzAJBgNV
+BAYTAlVTMRgwFgYDVQQDDA9FeGFtcGxlLVJvb3QtQ0EwIBcNMTkxMDIxMTYyODIy
+WhgPMjExODA5MjcxNjI4MjJaMCcxCzAJBgNVBAYTAlVTMRgwFgYDVQQDDA9FeGFt
+cGxlLVJvb3QtQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDMH/IO
+2qtHfyBKwANNPB4K0q5JVSg8XxZdRpTTlz0CwU0oRO3uHrI52raCCfVeiQutyZop
+eFZTDWeXGudGAFA2B5m3orWt0s+touPi8MzjsG2TQ+WSI66QgbXTNDitDDBtTVcV
+5G3Ic+3SppQAYiHSekLISnYWgXLl+k5CnEfTowg6cjqjVr0KjL03cTN3H7b+6+0S
+ws4rYbW1j4ExR7K6BFNH6572yq5qR20E6GqlY+EcOZpw4CbCk9lS8/CWuXze/vMs
+OfDcc6K+B625d27wyEGZHedBomT2vAD7sBjvO8hn/DP1Qb46a8uCHR6NSfnJ7bXO
+G1igaIbgY1zXirNdAgMBAAGjUDBOMB0GA1UdDgQWBBTzut+pwwDfqmMYcI9KNWRD
+hxcIpTAfBgNVHSMEGDAWgBTzut+pwwDfqmMYcI9KNWRDhxcIpTAMBgNVHRMEBTAD
+AQH/MA0GCSqGSIb3DQEBCwUAA4IBAQB9AqSbZ+hEglAgSHxAMCqRFdhVu7MvaQM0
+P090mhGlOCt3yB7kdGfsIrUW6nQcTz7PPQFRaJMrFHPvFvPootkBUpTYR4hTkdce
+H6RCRu2Jxl4Y9bY/uezd9YhGCYfUtfjA6/TH9FcuZfttmOOlxOt01XfNvVMIR6RM
+z/AYhd+DeOXjr35F/VHeVpnk+55L0PYJsm1CdEbOs5Hy1ecR7ACuDkXnbM4fpz9I
+kyIWJwk2zJReKcJMgi1aIinDM9ao/dca1G99PHOw8dnr4oyoTiv8ao6PWiSRHHMi
+MNf4EgWfK+tZMnuqfpfO9740KzfcVoMNo4QJD4yn5YxroUOO/Azi
+-----END CERTIFICATE-----
diff --git a/tests/specs/run/tls_starttls/__test__.jsonc b/tests/specs/run/tls_starttls/__test__.jsonc
new file mode 100644
index 000000000..4c1fe6324
--- /dev/null
+++ b/tests/specs/run/tls_starttls/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --quiet --reload --allow-net --allow-read --cert RootCA.pem --config deno.json tls_starttls.js",
+ "output": "tls.out"
+}
diff --git a/tests/specs/run/tls_starttls/deno.json b/tests/specs/run/tls_starttls/deno.json
new file mode 100644
index 000000000..105514e13
--- /dev/null
+++ b/tests/specs/run/tls_starttls/deno.json
@@ -0,0 +1,4 @@
+{
+ "lock": false,
+ "importMap": "../../../../import_map.json"
+}
diff --git a/tests/specs/run/tls_starttls/localhost.crt b/tests/specs/run/tls_starttls/localhost.crt
new file mode 100644
index 000000000..a71ae9050
--- /dev/null
+++ b/tests/specs/run/tls_starttls/localhost.crt
@@ -0,0 +1,21 @@
+-----BEGIN CERTIFICATE-----
+MIIDajCCAlKgAwIBAgIJAOPyQVdy/UpPMA0GCSqGSIb3DQEBCwUAMCcxCzAJBgNV
+BAYTAlVTMRgwFgYDVQQDDA9FeGFtcGxlLVJvb3QtQ0EwIBcNMTkxMDIxMTYyODU4
+WhgPMjExODA5MjcxNjI4NThaMG0xCzAJBgNVBAYTAlVTMRIwEAYDVQQIDAlZb3Vy
+U3RhdGUxETAPBgNVBAcMCFlvdXJDaXR5MR0wGwYDVQQKDBRFeGFtcGxlLUNlcnRp
+ZmljYXRlczEYMBYGA1UEAwwPbG9jYWxob3N0LmxvY2FsMIIBIjANBgkqhkiG9w0B
+AQEFAAOCAQ8AMIIBCgKCAQEAz9svjVdf5jihUBtofd84XKdb8dEHQRJfDNKaJ4Ar
+baqMHAdnqi/fWtlqEEMn8gweZ7+4hshECY5mnx4Hhy7IAbePDsTTbSm01dChhlxF
+uvd9QuvzvrqSjSq+v4Jlau+pQIhUzzV12dF5bFvrIrGWxCZp+W7lLDZI6Pd6Su+y
+ZIeiwrUaPMzdUePNf2hZI/IvWCUMCIyoqrrKHdHoPuvQCW17IyxsnFQJNbmN+Rtp
+BQilhtwvBbggCBWhHxEdiqBaZHDw6Zl+bU7ejx1mu9A95wpQ9SCL2cRkAlz2LDOy
+wznrTAwGcvqvFKxlV+3HsaD7rba4kCA1Ihp5mm/dS2k94QIDAQABo1EwTzAfBgNV
+HSMEGDAWgBTzut+pwwDfqmMYcI9KNWRDhxcIpTAJBgNVHRMEAjAAMAsGA1UdDwQE
+AwIE8DAUBgNVHREEDTALgglsb2NhbGhvc3QwDQYJKoZIhvcNAQELBQADggEBAKVu
+vVpu5nPGAGn1SX4FQUcbn9Z5wgBkjnZxfJHJQX4sYIRlcirZviPHCZGPWex4VHC+
+lFMm+70YEN2uoe5jGrdgcugzx2Amc7/mLrsvvpMsaS0PlxNMcqhdM1WHbGjjdNln
+XICVITSKnB1fSGH6uo9CMCWw5kgPS9o4QWrLLkxnds3hoz7gVEUyi/6V65mcfFNA
+lof9iKcK9JsSHdBs35vpv7UKLX+96RM7Nm2Mu0yue5JiS79/zuMA/Kryxot4jv5z
+ecdWFl0eIyQBZmBzMw2zPUqkxEnXLiKjV8jutEg/4qovTOB6YiA41qbARXdzNA2V
+FYuchcTcWmnmVVRFyyU=
+-----END CERTIFICATE-----
diff --git a/tests/specs/run/tls_starttls/localhost.key b/tests/specs/run/tls_starttls/localhost.key
new file mode 100644
index 000000000..42774c977
--- /dev/null
+++ b/tests/specs/run/tls_starttls/localhost.key
@@ -0,0 +1,28 @@
+-----BEGIN PRIVATE KEY-----
+MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDP2y+NV1/mOKFQ
+G2h93zhcp1vx0QdBEl8M0pongCttqowcB2eqL99a2WoQQyfyDB5nv7iGyEQJjmaf
+HgeHLsgBt48OxNNtKbTV0KGGXEW6931C6/O+upKNKr6/gmVq76lAiFTPNXXZ0Xls
+W+sisZbEJmn5buUsNkjo93pK77Jkh6LCtRo8zN1R481/aFkj8i9YJQwIjKiqusod
+0eg+69AJbXsjLGycVAk1uY35G2kFCKWG3C8FuCAIFaEfER2KoFpkcPDpmX5tTt6P
+HWa70D3nClD1IIvZxGQCXPYsM7LDOetMDAZy+q8UrGVX7cexoPuttriQIDUiGnma
+b91LaT3hAgMBAAECggEBAJABfn+BQorBP1m9s3ZJmcXvmW7+7/SwYrQCkRS+4te2
+6h1dMAAj7K4HpUkhDeLPbJ1aoeCXjTPFuemRp4uL6Lvvzahgy059L7FXOyFYemMf
+pmQgDx5cKr6tF7yc/eDJrExuZ7urgTvouiRNxqmhuh+psZBDuXkZHwhwtQSH7uNg
+KBDKu0qWO73vFLcLckdGEU3+H9oIWs5xcvvOkWzyvHbRGFJSihgcRpPPHodF5xB9
+T/gZIoJHMmCbUMlWaSasUyNXTuvCnkvBDol8vXrMJCVzKZj9GpPDcIFdc08GSn4I
+pTdSNwzUcHbdERzdVU28Xt+t6W5rvp/4FWrssi4IzkUCgYEA//ZcEcBguRD4OFrx
+6wbSjzCcUW1NWhzA8uTOORZi4SvndcH1cU4S2wznuHNubU1XlrGwJX6PUGebmY/l
+53B5PJvStbVtZCVIxllR+ZVzRuL8wLodRHzlYH8GOzHwoa4ivSupkzl72ij1u/tI
+NMLGfYEKVdNd8zXIESUY88NszvsCgYEAz+MDp3xOhFaCe+CPv80A592cJcfzc8Al
++rahEOu+VdN2QBZf86PIf2Bfv/t0QvnRvs1z648TuH6h83YSggOAbmfHyd789jkq
+UWlktIaXbVn+VaHmPTcBWTg3ZTlvG+fiFCbZXiYhm+UUf1MDqZHdiifAoyVIjV/Z
+YhCNJo3q39MCgYEAknrpK5t9fstwUcfyA/9OhnVaL9suVjB4V0iLn+3ovlXCywgp
+ryLv9X3IKi2c9144jtu3I23vFCOGz3WjKzSZnQ7LogNmy9XudNxu5jcZ1mpWHPEl
+iKk1F2j6Juwoek5OQRX4oHFYKHwiTOa75r3Em9Q6Fu20KVgQ24bwZafj3/sCgYAy
+k0AoVw2jFIjaKl/Ogclen4OFjYek+XJD9Hpq62964d866Dafx5DXrFKfGkXGpZBp
+owI4pK5fjC9KU8dc6g0szwLEEgPowy+QbtuZL8VXTTWbD7A75E3nrs2LStXFLDzM
+OkdXqF801h6Oe1vAvUPwgItVJZTpEBCK0wwD/TLPEQKBgQDRkhlTtAoHW7W6STd0
+A/OWc0dxhzMurpxg0bLgCqUjw1ESGrSCGhffFn0IWa8sv19VWsZuBhTgjNatZsYB
+AhDs/6OosT/3nJoh2/t0hYDj1FBI0lPXWYD4pesuZ5yIMrmSaAOtIzp4BGY7ui8N
+wOqcq/jdiHj/MKEdqOXy3YAJrA==
+-----END PRIVATE KEY-----
diff --git a/tests/specs/run/tls_starttls/textproto.ts b/tests/specs/run/tls_starttls/textproto.ts
new file mode 100644
index 000000000..9e0f5f5f0
--- /dev/null
+++ b/tests/specs/run/tls_starttls/textproto.ts
@@ -0,0 +1,170 @@
+// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
+// Copyright 2009 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+/** **Deprecated**. Use `TextLineStream` from `std/steams` for line-by-line text reading instead.
+ *
+ * A reader for dealing with low level text based protocols.
+ *
+ * Based on
+ * [net/textproto](https://github.com/golang/go/tree/master/src/net/textproto).
+ *
+ * @deprecated (will be removed after 0.159.0) Use `TextLineStream` from `std/steams` for line-by-line text reading instead.
+ * @module
+ */
+
+import type { BufReader, ReadLineResult } from "@std/io/buf-reader";
+import { concat } from "@std/bytes/concat";
+
+// Constants created for DRY
+const CHAR_SPACE: number = " ".charCodeAt(0);
+const CHAR_TAB: number = "\t".charCodeAt(0);
+const CHAR_COLON: number = ":".charCodeAt(0);
+
+const WHITESPACES: Array<number> = [CHAR_SPACE, CHAR_TAB];
+
+const decoder = new TextDecoder();
+
+// FROM https://github.com/denoland/deno/blob/b34628a26ab0187a827aa4ebe256e23178e25d39/cli/js/web/headers.ts#L9
+const invalidHeaderCharRegex = /[^\t\x20-\x7e\x80-\xff]/g;
+
+function str(buf: Uint8Array | null | undefined): string {
+ return !buf ? "" : decoder.decode(buf);
+}
+
+/**
+ * @deprecated (will be removed after 0.159.0) Use `TextLineStream` from `std/steams` for line-by-line text reading instead.
+ */
+export class TextProtoReader {
+ constructor(readonly r: BufReader) {}
+
+ /** readLine() reads a single line from the TextProtoReader,
+ * eliding the final \n or \r\n from the returned string.
+ */
+ async readLine(): Promise<string | null> {
+ const s = await this.readLineSlice();
+ return s === null ? null : str(s);
+ }
+
+ /** ReadMimeHeader reads a MIME-style header from r.
+ * The header is a sequence of possibly continued Key: Value lines
+ * ending in a blank line.
+ * The returned map m maps CanonicalMIMEHeaderKey(key) to a
+ * sequence of values in the same order encountered in the input.
+ *
+ * For example, consider this input:
+ *
+ * My-Key: Value 1
+ * Long-Key: Even
+ * Longer Value
+ * My-Key: Value 2
+ *
+ * Given that input, ReadMIMEHeader returns the map:
+ *
+ * map[string][]string{
+ * "My-Key": {"Value 1", "Value 2"},
+ * "Long-Key": {"Even Longer Value"},
+ * }
+ */
+ async readMimeHeader(): Promise<Headers | null> {
+ const m = new Headers();
+ let line: Uint8Array | undefined;
+
+ // The first line cannot start with a leading space.
+ let buf = await this.r.peek(1);
+ if (buf === null) {
+ return null;
+ } else if (WHITESPACES.includes(buf[0])) {
+ line = (await this.readLineSlice()) as Uint8Array;
+ }
+
+ buf = await this.r.peek(1);
+ if (buf === null) {
+ throw new Deno.errors.UnexpectedEof();
+ } else if (WHITESPACES.includes(buf[0])) {
+ throw new Deno.errors.InvalidData(
+ `malformed MIME header initial line: ${str(line)}`,
+ );
+ }
+
+ while (true) {
+ const kv = await this.readLineSlice(); // readContinuedLineSlice
+ if (kv === null) throw new Deno.errors.UnexpectedEof();
+ if (kv.byteLength === 0) return m;
+
+ // Key ends at first colon
+ let i = kv.indexOf(CHAR_COLON);
+ if (i < 0) {
+ throw new Deno.errors.InvalidData(
+ `malformed MIME header line: ${str(kv)}`,
+ );
+ }
+
+ //let key = canonicalMIMEHeaderKey(kv.subarray(0, endKey));
+ const key = str(kv.subarray(0, i));
+
+ // As per RFC 7230 field-name is a token,
+ // tokens consist of one or more chars.
+ // We could throw `Deno.errors.InvalidData` here,
+ // but better to be liberal in what we
+ // accept, so if we get an empty key, skip it.
+ if (key == "") {
+ continue;
+ }
+
+ // Skip initial spaces in value.
+ i++; // skip colon
+ while (
+ i < kv.byteLength &&
+ (WHITESPACES.includes(kv[i]))
+ ) {
+ i++;
+ }
+ const value = str(kv.subarray(i)).replace(
+ invalidHeaderCharRegex,
+ encodeURI,
+ );
+
+ // In case of invalid header we swallow the error
+ // example: "Audio Mode" => invalid due to space in the key
+ try {
+ m.append(key, value);
+ } catch {
+ // Pass
+ }
+ }
+ }
+
+ async readLineSlice(): Promise<Uint8Array | null> {
+ let line = new Uint8Array(0);
+ let r: ReadLineResult | null = null;
+
+ do {
+ r = await this.r.readLine();
+ // TODO(ry):
+ // This skipSpace() is definitely misplaced, but I don't know where it
+ // comes from nor how to fix it.
+
+ //TODO(SmashingQuasar): Kept skipSpace to preserve behavior but it should be looked into to check if it makes sense when this is used.
+
+ if (r !== null && this.skipSpace(r.line) !== 0) {
+ line = concat([line, r.line]);
+ }
+ } while (r !== null && r.more);
+
+ return r === null ? null : line;
+ }
+
+ skipSpace(l: Uint8Array): number {
+ let n = 0;
+
+ for (const val of l) {
+ if (!WHITESPACES.includes(val)) {
+ n++;
+ }
+ }
+
+ return n;
+ }
+}
diff --git a/tests/specs/run/tls_starttls/tls.out b/tests/specs/run/tls_starttls/tls.out
new file mode 100644
index 000000000..c8e8a135c
--- /dev/null
+++ b/tests/specs/run/tls_starttls/tls.out
@@ -0,0 +1 @@
+DONE
diff --git a/tests/specs/run/tls_starttls/tls_starttls.js b/tests/specs/run/tls_starttls/tls_starttls.js
new file mode 100644
index 000000000..cd5718ff5
--- /dev/null
+++ b/tests/specs/run/tls_starttls/tls_starttls.js
@@ -0,0 +1,64 @@
+import { assert, assertEquals } from "@std/assert";
+import { BufReader } from "@std/io/buf-reader";
+import { BufWriter } from "@std/io/buf-writer";
+import { TextProtoReader } from "./textproto.ts";
+
+const encoder = new TextEncoder();
+const decoder = new TextDecoder();
+
+const { promise, resolve } = Promise.withResolvers();
+const hostname = "localhost";
+const port = 3504;
+
+const listener = Deno.listenTls({
+ hostname,
+ port,
+ cert: Deno.readTextFileSync("./localhost.crt"),
+ key: Deno.readTextFileSync("./localhost.key"),
+});
+
+const response = encoder.encode(
+ "HTTP/1.1 200 OK\r\nContent-Length: 12\r\n\r\nHello World\n",
+);
+
+listener.accept().then(
+ async (conn) => {
+ assert(conn.remoteAddr != null);
+ assert(conn.localAddr != null);
+ await conn.write(response);
+ // TODO(bartlomieju): this might be a bug
+ setTimeout(() => {
+ conn.close();
+ resolve();
+ }, 0);
+ },
+);
+
+let conn = await Deno.connect({ hostname, port });
+conn = await Deno.startTls(conn, { hostname });
+const w = new BufWriter(conn);
+const r = new BufReader(conn);
+const body = `GET / HTTP/1.1\r\nHost: ${hostname}:${port}\r\n\r\n`;
+const writeResult = await w.write(encoder.encode(body));
+assertEquals(body.length, writeResult);
+await w.flush();
+const tpr = new TextProtoReader(r);
+const statusLine = await tpr.readLine();
+assert(statusLine !== null, `line must be read: ${String(statusLine)}`);
+const m = statusLine.match(/^(.+?) (.+?) (.+?)$/);
+assert(m !== null, "must be matched");
+const [_, proto, status, ok] = m;
+assertEquals(proto, "HTTP/1.1");
+assertEquals(status, "200");
+assertEquals(ok, "OK");
+const headers = await tpr.readMimeHeader();
+assert(headers !== null);
+const contentLength = parseInt(headers.get("content-length"));
+const bodyBuf = new Uint8Array(contentLength);
+await r.readFull(bodyBuf);
+assertEquals(decoder.decode(bodyBuf), "Hello World\n");
+conn.close();
+listener.close();
+await promise;
+
+console.log("DONE");
diff --git a/tests/specs/run/top_level_await/__test__.jsonc b/tests/specs/run/top_level_await/__test__.jsonc
new file mode 100644
index 000000000..25537db5f
--- /dev/null
+++ b/tests/specs/run/top_level_await/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --allow-read top_level_await/top_level_await.js",
+ "output": "top_level_await/top_level_await.out"
+}
diff --git a/tests/specs/run/top_level_await/hello.txt b/tests/specs/run/top_level_await/hello.txt
new file mode 100644
index 000000000..6769dd60b
--- /dev/null
+++ b/tests/specs/run/top_level_await/hello.txt
@@ -0,0 +1 @@
+Hello world! \ No newline at end of file
diff --git a/tests/specs/run/top_level_await/top_level_await/circular.js b/tests/specs/run/top_level_await/top_level_await/circular.js
new file mode 100644
index 000000000..ff2964b6a
--- /dev/null
+++ b/tests/specs/run/top_level_await/top_level_await/circular.js
@@ -0,0 +1,8 @@
+import { foo } from "./tla3/timeout_loop.js";
+
+export const collection = [];
+
+const mod = await import("./tla3/b.js");
+
+console.log("foo in main", foo);
+console.log("mod", mod);
diff --git a/tests/specs/run/top_level_await/top_level_await/circular.out b/tests/specs/run/top_level_await/top_level_await/circular.out
new file mode 100644
index 000000000..c88978961
--- /dev/null
+++ b/tests/specs/run/top_level_await/top_level_await/circular.out
@@ -0,0 +1,10 @@
+timeout loop 0
+timeout loop 1
+timeout loop 2
+timeout loop 3
+timeout loop 4
+timeout loop 5
+error: Top-level await promise never resolved
+const mod = await import("./tla3/b.js");
+ ^
+ at <anonymous> ([WILDCARD]/top_level_await/circular.js:5:13)
diff --git a/tests/specs/run/top_level_await/top_level_await/loop.js b/tests/specs/run/top_level_await/top_level_await/loop.js
new file mode 100644
index 000000000..f229e03f6
--- /dev/null
+++ b/tests/specs/run/top_level_await/top_level_await/loop.js
@@ -0,0 +1,20 @@
+const importsDir = Deno.readDirSync(
+ Deno.realPathSync("./top_level_await/tla2"),
+);
+
+const resolvedPaths = [];
+
+for (const { name } of importsDir) {
+ const filePath = Deno.realPathSync(`./top_level_await/tla2/${name}`);
+ resolvedPaths.push(filePath);
+}
+
+resolvedPaths.sort();
+
+for (const filePath of resolvedPaths) {
+ console.log("loading", filePath);
+ const mod = await import(`file://${filePath}`);
+ console.log("loaded", mod);
+}
+
+console.log("all loaded");
diff --git a/tests/specs/run/top_level_await/top_level_await/loop.out b/tests/specs/run/top_level_await/top_level_await/loop.out
new file mode 100644
index 000000000..1bdffbf66
--- /dev/null
+++ b/tests/specs/run/top_level_await/top_level_await/loop.out
@@ -0,0 +1,5 @@
+loading [WILDCARD]a.js
+loaded [Module: null prototype] { default: [class Foo] }
+loading [WILDCARD]b.js
+loaded [Module: null prototype] { default: [class Bar] }
+all loaded
diff --git a/tests/specs/run/top_level_await/top_level_await/nested.out b/tests/specs/run/top_level_await/top_level_await/nested.out
new file mode 100644
index 000000000..8a1218a10
--- /dev/null
+++ b/tests/specs/run/top_level_await/top_level_await/nested.out
@@ -0,0 +1,5 @@
+1
+2
+3
+4
+5
diff --git a/tests/specs/run/top_level_await/top_level_await/nested/a.js b/tests/specs/run/top_level_await/top_level_await/nested/a.js
new file mode 100644
index 000000000..74837d4ba
--- /dev/null
+++ b/tests/specs/run/top_level_await/top_level_await/nested/a.js
@@ -0,0 +1,3 @@
+console.log(2);
+await import("./b.js");
+console.log(4);
diff --git a/tests/specs/run/top_level_await/top_level_await/nested/b.js b/tests/specs/run/top_level_await/top_level_await/nested/b.js
new file mode 100644
index 000000000..3bd241b50
--- /dev/null
+++ b/tests/specs/run/top_level_await/top_level_await/nested/b.js
@@ -0,0 +1 @@
+console.log(3);
diff --git a/tests/specs/run/top_level_await/top_level_await/nested/main.js b/tests/specs/run/top_level_await/top_level_await/nested/main.js
new file mode 100644
index 000000000..ed46a4717
--- /dev/null
+++ b/tests/specs/run/top_level_await/top_level_await/nested/main.js
@@ -0,0 +1,3 @@
+console.log(1);
+await import("./a.js");
+console.log(5);
diff --git a/tests/specs/run/top_level_await/top_level_await/order.js b/tests/specs/run/top_level_await/top_level_await/order.js
new file mode 100644
index 000000000..30659cdfb
--- /dev/null
+++ b/tests/specs/run/top_level_await/top_level_await/order.js
@@ -0,0 +1,21 @@
+// Ported from Node
+// https://github.com/nodejs/node/blob/54746bb763ebea0dc7e99d88ff4b379bcd680964/test/es-module/test-esm-tla.mjs
+
+const { default: order } = await import("./tla/parent.js");
+
+console.log("order", JSON.stringify(order));
+
+if (
+ !(
+ order[0] === "order" &&
+ order[1] === "b" &&
+ order[2] === "c" &&
+ order[3] === "d" &&
+ order[4] === "a" &&
+ order[5] === "parent"
+ )
+) {
+ throw new Error("TLA wrong order");
+}
+
+console.log("TLA order correct");
diff --git a/tests/specs/run/top_level_await/top_level_await/order.out b/tests/specs/run/top_level_await/top_level_await/order.out
new file mode 100644
index 000000000..4cc27858c
--- /dev/null
+++ b/tests/specs/run/top_level_await/top_level_await/order.out
@@ -0,0 +1,2 @@
+order ["order","b","c","d","a","parent"]
+TLA order correct
diff --git a/tests/specs/run/top_level_await/top_level_await/tla/a.js b/tests/specs/run/top_level_await/top_level_await/tla/a.js
new file mode 100644
index 000000000..c3ef3f7db
--- /dev/null
+++ b/tests/specs/run/top_level_await/top_level_await/tla/a.js
@@ -0,0 +1,3 @@
+import order from "./order.js";
+
+order.push("b");
diff --git a/tests/specs/run/top_level_await/top_level_await/tla/b.js b/tests/specs/run/top_level_await/top_level_await/tla/b.js
new file mode 100644
index 000000000..3271c92d8
--- /dev/null
+++ b/tests/specs/run/top_level_await/top_level_await/tla/b.js
@@ -0,0 +1,7 @@
+import order from "./order.js";
+
+await new Promise((resolve) => {
+ setTimeout(resolve, 200);
+});
+
+order.push("a");
diff --git a/tests/specs/run/top_level_await/top_level_await/tla/c.js b/tests/specs/run/top_level_await/top_level_await/tla/c.js
new file mode 100644
index 000000000..806eb0a8b
--- /dev/null
+++ b/tests/specs/run/top_level_await/top_level_await/tla/c.js
@@ -0,0 +1,3 @@
+import order from "./order.js";
+
+order.push("c");
diff --git a/tests/specs/run/top_level_await/top_level_await/tla/d.js b/tests/specs/run/top_level_await/top_level_await/tla/d.js
new file mode 100644
index 000000000..283ebf817
--- /dev/null
+++ b/tests/specs/run/top_level_await/top_level_await/tla/d.js
@@ -0,0 +1,8 @@
+import order from "./order.js";
+
+const end = Date.now() + 500;
+while (end < Date.now()) {
+ // pass
+}
+
+order.push("d");
diff --git a/tests/specs/run/top_level_await/top_level_await/tla/order.js b/tests/specs/run/top_level_await/top_level_await/tla/order.js
new file mode 100644
index 000000000..f213a562c
--- /dev/null
+++ b/tests/specs/run/top_level_await/top_level_await/tla/order.js
@@ -0,0 +1 @@
+export default ["order"];
diff --git a/tests/specs/run/top_level_await/top_level_await/tla/parent.js b/tests/specs/run/top_level_await/top_level_await/tla/parent.js
new file mode 100644
index 000000000..1ecc15463
--- /dev/null
+++ b/tests/specs/run/top_level_await/top_level_await/tla/parent.js
@@ -0,0 +1,9 @@
+import order from "./order.js";
+import "./a.js";
+import "./b.js";
+import "./c.js";
+import "./d.js";
+
+order.push("parent");
+
+export default order;
diff --git a/tests/specs/run/top_level_await/top_level_await/tla2/a.js b/tests/specs/run/top_level_await/top_level_await/tla2/a.js
new file mode 100644
index 000000000..d07bcb94d
--- /dev/null
+++ b/tests/specs/run/top_level_await/top_level_await/tla2/a.js
@@ -0,0 +1,5 @@
+export default class Foo {
+ constructor(message) {
+ this.message = message;
+ }
+}
diff --git a/tests/specs/run/top_level_await/top_level_await/tla2/b.js b/tests/specs/run/top_level_await/top_level_await/tla2/b.js
new file mode 100644
index 000000000..68e357c1e
--- /dev/null
+++ b/tests/specs/run/top_level_await/top_level_await/tla2/b.js
@@ -0,0 +1,5 @@
+export default class Bar {
+ constructor(message) {
+ this.message = message;
+ }
+}
diff --git a/tests/specs/run/top_level_await/top_level_await/tla3/b.js b/tests/specs/run/top_level_await/top_level_await/tla3/b.js
new file mode 100644
index 000000000..d0349545e
--- /dev/null
+++ b/tests/specs/run/top_level_await/top_level_await/tla3/b.js
@@ -0,0 +1,7 @@
+import { foo } from "./timeout_loop.js";
+import { collection } from "../circular.js";
+
+console.log("collection in b", collection);
+console.log("foo in b", foo);
+
+export const a = "a";
diff --git a/tests/specs/run/top_level_await/top_level_await/tla3/timeout_loop.js b/tests/specs/run/top_level_await/top_level_await/tla3/timeout_loop.js
new file mode 100644
index 000000000..860e6cd2a
--- /dev/null
+++ b/tests/specs/run/top_level_await/top_level_await/tla3/timeout_loop.js
@@ -0,0 +1,23 @@
+export const foo = "foo";
+
+export function delay(ms) {
+ return new Promise((res) =>
+ setTimeout(() => {
+ res();
+ }, ms)
+ );
+}
+
+let i = 0;
+
+async function timeoutLoop() {
+ await delay(1000);
+ console.log("timeout loop", i);
+ i++;
+ if (i > 5) {
+ return;
+ }
+ timeoutLoop();
+}
+
+timeoutLoop();
diff --git a/tests/specs/run/top_level_await/top_level_await/top_level_await.js b/tests/specs/run/top_level_await/top_level_await/top_level_await.js
new file mode 100644
index 000000000..31c83caed
--- /dev/null
+++ b/tests/specs/run/top_level_await/top_level_await/top_level_await.js
@@ -0,0 +1,3 @@
+const buf = await Deno.readFile("./hello.txt");
+const n = await Deno.stdout.write(buf);
+console.log(`\n\nwrite ${n}`);
diff --git a/tests/specs/run/top_level_await/top_level_await/top_level_await.out b/tests/specs/run/top_level_await/top_level_await/top_level_await.out
new file mode 100644
index 000000000..4b65d15fe
--- /dev/null
+++ b/tests/specs/run/top_level_await/top_level_await/top_level_await.out
@@ -0,0 +1,3 @@
+Hello world!
+
+write 12
diff --git a/tests/specs/run/top_level_await/top_level_await/top_level_await.ts b/tests/specs/run/top_level_await/top_level_await/top_level_await.ts
new file mode 100644
index 000000000..8d47ceb21
--- /dev/null
+++ b/tests/specs/run/top_level_await/top_level_await/top_level_await.ts
@@ -0,0 +1,3 @@
+const buf: Uint8Array = await Deno.readFile("./assets/hello.txt");
+const n: number = await Deno.stdout.write(buf);
+console.log(`\n\nwrite ${n}`);
diff --git a/tests/specs/run/top_level_await/top_level_await/top_level_for_await.js b/tests/specs/run/top_level_await/top_level_await/top_level_for_await.js
new file mode 100644
index 000000000..a330f6c71
--- /dev/null
+++ b/tests/specs/run/top_level_await/top_level_await/top_level_for_await.js
@@ -0,0 +1,10 @@
+function* asyncGenerator() {
+ let i = 0;
+ while (i < 3) {
+ yield i++;
+ }
+}
+
+for await (const num of asyncGenerator()) {
+ console.log(num);
+}
diff --git a/tests/specs/run/top_level_await/top_level_await/top_level_for_await.out b/tests/specs/run/top_level_await/top_level_await/top_level_for_await.out
new file mode 100644
index 000000000..4539bbf2d
--- /dev/null
+++ b/tests/specs/run/top_level_await/top_level_await/top_level_for_await.out
@@ -0,0 +1,3 @@
+0
+1
+2
diff --git a/tests/specs/run/top_level_await/top_level_await/top_level_for_await.ts b/tests/specs/run/top_level_await/top_level_await/top_level_for_await.ts
new file mode 100644
index 000000000..9179322d7
--- /dev/null
+++ b/tests/specs/run/top_level_await/top_level_await/top_level_for_await.ts
@@ -0,0 +1,10 @@
+async function* asyncGenerator(): AsyncIterableIterator<number> {
+ let i = 0;
+ while (i < 3) {
+ yield i++;
+ }
+}
+
+for await (const num of asyncGenerator()) {
+ console.log(num);
+}
diff --git a/tests/specs/run/top_level_await/top_level_await/unresolved.js b/tests/specs/run/top_level_await/top_level_await/unresolved.js
new file mode 100644
index 000000000..231a8cd63
--- /dev/null
+++ b/tests/specs/run/top_level_await/top_level_await/unresolved.js
@@ -0,0 +1 @@
+await new Promise(() => {});
diff --git a/tests/specs/run/top_level_await/top_level_await/unresolved.out b/tests/specs/run/top_level_await/top_level_await/unresolved.out
new file mode 100644
index 000000000..1f4ea5d38
--- /dev/null
+++ b/tests/specs/run/top_level_await/top_level_await/unresolved.out
@@ -0,0 +1,4 @@
+error: Top-level await promise never resolved
+await new Promise(() => {});
+^
+ at <anonymous> ([WILDCARD]top_level_await/unresolved.js:1:1)
diff --git a/tests/specs/run/top_level_await_circular/__test__.jsonc b/tests/specs/run/top_level_await_circular/__test__.jsonc
new file mode 100644
index 000000000..3e236b210
--- /dev/null
+++ b/tests/specs/run/top_level_await_circular/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run --allow-read top_level_await/circular.js",
+ "output": "top_level_await/circular.out",
+ "exitCode": 1
+}
diff --git a/tests/specs/run/top_level_await_circular/top_level_await/circular.js b/tests/specs/run/top_level_await_circular/top_level_await/circular.js
new file mode 100644
index 000000000..ff2964b6a
--- /dev/null
+++ b/tests/specs/run/top_level_await_circular/top_level_await/circular.js
@@ -0,0 +1,8 @@
+import { foo } from "./tla3/timeout_loop.js";
+
+export const collection = [];
+
+const mod = await import("./tla3/b.js");
+
+console.log("foo in main", foo);
+console.log("mod", mod);
diff --git a/tests/specs/run/top_level_await_circular/top_level_await/circular.out b/tests/specs/run/top_level_await_circular/top_level_await/circular.out
new file mode 100644
index 000000000..c88978961
--- /dev/null
+++ b/tests/specs/run/top_level_await_circular/top_level_await/circular.out
@@ -0,0 +1,10 @@
+timeout loop 0
+timeout loop 1
+timeout loop 2
+timeout loop 3
+timeout loop 4
+timeout loop 5
+error: Top-level await promise never resolved
+const mod = await import("./tla3/b.js");
+ ^
+ at <anonymous> ([WILDCARD]/top_level_await/circular.js:5:13)
diff --git a/tests/specs/run/top_level_await_circular/top_level_await/loop.js b/tests/specs/run/top_level_await_circular/top_level_await/loop.js
new file mode 100644
index 000000000..f229e03f6
--- /dev/null
+++ b/tests/specs/run/top_level_await_circular/top_level_await/loop.js
@@ -0,0 +1,20 @@
+const importsDir = Deno.readDirSync(
+ Deno.realPathSync("./top_level_await/tla2"),
+);
+
+const resolvedPaths = [];
+
+for (const { name } of importsDir) {
+ const filePath = Deno.realPathSync(`./top_level_await/tla2/${name}`);
+ resolvedPaths.push(filePath);
+}
+
+resolvedPaths.sort();
+
+for (const filePath of resolvedPaths) {
+ console.log("loading", filePath);
+ const mod = await import(`file://${filePath}`);
+ console.log("loaded", mod);
+}
+
+console.log("all loaded");
diff --git a/tests/specs/run/top_level_await_circular/top_level_await/loop.out b/tests/specs/run/top_level_await_circular/top_level_await/loop.out
new file mode 100644
index 000000000..1bdffbf66
--- /dev/null
+++ b/tests/specs/run/top_level_await_circular/top_level_await/loop.out
@@ -0,0 +1,5 @@
+loading [WILDCARD]a.js
+loaded [Module: null prototype] { default: [class Foo] }
+loading [WILDCARD]b.js
+loaded [Module: null prototype] { default: [class Bar] }
+all loaded
diff --git a/tests/specs/run/top_level_await_circular/top_level_await/nested.out b/tests/specs/run/top_level_await_circular/top_level_await/nested.out
new file mode 100644
index 000000000..8a1218a10
--- /dev/null
+++ b/tests/specs/run/top_level_await_circular/top_level_await/nested.out
@@ -0,0 +1,5 @@
+1
+2
+3
+4
+5
diff --git a/tests/specs/run/top_level_await_circular/top_level_await/nested/a.js b/tests/specs/run/top_level_await_circular/top_level_await/nested/a.js
new file mode 100644
index 000000000..74837d4ba
--- /dev/null
+++ b/tests/specs/run/top_level_await_circular/top_level_await/nested/a.js
@@ -0,0 +1,3 @@
+console.log(2);
+await import("./b.js");
+console.log(4);
diff --git a/tests/specs/run/top_level_await_circular/top_level_await/nested/b.js b/tests/specs/run/top_level_await_circular/top_level_await/nested/b.js
new file mode 100644
index 000000000..3bd241b50
--- /dev/null
+++ b/tests/specs/run/top_level_await_circular/top_level_await/nested/b.js
@@ -0,0 +1 @@
+console.log(3);
diff --git a/tests/specs/run/top_level_await_circular/top_level_await/nested/main.js b/tests/specs/run/top_level_await_circular/top_level_await/nested/main.js
new file mode 100644
index 000000000..ed46a4717
--- /dev/null
+++ b/tests/specs/run/top_level_await_circular/top_level_await/nested/main.js
@@ -0,0 +1,3 @@
+console.log(1);
+await import("./a.js");
+console.log(5);
diff --git a/tests/specs/run/top_level_await_circular/top_level_await/order.js b/tests/specs/run/top_level_await_circular/top_level_await/order.js
new file mode 100644
index 000000000..30659cdfb
--- /dev/null
+++ b/tests/specs/run/top_level_await_circular/top_level_await/order.js
@@ -0,0 +1,21 @@
+// Ported from Node
+// https://github.com/nodejs/node/blob/54746bb763ebea0dc7e99d88ff4b379bcd680964/test/es-module/test-esm-tla.mjs
+
+const { default: order } = await import("./tla/parent.js");
+
+console.log("order", JSON.stringify(order));
+
+if (
+ !(
+ order[0] === "order" &&
+ order[1] === "b" &&
+ order[2] === "c" &&
+ order[3] === "d" &&
+ order[4] === "a" &&
+ order[5] === "parent"
+ )
+) {
+ throw new Error("TLA wrong order");
+}
+
+console.log("TLA order correct");
diff --git a/tests/specs/run/top_level_await_circular/top_level_await/order.out b/tests/specs/run/top_level_await_circular/top_level_await/order.out
new file mode 100644
index 000000000..4cc27858c
--- /dev/null
+++ b/tests/specs/run/top_level_await_circular/top_level_await/order.out
@@ -0,0 +1,2 @@
+order ["order","b","c","d","a","parent"]
+TLA order correct
diff --git a/tests/specs/run/top_level_await_circular/top_level_await/tla/a.js b/tests/specs/run/top_level_await_circular/top_level_await/tla/a.js
new file mode 100644
index 000000000..c3ef3f7db
--- /dev/null
+++ b/tests/specs/run/top_level_await_circular/top_level_await/tla/a.js
@@ -0,0 +1,3 @@
+import order from "./order.js";
+
+order.push("b");
diff --git a/tests/specs/run/top_level_await_circular/top_level_await/tla/b.js b/tests/specs/run/top_level_await_circular/top_level_await/tla/b.js
new file mode 100644
index 000000000..3271c92d8
--- /dev/null
+++ b/tests/specs/run/top_level_await_circular/top_level_await/tla/b.js
@@ -0,0 +1,7 @@
+import order from "./order.js";
+
+await new Promise((resolve) => {
+ setTimeout(resolve, 200);
+});
+
+order.push("a");
diff --git a/tests/specs/run/top_level_await_circular/top_level_await/tla/c.js b/tests/specs/run/top_level_await_circular/top_level_await/tla/c.js
new file mode 100644
index 000000000..806eb0a8b
--- /dev/null
+++ b/tests/specs/run/top_level_await_circular/top_level_await/tla/c.js
@@ -0,0 +1,3 @@
+import order from "./order.js";
+
+order.push("c");
diff --git a/tests/specs/run/top_level_await_circular/top_level_await/tla/d.js b/tests/specs/run/top_level_await_circular/top_level_await/tla/d.js
new file mode 100644
index 000000000..283ebf817
--- /dev/null
+++ b/tests/specs/run/top_level_await_circular/top_level_await/tla/d.js
@@ -0,0 +1,8 @@
+import order from "./order.js";
+
+const end = Date.now() + 500;
+while (end < Date.now()) {
+ // pass
+}
+
+order.push("d");
diff --git a/tests/specs/run/top_level_await_circular/top_level_await/tla/order.js b/tests/specs/run/top_level_await_circular/top_level_await/tla/order.js
new file mode 100644
index 000000000..f213a562c
--- /dev/null
+++ b/tests/specs/run/top_level_await_circular/top_level_await/tla/order.js
@@ -0,0 +1 @@
+export default ["order"];
diff --git a/tests/specs/run/top_level_await_circular/top_level_await/tla/parent.js b/tests/specs/run/top_level_await_circular/top_level_await/tla/parent.js
new file mode 100644
index 000000000..1ecc15463
--- /dev/null
+++ b/tests/specs/run/top_level_await_circular/top_level_await/tla/parent.js
@@ -0,0 +1,9 @@
+import order from "./order.js";
+import "./a.js";
+import "./b.js";
+import "./c.js";
+import "./d.js";
+
+order.push("parent");
+
+export default order;
diff --git a/tests/specs/run/top_level_await_circular/top_level_await/tla2/a.js b/tests/specs/run/top_level_await_circular/top_level_await/tla2/a.js
new file mode 100644
index 000000000..d07bcb94d
--- /dev/null
+++ b/tests/specs/run/top_level_await_circular/top_level_await/tla2/a.js
@@ -0,0 +1,5 @@
+export default class Foo {
+ constructor(message) {
+ this.message = message;
+ }
+}
diff --git a/tests/specs/run/top_level_await_circular/top_level_await/tla2/b.js b/tests/specs/run/top_level_await_circular/top_level_await/tla2/b.js
new file mode 100644
index 000000000..68e357c1e
--- /dev/null
+++ b/tests/specs/run/top_level_await_circular/top_level_await/tla2/b.js
@@ -0,0 +1,5 @@
+export default class Bar {
+ constructor(message) {
+ this.message = message;
+ }
+}
diff --git a/tests/specs/run/top_level_await_circular/top_level_await/tla3/b.js b/tests/specs/run/top_level_await_circular/top_level_await/tla3/b.js
new file mode 100644
index 000000000..d0349545e
--- /dev/null
+++ b/tests/specs/run/top_level_await_circular/top_level_await/tla3/b.js
@@ -0,0 +1,7 @@
+import { foo } from "./timeout_loop.js";
+import { collection } from "../circular.js";
+
+console.log("collection in b", collection);
+console.log("foo in b", foo);
+
+export const a = "a";
diff --git a/tests/specs/run/top_level_await_circular/top_level_await/tla3/timeout_loop.js b/tests/specs/run/top_level_await_circular/top_level_await/tla3/timeout_loop.js
new file mode 100644
index 000000000..860e6cd2a
--- /dev/null
+++ b/tests/specs/run/top_level_await_circular/top_level_await/tla3/timeout_loop.js
@@ -0,0 +1,23 @@
+export const foo = "foo";
+
+export function delay(ms) {
+ return new Promise((res) =>
+ setTimeout(() => {
+ res();
+ }, ms)
+ );
+}
+
+let i = 0;
+
+async function timeoutLoop() {
+ await delay(1000);
+ console.log("timeout loop", i);
+ i++;
+ if (i > 5) {
+ return;
+ }
+ timeoutLoop();
+}
+
+timeoutLoop();
diff --git a/tests/specs/run/top_level_await_circular/top_level_await/top_level_await.js b/tests/specs/run/top_level_await_circular/top_level_await/top_level_await.js
new file mode 100644
index 000000000..ea319ea12
--- /dev/null
+++ b/tests/specs/run/top_level_await_circular/top_level_await/top_level_await.js
@@ -0,0 +1,3 @@
+const buf = await Deno.readFile("./assets/hello.txt");
+const n = await Deno.stdout.write(buf);
+console.log(`\n\nwrite ${n}`);
diff --git a/tests/specs/run/top_level_await_circular/top_level_await/top_level_await.out b/tests/specs/run/top_level_await_circular/top_level_await/top_level_await.out
new file mode 100644
index 000000000..4b65d15fe
--- /dev/null
+++ b/tests/specs/run/top_level_await_circular/top_level_await/top_level_await.out
@@ -0,0 +1,3 @@
+Hello world!
+
+write 12
diff --git a/tests/specs/run/top_level_await_circular/top_level_await/top_level_await.ts b/tests/specs/run/top_level_await_circular/top_level_await/top_level_await.ts
new file mode 100644
index 000000000..8d47ceb21
--- /dev/null
+++ b/tests/specs/run/top_level_await_circular/top_level_await/top_level_await.ts
@@ -0,0 +1,3 @@
+const buf: Uint8Array = await Deno.readFile("./assets/hello.txt");
+const n: number = await Deno.stdout.write(buf);
+console.log(`\n\nwrite ${n}`);
diff --git a/tests/specs/run/top_level_await_circular/top_level_await/top_level_for_await.js b/tests/specs/run/top_level_await_circular/top_level_await/top_level_for_await.js
new file mode 100644
index 000000000..a330f6c71
--- /dev/null
+++ b/tests/specs/run/top_level_await_circular/top_level_await/top_level_for_await.js
@@ -0,0 +1,10 @@
+function* asyncGenerator() {
+ let i = 0;
+ while (i < 3) {
+ yield i++;
+ }
+}
+
+for await (const num of asyncGenerator()) {
+ console.log(num);
+}
diff --git a/tests/specs/run/top_level_await_circular/top_level_await/top_level_for_await.out b/tests/specs/run/top_level_await_circular/top_level_await/top_level_for_await.out
new file mode 100644
index 000000000..4539bbf2d
--- /dev/null
+++ b/tests/specs/run/top_level_await_circular/top_level_await/top_level_for_await.out
@@ -0,0 +1,3 @@
+0
+1
+2
diff --git a/tests/specs/run/top_level_await_circular/top_level_await/top_level_for_await.ts b/tests/specs/run/top_level_await_circular/top_level_await/top_level_for_await.ts
new file mode 100644
index 000000000..9179322d7
--- /dev/null
+++ b/tests/specs/run/top_level_await_circular/top_level_await/top_level_for_await.ts
@@ -0,0 +1,10 @@
+async function* asyncGenerator(): AsyncIterableIterator<number> {
+ let i = 0;
+ while (i < 3) {
+ yield i++;
+ }
+}
+
+for await (const num of asyncGenerator()) {
+ console.log(num);
+}
diff --git a/tests/specs/run/top_level_await_circular/top_level_await/unresolved.js b/tests/specs/run/top_level_await_circular/top_level_await/unresolved.js
new file mode 100644
index 000000000..231a8cd63
--- /dev/null
+++ b/tests/specs/run/top_level_await_circular/top_level_await/unresolved.js
@@ -0,0 +1 @@
+await new Promise(() => {});
diff --git a/tests/specs/run/top_level_await_circular/top_level_await/unresolved.out b/tests/specs/run/top_level_await_circular/top_level_await/unresolved.out
new file mode 100644
index 000000000..1f4ea5d38
--- /dev/null
+++ b/tests/specs/run/top_level_await_circular/top_level_await/unresolved.out
@@ -0,0 +1,4 @@
+error: Top-level await promise never resolved
+await new Promise(() => {});
+^
+ at <anonymous> ([WILDCARD]top_level_await/unresolved.js:1:1)
diff --git a/tests/specs/run/top_level_await_loop/__test__.jsonc b/tests/specs/run/top_level_await_loop/__test__.jsonc
new file mode 100644
index 000000000..b2f5c84c0
--- /dev/null
+++ b/tests/specs/run/top_level_await_loop/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --allow-read top_level_await/loop.js",
+ "output": "top_level_await/loop.out"
+}
diff --git a/tests/specs/run/top_level_await_loop/top_level_await/circular.js b/tests/specs/run/top_level_await_loop/top_level_await/circular.js
new file mode 100644
index 000000000..ff2964b6a
--- /dev/null
+++ b/tests/specs/run/top_level_await_loop/top_level_await/circular.js
@@ -0,0 +1,8 @@
+import { foo } from "./tla3/timeout_loop.js";
+
+export const collection = [];
+
+const mod = await import("./tla3/b.js");
+
+console.log("foo in main", foo);
+console.log("mod", mod);
diff --git a/tests/specs/run/top_level_await_loop/top_level_await/circular.out b/tests/specs/run/top_level_await_loop/top_level_await/circular.out
new file mode 100644
index 000000000..c88978961
--- /dev/null
+++ b/tests/specs/run/top_level_await_loop/top_level_await/circular.out
@@ -0,0 +1,10 @@
+timeout loop 0
+timeout loop 1
+timeout loop 2
+timeout loop 3
+timeout loop 4
+timeout loop 5
+error: Top-level await promise never resolved
+const mod = await import("./tla3/b.js");
+ ^
+ at <anonymous> ([WILDCARD]/top_level_await/circular.js:5:13)
diff --git a/tests/specs/run/top_level_await_loop/top_level_await/loop.js b/tests/specs/run/top_level_await_loop/top_level_await/loop.js
new file mode 100644
index 000000000..f229e03f6
--- /dev/null
+++ b/tests/specs/run/top_level_await_loop/top_level_await/loop.js
@@ -0,0 +1,20 @@
+const importsDir = Deno.readDirSync(
+ Deno.realPathSync("./top_level_await/tla2"),
+);
+
+const resolvedPaths = [];
+
+for (const { name } of importsDir) {
+ const filePath = Deno.realPathSync(`./top_level_await/tla2/${name}`);
+ resolvedPaths.push(filePath);
+}
+
+resolvedPaths.sort();
+
+for (const filePath of resolvedPaths) {
+ console.log("loading", filePath);
+ const mod = await import(`file://${filePath}`);
+ console.log("loaded", mod);
+}
+
+console.log("all loaded");
diff --git a/tests/specs/run/top_level_await_loop/top_level_await/loop.out b/tests/specs/run/top_level_await_loop/top_level_await/loop.out
new file mode 100644
index 000000000..1bdffbf66
--- /dev/null
+++ b/tests/specs/run/top_level_await_loop/top_level_await/loop.out
@@ -0,0 +1,5 @@
+loading [WILDCARD]a.js
+loaded [Module: null prototype] { default: [class Foo] }
+loading [WILDCARD]b.js
+loaded [Module: null prototype] { default: [class Bar] }
+all loaded
diff --git a/tests/specs/run/top_level_await_loop/top_level_await/nested.out b/tests/specs/run/top_level_await_loop/top_level_await/nested.out
new file mode 100644
index 000000000..8a1218a10
--- /dev/null
+++ b/tests/specs/run/top_level_await_loop/top_level_await/nested.out
@@ -0,0 +1,5 @@
+1
+2
+3
+4
+5
diff --git a/tests/specs/run/top_level_await_loop/top_level_await/nested/a.js b/tests/specs/run/top_level_await_loop/top_level_await/nested/a.js
new file mode 100644
index 000000000..74837d4ba
--- /dev/null
+++ b/tests/specs/run/top_level_await_loop/top_level_await/nested/a.js
@@ -0,0 +1,3 @@
+console.log(2);
+await import("./b.js");
+console.log(4);
diff --git a/tests/specs/run/top_level_await_loop/top_level_await/nested/b.js b/tests/specs/run/top_level_await_loop/top_level_await/nested/b.js
new file mode 100644
index 000000000..3bd241b50
--- /dev/null
+++ b/tests/specs/run/top_level_await_loop/top_level_await/nested/b.js
@@ -0,0 +1 @@
+console.log(3);
diff --git a/tests/specs/run/top_level_await_loop/top_level_await/nested/main.js b/tests/specs/run/top_level_await_loop/top_level_await/nested/main.js
new file mode 100644
index 000000000..ed46a4717
--- /dev/null
+++ b/tests/specs/run/top_level_await_loop/top_level_await/nested/main.js
@@ -0,0 +1,3 @@
+console.log(1);
+await import("./a.js");
+console.log(5);
diff --git a/tests/specs/run/top_level_await_loop/top_level_await/order.js b/tests/specs/run/top_level_await_loop/top_level_await/order.js
new file mode 100644
index 000000000..30659cdfb
--- /dev/null
+++ b/tests/specs/run/top_level_await_loop/top_level_await/order.js
@@ -0,0 +1,21 @@
+// Ported from Node
+// https://github.com/nodejs/node/blob/54746bb763ebea0dc7e99d88ff4b379bcd680964/test/es-module/test-esm-tla.mjs
+
+const { default: order } = await import("./tla/parent.js");
+
+console.log("order", JSON.stringify(order));
+
+if (
+ !(
+ order[0] === "order" &&
+ order[1] === "b" &&
+ order[2] === "c" &&
+ order[3] === "d" &&
+ order[4] === "a" &&
+ order[5] === "parent"
+ )
+) {
+ throw new Error("TLA wrong order");
+}
+
+console.log("TLA order correct");
diff --git a/tests/specs/run/top_level_await_loop/top_level_await/order.out b/tests/specs/run/top_level_await_loop/top_level_await/order.out
new file mode 100644
index 000000000..4cc27858c
--- /dev/null
+++ b/tests/specs/run/top_level_await_loop/top_level_await/order.out
@@ -0,0 +1,2 @@
+order ["order","b","c","d","a","parent"]
+TLA order correct
diff --git a/tests/specs/run/top_level_await_loop/top_level_await/tla/a.js b/tests/specs/run/top_level_await_loop/top_level_await/tla/a.js
new file mode 100644
index 000000000..c3ef3f7db
--- /dev/null
+++ b/tests/specs/run/top_level_await_loop/top_level_await/tla/a.js
@@ -0,0 +1,3 @@
+import order from "./order.js";
+
+order.push("b");
diff --git a/tests/specs/run/top_level_await_loop/top_level_await/tla/b.js b/tests/specs/run/top_level_await_loop/top_level_await/tla/b.js
new file mode 100644
index 000000000..3271c92d8
--- /dev/null
+++ b/tests/specs/run/top_level_await_loop/top_level_await/tla/b.js
@@ -0,0 +1,7 @@
+import order from "./order.js";
+
+await new Promise((resolve) => {
+ setTimeout(resolve, 200);
+});
+
+order.push("a");
diff --git a/tests/specs/run/top_level_await_loop/top_level_await/tla/c.js b/tests/specs/run/top_level_await_loop/top_level_await/tla/c.js
new file mode 100644
index 000000000..806eb0a8b
--- /dev/null
+++ b/tests/specs/run/top_level_await_loop/top_level_await/tla/c.js
@@ -0,0 +1,3 @@
+import order from "./order.js";
+
+order.push("c");
diff --git a/tests/specs/run/top_level_await_loop/top_level_await/tla/d.js b/tests/specs/run/top_level_await_loop/top_level_await/tla/d.js
new file mode 100644
index 000000000..283ebf817
--- /dev/null
+++ b/tests/specs/run/top_level_await_loop/top_level_await/tla/d.js
@@ -0,0 +1,8 @@
+import order from "./order.js";
+
+const end = Date.now() + 500;
+while (end < Date.now()) {
+ // pass
+}
+
+order.push("d");
diff --git a/tests/specs/run/top_level_await_loop/top_level_await/tla/order.js b/tests/specs/run/top_level_await_loop/top_level_await/tla/order.js
new file mode 100644
index 000000000..f213a562c
--- /dev/null
+++ b/tests/specs/run/top_level_await_loop/top_level_await/tla/order.js
@@ -0,0 +1 @@
+export default ["order"];
diff --git a/tests/specs/run/top_level_await_loop/top_level_await/tla/parent.js b/tests/specs/run/top_level_await_loop/top_level_await/tla/parent.js
new file mode 100644
index 000000000..1ecc15463
--- /dev/null
+++ b/tests/specs/run/top_level_await_loop/top_level_await/tla/parent.js
@@ -0,0 +1,9 @@
+import order from "./order.js";
+import "./a.js";
+import "./b.js";
+import "./c.js";
+import "./d.js";
+
+order.push("parent");
+
+export default order;
diff --git a/tests/specs/run/top_level_await_loop/top_level_await/tla2/a.js b/tests/specs/run/top_level_await_loop/top_level_await/tla2/a.js
new file mode 100644
index 000000000..d07bcb94d
--- /dev/null
+++ b/tests/specs/run/top_level_await_loop/top_level_await/tla2/a.js
@@ -0,0 +1,5 @@
+export default class Foo {
+ constructor(message) {
+ this.message = message;
+ }
+}
diff --git a/tests/specs/run/top_level_await_loop/top_level_await/tla2/b.js b/tests/specs/run/top_level_await_loop/top_level_await/tla2/b.js
new file mode 100644
index 000000000..68e357c1e
--- /dev/null
+++ b/tests/specs/run/top_level_await_loop/top_level_await/tla2/b.js
@@ -0,0 +1,5 @@
+export default class Bar {
+ constructor(message) {
+ this.message = message;
+ }
+}
diff --git a/tests/specs/run/top_level_await_loop/top_level_await/tla3/b.js b/tests/specs/run/top_level_await_loop/top_level_await/tla3/b.js
new file mode 100644
index 000000000..d0349545e
--- /dev/null
+++ b/tests/specs/run/top_level_await_loop/top_level_await/tla3/b.js
@@ -0,0 +1,7 @@
+import { foo } from "./timeout_loop.js";
+import { collection } from "../circular.js";
+
+console.log("collection in b", collection);
+console.log("foo in b", foo);
+
+export const a = "a";
diff --git a/tests/specs/run/top_level_await_loop/top_level_await/tla3/timeout_loop.js b/tests/specs/run/top_level_await_loop/top_level_await/tla3/timeout_loop.js
new file mode 100644
index 000000000..860e6cd2a
--- /dev/null
+++ b/tests/specs/run/top_level_await_loop/top_level_await/tla3/timeout_loop.js
@@ -0,0 +1,23 @@
+export const foo = "foo";
+
+export function delay(ms) {
+ return new Promise((res) =>
+ setTimeout(() => {
+ res();
+ }, ms)
+ );
+}
+
+let i = 0;
+
+async function timeoutLoop() {
+ await delay(1000);
+ console.log("timeout loop", i);
+ i++;
+ if (i > 5) {
+ return;
+ }
+ timeoutLoop();
+}
+
+timeoutLoop();
diff --git a/tests/specs/run/top_level_await_loop/top_level_await/top_level_await.js b/tests/specs/run/top_level_await_loop/top_level_await/top_level_await.js
new file mode 100644
index 000000000..ea319ea12
--- /dev/null
+++ b/tests/specs/run/top_level_await_loop/top_level_await/top_level_await.js
@@ -0,0 +1,3 @@
+const buf = await Deno.readFile("./assets/hello.txt");
+const n = await Deno.stdout.write(buf);
+console.log(`\n\nwrite ${n}`);
diff --git a/tests/specs/run/top_level_await_loop/top_level_await/top_level_await.out b/tests/specs/run/top_level_await_loop/top_level_await/top_level_await.out
new file mode 100644
index 000000000..4b65d15fe
--- /dev/null
+++ b/tests/specs/run/top_level_await_loop/top_level_await/top_level_await.out
@@ -0,0 +1,3 @@
+Hello world!
+
+write 12
diff --git a/tests/specs/run/top_level_await_loop/top_level_await/top_level_await.ts b/tests/specs/run/top_level_await_loop/top_level_await/top_level_await.ts
new file mode 100644
index 000000000..8d47ceb21
--- /dev/null
+++ b/tests/specs/run/top_level_await_loop/top_level_await/top_level_await.ts
@@ -0,0 +1,3 @@
+const buf: Uint8Array = await Deno.readFile("./assets/hello.txt");
+const n: number = await Deno.stdout.write(buf);
+console.log(`\n\nwrite ${n}`);
diff --git a/tests/specs/run/top_level_await_loop/top_level_await/top_level_for_await.js b/tests/specs/run/top_level_await_loop/top_level_await/top_level_for_await.js
new file mode 100644
index 000000000..a330f6c71
--- /dev/null
+++ b/tests/specs/run/top_level_await_loop/top_level_await/top_level_for_await.js
@@ -0,0 +1,10 @@
+function* asyncGenerator() {
+ let i = 0;
+ while (i < 3) {
+ yield i++;
+ }
+}
+
+for await (const num of asyncGenerator()) {
+ console.log(num);
+}
diff --git a/tests/specs/run/top_level_await_loop/top_level_await/top_level_for_await.out b/tests/specs/run/top_level_await_loop/top_level_await/top_level_for_await.out
new file mode 100644
index 000000000..4539bbf2d
--- /dev/null
+++ b/tests/specs/run/top_level_await_loop/top_level_await/top_level_for_await.out
@@ -0,0 +1,3 @@
+0
+1
+2
diff --git a/tests/specs/run/top_level_await_loop/top_level_await/top_level_for_await.ts b/tests/specs/run/top_level_await_loop/top_level_await/top_level_for_await.ts
new file mode 100644
index 000000000..9179322d7
--- /dev/null
+++ b/tests/specs/run/top_level_await_loop/top_level_await/top_level_for_await.ts
@@ -0,0 +1,10 @@
+async function* asyncGenerator(): AsyncIterableIterator<number> {
+ let i = 0;
+ while (i < 3) {
+ yield i++;
+ }
+}
+
+for await (const num of asyncGenerator()) {
+ console.log(num);
+}
diff --git a/tests/specs/run/top_level_await_loop/top_level_await/unresolved.js b/tests/specs/run/top_level_await_loop/top_level_await/unresolved.js
new file mode 100644
index 000000000..231a8cd63
--- /dev/null
+++ b/tests/specs/run/top_level_await_loop/top_level_await/unresolved.js
@@ -0,0 +1 @@
+await new Promise(() => {});
diff --git a/tests/specs/run/top_level_await_loop/top_level_await/unresolved.out b/tests/specs/run/top_level_await_loop/top_level_await/unresolved.out
new file mode 100644
index 000000000..1f4ea5d38
--- /dev/null
+++ b/tests/specs/run/top_level_await_loop/top_level_await/unresolved.out
@@ -0,0 +1,4 @@
+error: Top-level await promise never resolved
+await new Promise(() => {});
+^
+ at <anonymous> ([WILDCARD]top_level_await/unresolved.js:1:1)
diff --git a/tests/specs/run/top_level_await_nested/__test__.jsonc b/tests/specs/run/top_level_await_nested/__test__.jsonc
new file mode 100644
index 000000000..376180ecd
--- /dev/null
+++ b/tests/specs/run/top_level_await_nested/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --allow-read top_level_await/nested/main.js",
+ "output": "top_level_await/nested.out"
+}
diff --git a/tests/specs/run/top_level_await_nested/top_level_await/circular.js b/tests/specs/run/top_level_await_nested/top_level_await/circular.js
new file mode 100644
index 000000000..ff2964b6a
--- /dev/null
+++ b/tests/specs/run/top_level_await_nested/top_level_await/circular.js
@@ -0,0 +1,8 @@
+import { foo } from "./tla3/timeout_loop.js";
+
+export const collection = [];
+
+const mod = await import("./tla3/b.js");
+
+console.log("foo in main", foo);
+console.log("mod", mod);
diff --git a/tests/specs/run/top_level_await_nested/top_level_await/circular.out b/tests/specs/run/top_level_await_nested/top_level_await/circular.out
new file mode 100644
index 000000000..c88978961
--- /dev/null
+++ b/tests/specs/run/top_level_await_nested/top_level_await/circular.out
@@ -0,0 +1,10 @@
+timeout loop 0
+timeout loop 1
+timeout loop 2
+timeout loop 3
+timeout loop 4
+timeout loop 5
+error: Top-level await promise never resolved
+const mod = await import("./tla3/b.js");
+ ^
+ at <anonymous> ([WILDCARD]/top_level_await/circular.js:5:13)
diff --git a/tests/specs/run/top_level_await_nested/top_level_await/loop.js b/tests/specs/run/top_level_await_nested/top_level_await/loop.js
new file mode 100644
index 000000000..415db5ec7
--- /dev/null
+++ b/tests/specs/run/top_level_await_nested/top_level_await/loop.js
@@ -0,0 +1,20 @@
+const importsDir = Deno.readDirSync(
+ Deno.realPathSync("./run/top_level_await/tla2"),
+);
+
+const resolvedPaths = [];
+
+for (const { name } of importsDir) {
+ const filePath = Deno.realPathSync(`./run/top_level_await/tla2/${name}`);
+ resolvedPaths.push(filePath);
+}
+
+resolvedPaths.sort();
+
+for (const filePath of resolvedPaths) {
+ console.log("loading", filePath);
+ const mod = await import(`file://${filePath}`);
+ console.log("loaded", mod);
+}
+
+console.log("all loaded");
diff --git a/tests/specs/run/top_level_await_nested/top_level_await/loop.out b/tests/specs/run/top_level_await_nested/top_level_await/loop.out
new file mode 100644
index 000000000..1bdffbf66
--- /dev/null
+++ b/tests/specs/run/top_level_await_nested/top_level_await/loop.out
@@ -0,0 +1,5 @@
+loading [WILDCARD]a.js
+loaded [Module: null prototype] { default: [class Foo] }
+loading [WILDCARD]b.js
+loaded [Module: null prototype] { default: [class Bar] }
+all loaded
diff --git a/tests/specs/run/top_level_await_nested/top_level_await/nested.out b/tests/specs/run/top_level_await_nested/top_level_await/nested.out
new file mode 100644
index 000000000..8a1218a10
--- /dev/null
+++ b/tests/specs/run/top_level_await_nested/top_level_await/nested.out
@@ -0,0 +1,5 @@
+1
+2
+3
+4
+5
diff --git a/tests/specs/run/top_level_await_nested/top_level_await/nested/a.js b/tests/specs/run/top_level_await_nested/top_level_await/nested/a.js
new file mode 100644
index 000000000..74837d4ba
--- /dev/null
+++ b/tests/specs/run/top_level_await_nested/top_level_await/nested/a.js
@@ -0,0 +1,3 @@
+console.log(2);
+await import("./b.js");
+console.log(4);
diff --git a/tests/specs/run/top_level_await_nested/top_level_await/nested/b.js b/tests/specs/run/top_level_await_nested/top_level_await/nested/b.js
new file mode 100644
index 000000000..3bd241b50
--- /dev/null
+++ b/tests/specs/run/top_level_await_nested/top_level_await/nested/b.js
@@ -0,0 +1 @@
+console.log(3);
diff --git a/tests/specs/run/top_level_await_nested/top_level_await/nested/main.js b/tests/specs/run/top_level_await_nested/top_level_await/nested/main.js
new file mode 100644
index 000000000..ed46a4717
--- /dev/null
+++ b/tests/specs/run/top_level_await_nested/top_level_await/nested/main.js
@@ -0,0 +1,3 @@
+console.log(1);
+await import("./a.js");
+console.log(5);
diff --git a/tests/specs/run/top_level_await_nested/top_level_await/order.js b/tests/specs/run/top_level_await_nested/top_level_await/order.js
new file mode 100644
index 000000000..30659cdfb
--- /dev/null
+++ b/tests/specs/run/top_level_await_nested/top_level_await/order.js
@@ -0,0 +1,21 @@
+// Ported from Node
+// https://github.com/nodejs/node/blob/54746bb763ebea0dc7e99d88ff4b379bcd680964/test/es-module/test-esm-tla.mjs
+
+const { default: order } = await import("./tla/parent.js");
+
+console.log("order", JSON.stringify(order));
+
+if (
+ !(
+ order[0] === "order" &&
+ order[1] === "b" &&
+ order[2] === "c" &&
+ order[3] === "d" &&
+ order[4] === "a" &&
+ order[5] === "parent"
+ )
+) {
+ throw new Error("TLA wrong order");
+}
+
+console.log("TLA order correct");
diff --git a/tests/specs/run/top_level_await_nested/top_level_await/order.out b/tests/specs/run/top_level_await_nested/top_level_await/order.out
new file mode 100644
index 000000000..4cc27858c
--- /dev/null
+++ b/tests/specs/run/top_level_await_nested/top_level_await/order.out
@@ -0,0 +1,2 @@
+order ["order","b","c","d","a","parent"]
+TLA order correct
diff --git a/tests/specs/run/top_level_await_nested/top_level_await/tla/a.js b/tests/specs/run/top_level_await_nested/top_level_await/tla/a.js
new file mode 100644
index 000000000..c3ef3f7db
--- /dev/null
+++ b/tests/specs/run/top_level_await_nested/top_level_await/tla/a.js
@@ -0,0 +1,3 @@
+import order from "./order.js";
+
+order.push("b");
diff --git a/tests/specs/run/top_level_await_nested/top_level_await/tla/b.js b/tests/specs/run/top_level_await_nested/top_level_await/tla/b.js
new file mode 100644
index 000000000..3271c92d8
--- /dev/null
+++ b/tests/specs/run/top_level_await_nested/top_level_await/tla/b.js
@@ -0,0 +1,7 @@
+import order from "./order.js";
+
+await new Promise((resolve) => {
+ setTimeout(resolve, 200);
+});
+
+order.push("a");
diff --git a/tests/specs/run/top_level_await_nested/top_level_await/tla/c.js b/tests/specs/run/top_level_await_nested/top_level_await/tla/c.js
new file mode 100644
index 000000000..806eb0a8b
--- /dev/null
+++ b/tests/specs/run/top_level_await_nested/top_level_await/tla/c.js
@@ -0,0 +1,3 @@
+import order from "./order.js";
+
+order.push("c");
diff --git a/tests/specs/run/top_level_await_nested/top_level_await/tla/d.js b/tests/specs/run/top_level_await_nested/top_level_await/tla/d.js
new file mode 100644
index 000000000..283ebf817
--- /dev/null
+++ b/tests/specs/run/top_level_await_nested/top_level_await/tla/d.js
@@ -0,0 +1,8 @@
+import order from "./order.js";
+
+const end = Date.now() + 500;
+while (end < Date.now()) {
+ // pass
+}
+
+order.push("d");
diff --git a/tests/specs/run/top_level_await_nested/top_level_await/tla/order.js b/tests/specs/run/top_level_await_nested/top_level_await/tla/order.js
new file mode 100644
index 000000000..f213a562c
--- /dev/null
+++ b/tests/specs/run/top_level_await_nested/top_level_await/tla/order.js
@@ -0,0 +1 @@
+export default ["order"];
diff --git a/tests/specs/run/top_level_await_nested/top_level_await/tla/parent.js b/tests/specs/run/top_level_await_nested/top_level_await/tla/parent.js
new file mode 100644
index 000000000..1ecc15463
--- /dev/null
+++ b/tests/specs/run/top_level_await_nested/top_level_await/tla/parent.js
@@ -0,0 +1,9 @@
+import order from "./order.js";
+import "./a.js";
+import "./b.js";
+import "./c.js";
+import "./d.js";
+
+order.push("parent");
+
+export default order;
diff --git a/tests/specs/run/top_level_await_nested/top_level_await/tla2/a.js b/tests/specs/run/top_level_await_nested/top_level_await/tla2/a.js
new file mode 100644
index 000000000..d07bcb94d
--- /dev/null
+++ b/tests/specs/run/top_level_await_nested/top_level_await/tla2/a.js
@@ -0,0 +1,5 @@
+export default class Foo {
+ constructor(message) {
+ this.message = message;
+ }
+}
diff --git a/tests/specs/run/top_level_await_nested/top_level_await/tla2/b.js b/tests/specs/run/top_level_await_nested/top_level_await/tla2/b.js
new file mode 100644
index 000000000..68e357c1e
--- /dev/null
+++ b/tests/specs/run/top_level_await_nested/top_level_await/tla2/b.js
@@ -0,0 +1,5 @@
+export default class Bar {
+ constructor(message) {
+ this.message = message;
+ }
+}
diff --git a/tests/specs/run/top_level_await_nested/top_level_await/tla3/b.js b/tests/specs/run/top_level_await_nested/top_level_await/tla3/b.js
new file mode 100644
index 000000000..d0349545e
--- /dev/null
+++ b/tests/specs/run/top_level_await_nested/top_level_await/tla3/b.js
@@ -0,0 +1,7 @@
+import { foo } from "./timeout_loop.js";
+import { collection } from "../circular.js";
+
+console.log("collection in b", collection);
+console.log("foo in b", foo);
+
+export const a = "a";
diff --git a/tests/specs/run/top_level_await_nested/top_level_await/tla3/timeout_loop.js b/tests/specs/run/top_level_await_nested/top_level_await/tla3/timeout_loop.js
new file mode 100644
index 000000000..860e6cd2a
--- /dev/null
+++ b/tests/specs/run/top_level_await_nested/top_level_await/tla3/timeout_loop.js
@@ -0,0 +1,23 @@
+export const foo = "foo";
+
+export function delay(ms) {
+ return new Promise((res) =>
+ setTimeout(() => {
+ res();
+ }, ms)
+ );
+}
+
+let i = 0;
+
+async function timeoutLoop() {
+ await delay(1000);
+ console.log("timeout loop", i);
+ i++;
+ if (i > 5) {
+ return;
+ }
+ timeoutLoop();
+}
+
+timeoutLoop();
diff --git a/tests/specs/run/top_level_await_nested/top_level_await/top_level_await.js b/tests/specs/run/top_level_await_nested/top_level_await/top_level_await.js
new file mode 100644
index 000000000..ea319ea12
--- /dev/null
+++ b/tests/specs/run/top_level_await_nested/top_level_await/top_level_await.js
@@ -0,0 +1,3 @@
+const buf = await Deno.readFile("./assets/hello.txt");
+const n = await Deno.stdout.write(buf);
+console.log(`\n\nwrite ${n}`);
diff --git a/tests/specs/run/top_level_await_nested/top_level_await/top_level_await.out b/tests/specs/run/top_level_await_nested/top_level_await/top_level_await.out
new file mode 100644
index 000000000..4b65d15fe
--- /dev/null
+++ b/tests/specs/run/top_level_await_nested/top_level_await/top_level_await.out
@@ -0,0 +1,3 @@
+Hello world!
+
+write 12
diff --git a/tests/specs/run/top_level_await_nested/top_level_await/top_level_await.ts b/tests/specs/run/top_level_await_nested/top_level_await/top_level_await.ts
new file mode 100644
index 000000000..8d47ceb21
--- /dev/null
+++ b/tests/specs/run/top_level_await_nested/top_level_await/top_level_await.ts
@@ -0,0 +1,3 @@
+const buf: Uint8Array = await Deno.readFile("./assets/hello.txt");
+const n: number = await Deno.stdout.write(buf);
+console.log(`\n\nwrite ${n}`);
diff --git a/tests/specs/run/top_level_await_nested/top_level_await/top_level_for_await.js b/tests/specs/run/top_level_await_nested/top_level_await/top_level_for_await.js
new file mode 100644
index 000000000..a330f6c71
--- /dev/null
+++ b/tests/specs/run/top_level_await_nested/top_level_await/top_level_for_await.js
@@ -0,0 +1,10 @@
+function* asyncGenerator() {
+ let i = 0;
+ while (i < 3) {
+ yield i++;
+ }
+}
+
+for await (const num of asyncGenerator()) {
+ console.log(num);
+}
diff --git a/tests/specs/run/top_level_await_nested/top_level_await/top_level_for_await.out b/tests/specs/run/top_level_await_nested/top_level_await/top_level_for_await.out
new file mode 100644
index 000000000..4539bbf2d
--- /dev/null
+++ b/tests/specs/run/top_level_await_nested/top_level_await/top_level_for_await.out
@@ -0,0 +1,3 @@
+0
+1
+2
diff --git a/tests/specs/run/top_level_await_nested/top_level_await/top_level_for_await.ts b/tests/specs/run/top_level_await_nested/top_level_await/top_level_for_await.ts
new file mode 100644
index 000000000..9179322d7
--- /dev/null
+++ b/tests/specs/run/top_level_await_nested/top_level_await/top_level_for_await.ts
@@ -0,0 +1,10 @@
+async function* asyncGenerator(): AsyncIterableIterator<number> {
+ let i = 0;
+ while (i < 3) {
+ yield i++;
+ }
+}
+
+for await (const num of asyncGenerator()) {
+ console.log(num);
+}
diff --git a/tests/specs/run/top_level_await_nested/top_level_await/unresolved.js b/tests/specs/run/top_level_await_nested/top_level_await/unresolved.js
new file mode 100644
index 000000000..231a8cd63
--- /dev/null
+++ b/tests/specs/run/top_level_await_nested/top_level_await/unresolved.js
@@ -0,0 +1 @@
+await new Promise(() => {});
diff --git a/tests/specs/run/top_level_await_nested/top_level_await/unresolved.out b/tests/specs/run/top_level_await_nested/top_level_await/unresolved.out
new file mode 100644
index 000000000..1f4ea5d38
--- /dev/null
+++ b/tests/specs/run/top_level_await_nested/top_level_await/unresolved.out
@@ -0,0 +1,4 @@
+error: Top-level await promise never resolved
+await new Promise(() => {});
+^
+ at <anonymous> ([WILDCARD]top_level_await/unresolved.js:1:1)
diff --git a/tests/specs/run/top_level_await_order/__test__.jsonc b/tests/specs/run/top_level_await_order/__test__.jsonc
new file mode 100644
index 000000000..65d00d607
--- /dev/null
+++ b/tests/specs/run/top_level_await_order/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --allow-read top_level_await/order.js",
+ "output": "top_level_await/order.out"
+}
diff --git a/tests/specs/run/top_level_await_order/top_level_await/circular.js b/tests/specs/run/top_level_await_order/top_level_await/circular.js
new file mode 100644
index 000000000..ff2964b6a
--- /dev/null
+++ b/tests/specs/run/top_level_await_order/top_level_await/circular.js
@@ -0,0 +1,8 @@
+import { foo } from "./tla3/timeout_loop.js";
+
+export const collection = [];
+
+const mod = await import("./tla3/b.js");
+
+console.log("foo in main", foo);
+console.log("mod", mod);
diff --git a/tests/specs/run/top_level_await_order/top_level_await/circular.out b/tests/specs/run/top_level_await_order/top_level_await/circular.out
new file mode 100644
index 000000000..c88978961
--- /dev/null
+++ b/tests/specs/run/top_level_await_order/top_level_await/circular.out
@@ -0,0 +1,10 @@
+timeout loop 0
+timeout loop 1
+timeout loop 2
+timeout loop 3
+timeout loop 4
+timeout loop 5
+error: Top-level await promise never resolved
+const mod = await import("./tla3/b.js");
+ ^
+ at <anonymous> ([WILDCARD]/top_level_await/circular.js:5:13)
diff --git a/tests/specs/run/top_level_await_order/top_level_await/loop.js b/tests/specs/run/top_level_await_order/top_level_await/loop.js
new file mode 100644
index 000000000..415db5ec7
--- /dev/null
+++ b/tests/specs/run/top_level_await_order/top_level_await/loop.js
@@ -0,0 +1,20 @@
+const importsDir = Deno.readDirSync(
+ Deno.realPathSync("./run/top_level_await/tla2"),
+);
+
+const resolvedPaths = [];
+
+for (const { name } of importsDir) {
+ const filePath = Deno.realPathSync(`./run/top_level_await/tla2/${name}`);
+ resolvedPaths.push(filePath);
+}
+
+resolvedPaths.sort();
+
+for (const filePath of resolvedPaths) {
+ console.log("loading", filePath);
+ const mod = await import(`file://${filePath}`);
+ console.log("loaded", mod);
+}
+
+console.log("all loaded");
diff --git a/tests/specs/run/top_level_await_order/top_level_await/loop.out b/tests/specs/run/top_level_await_order/top_level_await/loop.out
new file mode 100644
index 000000000..1bdffbf66
--- /dev/null
+++ b/tests/specs/run/top_level_await_order/top_level_await/loop.out
@@ -0,0 +1,5 @@
+loading [WILDCARD]a.js
+loaded [Module: null prototype] { default: [class Foo] }
+loading [WILDCARD]b.js
+loaded [Module: null prototype] { default: [class Bar] }
+all loaded
diff --git a/tests/specs/run/top_level_await_order/top_level_await/nested.out b/tests/specs/run/top_level_await_order/top_level_await/nested.out
new file mode 100644
index 000000000..8a1218a10
--- /dev/null
+++ b/tests/specs/run/top_level_await_order/top_level_await/nested.out
@@ -0,0 +1,5 @@
+1
+2
+3
+4
+5
diff --git a/tests/specs/run/top_level_await_order/top_level_await/nested/a.js b/tests/specs/run/top_level_await_order/top_level_await/nested/a.js
new file mode 100644
index 000000000..74837d4ba
--- /dev/null
+++ b/tests/specs/run/top_level_await_order/top_level_await/nested/a.js
@@ -0,0 +1,3 @@
+console.log(2);
+await import("./b.js");
+console.log(4);
diff --git a/tests/specs/run/top_level_await_order/top_level_await/nested/b.js b/tests/specs/run/top_level_await_order/top_level_await/nested/b.js
new file mode 100644
index 000000000..3bd241b50
--- /dev/null
+++ b/tests/specs/run/top_level_await_order/top_level_await/nested/b.js
@@ -0,0 +1 @@
+console.log(3);
diff --git a/tests/specs/run/top_level_await_order/top_level_await/nested/main.js b/tests/specs/run/top_level_await_order/top_level_await/nested/main.js
new file mode 100644
index 000000000..ed46a4717
--- /dev/null
+++ b/tests/specs/run/top_level_await_order/top_level_await/nested/main.js
@@ -0,0 +1,3 @@
+console.log(1);
+await import("./a.js");
+console.log(5);
diff --git a/tests/specs/run/top_level_await_order/top_level_await/order.js b/tests/specs/run/top_level_await_order/top_level_await/order.js
new file mode 100644
index 000000000..30659cdfb
--- /dev/null
+++ b/tests/specs/run/top_level_await_order/top_level_await/order.js
@@ -0,0 +1,21 @@
+// Ported from Node
+// https://github.com/nodejs/node/blob/54746bb763ebea0dc7e99d88ff4b379bcd680964/test/es-module/test-esm-tla.mjs
+
+const { default: order } = await import("./tla/parent.js");
+
+console.log("order", JSON.stringify(order));
+
+if (
+ !(
+ order[0] === "order" &&
+ order[1] === "b" &&
+ order[2] === "c" &&
+ order[3] === "d" &&
+ order[4] === "a" &&
+ order[5] === "parent"
+ )
+) {
+ throw new Error("TLA wrong order");
+}
+
+console.log("TLA order correct");
diff --git a/tests/specs/run/top_level_await_order/top_level_await/order.out b/tests/specs/run/top_level_await_order/top_level_await/order.out
new file mode 100644
index 000000000..4cc27858c
--- /dev/null
+++ b/tests/specs/run/top_level_await_order/top_level_await/order.out
@@ -0,0 +1,2 @@
+order ["order","b","c","d","a","parent"]
+TLA order correct
diff --git a/tests/specs/run/top_level_await_order/top_level_await/tla/a.js b/tests/specs/run/top_level_await_order/top_level_await/tla/a.js
new file mode 100644
index 000000000..c3ef3f7db
--- /dev/null
+++ b/tests/specs/run/top_level_await_order/top_level_await/tla/a.js
@@ -0,0 +1,3 @@
+import order from "./order.js";
+
+order.push("b");
diff --git a/tests/specs/run/top_level_await_order/top_level_await/tla/b.js b/tests/specs/run/top_level_await_order/top_level_await/tla/b.js
new file mode 100644
index 000000000..3271c92d8
--- /dev/null
+++ b/tests/specs/run/top_level_await_order/top_level_await/tla/b.js
@@ -0,0 +1,7 @@
+import order from "./order.js";
+
+await new Promise((resolve) => {
+ setTimeout(resolve, 200);
+});
+
+order.push("a");
diff --git a/tests/specs/run/top_level_await_order/top_level_await/tla/c.js b/tests/specs/run/top_level_await_order/top_level_await/tla/c.js
new file mode 100644
index 000000000..806eb0a8b
--- /dev/null
+++ b/tests/specs/run/top_level_await_order/top_level_await/tla/c.js
@@ -0,0 +1,3 @@
+import order from "./order.js";
+
+order.push("c");
diff --git a/tests/specs/run/top_level_await_order/top_level_await/tla/d.js b/tests/specs/run/top_level_await_order/top_level_await/tla/d.js
new file mode 100644
index 000000000..283ebf817
--- /dev/null
+++ b/tests/specs/run/top_level_await_order/top_level_await/tla/d.js
@@ -0,0 +1,8 @@
+import order from "./order.js";
+
+const end = Date.now() + 500;
+while (end < Date.now()) {
+ // pass
+}
+
+order.push("d");
diff --git a/tests/specs/run/top_level_await_order/top_level_await/tla/order.js b/tests/specs/run/top_level_await_order/top_level_await/tla/order.js
new file mode 100644
index 000000000..f213a562c
--- /dev/null
+++ b/tests/specs/run/top_level_await_order/top_level_await/tla/order.js
@@ -0,0 +1 @@
+export default ["order"];
diff --git a/tests/specs/run/top_level_await_order/top_level_await/tla/parent.js b/tests/specs/run/top_level_await_order/top_level_await/tla/parent.js
new file mode 100644
index 000000000..1ecc15463
--- /dev/null
+++ b/tests/specs/run/top_level_await_order/top_level_await/tla/parent.js
@@ -0,0 +1,9 @@
+import order from "./order.js";
+import "./a.js";
+import "./b.js";
+import "./c.js";
+import "./d.js";
+
+order.push("parent");
+
+export default order;
diff --git a/tests/specs/run/top_level_await_order/top_level_await/tla2/a.js b/tests/specs/run/top_level_await_order/top_level_await/tla2/a.js
new file mode 100644
index 000000000..d07bcb94d
--- /dev/null
+++ b/tests/specs/run/top_level_await_order/top_level_await/tla2/a.js
@@ -0,0 +1,5 @@
+export default class Foo {
+ constructor(message) {
+ this.message = message;
+ }
+}
diff --git a/tests/specs/run/top_level_await_order/top_level_await/tla2/b.js b/tests/specs/run/top_level_await_order/top_level_await/tla2/b.js
new file mode 100644
index 000000000..68e357c1e
--- /dev/null
+++ b/tests/specs/run/top_level_await_order/top_level_await/tla2/b.js
@@ -0,0 +1,5 @@
+export default class Bar {
+ constructor(message) {
+ this.message = message;
+ }
+}
diff --git a/tests/specs/run/top_level_await_order/top_level_await/tla3/b.js b/tests/specs/run/top_level_await_order/top_level_await/tla3/b.js
new file mode 100644
index 000000000..d0349545e
--- /dev/null
+++ b/tests/specs/run/top_level_await_order/top_level_await/tla3/b.js
@@ -0,0 +1,7 @@
+import { foo } from "./timeout_loop.js";
+import { collection } from "../circular.js";
+
+console.log("collection in b", collection);
+console.log("foo in b", foo);
+
+export const a = "a";
diff --git a/tests/specs/run/top_level_await_order/top_level_await/tla3/timeout_loop.js b/tests/specs/run/top_level_await_order/top_level_await/tla3/timeout_loop.js
new file mode 100644
index 000000000..860e6cd2a
--- /dev/null
+++ b/tests/specs/run/top_level_await_order/top_level_await/tla3/timeout_loop.js
@@ -0,0 +1,23 @@
+export const foo = "foo";
+
+export function delay(ms) {
+ return new Promise((res) =>
+ setTimeout(() => {
+ res();
+ }, ms)
+ );
+}
+
+let i = 0;
+
+async function timeoutLoop() {
+ await delay(1000);
+ console.log("timeout loop", i);
+ i++;
+ if (i > 5) {
+ return;
+ }
+ timeoutLoop();
+}
+
+timeoutLoop();
diff --git a/tests/specs/run/top_level_await_order/top_level_await/top_level_await.js b/tests/specs/run/top_level_await_order/top_level_await/top_level_await.js
new file mode 100644
index 000000000..ea319ea12
--- /dev/null
+++ b/tests/specs/run/top_level_await_order/top_level_await/top_level_await.js
@@ -0,0 +1,3 @@
+const buf = await Deno.readFile("./assets/hello.txt");
+const n = await Deno.stdout.write(buf);
+console.log(`\n\nwrite ${n}`);
diff --git a/tests/specs/run/top_level_await_order/top_level_await/top_level_await.out b/tests/specs/run/top_level_await_order/top_level_await/top_level_await.out
new file mode 100644
index 000000000..4b65d15fe
--- /dev/null
+++ b/tests/specs/run/top_level_await_order/top_level_await/top_level_await.out
@@ -0,0 +1,3 @@
+Hello world!
+
+write 12
diff --git a/tests/specs/run/top_level_await_order/top_level_await/top_level_await.ts b/tests/specs/run/top_level_await_order/top_level_await/top_level_await.ts
new file mode 100644
index 000000000..8d47ceb21
--- /dev/null
+++ b/tests/specs/run/top_level_await_order/top_level_await/top_level_await.ts
@@ -0,0 +1,3 @@
+const buf: Uint8Array = await Deno.readFile("./assets/hello.txt");
+const n: number = await Deno.stdout.write(buf);
+console.log(`\n\nwrite ${n}`);
diff --git a/tests/specs/run/top_level_await_order/top_level_await/top_level_for_await.js b/tests/specs/run/top_level_await_order/top_level_await/top_level_for_await.js
new file mode 100644
index 000000000..a330f6c71
--- /dev/null
+++ b/tests/specs/run/top_level_await_order/top_level_await/top_level_for_await.js
@@ -0,0 +1,10 @@
+function* asyncGenerator() {
+ let i = 0;
+ while (i < 3) {
+ yield i++;
+ }
+}
+
+for await (const num of asyncGenerator()) {
+ console.log(num);
+}
diff --git a/tests/specs/run/top_level_await_order/top_level_await/top_level_for_await.out b/tests/specs/run/top_level_await_order/top_level_await/top_level_for_await.out
new file mode 100644
index 000000000..4539bbf2d
--- /dev/null
+++ b/tests/specs/run/top_level_await_order/top_level_await/top_level_for_await.out
@@ -0,0 +1,3 @@
+0
+1
+2
diff --git a/tests/specs/run/top_level_await_order/top_level_await/top_level_for_await.ts b/tests/specs/run/top_level_await_order/top_level_await/top_level_for_await.ts
new file mode 100644
index 000000000..9179322d7
--- /dev/null
+++ b/tests/specs/run/top_level_await_order/top_level_await/top_level_for_await.ts
@@ -0,0 +1,10 @@
+async function* asyncGenerator(): AsyncIterableIterator<number> {
+ let i = 0;
+ while (i < 3) {
+ yield i++;
+ }
+}
+
+for await (const num of asyncGenerator()) {
+ console.log(num);
+}
diff --git a/tests/specs/run/top_level_await_order/top_level_await/unresolved.js b/tests/specs/run/top_level_await_order/top_level_await/unresolved.js
new file mode 100644
index 000000000..231a8cd63
--- /dev/null
+++ b/tests/specs/run/top_level_await_order/top_level_await/unresolved.js
@@ -0,0 +1 @@
+await new Promise(() => {});
diff --git a/tests/specs/run/top_level_await_order/top_level_await/unresolved.out b/tests/specs/run/top_level_await_order/top_level_await/unresolved.out
new file mode 100644
index 000000000..1f4ea5d38
--- /dev/null
+++ b/tests/specs/run/top_level_await_order/top_level_await/unresolved.out
@@ -0,0 +1,4 @@
+error: Top-level await promise never resolved
+await new Promise(() => {});
+^
+ at <anonymous> ([WILDCARD]top_level_await/unresolved.js:1:1)
diff --git a/tests/specs/run/top_level_await_ts/__test__.jsonc b/tests/specs/run/top_level_await_ts/__test__.jsonc
new file mode 100644
index 000000000..15f937df1
--- /dev/null
+++ b/tests/specs/run/top_level_await_ts/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --quiet --allow-read top_level_await/top_level_await.ts",
+ "output": "top_level_await/top_level_await.out"
+}
diff --git a/tests/specs/run/top_level_await_ts/hello.txt b/tests/specs/run/top_level_await_ts/hello.txt
new file mode 100644
index 000000000..6769dd60b
--- /dev/null
+++ b/tests/specs/run/top_level_await_ts/hello.txt
@@ -0,0 +1 @@
+Hello world! \ No newline at end of file
diff --git a/tests/specs/run/top_level_await_ts/top_level_await/circular.js b/tests/specs/run/top_level_await_ts/top_level_await/circular.js
new file mode 100644
index 000000000..ff2964b6a
--- /dev/null
+++ b/tests/specs/run/top_level_await_ts/top_level_await/circular.js
@@ -0,0 +1,8 @@
+import { foo } from "./tla3/timeout_loop.js";
+
+export const collection = [];
+
+const mod = await import("./tla3/b.js");
+
+console.log("foo in main", foo);
+console.log("mod", mod);
diff --git a/tests/specs/run/top_level_await_ts/top_level_await/circular.out b/tests/specs/run/top_level_await_ts/top_level_await/circular.out
new file mode 100644
index 000000000..c88978961
--- /dev/null
+++ b/tests/specs/run/top_level_await_ts/top_level_await/circular.out
@@ -0,0 +1,10 @@
+timeout loop 0
+timeout loop 1
+timeout loop 2
+timeout loop 3
+timeout loop 4
+timeout loop 5
+error: Top-level await promise never resolved
+const mod = await import("./tla3/b.js");
+ ^
+ at <anonymous> ([WILDCARD]/top_level_await/circular.js:5:13)
diff --git a/tests/specs/run/top_level_await_ts/top_level_await/loop.js b/tests/specs/run/top_level_await_ts/top_level_await/loop.js
new file mode 100644
index 000000000..415db5ec7
--- /dev/null
+++ b/tests/specs/run/top_level_await_ts/top_level_await/loop.js
@@ -0,0 +1,20 @@
+const importsDir = Deno.readDirSync(
+ Deno.realPathSync("./run/top_level_await/tla2"),
+);
+
+const resolvedPaths = [];
+
+for (const { name } of importsDir) {
+ const filePath = Deno.realPathSync(`./run/top_level_await/tla2/${name}`);
+ resolvedPaths.push(filePath);
+}
+
+resolvedPaths.sort();
+
+for (const filePath of resolvedPaths) {
+ console.log("loading", filePath);
+ const mod = await import(`file://${filePath}`);
+ console.log("loaded", mod);
+}
+
+console.log("all loaded");
diff --git a/tests/specs/run/top_level_await_ts/top_level_await/loop.out b/tests/specs/run/top_level_await_ts/top_level_await/loop.out
new file mode 100644
index 000000000..1bdffbf66
--- /dev/null
+++ b/tests/specs/run/top_level_await_ts/top_level_await/loop.out
@@ -0,0 +1,5 @@
+loading [WILDCARD]a.js
+loaded [Module: null prototype] { default: [class Foo] }
+loading [WILDCARD]b.js
+loaded [Module: null prototype] { default: [class Bar] }
+all loaded
diff --git a/tests/specs/run/top_level_await_ts/top_level_await/nested.out b/tests/specs/run/top_level_await_ts/top_level_await/nested.out
new file mode 100644
index 000000000..8a1218a10
--- /dev/null
+++ b/tests/specs/run/top_level_await_ts/top_level_await/nested.out
@@ -0,0 +1,5 @@
+1
+2
+3
+4
+5
diff --git a/tests/specs/run/top_level_await_ts/top_level_await/nested/a.js b/tests/specs/run/top_level_await_ts/top_level_await/nested/a.js
new file mode 100644
index 000000000..74837d4ba
--- /dev/null
+++ b/tests/specs/run/top_level_await_ts/top_level_await/nested/a.js
@@ -0,0 +1,3 @@
+console.log(2);
+await import("./b.js");
+console.log(4);
diff --git a/tests/specs/run/top_level_await_ts/top_level_await/nested/b.js b/tests/specs/run/top_level_await_ts/top_level_await/nested/b.js
new file mode 100644
index 000000000..3bd241b50
--- /dev/null
+++ b/tests/specs/run/top_level_await_ts/top_level_await/nested/b.js
@@ -0,0 +1 @@
+console.log(3);
diff --git a/tests/specs/run/top_level_await_ts/top_level_await/nested/main.js b/tests/specs/run/top_level_await_ts/top_level_await/nested/main.js
new file mode 100644
index 000000000..ed46a4717
--- /dev/null
+++ b/tests/specs/run/top_level_await_ts/top_level_await/nested/main.js
@@ -0,0 +1,3 @@
+console.log(1);
+await import("./a.js");
+console.log(5);
diff --git a/tests/specs/run/top_level_await_ts/top_level_await/order.js b/tests/specs/run/top_level_await_ts/top_level_await/order.js
new file mode 100644
index 000000000..30659cdfb
--- /dev/null
+++ b/tests/specs/run/top_level_await_ts/top_level_await/order.js
@@ -0,0 +1,21 @@
+// Ported from Node
+// https://github.com/nodejs/node/blob/54746bb763ebea0dc7e99d88ff4b379bcd680964/test/es-module/test-esm-tla.mjs
+
+const { default: order } = await import("./tla/parent.js");
+
+console.log("order", JSON.stringify(order));
+
+if (
+ !(
+ order[0] === "order" &&
+ order[1] === "b" &&
+ order[2] === "c" &&
+ order[3] === "d" &&
+ order[4] === "a" &&
+ order[5] === "parent"
+ )
+) {
+ throw new Error("TLA wrong order");
+}
+
+console.log("TLA order correct");
diff --git a/tests/specs/run/top_level_await_ts/top_level_await/order.out b/tests/specs/run/top_level_await_ts/top_level_await/order.out
new file mode 100644
index 000000000..4cc27858c
--- /dev/null
+++ b/tests/specs/run/top_level_await_ts/top_level_await/order.out
@@ -0,0 +1,2 @@
+order ["order","b","c","d","a","parent"]
+TLA order correct
diff --git a/tests/specs/run/top_level_await_ts/top_level_await/tla/a.js b/tests/specs/run/top_level_await_ts/top_level_await/tla/a.js
new file mode 100644
index 000000000..c3ef3f7db
--- /dev/null
+++ b/tests/specs/run/top_level_await_ts/top_level_await/tla/a.js
@@ -0,0 +1,3 @@
+import order from "./order.js";
+
+order.push("b");
diff --git a/tests/specs/run/top_level_await_ts/top_level_await/tla/b.js b/tests/specs/run/top_level_await_ts/top_level_await/tla/b.js
new file mode 100644
index 000000000..3271c92d8
--- /dev/null
+++ b/tests/specs/run/top_level_await_ts/top_level_await/tla/b.js
@@ -0,0 +1,7 @@
+import order from "./order.js";
+
+await new Promise((resolve) => {
+ setTimeout(resolve, 200);
+});
+
+order.push("a");
diff --git a/tests/specs/run/top_level_await_ts/top_level_await/tla/c.js b/tests/specs/run/top_level_await_ts/top_level_await/tla/c.js
new file mode 100644
index 000000000..806eb0a8b
--- /dev/null
+++ b/tests/specs/run/top_level_await_ts/top_level_await/tla/c.js
@@ -0,0 +1,3 @@
+import order from "./order.js";
+
+order.push("c");
diff --git a/tests/specs/run/top_level_await_ts/top_level_await/tla/d.js b/tests/specs/run/top_level_await_ts/top_level_await/tla/d.js
new file mode 100644
index 000000000..283ebf817
--- /dev/null
+++ b/tests/specs/run/top_level_await_ts/top_level_await/tla/d.js
@@ -0,0 +1,8 @@
+import order from "./order.js";
+
+const end = Date.now() + 500;
+while (end < Date.now()) {
+ // pass
+}
+
+order.push("d");
diff --git a/tests/specs/run/top_level_await_ts/top_level_await/tla/order.js b/tests/specs/run/top_level_await_ts/top_level_await/tla/order.js
new file mode 100644
index 000000000..f213a562c
--- /dev/null
+++ b/tests/specs/run/top_level_await_ts/top_level_await/tla/order.js
@@ -0,0 +1 @@
+export default ["order"];
diff --git a/tests/specs/run/top_level_await_ts/top_level_await/tla/parent.js b/tests/specs/run/top_level_await_ts/top_level_await/tla/parent.js
new file mode 100644
index 000000000..1ecc15463
--- /dev/null
+++ b/tests/specs/run/top_level_await_ts/top_level_await/tla/parent.js
@@ -0,0 +1,9 @@
+import order from "./order.js";
+import "./a.js";
+import "./b.js";
+import "./c.js";
+import "./d.js";
+
+order.push("parent");
+
+export default order;
diff --git a/tests/specs/run/top_level_await_ts/top_level_await/tla2/a.js b/tests/specs/run/top_level_await_ts/top_level_await/tla2/a.js
new file mode 100644
index 000000000..d07bcb94d
--- /dev/null
+++ b/tests/specs/run/top_level_await_ts/top_level_await/tla2/a.js
@@ -0,0 +1,5 @@
+export default class Foo {
+ constructor(message) {
+ this.message = message;
+ }
+}
diff --git a/tests/specs/run/top_level_await_ts/top_level_await/tla2/b.js b/tests/specs/run/top_level_await_ts/top_level_await/tla2/b.js
new file mode 100644
index 000000000..68e357c1e
--- /dev/null
+++ b/tests/specs/run/top_level_await_ts/top_level_await/tla2/b.js
@@ -0,0 +1,5 @@
+export default class Bar {
+ constructor(message) {
+ this.message = message;
+ }
+}
diff --git a/tests/specs/run/top_level_await_ts/top_level_await/tla3/b.js b/tests/specs/run/top_level_await_ts/top_level_await/tla3/b.js
new file mode 100644
index 000000000..d0349545e
--- /dev/null
+++ b/tests/specs/run/top_level_await_ts/top_level_await/tla3/b.js
@@ -0,0 +1,7 @@
+import { foo } from "./timeout_loop.js";
+import { collection } from "../circular.js";
+
+console.log("collection in b", collection);
+console.log("foo in b", foo);
+
+export const a = "a";
diff --git a/tests/specs/run/top_level_await_ts/top_level_await/tla3/timeout_loop.js b/tests/specs/run/top_level_await_ts/top_level_await/tla3/timeout_loop.js
new file mode 100644
index 000000000..860e6cd2a
--- /dev/null
+++ b/tests/specs/run/top_level_await_ts/top_level_await/tla3/timeout_loop.js
@@ -0,0 +1,23 @@
+export const foo = "foo";
+
+export function delay(ms) {
+ return new Promise((res) =>
+ setTimeout(() => {
+ res();
+ }, ms)
+ );
+}
+
+let i = 0;
+
+async function timeoutLoop() {
+ await delay(1000);
+ console.log("timeout loop", i);
+ i++;
+ if (i > 5) {
+ return;
+ }
+ timeoutLoop();
+}
+
+timeoutLoop();
diff --git a/tests/specs/run/top_level_await_ts/top_level_await/top_level_await.js b/tests/specs/run/top_level_await_ts/top_level_await/top_level_await.js
new file mode 100644
index 000000000..ea319ea12
--- /dev/null
+++ b/tests/specs/run/top_level_await_ts/top_level_await/top_level_await.js
@@ -0,0 +1,3 @@
+const buf = await Deno.readFile("./assets/hello.txt");
+const n = await Deno.stdout.write(buf);
+console.log(`\n\nwrite ${n}`);
diff --git a/tests/specs/run/top_level_await_ts/top_level_await/top_level_await.out b/tests/specs/run/top_level_await_ts/top_level_await/top_level_await.out
new file mode 100644
index 000000000..4b65d15fe
--- /dev/null
+++ b/tests/specs/run/top_level_await_ts/top_level_await/top_level_await.out
@@ -0,0 +1,3 @@
+Hello world!
+
+write 12
diff --git a/tests/specs/run/top_level_await_ts/top_level_await/top_level_await.ts b/tests/specs/run/top_level_await_ts/top_level_await/top_level_await.ts
new file mode 100644
index 000000000..48f66545a
--- /dev/null
+++ b/tests/specs/run/top_level_await_ts/top_level_await/top_level_await.ts
@@ -0,0 +1,3 @@
+const buf: Uint8Array = await Deno.readFile("./hello.txt");
+const n: number = await Deno.stdout.write(buf);
+console.log(`\n\nwrite ${n}`);
diff --git a/tests/specs/run/top_level_await_ts/top_level_await/top_level_for_await.js b/tests/specs/run/top_level_await_ts/top_level_await/top_level_for_await.js
new file mode 100644
index 000000000..a330f6c71
--- /dev/null
+++ b/tests/specs/run/top_level_await_ts/top_level_await/top_level_for_await.js
@@ -0,0 +1,10 @@
+function* asyncGenerator() {
+ let i = 0;
+ while (i < 3) {
+ yield i++;
+ }
+}
+
+for await (const num of asyncGenerator()) {
+ console.log(num);
+}
diff --git a/tests/specs/run/top_level_await_ts/top_level_await/top_level_for_await.out b/tests/specs/run/top_level_await_ts/top_level_await/top_level_for_await.out
new file mode 100644
index 000000000..4539bbf2d
--- /dev/null
+++ b/tests/specs/run/top_level_await_ts/top_level_await/top_level_for_await.out
@@ -0,0 +1,3 @@
+0
+1
+2
diff --git a/tests/specs/run/top_level_await_ts/top_level_await/top_level_for_await.ts b/tests/specs/run/top_level_await_ts/top_level_await/top_level_for_await.ts
new file mode 100644
index 000000000..9179322d7
--- /dev/null
+++ b/tests/specs/run/top_level_await_ts/top_level_await/top_level_for_await.ts
@@ -0,0 +1,10 @@
+async function* asyncGenerator(): AsyncIterableIterator<number> {
+ let i = 0;
+ while (i < 3) {
+ yield i++;
+ }
+}
+
+for await (const num of asyncGenerator()) {
+ console.log(num);
+}
diff --git a/tests/specs/run/top_level_await_ts/top_level_await/unresolved.js b/tests/specs/run/top_level_await_ts/top_level_await/unresolved.js
new file mode 100644
index 000000000..231a8cd63
--- /dev/null
+++ b/tests/specs/run/top_level_await_ts/top_level_await/unresolved.js
@@ -0,0 +1 @@
+await new Promise(() => {});
diff --git a/tests/specs/run/top_level_await_ts/top_level_await/unresolved.out b/tests/specs/run/top_level_await_ts/top_level_await/unresolved.out
new file mode 100644
index 000000000..1f4ea5d38
--- /dev/null
+++ b/tests/specs/run/top_level_await_ts/top_level_await/unresolved.out
@@ -0,0 +1,4 @@
+error: Top-level await promise never resolved
+await new Promise(() => {});
+^
+ at <anonymous> ([WILDCARD]top_level_await/unresolved.js:1:1)
diff --git a/tests/specs/run/top_level_await_unresolved/__test__.jsonc b/tests/specs/run/top_level_await_unresolved/__test__.jsonc
new file mode 100644
index 000000000..a92774c1b
--- /dev/null
+++ b/tests/specs/run/top_level_await_unresolved/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run top_level_await/unresolved.js",
+ "output": "top_level_await/unresolved.out",
+ "exitCode": 1
+}
diff --git a/tests/specs/run/top_level_await_unresolved/top_level_await/circular.js b/tests/specs/run/top_level_await_unresolved/top_level_await/circular.js
new file mode 100644
index 000000000..ff2964b6a
--- /dev/null
+++ b/tests/specs/run/top_level_await_unresolved/top_level_await/circular.js
@@ -0,0 +1,8 @@
+import { foo } from "./tla3/timeout_loop.js";
+
+export const collection = [];
+
+const mod = await import("./tla3/b.js");
+
+console.log("foo in main", foo);
+console.log("mod", mod);
diff --git a/tests/specs/run/top_level_await_unresolved/top_level_await/circular.out b/tests/specs/run/top_level_await_unresolved/top_level_await/circular.out
new file mode 100644
index 000000000..c88978961
--- /dev/null
+++ b/tests/specs/run/top_level_await_unresolved/top_level_await/circular.out
@@ -0,0 +1,10 @@
+timeout loop 0
+timeout loop 1
+timeout loop 2
+timeout loop 3
+timeout loop 4
+timeout loop 5
+error: Top-level await promise never resolved
+const mod = await import("./tla3/b.js");
+ ^
+ at <anonymous> ([WILDCARD]/top_level_await/circular.js:5:13)
diff --git a/tests/specs/run/top_level_await_unresolved/top_level_await/loop.js b/tests/specs/run/top_level_await_unresolved/top_level_await/loop.js
new file mode 100644
index 000000000..415db5ec7
--- /dev/null
+++ b/tests/specs/run/top_level_await_unresolved/top_level_await/loop.js
@@ -0,0 +1,20 @@
+const importsDir = Deno.readDirSync(
+ Deno.realPathSync("./run/top_level_await/tla2"),
+);
+
+const resolvedPaths = [];
+
+for (const { name } of importsDir) {
+ const filePath = Deno.realPathSync(`./run/top_level_await/tla2/${name}`);
+ resolvedPaths.push(filePath);
+}
+
+resolvedPaths.sort();
+
+for (const filePath of resolvedPaths) {
+ console.log("loading", filePath);
+ const mod = await import(`file://${filePath}`);
+ console.log("loaded", mod);
+}
+
+console.log("all loaded");
diff --git a/tests/specs/run/top_level_await_unresolved/top_level_await/loop.out b/tests/specs/run/top_level_await_unresolved/top_level_await/loop.out
new file mode 100644
index 000000000..1bdffbf66
--- /dev/null
+++ b/tests/specs/run/top_level_await_unresolved/top_level_await/loop.out
@@ -0,0 +1,5 @@
+loading [WILDCARD]a.js
+loaded [Module: null prototype] { default: [class Foo] }
+loading [WILDCARD]b.js
+loaded [Module: null prototype] { default: [class Bar] }
+all loaded
diff --git a/tests/specs/run/top_level_await_unresolved/top_level_await/nested.out b/tests/specs/run/top_level_await_unresolved/top_level_await/nested.out
new file mode 100644
index 000000000..8a1218a10
--- /dev/null
+++ b/tests/specs/run/top_level_await_unresolved/top_level_await/nested.out
@@ -0,0 +1,5 @@
+1
+2
+3
+4
+5
diff --git a/tests/specs/run/top_level_await_unresolved/top_level_await/nested/a.js b/tests/specs/run/top_level_await_unresolved/top_level_await/nested/a.js
new file mode 100644
index 000000000..74837d4ba
--- /dev/null
+++ b/tests/specs/run/top_level_await_unresolved/top_level_await/nested/a.js
@@ -0,0 +1,3 @@
+console.log(2);
+await import("./b.js");
+console.log(4);
diff --git a/tests/specs/run/top_level_await_unresolved/top_level_await/nested/b.js b/tests/specs/run/top_level_await_unresolved/top_level_await/nested/b.js
new file mode 100644
index 000000000..3bd241b50
--- /dev/null
+++ b/tests/specs/run/top_level_await_unresolved/top_level_await/nested/b.js
@@ -0,0 +1 @@
+console.log(3);
diff --git a/tests/specs/run/top_level_await_unresolved/top_level_await/nested/main.js b/tests/specs/run/top_level_await_unresolved/top_level_await/nested/main.js
new file mode 100644
index 000000000..ed46a4717
--- /dev/null
+++ b/tests/specs/run/top_level_await_unresolved/top_level_await/nested/main.js
@@ -0,0 +1,3 @@
+console.log(1);
+await import("./a.js");
+console.log(5);
diff --git a/tests/specs/run/top_level_await_unresolved/top_level_await/order.js b/tests/specs/run/top_level_await_unresolved/top_level_await/order.js
new file mode 100644
index 000000000..30659cdfb
--- /dev/null
+++ b/tests/specs/run/top_level_await_unresolved/top_level_await/order.js
@@ -0,0 +1,21 @@
+// Ported from Node
+// https://github.com/nodejs/node/blob/54746bb763ebea0dc7e99d88ff4b379bcd680964/test/es-module/test-esm-tla.mjs
+
+const { default: order } = await import("./tla/parent.js");
+
+console.log("order", JSON.stringify(order));
+
+if (
+ !(
+ order[0] === "order" &&
+ order[1] === "b" &&
+ order[2] === "c" &&
+ order[3] === "d" &&
+ order[4] === "a" &&
+ order[5] === "parent"
+ )
+) {
+ throw new Error("TLA wrong order");
+}
+
+console.log("TLA order correct");
diff --git a/tests/specs/run/top_level_await_unresolved/top_level_await/order.out b/tests/specs/run/top_level_await_unresolved/top_level_await/order.out
new file mode 100644
index 000000000..4cc27858c
--- /dev/null
+++ b/tests/specs/run/top_level_await_unresolved/top_level_await/order.out
@@ -0,0 +1,2 @@
+order ["order","b","c","d","a","parent"]
+TLA order correct
diff --git a/tests/specs/run/top_level_await_unresolved/top_level_await/tla/a.js b/tests/specs/run/top_level_await_unresolved/top_level_await/tla/a.js
new file mode 100644
index 000000000..c3ef3f7db
--- /dev/null
+++ b/tests/specs/run/top_level_await_unresolved/top_level_await/tla/a.js
@@ -0,0 +1,3 @@
+import order from "./order.js";
+
+order.push("b");
diff --git a/tests/specs/run/top_level_await_unresolved/top_level_await/tla/b.js b/tests/specs/run/top_level_await_unresolved/top_level_await/tla/b.js
new file mode 100644
index 000000000..3271c92d8
--- /dev/null
+++ b/tests/specs/run/top_level_await_unresolved/top_level_await/tla/b.js
@@ -0,0 +1,7 @@
+import order from "./order.js";
+
+await new Promise((resolve) => {
+ setTimeout(resolve, 200);
+});
+
+order.push("a");
diff --git a/tests/specs/run/top_level_await_unresolved/top_level_await/tla/c.js b/tests/specs/run/top_level_await_unresolved/top_level_await/tla/c.js
new file mode 100644
index 000000000..806eb0a8b
--- /dev/null
+++ b/tests/specs/run/top_level_await_unresolved/top_level_await/tla/c.js
@@ -0,0 +1,3 @@
+import order from "./order.js";
+
+order.push("c");
diff --git a/tests/specs/run/top_level_await_unresolved/top_level_await/tla/d.js b/tests/specs/run/top_level_await_unresolved/top_level_await/tla/d.js
new file mode 100644
index 000000000..283ebf817
--- /dev/null
+++ b/tests/specs/run/top_level_await_unresolved/top_level_await/tla/d.js
@@ -0,0 +1,8 @@
+import order from "./order.js";
+
+const end = Date.now() + 500;
+while (end < Date.now()) {
+ // pass
+}
+
+order.push("d");
diff --git a/tests/specs/run/top_level_await_unresolved/top_level_await/tla/order.js b/tests/specs/run/top_level_await_unresolved/top_level_await/tla/order.js
new file mode 100644
index 000000000..f213a562c
--- /dev/null
+++ b/tests/specs/run/top_level_await_unresolved/top_level_await/tla/order.js
@@ -0,0 +1 @@
+export default ["order"];
diff --git a/tests/specs/run/top_level_await_unresolved/top_level_await/tla/parent.js b/tests/specs/run/top_level_await_unresolved/top_level_await/tla/parent.js
new file mode 100644
index 000000000..1ecc15463
--- /dev/null
+++ b/tests/specs/run/top_level_await_unresolved/top_level_await/tla/parent.js
@@ -0,0 +1,9 @@
+import order from "./order.js";
+import "./a.js";
+import "./b.js";
+import "./c.js";
+import "./d.js";
+
+order.push("parent");
+
+export default order;
diff --git a/tests/specs/run/top_level_await_unresolved/top_level_await/tla2/a.js b/tests/specs/run/top_level_await_unresolved/top_level_await/tla2/a.js
new file mode 100644
index 000000000..d07bcb94d
--- /dev/null
+++ b/tests/specs/run/top_level_await_unresolved/top_level_await/tla2/a.js
@@ -0,0 +1,5 @@
+export default class Foo {
+ constructor(message) {
+ this.message = message;
+ }
+}
diff --git a/tests/specs/run/top_level_await_unresolved/top_level_await/tla2/b.js b/tests/specs/run/top_level_await_unresolved/top_level_await/tla2/b.js
new file mode 100644
index 000000000..68e357c1e
--- /dev/null
+++ b/tests/specs/run/top_level_await_unresolved/top_level_await/tla2/b.js
@@ -0,0 +1,5 @@
+export default class Bar {
+ constructor(message) {
+ this.message = message;
+ }
+}
diff --git a/tests/specs/run/top_level_await_unresolved/top_level_await/tla3/b.js b/tests/specs/run/top_level_await_unresolved/top_level_await/tla3/b.js
new file mode 100644
index 000000000..d0349545e
--- /dev/null
+++ b/tests/specs/run/top_level_await_unresolved/top_level_await/tla3/b.js
@@ -0,0 +1,7 @@
+import { foo } from "./timeout_loop.js";
+import { collection } from "../circular.js";
+
+console.log("collection in b", collection);
+console.log("foo in b", foo);
+
+export const a = "a";
diff --git a/tests/specs/run/top_level_await_unresolved/top_level_await/tla3/timeout_loop.js b/tests/specs/run/top_level_await_unresolved/top_level_await/tla3/timeout_loop.js
new file mode 100644
index 000000000..860e6cd2a
--- /dev/null
+++ b/tests/specs/run/top_level_await_unresolved/top_level_await/tla3/timeout_loop.js
@@ -0,0 +1,23 @@
+export const foo = "foo";
+
+export function delay(ms) {
+ return new Promise((res) =>
+ setTimeout(() => {
+ res();
+ }, ms)
+ );
+}
+
+let i = 0;
+
+async function timeoutLoop() {
+ await delay(1000);
+ console.log("timeout loop", i);
+ i++;
+ if (i > 5) {
+ return;
+ }
+ timeoutLoop();
+}
+
+timeoutLoop();
diff --git a/tests/specs/run/top_level_await_unresolved/top_level_await/top_level_await.js b/tests/specs/run/top_level_await_unresolved/top_level_await/top_level_await.js
new file mode 100644
index 000000000..ea319ea12
--- /dev/null
+++ b/tests/specs/run/top_level_await_unresolved/top_level_await/top_level_await.js
@@ -0,0 +1,3 @@
+const buf = await Deno.readFile("./assets/hello.txt");
+const n = await Deno.stdout.write(buf);
+console.log(`\n\nwrite ${n}`);
diff --git a/tests/specs/run/top_level_await_unresolved/top_level_await/top_level_await.out b/tests/specs/run/top_level_await_unresolved/top_level_await/top_level_await.out
new file mode 100644
index 000000000..4b65d15fe
--- /dev/null
+++ b/tests/specs/run/top_level_await_unresolved/top_level_await/top_level_await.out
@@ -0,0 +1,3 @@
+Hello world!
+
+write 12
diff --git a/tests/specs/run/top_level_await_unresolved/top_level_await/top_level_await.ts b/tests/specs/run/top_level_await_unresolved/top_level_await/top_level_await.ts
new file mode 100644
index 000000000..8d47ceb21
--- /dev/null
+++ b/tests/specs/run/top_level_await_unresolved/top_level_await/top_level_await.ts
@@ -0,0 +1,3 @@
+const buf: Uint8Array = await Deno.readFile("./assets/hello.txt");
+const n: number = await Deno.stdout.write(buf);
+console.log(`\n\nwrite ${n}`);
diff --git a/tests/specs/run/top_level_await_unresolved/top_level_await/top_level_for_await.js b/tests/specs/run/top_level_await_unresolved/top_level_await/top_level_for_await.js
new file mode 100644
index 000000000..a330f6c71
--- /dev/null
+++ b/tests/specs/run/top_level_await_unresolved/top_level_await/top_level_for_await.js
@@ -0,0 +1,10 @@
+function* asyncGenerator() {
+ let i = 0;
+ while (i < 3) {
+ yield i++;
+ }
+}
+
+for await (const num of asyncGenerator()) {
+ console.log(num);
+}
diff --git a/tests/specs/run/top_level_await_unresolved/top_level_await/top_level_for_await.out b/tests/specs/run/top_level_await_unresolved/top_level_await/top_level_for_await.out
new file mode 100644
index 000000000..4539bbf2d
--- /dev/null
+++ b/tests/specs/run/top_level_await_unresolved/top_level_await/top_level_for_await.out
@@ -0,0 +1,3 @@
+0
+1
+2
diff --git a/tests/specs/run/top_level_await_unresolved/top_level_await/top_level_for_await.ts b/tests/specs/run/top_level_await_unresolved/top_level_await/top_level_for_await.ts
new file mode 100644
index 000000000..9179322d7
--- /dev/null
+++ b/tests/specs/run/top_level_await_unresolved/top_level_await/top_level_for_await.ts
@@ -0,0 +1,10 @@
+async function* asyncGenerator(): AsyncIterableIterator<number> {
+ let i = 0;
+ while (i < 3) {
+ yield i++;
+ }
+}
+
+for await (const num of asyncGenerator()) {
+ console.log(num);
+}
diff --git a/tests/specs/run/top_level_await_unresolved/top_level_await/unresolved.js b/tests/specs/run/top_level_await_unresolved/top_level_await/unresolved.js
new file mode 100644
index 000000000..231a8cd63
--- /dev/null
+++ b/tests/specs/run/top_level_await_unresolved/top_level_await/unresolved.js
@@ -0,0 +1 @@
+await new Promise(() => {});
diff --git a/tests/specs/run/top_level_await_unresolved/top_level_await/unresolved.out b/tests/specs/run/top_level_await_unresolved/top_level_await/unresolved.out
new file mode 100644
index 000000000..1f4ea5d38
--- /dev/null
+++ b/tests/specs/run/top_level_await_unresolved/top_level_await/unresolved.out
@@ -0,0 +1,4 @@
+error: Top-level await promise never resolved
+await new Promise(() => {});
+^
+ at <anonymous> ([WILDCARD]top_level_await/unresolved.js:1:1)
diff --git a/tests/specs/run/top_level_for_await/__test__.jsonc b/tests/specs/run/top_level_for_await/__test__.jsonc
new file mode 100644
index 000000000..198008560
--- /dev/null
+++ b/tests/specs/run/top_level_for_await/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --quiet top_level_await/top_level_for_await.js",
+ "output": "top_level_await/top_level_for_await.out"
+}
diff --git a/tests/specs/run/top_level_for_await/top_level_await/circular.js b/tests/specs/run/top_level_for_await/top_level_await/circular.js
new file mode 100644
index 000000000..ff2964b6a
--- /dev/null
+++ b/tests/specs/run/top_level_for_await/top_level_await/circular.js
@@ -0,0 +1,8 @@
+import { foo } from "./tla3/timeout_loop.js";
+
+export const collection = [];
+
+const mod = await import("./tla3/b.js");
+
+console.log("foo in main", foo);
+console.log("mod", mod);
diff --git a/tests/specs/run/top_level_for_await/top_level_await/circular.out b/tests/specs/run/top_level_for_await/top_level_await/circular.out
new file mode 100644
index 000000000..c88978961
--- /dev/null
+++ b/tests/specs/run/top_level_for_await/top_level_await/circular.out
@@ -0,0 +1,10 @@
+timeout loop 0
+timeout loop 1
+timeout loop 2
+timeout loop 3
+timeout loop 4
+timeout loop 5
+error: Top-level await promise never resolved
+const mod = await import("./tla3/b.js");
+ ^
+ at <anonymous> ([WILDCARD]/top_level_await/circular.js:5:13)
diff --git a/tests/specs/run/top_level_for_await/top_level_await/loop.js b/tests/specs/run/top_level_for_await/top_level_await/loop.js
new file mode 100644
index 000000000..415db5ec7
--- /dev/null
+++ b/tests/specs/run/top_level_for_await/top_level_await/loop.js
@@ -0,0 +1,20 @@
+const importsDir = Deno.readDirSync(
+ Deno.realPathSync("./run/top_level_await/tla2"),
+);
+
+const resolvedPaths = [];
+
+for (const { name } of importsDir) {
+ const filePath = Deno.realPathSync(`./run/top_level_await/tla2/${name}`);
+ resolvedPaths.push(filePath);
+}
+
+resolvedPaths.sort();
+
+for (const filePath of resolvedPaths) {
+ console.log("loading", filePath);
+ const mod = await import(`file://${filePath}`);
+ console.log("loaded", mod);
+}
+
+console.log("all loaded");
diff --git a/tests/specs/run/top_level_for_await/top_level_await/loop.out b/tests/specs/run/top_level_for_await/top_level_await/loop.out
new file mode 100644
index 000000000..1bdffbf66
--- /dev/null
+++ b/tests/specs/run/top_level_for_await/top_level_await/loop.out
@@ -0,0 +1,5 @@
+loading [WILDCARD]a.js
+loaded [Module: null prototype] { default: [class Foo] }
+loading [WILDCARD]b.js
+loaded [Module: null prototype] { default: [class Bar] }
+all loaded
diff --git a/tests/specs/run/top_level_for_await/top_level_await/nested.out b/tests/specs/run/top_level_for_await/top_level_await/nested.out
new file mode 100644
index 000000000..8a1218a10
--- /dev/null
+++ b/tests/specs/run/top_level_for_await/top_level_await/nested.out
@@ -0,0 +1,5 @@
+1
+2
+3
+4
+5
diff --git a/tests/specs/run/top_level_for_await/top_level_await/nested/a.js b/tests/specs/run/top_level_for_await/top_level_await/nested/a.js
new file mode 100644
index 000000000..74837d4ba
--- /dev/null
+++ b/tests/specs/run/top_level_for_await/top_level_await/nested/a.js
@@ -0,0 +1,3 @@
+console.log(2);
+await import("./b.js");
+console.log(4);
diff --git a/tests/specs/run/top_level_for_await/top_level_await/nested/b.js b/tests/specs/run/top_level_for_await/top_level_await/nested/b.js
new file mode 100644
index 000000000..3bd241b50
--- /dev/null
+++ b/tests/specs/run/top_level_for_await/top_level_await/nested/b.js
@@ -0,0 +1 @@
+console.log(3);
diff --git a/tests/specs/run/top_level_for_await/top_level_await/nested/main.js b/tests/specs/run/top_level_for_await/top_level_await/nested/main.js
new file mode 100644
index 000000000..ed46a4717
--- /dev/null
+++ b/tests/specs/run/top_level_for_await/top_level_await/nested/main.js
@@ -0,0 +1,3 @@
+console.log(1);
+await import("./a.js");
+console.log(5);
diff --git a/tests/specs/run/top_level_for_await/top_level_await/order.js b/tests/specs/run/top_level_for_await/top_level_await/order.js
new file mode 100644
index 000000000..30659cdfb
--- /dev/null
+++ b/tests/specs/run/top_level_for_await/top_level_await/order.js
@@ -0,0 +1,21 @@
+// Ported from Node
+// https://github.com/nodejs/node/blob/54746bb763ebea0dc7e99d88ff4b379bcd680964/test/es-module/test-esm-tla.mjs
+
+const { default: order } = await import("./tla/parent.js");
+
+console.log("order", JSON.stringify(order));
+
+if (
+ !(
+ order[0] === "order" &&
+ order[1] === "b" &&
+ order[2] === "c" &&
+ order[3] === "d" &&
+ order[4] === "a" &&
+ order[5] === "parent"
+ )
+) {
+ throw new Error("TLA wrong order");
+}
+
+console.log("TLA order correct");
diff --git a/tests/specs/run/top_level_for_await/top_level_await/order.out b/tests/specs/run/top_level_for_await/top_level_await/order.out
new file mode 100644
index 000000000..4cc27858c
--- /dev/null
+++ b/tests/specs/run/top_level_for_await/top_level_await/order.out
@@ -0,0 +1,2 @@
+order ["order","b","c","d","a","parent"]
+TLA order correct
diff --git a/tests/specs/run/top_level_for_await/top_level_await/tla/a.js b/tests/specs/run/top_level_for_await/top_level_await/tla/a.js
new file mode 100644
index 000000000..c3ef3f7db
--- /dev/null
+++ b/tests/specs/run/top_level_for_await/top_level_await/tla/a.js
@@ -0,0 +1,3 @@
+import order from "./order.js";
+
+order.push("b");
diff --git a/tests/specs/run/top_level_for_await/top_level_await/tla/b.js b/tests/specs/run/top_level_for_await/top_level_await/tla/b.js
new file mode 100644
index 000000000..3271c92d8
--- /dev/null
+++ b/tests/specs/run/top_level_for_await/top_level_await/tla/b.js
@@ -0,0 +1,7 @@
+import order from "./order.js";
+
+await new Promise((resolve) => {
+ setTimeout(resolve, 200);
+});
+
+order.push("a");
diff --git a/tests/specs/run/top_level_for_await/top_level_await/tla/c.js b/tests/specs/run/top_level_for_await/top_level_await/tla/c.js
new file mode 100644
index 000000000..806eb0a8b
--- /dev/null
+++ b/tests/specs/run/top_level_for_await/top_level_await/tla/c.js
@@ -0,0 +1,3 @@
+import order from "./order.js";
+
+order.push("c");
diff --git a/tests/specs/run/top_level_for_await/top_level_await/tla/d.js b/tests/specs/run/top_level_for_await/top_level_await/tla/d.js
new file mode 100644
index 000000000..283ebf817
--- /dev/null
+++ b/tests/specs/run/top_level_for_await/top_level_await/tla/d.js
@@ -0,0 +1,8 @@
+import order from "./order.js";
+
+const end = Date.now() + 500;
+while (end < Date.now()) {
+ // pass
+}
+
+order.push("d");
diff --git a/tests/specs/run/top_level_for_await/top_level_await/tla/order.js b/tests/specs/run/top_level_for_await/top_level_await/tla/order.js
new file mode 100644
index 000000000..f213a562c
--- /dev/null
+++ b/tests/specs/run/top_level_for_await/top_level_await/tla/order.js
@@ -0,0 +1 @@
+export default ["order"];
diff --git a/tests/specs/run/top_level_for_await/top_level_await/tla/parent.js b/tests/specs/run/top_level_for_await/top_level_await/tla/parent.js
new file mode 100644
index 000000000..1ecc15463
--- /dev/null
+++ b/tests/specs/run/top_level_for_await/top_level_await/tla/parent.js
@@ -0,0 +1,9 @@
+import order from "./order.js";
+import "./a.js";
+import "./b.js";
+import "./c.js";
+import "./d.js";
+
+order.push("parent");
+
+export default order;
diff --git a/tests/specs/run/top_level_for_await/top_level_await/tla2/a.js b/tests/specs/run/top_level_for_await/top_level_await/tla2/a.js
new file mode 100644
index 000000000..d07bcb94d
--- /dev/null
+++ b/tests/specs/run/top_level_for_await/top_level_await/tla2/a.js
@@ -0,0 +1,5 @@
+export default class Foo {
+ constructor(message) {
+ this.message = message;
+ }
+}
diff --git a/tests/specs/run/top_level_for_await/top_level_await/tla2/b.js b/tests/specs/run/top_level_for_await/top_level_await/tla2/b.js
new file mode 100644
index 000000000..68e357c1e
--- /dev/null
+++ b/tests/specs/run/top_level_for_await/top_level_await/tla2/b.js
@@ -0,0 +1,5 @@
+export default class Bar {
+ constructor(message) {
+ this.message = message;
+ }
+}
diff --git a/tests/specs/run/top_level_for_await/top_level_await/tla3/b.js b/tests/specs/run/top_level_for_await/top_level_await/tla3/b.js
new file mode 100644
index 000000000..d0349545e
--- /dev/null
+++ b/tests/specs/run/top_level_for_await/top_level_await/tla3/b.js
@@ -0,0 +1,7 @@
+import { foo } from "./timeout_loop.js";
+import { collection } from "../circular.js";
+
+console.log("collection in b", collection);
+console.log("foo in b", foo);
+
+export const a = "a";
diff --git a/tests/specs/run/top_level_for_await/top_level_await/tla3/timeout_loop.js b/tests/specs/run/top_level_for_await/top_level_await/tla3/timeout_loop.js
new file mode 100644
index 000000000..860e6cd2a
--- /dev/null
+++ b/tests/specs/run/top_level_for_await/top_level_await/tla3/timeout_loop.js
@@ -0,0 +1,23 @@
+export const foo = "foo";
+
+export function delay(ms) {
+ return new Promise((res) =>
+ setTimeout(() => {
+ res();
+ }, ms)
+ );
+}
+
+let i = 0;
+
+async function timeoutLoop() {
+ await delay(1000);
+ console.log("timeout loop", i);
+ i++;
+ if (i > 5) {
+ return;
+ }
+ timeoutLoop();
+}
+
+timeoutLoop();
diff --git a/tests/specs/run/top_level_for_await/top_level_await/top_level_await.js b/tests/specs/run/top_level_for_await/top_level_await/top_level_await.js
new file mode 100644
index 000000000..ea319ea12
--- /dev/null
+++ b/tests/specs/run/top_level_for_await/top_level_await/top_level_await.js
@@ -0,0 +1,3 @@
+const buf = await Deno.readFile("./assets/hello.txt");
+const n = await Deno.stdout.write(buf);
+console.log(`\n\nwrite ${n}`);
diff --git a/tests/specs/run/top_level_for_await/top_level_await/top_level_await.out b/tests/specs/run/top_level_for_await/top_level_await/top_level_await.out
new file mode 100644
index 000000000..4b65d15fe
--- /dev/null
+++ b/tests/specs/run/top_level_for_await/top_level_await/top_level_await.out
@@ -0,0 +1,3 @@
+Hello world!
+
+write 12
diff --git a/tests/specs/run/top_level_for_await/top_level_await/top_level_await.ts b/tests/specs/run/top_level_for_await/top_level_await/top_level_await.ts
new file mode 100644
index 000000000..8d47ceb21
--- /dev/null
+++ b/tests/specs/run/top_level_for_await/top_level_await/top_level_await.ts
@@ -0,0 +1,3 @@
+const buf: Uint8Array = await Deno.readFile("./assets/hello.txt");
+const n: number = await Deno.stdout.write(buf);
+console.log(`\n\nwrite ${n}`);
diff --git a/tests/specs/run/top_level_for_await/top_level_await/top_level_for_await.js b/tests/specs/run/top_level_for_await/top_level_await/top_level_for_await.js
new file mode 100644
index 000000000..a330f6c71
--- /dev/null
+++ b/tests/specs/run/top_level_for_await/top_level_await/top_level_for_await.js
@@ -0,0 +1,10 @@
+function* asyncGenerator() {
+ let i = 0;
+ while (i < 3) {
+ yield i++;
+ }
+}
+
+for await (const num of asyncGenerator()) {
+ console.log(num);
+}
diff --git a/tests/specs/run/top_level_for_await/top_level_await/top_level_for_await.out b/tests/specs/run/top_level_for_await/top_level_await/top_level_for_await.out
new file mode 100644
index 000000000..4539bbf2d
--- /dev/null
+++ b/tests/specs/run/top_level_for_await/top_level_await/top_level_for_await.out
@@ -0,0 +1,3 @@
+0
+1
+2
diff --git a/tests/specs/run/top_level_for_await/top_level_await/top_level_for_await.ts b/tests/specs/run/top_level_for_await/top_level_await/top_level_for_await.ts
new file mode 100644
index 000000000..9179322d7
--- /dev/null
+++ b/tests/specs/run/top_level_for_await/top_level_await/top_level_for_await.ts
@@ -0,0 +1,10 @@
+async function* asyncGenerator(): AsyncIterableIterator<number> {
+ let i = 0;
+ while (i < 3) {
+ yield i++;
+ }
+}
+
+for await (const num of asyncGenerator()) {
+ console.log(num);
+}
diff --git a/tests/specs/run/top_level_for_await/top_level_await/unresolved.js b/tests/specs/run/top_level_for_await/top_level_await/unresolved.js
new file mode 100644
index 000000000..231a8cd63
--- /dev/null
+++ b/tests/specs/run/top_level_for_await/top_level_await/unresolved.js
@@ -0,0 +1 @@
+await new Promise(() => {});
diff --git a/tests/specs/run/top_level_for_await/top_level_await/unresolved.out b/tests/specs/run/top_level_for_await/top_level_await/unresolved.out
new file mode 100644
index 000000000..1f4ea5d38
--- /dev/null
+++ b/tests/specs/run/top_level_for_await/top_level_await/unresolved.out
@@ -0,0 +1,4 @@
+error: Top-level await promise never resolved
+await new Promise(() => {});
+^
+ at <anonymous> ([WILDCARD]top_level_await/unresolved.js:1:1)
diff --git a/tests/specs/run/top_level_for_await_ts/__test__.jsonc b/tests/specs/run/top_level_for_await_ts/__test__.jsonc
new file mode 100644
index 000000000..22314e8e0
--- /dev/null
+++ b/tests/specs/run/top_level_for_await_ts/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --quiet top_level_await/top_level_for_await.ts",
+ "output": "top_level_await/top_level_for_await.out"
+}
diff --git a/tests/specs/run/top_level_for_await_ts/top_level_await/circular.js b/tests/specs/run/top_level_for_await_ts/top_level_await/circular.js
new file mode 100644
index 000000000..ff2964b6a
--- /dev/null
+++ b/tests/specs/run/top_level_for_await_ts/top_level_await/circular.js
@@ -0,0 +1,8 @@
+import { foo } from "./tla3/timeout_loop.js";
+
+export const collection = [];
+
+const mod = await import("./tla3/b.js");
+
+console.log("foo in main", foo);
+console.log("mod", mod);
diff --git a/tests/specs/run/top_level_for_await_ts/top_level_await/circular.out b/tests/specs/run/top_level_for_await_ts/top_level_await/circular.out
new file mode 100644
index 000000000..c88978961
--- /dev/null
+++ b/tests/specs/run/top_level_for_await_ts/top_level_await/circular.out
@@ -0,0 +1,10 @@
+timeout loop 0
+timeout loop 1
+timeout loop 2
+timeout loop 3
+timeout loop 4
+timeout loop 5
+error: Top-level await promise never resolved
+const mod = await import("./tla3/b.js");
+ ^
+ at <anonymous> ([WILDCARD]/top_level_await/circular.js:5:13)
diff --git a/tests/specs/run/top_level_for_await_ts/top_level_await/loop.js b/tests/specs/run/top_level_for_await_ts/top_level_await/loop.js
new file mode 100644
index 000000000..415db5ec7
--- /dev/null
+++ b/tests/specs/run/top_level_for_await_ts/top_level_await/loop.js
@@ -0,0 +1,20 @@
+const importsDir = Deno.readDirSync(
+ Deno.realPathSync("./run/top_level_await/tla2"),
+);
+
+const resolvedPaths = [];
+
+for (const { name } of importsDir) {
+ const filePath = Deno.realPathSync(`./run/top_level_await/tla2/${name}`);
+ resolvedPaths.push(filePath);
+}
+
+resolvedPaths.sort();
+
+for (const filePath of resolvedPaths) {
+ console.log("loading", filePath);
+ const mod = await import(`file://${filePath}`);
+ console.log("loaded", mod);
+}
+
+console.log("all loaded");
diff --git a/tests/specs/run/top_level_for_await_ts/top_level_await/loop.out b/tests/specs/run/top_level_for_await_ts/top_level_await/loop.out
new file mode 100644
index 000000000..1bdffbf66
--- /dev/null
+++ b/tests/specs/run/top_level_for_await_ts/top_level_await/loop.out
@@ -0,0 +1,5 @@
+loading [WILDCARD]a.js
+loaded [Module: null prototype] { default: [class Foo] }
+loading [WILDCARD]b.js
+loaded [Module: null prototype] { default: [class Bar] }
+all loaded
diff --git a/tests/specs/run/top_level_for_await_ts/top_level_await/nested.out b/tests/specs/run/top_level_for_await_ts/top_level_await/nested.out
new file mode 100644
index 000000000..8a1218a10
--- /dev/null
+++ b/tests/specs/run/top_level_for_await_ts/top_level_await/nested.out
@@ -0,0 +1,5 @@
+1
+2
+3
+4
+5
diff --git a/tests/specs/run/top_level_for_await_ts/top_level_await/nested/a.js b/tests/specs/run/top_level_for_await_ts/top_level_await/nested/a.js
new file mode 100644
index 000000000..74837d4ba
--- /dev/null
+++ b/tests/specs/run/top_level_for_await_ts/top_level_await/nested/a.js
@@ -0,0 +1,3 @@
+console.log(2);
+await import("./b.js");
+console.log(4);
diff --git a/tests/specs/run/top_level_for_await_ts/top_level_await/nested/b.js b/tests/specs/run/top_level_for_await_ts/top_level_await/nested/b.js
new file mode 100644
index 000000000..3bd241b50
--- /dev/null
+++ b/tests/specs/run/top_level_for_await_ts/top_level_await/nested/b.js
@@ -0,0 +1 @@
+console.log(3);
diff --git a/tests/specs/run/top_level_for_await_ts/top_level_await/nested/main.js b/tests/specs/run/top_level_for_await_ts/top_level_await/nested/main.js
new file mode 100644
index 000000000..ed46a4717
--- /dev/null
+++ b/tests/specs/run/top_level_for_await_ts/top_level_await/nested/main.js
@@ -0,0 +1,3 @@
+console.log(1);
+await import("./a.js");
+console.log(5);
diff --git a/tests/specs/run/top_level_for_await_ts/top_level_await/order.js b/tests/specs/run/top_level_for_await_ts/top_level_await/order.js
new file mode 100644
index 000000000..30659cdfb
--- /dev/null
+++ b/tests/specs/run/top_level_for_await_ts/top_level_await/order.js
@@ -0,0 +1,21 @@
+// Ported from Node
+// https://github.com/nodejs/node/blob/54746bb763ebea0dc7e99d88ff4b379bcd680964/test/es-module/test-esm-tla.mjs
+
+const { default: order } = await import("./tla/parent.js");
+
+console.log("order", JSON.stringify(order));
+
+if (
+ !(
+ order[0] === "order" &&
+ order[1] === "b" &&
+ order[2] === "c" &&
+ order[3] === "d" &&
+ order[4] === "a" &&
+ order[5] === "parent"
+ )
+) {
+ throw new Error("TLA wrong order");
+}
+
+console.log("TLA order correct");
diff --git a/tests/specs/run/top_level_for_await_ts/top_level_await/order.out b/tests/specs/run/top_level_for_await_ts/top_level_await/order.out
new file mode 100644
index 000000000..4cc27858c
--- /dev/null
+++ b/tests/specs/run/top_level_for_await_ts/top_level_await/order.out
@@ -0,0 +1,2 @@
+order ["order","b","c","d","a","parent"]
+TLA order correct
diff --git a/tests/specs/run/top_level_for_await_ts/top_level_await/tla/a.js b/tests/specs/run/top_level_for_await_ts/top_level_await/tla/a.js
new file mode 100644
index 000000000..c3ef3f7db
--- /dev/null
+++ b/tests/specs/run/top_level_for_await_ts/top_level_await/tla/a.js
@@ -0,0 +1,3 @@
+import order from "./order.js";
+
+order.push("b");
diff --git a/tests/specs/run/top_level_for_await_ts/top_level_await/tla/b.js b/tests/specs/run/top_level_for_await_ts/top_level_await/tla/b.js
new file mode 100644
index 000000000..3271c92d8
--- /dev/null
+++ b/tests/specs/run/top_level_for_await_ts/top_level_await/tla/b.js
@@ -0,0 +1,7 @@
+import order from "./order.js";
+
+await new Promise((resolve) => {
+ setTimeout(resolve, 200);
+});
+
+order.push("a");
diff --git a/tests/specs/run/top_level_for_await_ts/top_level_await/tla/c.js b/tests/specs/run/top_level_for_await_ts/top_level_await/tla/c.js
new file mode 100644
index 000000000..806eb0a8b
--- /dev/null
+++ b/tests/specs/run/top_level_for_await_ts/top_level_await/tla/c.js
@@ -0,0 +1,3 @@
+import order from "./order.js";
+
+order.push("c");
diff --git a/tests/specs/run/top_level_for_await_ts/top_level_await/tla/d.js b/tests/specs/run/top_level_for_await_ts/top_level_await/tla/d.js
new file mode 100644
index 000000000..283ebf817
--- /dev/null
+++ b/tests/specs/run/top_level_for_await_ts/top_level_await/tla/d.js
@@ -0,0 +1,8 @@
+import order from "./order.js";
+
+const end = Date.now() + 500;
+while (end < Date.now()) {
+ // pass
+}
+
+order.push("d");
diff --git a/tests/specs/run/top_level_for_await_ts/top_level_await/tla/order.js b/tests/specs/run/top_level_for_await_ts/top_level_await/tla/order.js
new file mode 100644
index 000000000..f213a562c
--- /dev/null
+++ b/tests/specs/run/top_level_for_await_ts/top_level_await/tla/order.js
@@ -0,0 +1 @@
+export default ["order"];
diff --git a/tests/specs/run/top_level_for_await_ts/top_level_await/tla/parent.js b/tests/specs/run/top_level_for_await_ts/top_level_await/tla/parent.js
new file mode 100644
index 000000000..1ecc15463
--- /dev/null
+++ b/tests/specs/run/top_level_for_await_ts/top_level_await/tla/parent.js
@@ -0,0 +1,9 @@
+import order from "./order.js";
+import "./a.js";
+import "./b.js";
+import "./c.js";
+import "./d.js";
+
+order.push("parent");
+
+export default order;
diff --git a/tests/specs/run/top_level_for_await_ts/top_level_await/tla2/a.js b/tests/specs/run/top_level_for_await_ts/top_level_await/tla2/a.js
new file mode 100644
index 000000000..d07bcb94d
--- /dev/null
+++ b/tests/specs/run/top_level_for_await_ts/top_level_await/tla2/a.js
@@ -0,0 +1,5 @@
+export default class Foo {
+ constructor(message) {
+ this.message = message;
+ }
+}
diff --git a/tests/specs/run/top_level_for_await_ts/top_level_await/tla2/b.js b/tests/specs/run/top_level_for_await_ts/top_level_await/tla2/b.js
new file mode 100644
index 000000000..68e357c1e
--- /dev/null
+++ b/tests/specs/run/top_level_for_await_ts/top_level_await/tla2/b.js
@@ -0,0 +1,5 @@
+export default class Bar {
+ constructor(message) {
+ this.message = message;
+ }
+}
diff --git a/tests/specs/run/top_level_for_await_ts/top_level_await/tla3/b.js b/tests/specs/run/top_level_for_await_ts/top_level_await/tla3/b.js
new file mode 100644
index 000000000..d0349545e
--- /dev/null
+++ b/tests/specs/run/top_level_for_await_ts/top_level_await/tla3/b.js
@@ -0,0 +1,7 @@
+import { foo } from "./timeout_loop.js";
+import { collection } from "../circular.js";
+
+console.log("collection in b", collection);
+console.log("foo in b", foo);
+
+export const a = "a";
diff --git a/tests/specs/run/top_level_for_await_ts/top_level_await/tla3/timeout_loop.js b/tests/specs/run/top_level_for_await_ts/top_level_await/tla3/timeout_loop.js
new file mode 100644
index 000000000..860e6cd2a
--- /dev/null
+++ b/tests/specs/run/top_level_for_await_ts/top_level_await/tla3/timeout_loop.js
@@ -0,0 +1,23 @@
+export const foo = "foo";
+
+export function delay(ms) {
+ return new Promise((res) =>
+ setTimeout(() => {
+ res();
+ }, ms)
+ );
+}
+
+let i = 0;
+
+async function timeoutLoop() {
+ await delay(1000);
+ console.log("timeout loop", i);
+ i++;
+ if (i > 5) {
+ return;
+ }
+ timeoutLoop();
+}
+
+timeoutLoop();
diff --git a/tests/specs/run/top_level_for_await_ts/top_level_await/top_level_await.js b/tests/specs/run/top_level_for_await_ts/top_level_await/top_level_await.js
new file mode 100644
index 000000000..ea319ea12
--- /dev/null
+++ b/tests/specs/run/top_level_for_await_ts/top_level_await/top_level_await.js
@@ -0,0 +1,3 @@
+const buf = await Deno.readFile("./assets/hello.txt");
+const n = await Deno.stdout.write(buf);
+console.log(`\n\nwrite ${n}`);
diff --git a/tests/specs/run/top_level_for_await_ts/top_level_await/top_level_await.out b/tests/specs/run/top_level_for_await_ts/top_level_await/top_level_await.out
new file mode 100644
index 000000000..4b65d15fe
--- /dev/null
+++ b/tests/specs/run/top_level_for_await_ts/top_level_await/top_level_await.out
@@ -0,0 +1,3 @@
+Hello world!
+
+write 12
diff --git a/tests/specs/run/top_level_for_await_ts/top_level_await/top_level_await.ts b/tests/specs/run/top_level_for_await_ts/top_level_await/top_level_await.ts
new file mode 100644
index 000000000..8d47ceb21
--- /dev/null
+++ b/tests/specs/run/top_level_for_await_ts/top_level_await/top_level_await.ts
@@ -0,0 +1,3 @@
+const buf: Uint8Array = await Deno.readFile("./assets/hello.txt");
+const n: number = await Deno.stdout.write(buf);
+console.log(`\n\nwrite ${n}`);
diff --git a/tests/specs/run/top_level_for_await_ts/top_level_await/top_level_for_await.js b/tests/specs/run/top_level_for_await_ts/top_level_await/top_level_for_await.js
new file mode 100644
index 000000000..a330f6c71
--- /dev/null
+++ b/tests/specs/run/top_level_for_await_ts/top_level_await/top_level_for_await.js
@@ -0,0 +1,10 @@
+function* asyncGenerator() {
+ let i = 0;
+ while (i < 3) {
+ yield i++;
+ }
+}
+
+for await (const num of asyncGenerator()) {
+ console.log(num);
+}
diff --git a/tests/specs/run/top_level_for_await_ts/top_level_await/top_level_for_await.out b/tests/specs/run/top_level_for_await_ts/top_level_await/top_level_for_await.out
new file mode 100644
index 000000000..4539bbf2d
--- /dev/null
+++ b/tests/specs/run/top_level_for_await_ts/top_level_await/top_level_for_await.out
@@ -0,0 +1,3 @@
+0
+1
+2
diff --git a/tests/specs/run/top_level_for_await_ts/top_level_await/top_level_for_await.ts b/tests/specs/run/top_level_for_await_ts/top_level_await/top_level_for_await.ts
new file mode 100644
index 000000000..9179322d7
--- /dev/null
+++ b/tests/specs/run/top_level_for_await_ts/top_level_await/top_level_for_await.ts
@@ -0,0 +1,10 @@
+async function* asyncGenerator(): AsyncIterableIterator<number> {
+ let i = 0;
+ while (i < 3) {
+ yield i++;
+ }
+}
+
+for await (const num of asyncGenerator()) {
+ console.log(num);
+}
diff --git a/tests/specs/run/top_level_for_await_ts/top_level_await/unresolved.js b/tests/specs/run/top_level_for_await_ts/top_level_await/unresolved.js
new file mode 100644
index 000000000..231a8cd63
--- /dev/null
+++ b/tests/specs/run/top_level_for_await_ts/top_level_await/unresolved.js
@@ -0,0 +1 @@
+await new Promise(() => {});
diff --git a/tests/specs/run/top_level_for_await_ts/top_level_await/unresolved.out b/tests/specs/run/top_level_for_await_ts/top_level_await/unresolved.out
new file mode 100644
index 000000000..1f4ea5d38
--- /dev/null
+++ b/tests/specs/run/top_level_for_await_ts/top_level_await/unresolved.out
@@ -0,0 +1,4 @@
+error: Top-level await promise never resolved
+await new Promise(() => {});
+^
+ at <anonymous> ([WILDCARD]top_level_await/unresolved.js:1:1)
diff --git a/tests/specs/run/ts_decorators/__test__.jsonc b/tests/specs/run/ts_decorators/__test__.jsonc
new file mode 100644
index 000000000..96e7cdf30
--- /dev/null
+++ b/tests/specs/run/ts_decorators/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --reload --check decorators/experimental/ts/main.ts",
+ "output": "decorators/experimental/ts/main.out"
+}
diff --git a/tests/specs/run/ts_decorators/decorators/experimental/deno.json b/tests/specs/run/ts_decorators/decorators/experimental/deno.json
new file mode 100644
index 000000000..504cd646e
--- /dev/null
+++ b/tests/specs/run/ts_decorators/decorators/experimental/deno.json
@@ -0,0 +1,5 @@
+{
+ "compilerOptions": {
+ "experimentalDecorators": true
+ }
+}
diff --git a/tests/specs/run/ts_decorators/decorators/experimental/no_check/main.out b/tests/specs/run/ts_decorators/decorators/experimental/no_check/main.out
new file mode 100644
index 000000000..015f7076e
--- /dev/null
+++ b/tests/specs/run/ts_decorators/decorators/experimental/no_check/main.out
@@ -0,0 +1,3 @@
+a(): evaluated
+a(): called
+method
diff --git a/tests/specs/run/ts_decorators/decorators/experimental/no_check/main.ts b/tests/specs/run/ts_decorators/decorators/experimental/no_check/main.ts
new file mode 100644
index 000000000..9f7ec550d
--- /dev/null
+++ b/tests/specs/run/ts_decorators/decorators/experimental/no_check/main.ts
@@ -0,0 +1,21 @@
+// deno-lint-ignore-file
+function a() {
+ console.log("a(): evaluated");
+ return (
+ _target: any,
+ _propertyKey: string,
+ _descriptor: PropertyDescriptor,
+ ) => {
+ console.log("a(): called");
+ };
+}
+
+class B {
+ @a()
+ method() {
+ console.log("method");
+ }
+}
+
+const b = new B();
+b.method();
diff --git a/tests/specs/run/ts_decorators/decorators/experimental/runtime/main.out b/tests/specs/run/ts_decorators/decorators/experimental/runtime/main.out
new file mode 100644
index 000000000..0fc1d4590
--- /dev/null
+++ b/tests/specs/run/ts_decorators/decorators/experimental/runtime/main.out
@@ -0,0 +1,7 @@
+@A evaluated
+@B evaluated
+@B called
+@A called
+fn() called from @A
+fn() called from @B
+C.test() called
diff --git a/tests/specs/run/ts_decorators/decorators/experimental/runtime/main.ts b/tests/specs/run/ts_decorators/decorators/experimental/runtime/main.ts
new file mode 100644
index 000000000..40a26bbd4
--- /dev/null
+++ b/tests/specs/run/ts_decorators/decorators/experimental/runtime/main.ts
@@ -0,0 +1,42 @@
+// deno-lint-ignore-file
+function a() {
+ console.log("@A evaluated");
+ return function (
+ target: any,
+ propertyKey: string,
+ descriptor: PropertyDescriptor,
+ ) {
+ console.log("@A called");
+ const fn = descriptor.value;
+ descriptor.value = function () {
+ console.log("fn() called from @A");
+ fn();
+ };
+ };
+}
+
+function b() {
+ console.log("@B evaluated");
+ return function (
+ target: any,
+ propertyKey: string,
+ descriptor: PropertyDescriptor,
+ ) {
+ console.log("@B called");
+ const fn = descriptor.value;
+ descriptor.value = function () {
+ console.log("fn() called from @B");
+ fn();
+ };
+ };
+}
+
+class C {
+ @a()
+ @b()
+ static test() {
+ console.log("C.test() called");
+ }
+}
+
+C.test();
diff --git a/tests/specs/run/ts_decorators/decorators/experimental/ts/main.out b/tests/specs/run/ts_decorators/decorators/experimental/ts/main.out
new file mode 100644
index 000000000..ea64fbaa6
--- /dev/null
+++ b/tests/specs/run/ts_decorators/decorators/experimental/ts/main.out
@@ -0,0 +1,3 @@
+Warning experimentalDecorators compiler option is deprecated and may be removed at any time
+Check [WILDCARD]
+SomeClass { someField: "asdf" }
diff --git a/tests/specs/run/ts_decorators/decorators/experimental/ts/main.ts b/tests/specs/run/ts_decorators/decorators/experimental/ts/main.ts
new file mode 100644
index 000000000..95fba6cd4
--- /dev/null
+++ b/tests/specs/run/ts_decorators/decorators/experimental/ts/main.ts
@@ -0,0 +1,14 @@
+// deno-lint-ignore-file
+
+function Decorate() {
+ return function (constructor: any): any {
+ return class extends constructor {
+ protected someField: string = "asdf";
+ };
+ };
+}
+
+@Decorate()
+class SomeClass {}
+
+console.log(new SomeClass());
diff --git a/tests/specs/run/ts_decorators/decorators/tc39_proposal/main.out b/tests/specs/run/ts_decorators/decorators/tc39_proposal/main.out
new file mode 100644
index 000000000..39394952e
--- /dev/null
+++ b/tests/specs/run/ts_decorators/decorators/tc39_proposal/main.out
@@ -0,0 +1,3 @@
+starting m with arguments 1
+C.m 1
+ending m
diff --git a/tests/specs/run/ts_decorators/decorators/tc39_proposal/main.ts b/tests/specs/run/ts_decorators/decorators/tc39_proposal/main.ts
new file mode 100644
index 000000000..00c8a8502
--- /dev/null
+++ b/tests/specs/run/ts_decorators/decorators/tc39_proposal/main.ts
@@ -0,0 +1,21 @@
+// deno-lint-ignore no-explicit-any
+function logged(value: any, { kind, name }: { kind: string; name: string }) {
+ if (kind === "method") {
+ return function (...args: unknown[]) {
+ console.log(`starting ${name} with arguments ${args.join(", ")}`);
+ // @ts-ignore this has implicit any type
+ const ret = value.call(this, ...args);
+ console.log(`ending ${name}`);
+ return ret;
+ };
+ }
+}
+
+class C {
+ @logged
+ m(arg: number) {
+ console.log("C.m", arg);
+ }
+}
+
+new C().m(1);
diff --git a/tests/specs/run/ts_import_from_js/005_more_imports.ts b/tests/specs/run/ts_import_from_js/005_more_imports.ts
new file mode 100644
index 000000000..c69556be1
--- /dev/null
+++ b/tests/specs/run/ts_import_from_js/005_more_imports.ts
@@ -0,0 +1,11 @@
+import { printHello3, returnsFoo2, returnsHi } from "./mod1.ts";
+
+printHello3();
+
+if (returnsHi() !== "Hi") {
+ throw Error("Unexpected");
+}
+
+if (returnsFoo2() !== "Foo") {
+ throw Error("Unexpected");
+}
diff --git a/tests/specs/run/ts_import_from_js/__test__.jsonc b/tests/specs/run/ts_import_from_js/__test__.jsonc
new file mode 100644
index 000000000..de11873cb
--- /dev/null
+++ b/tests/specs/run/ts_import_from_js/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --allow-import --quiet --reload ts_import_from_js/main.js",
+ "output": "ts_import_from_js/main.out"
+}
diff --git a/tests/specs/run/ts_import_from_js/mod1.ts b/tests/specs/run/ts_import_from_js/mod1.ts
new file mode 100644
index 000000000..5e58f432e
--- /dev/null
+++ b/tests/specs/run/ts_import_from_js/mod1.ts
@@ -0,0 +1,17 @@
+import { printHello2, returnsFoo } from "./subdir2/mod2.ts";
+
+export function returnsHi(): string {
+ return "Hi";
+}
+
+export function returnsFoo2(): string {
+ return returnsFoo();
+}
+
+export function printHello3() {
+ printHello2();
+}
+
+export function throwsError() {
+ throw Error("exception from mod1");
+}
diff --git a/tests/specs/run/ts_import_from_js/mod2.ts b/tests/specs/run/ts_import_from_js/mod2.ts
new file mode 100644
index 000000000..ce1adc0e8
--- /dev/null
+++ b/tests/specs/run/ts_import_from_js/mod2.ts
@@ -0,0 +1 @@
+export { printHello } from "./print_hello.ts";
diff --git a/tests/specs/run/ts_import_from_js/print_hello.ts b/tests/specs/run/ts_import_from_js/print_hello.ts
new file mode 100644
index 000000000..b9c0ad527
--- /dev/null
+++ b/tests/specs/run/ts_import_from_js/print_hello.ts
@@ -0,0 +1,3 @@
+export function printHello() {
+ console.log("Hello");
+}
diff --git a/tests/specs/run/ts_import_from_js/subdir2/dynamic_import.ts b/tests/specs/run/ts_import_from_js/subdir2/dynamic_import.ts
new file mode 100644
index 000000000..59beb64c3
--- /dev/null
+++ b/tests/specs/run/ts_import_from_js/subdir2/dynamic_import.ts
@@ -0,0 +1,4 @@
+(async () => {
+ const { printHello } = await import("../mod2.ts");
+ printHello();
+})();
diff --git a/tests/specs/run/ts_import_from_js/subdir2/mod2.ts b/tests/specs/run/ts_import_from_js/subdir2/mod2.ts
new file mode 100644
index 000000000..9071d0aeb
--- /dev/null
+++ b/tests/specs/run/ts_import_from_js/subdir2/mod2.ts
@@ -0,0 +1,9 @@
+import { printHello } from "../print_hello.ts";
+
+export function returnsFoo(): string {
+ return "Foo";
+}
+
+export function printHello2() {
+ printHello();
+}
diff --git a/tests/specs/run/ts_import_from_js/ts_import_from_js/deps.js b/tests/specs/run/ts_import_from_js/ts_import_from_js/deps.js
new file mode 100644
index 000000000..746b5cf6b
--- /dev/null
+++ b/tests/specs/run/ts_import_from_js/ts_import_from_js/deps.js
@@ -0,0 +1,2 @@
+import "../005_more_imports.ts";
+export { printHello } from "http://localhost:4545/subdir/mod2.ts";
diff --git a/tests/specs/run/ts_import_from_js/ts_import_from_js/main.js b/tests/specs/run/ts_import_from_js/ts_import_from_js/main.js
new file mode 100644
index 000000000..32d6c29a1
--- /dev/null
+++ b/tests/specs/run/ts_import_from_js/ts_import_from_js/main.js
@@ -0,0 +1,3 @@
+import { printHello } from "./deps.js";
+printHello();
+console.log("success");
diff --git a/tests/specs/run/ts_import_from_js/ts_import_from_js/main.out b/tests/specs/run/ts_import_from_js/ts_import_from_js/main.out
new file mode 100644
index 000000000..e1d7a869f
--- /dev/null
+++ b/tests/specs/run/ts_import_from_js/ts_import_from_js/main.out
@@ -0,0 +1,3 @@
+Hello
+Hello
+success
diff --git a/tests/specs/run/ts_type_imports/__test__.jsonc b/tests/specs/run/ts_type_imports/__test__.jsonc
new file mode 100644
index 000000000..e9a925d1a
--- /dev/null
+++ b/tests/specs/run/ts_type_imports/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run --reload --check ts_type_imports.ts",
+ "output": "ts_type_imports.ts.out",
+ "exitCode": 1
+}
diff --git a/tests/specs/run/ts_type_imports/ts_type_imports.ts b/tests/specs/run/ts_type_imports/ts_type_imports.ts
new file mode 100644
index 000000000..73c779156
--- /dev/null
+++ b/tests/specs/run/ts_type_imports/ts_type_imports.ts
@@ -0,0 +1,5 @@
+// deno-lint-ignore-file
+
+type Foo = import("./ts_type_imports_foo.ts").Foo;
+
+const foo: Foo = new Map<string, string>();
diff --git a/tests/specs/run/ts_type_imports/ts_type_imports.ts.out b/tests/specs/run/ts_type_imports/ts_type_imports.ts.out
new file mode 100644
index 000000000..3972d6a97
--- /dev/null
+++ b/tests/specs/run/ts_type_imports/ts_type_imports.ts.out
@@ -0,0 +1,6 @@
+Check [WILDCARD]ts_type_imports.ts
+error: TS2322 [ERROR]: Type 'Map<string, string>' is not assignable to type 'Foo'.
+ Type 'string' is not assignable to type 'number'.
+const foo: Foo = new Map<string, string>();
+ ~~~
+ at [WILDCARD]ts_type_imports.ts:5:7
diff --git a/tests/specs/run/ts_type_imports/ts_type_imports_foo.ts b/tests/specs/run/ts_type_imports/ts_type_imports_foo.ts
new file mode 100644
index 000000000..db20773f6
--- /dev/null
+++ b/tests/specs/run/ts_type_imports/ts_type_imports_foo.ts
@@ -0,0 +1 @@
+export type Foo = Map<string, number>;
diff --git a/tests/specs/run/ts_type_only_import/__test__.jsonc b/tests/specs/run/ts_type_only_import/__test__.jsonc
new file mode 100644
index 000000000..977a6aba7
--- /dev/null
+++ b/tests/specs/run/ts_type_only_import/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --reload --check ts_type_only_import.ts",
+ "output": "ts_type_only_import.ts.out"
+}
diff --git a/tests/specs/run/ts_type_only_import/ts_type_only_import.d.ts b/tests/specs/run/ts_type_only_import/ts_type_only_import.d.ts
new file mode 100644
index 000000000..d48e4b48a
--- /dev/null
+++ b/tests/specs/run/ts_type_only_import/ts_type_only_import.d.ts
@@ -0,0 +1,3 @@
+export interface HelloWorld {
+ a: string;
+}
diff --git a/tests/specs/run/ts_type_only_import/ts_type_only_import.ts b/tests/specs/run/ts_type_only_import/ts_type_only_import.ts
new file mode 100644
index 000000000..53e114373
--- /dev/null
+++ b/tests/specs/run/ts_type_only_import/ts_type_only_import.ts
@@ -0,0 +1 @@
+export * from "./ts_type_only_import.d.ts";
diff --git a/tests/specs/run/ts_type_only_import/ts_type_only_import.ts.out b/tests/specs/run/ts_type_only_import/ts_type_only_import.ts.out
new file mode 100644
index 000000000..42852cd26
--- /dev/null
+++ b/tests/specs/run/ts_type_only_import/ts_type_only_import.ts.out
@@ -0,0 +1 @@
+Check file://[WILDCARD]/ts_type_only_import.ts
diff --git a/tests/specs/run/ts_without_extension/__test__.jsonc b/tests/specs/run/ts_without_extension/__test__.jsonc
new file mode 100644
index 000000000..a6c713bf5
--- /dev/null
+++ b/tests/specs/run/ts_without_extension/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run --ext ts --check ts_without_extension",
+ "output": "ts_without_extension.out",
+ "exitCode": 0
+}
diff --git a/tests/specs/run/ts_without_extension/ts_without_extension b/tests/specs/run/ts_without_extension/ts_without_extension
new file mode 100644
index 000000000..f10891d7a
--- /dev/null
+++ b/tests/specs/run/ts_without_extension/ts_without_extension
@@ -0,0 +1,3 @@
+interface Lollipop {}
+
+console.log("executing typescript with no extension");
diff --git a/tests/specs/run/ts_without_extension/ts_without_extension.out b/tests/specs/run/ts_without_extension/ts_without_extension.out
new file mode 100644
index 000000000..4f02dd4c3
--- /dev/null
+++ b/tests/specs/run/ts_without_extension/ts_without_extension.out
@@ -0,0 +1,2 @@
+Check [WILDCARD]/ts_without_extension
+executing typescript with no extension
diff --git a/tests/specs/run/tsx_imports/046_jsx_test.tsx b/tests/specs/run/tsx_imports/046_jsx_test.tsx
new file mode 100644
index 000000000..5ed3ff2fa
--- /dev/null
+++ b/tests/specs/run/tsx_imports/046_jsx_test.tsx
@@ -0,0 +1,14 @@
+declare global {
+ export namespace JSX {
+ interface IntrinsicElements {
+ [elemName: string]: any;
+ }
+ }
+}
+const React = {
+ createElement(factory: any, props: any, ...children: any[]) {
+ return { factory, props, children };
+ },
+};
+const View = () => <div class="deno">land</div>;
+console.log(<View />);
diff --git a/tests/specs/run/tsx_imports/__test__.jsonc b/tests/specs/run/tsx_imports/__test__.jsonc
new file mode 100644
index 000000000..2026804ad
--- /dev/null
+++ b/tests/specs/run/tsx_imports/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --reload --check tsx_imports/tsx_imports.ts",
+ "output": "tsx_imports/tsx_imports.ts.out"
+}
diff --git a/tests/specs/run/tsx_imports/tsx_imports/Component.tsx b/tests/specs/run/tsx_imports/tsx_imports/Component.tsx
new file mode 100644
index 000000000..c466a28ca
--- /dev/null
+++ b/tests/specs/run/tsx_imports/tsx_imports/Component.tsx
@@ -0,0 +1 @@
+import "../046_jsx_test.tsx";
diff --git a/tests/specs/run/tsx_imports/tsx_imports/tsx_imports.ts b/tests/specs/run/tsx_imports/tsx_imports/tsx_imports.ts
new file mode 100644
index 000000000..44ba10b7a
--- /dev/null
+++ b/tests/specs/run/tsx_imports/tsx_imports/tsx_imports.ts
@@ -0,0 +1 @@
+import "./Component.tsx";
diff --git a/tests/specs/run/tsx_imports/tsx_imports/tsx_imports.ts.out b/tests/specs/run/tsx_imports/tsx_imports/tsx_imports.ts.out
new file mode 100644
index 000000000..1f8b10d32
--- /dev/null
+++ b/tests/specs/run/tsx_imports/tsx_imports/tsx_imports.ts.out
@@ -0,0 +1,2 @@
+Check [WILDCARD]tsx_imports.ts
+{ factory: [Function: View], props: null, children: [] }
diff --git a/tests/specs/run/type_definitions/__test__.jsonc b/tests/specs/run/type_definitions/__test__.jsonc
new file mode 100644
index 000000000..5030612a5
--- /dev/null
+++ b/tests/specs/run/type_definitions/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --reload type_definitions.ts",
+ "output": "type_definitions.ts.out"
+}
diff --git a/tests/specs/run/type_definitions/type_definitions.ts b/tests/specs/run/type_definitions/type_definitions.ts
new file mode 100644
index 000000000..0297c7e3d
--- /dev/null
+++ b/tests/specs/run/type_definitions/type_definitions.ts
@@ -0,0 +1,12 @@
+// deno-lint-ignore-file
+
+// @deno-types="../type_definitions/foo.d.ts"
+import { foo } from "./type_definitions/foo.js";
+// @deno-types="../type_definitions/fizz.d.ts"
+import "./type_definitions/fizz.js";
+
+import * as qat from "./type_definitions/qat.ts";
+
+console.log(foo);
+console.log(fizz);
+console.log(qat.qat);
diff --git a/tests/specs/run/type_definitions/type_definitions.ts.out b/tests/specs/run/type_definitions/type_definitions.ts.out
new file mode 100644
index 000000000..b4fa88c50
--- /dev/null
+++ b/tests/specs/run/type_definitions/type_definitions.ts.out
@@ -0,0 +1,3 @@
+[WILDCARD]foo
+fizz
+qat
diff --git a/tests/specs/run/type_definitions/type_definitions/bar.d.ts b/tests/specs/run/type_definitions/type_definitions/bar.d.ts
new file mode 100644
index 000000000..d43335dbb
--- /dev/null
+++ b/tests/specs/run/type_definitions/type_definitions/bar.d.ts
@@ -0,0 +1,7 @@
+/// <reference types="baz" />
+
+declare namespace bar {
+ export class Bar {
+ baz: string;
+ }
+}
diff --git a/tests/specs/run/type_definitions/type_definitions/bar.js b/tests/specs/run/type_definitions/type_definitions/bar.js
new file mode 100644
index 000000000..e9c2e5193
--- /dev/null
+++ b/tests/specs/run/type_definitions/type_definitions/bar.js
@@ -0,0 +1,5 @@
+export class Bar {
+ constructor() {
+ this.baz = "baz";
+ }
+}
diff --git a/tests/specs/run/type_definitions/type_definitions/fizz.d.ts b/tests/specs/run/type_definitions/type_definitions/fizz.d.ts
new file mode 100644
index 000000000..34eb41b96
--- /dev/null
+++ b/tests/specs/run/type_definitions/type_definitions/fizz.d.ts
@@ -0,0 +1,2 @@
+/** A global value. */
+declare const fizz: string;
diff --git a/tests/specs/run/type_definitions/type_definitions/fizz.js b/tests/specs/run/type_definitions/type_definitions/fizz.js
new file mode 100644
index 000000000..852162c94
--- /dev/null
+++ b/tests/specs/run/type_definitions/type_definitions/fizz.js
@@ -0,0 +1 @@
+globalThis.fizz = "fizz";
diff --git a/tests/specs/run/type_definitions/type_definitions/foo.d.ts b/tests/specs/run/type_definitions/type_definitions/foo.d.ts
new file mode 100644
index 000000000..ce39201e1
--- /dev/null
+++ b/tests/specs/run/type_definitions/type_definitions/foo.d.ts
@@ -0,0 +1,2 @@
+/** An exported value. */
+export const foo: string;
diff --git a/tests/specs/run/type_definitions/type_definitions/foo.js b/tests/specs/run/type_definitions/type_definitions/foo.js
new file mode 100644
index 000000000..61d366eb2
--- /dev/null
+++ b/tests/specs/run/type_definitions/type_definitions/foo.js
@@ -0,0 +1 @@
+export const foo = "foo";
diff --git a/tests/specs/run/type_definitions/type_definitions/qat.ts b/tests/specs/run/type_definitions/type_definitions/qat.ts
new file mode 100644
index 000000000..6196c9d38
--- /dev/null
+++ b/tests/specs/run/type_definitions/type_definitions/qat.ts
@@ -0,0 +1 @@
+export const qat = "qat";
diff --git a/tests/specs/run/type_definitions_for_export/__test__.jsonc b/tests/specs/run/type_definitions_for_export/__test__.jsonc
new file mode 100644
index 000000000..cf32bc960
--- /dev/null
+++ b/tests/specs/run/type_definitions_for_export/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run --reload --check type_definitions_for_export.ts",
+ "output": "type_definitions_for_export.ts.out",
+ "exitCode": 1
+}
diff --git a/tests/specs/run/type_definitions_for_export/export_type_def.ts b/tests/specs/run/type_definitions_for_export/export_type_def.ts
new file mode 100644
index 000000000..e33b70a64
--- /dev/null
+++ b/tests/specs/run/type_definitions_for_export/export_type_def.ts
@@ -0,0 +1,2 @@
+// @deno-types="./type_definitions/foo.d.ts"
+export { foo } from "./type_definitions/foo.js";
diff --git a/tests/specs/run/type_definitions_for_export/type_definitions/bar.d.ts b/tests/specs/run/type_definitions_for_export/type_definitions/bar.d.ts
new file mode 100644
index 000000000..d43335dbb
--- /dev/null
+++ b/tests/specs/run/type_definitions_for_export/type_definitions/bar.d.ts
@@ -0,0 +1,7 @@
+/// <reference types="baz" />
+
+declare namespace bar {
+ export class Bar {
+ baz: string;
+ }
+}
diff --git a/tests/specs/run/type_definitions_for_export/type_definitions/bar.js b/tests/specs/run/type_definitions_for_export/type_definitions/bar.js
new file mode 100644
index 000000000..e9c2e5193
--- /dev/null
+++ b/tests/specs/run/type_definitions_for_export/type_definitions/bar.js
@@ -0,0 +1,5 @@
+export class Bar {
+ constructor() {
+ this.baz = "baz";
+ }
+}
diff --git a/tests/specs/run/type_definitions_for_export/type_definitions/fizz.d.ts b/tests/specs/run/type_definitions_for_export/type_definitions/fizz.d.ts
new file mode 100644
index 000000000..34eb41b96
--- /dev/null
+++ b/tests/specs/run/type_definitions_for_export/type_definitions/fizz.d.ts
@@ -0,0 +1,2 @@
+/** A global value. */
+declare const fizz: string;
diff --git a/tests/specs/run/type_definitions_for_export/type_definitions/fizz.js b/tests/specs/run/type_definitions_for_export/type_definitions/fizz.js
new file mode 100644
index 000000000..852162c94
--- /dev/null
+++ b/tests/specs/run/type_definitions_for_export/type_definitions/fizz.js
@@ -0,0 +1 @@
+globalThis.fizz = "fizz";
diff --git a/tests/specs/run/type_definitions_for_export/type_definitions/foo.d.ts b/tests/specs/run/type_definitions_for_export/type_definitions/foo.d.ts
new file mode 100644
index 000000000..ce39201e1
--- /dev/null
+++ b/tests/specs/run/type_definitions_for_export/type_definitions/foo.d.ts
@@ -0,0 +1,2 @@
+/** An exported value. */
+export const foo: string;
diff --git a/tests/specs/run/type_definitions_for_export/type_definitions/foo.js b/tests/specs/run/type_definitions_for_export/type_definitions/foo.js
new file mode 100644
index 000000000..61d366eb2
--- /dev/null
+++ b/tests/specs/run/type_definitions_for_export/type_definitions/foo.js
@@ -0,0 +1 @@
+export const foo = "foo";
diff --git a/tests/specs/run/type_definitions_for_export/type_definitions/qat.ts b/tests/specs/run/type_definitions_for_export/type_definitions/qat.ts
new file mode 100644
index 000000000..6196c9d38
--- /dev/null
+++ b/tests/specs/run/type_definitions_for_export/type_definitions/qat.ts
@@ -0,0 +1 @@
+export const qat = "qat";
diff --git a/tests/specs/run/type_definitions_for_export/type_definitions_for_export.ts b/tests/specs/run/type_definitions_for_export/type_definitions_for_export.ts
new file mode 100644
index 000000000..1f17b4962
--- /dev/null
+++ b/tests/specs/run/type_definitions_for_export/type_definitions_for_export.ts
@@ -0,0 +1,7 @@
+import { foo } from "./export_type_def.ts";
+
+function bar(a: number) {
+ console.log(a);
+}
+
+bar(foo);
diff --git a/tests/specs/run/type_definitions_for_export/type_definitions_for_export.ts.out b/tests/specs/run/type_definitions_for_export/type_definitions_for_export.ts.out
new file mode 100644
index 000000000..8f1240bc7
--- /dev/null
+++ b/tests/specs/run/type_definitions_for_export/type_definitions_for_export.ts.out
@@ -0,0 +1,5 @@
+Check [WILDCARD]type_definitions_for_export.ts
+error: TS2345 [ERROR]: Argument of type 'string' is not assignable to parameter of type 'number'.
+bar(foo);
+ ~~~
+ at [WILDCARD]type_definitions_for_export.ts:7:5
diff --git a/tests/specs/run/type_directives_01/__test__.jsonc b/tests/specs/run/type_directives_01/__test__.jsonc
new file mode 100644
index 000000000..08826b776
--- /dev/null
+++ b/tests/specs/run/type_directives_01/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --allow-import --reload --check=all -L debug type_directives_01.ts",
+ "output": "type_directives_01.ts.out"
+}
diff --git a/tests/specs/run/type_directives_01/type_directives_01.ts b/tests/specs/run/type_directives_01/type_directives_01.ts
new file mode 100644
index 000000000..2129d90b4
--- /dev/null
+++ b/tests/specs/run/type_directives_01/type_directives_01.ts
@@ -0,0 +1,3 @@
+import * as foo from "http://localhost:4545/xTypeScriptTypes.js";
+
+console.log(foo.foo);
diff --git a/tests/specs/run/type_directives_01/type_directives_01.ts.out b/tests/specs/run/type_directives_01/type_directives_01.ts.out
new file mode 100644
index 000000000..466218a96
--- /dev/null
+++ b/tests/specs/run/type_directives_01/type_directives_01.ts.out
@@ -0,0 +1,3 @@
+[WILDCARD]
+DEBUG TS - host.getSourceFile("http://localhost:4545/xTypeScriptTypes.d.ts", Latest)
+[WILDCARD] \ No newline at end of file
diff --git a/tests/specs/run/type_directives_02/__test__.jsonc b/tests/specs/run/type_directives_02/__test__.jsonc
new file mode 100644
index 000000000..e731e393e
--- /dev/null
+++ b/tests/specs/run/type_directives_02/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --allow-import --reload --check=all -L debug type_directives_02.ts",
+ "output": "type_directives_02.ts.out"
+}
diff --git a/tests/specs/run/type_directives_02/type_directives_02.ts b/tests/specs/run/type_directives_02/type_directives_02.ts
new file mode 100644
index 000000000..f829c0cec
--- /dev/null
+++ b/tests/specs/run/type_directives_02/type_directives_02.ts
@@ -0,0 +1,3 @@
+import * as foo from "./type_reference.js";
+
+console.log(foo.foo);
diff --git a/tests/specs/run/type_directives_02/type_directives_02.ts.out b/tests/specs/run/type_directives_02/type_directives_02.ts.out
new file mode 100644
index 000000000..d9bd38150
--- /dev/null
+++ b/tests/specs/run/type_directives_02/type_directives_02.ts.out
@@ -0,0 +1,3 @@
+[WILDCARD]
+DEBUG TS - host.getSourceFile("file:///[WILDCARD]/type_reference.d.ts", Latest)
+[WILDCARD] \ No newline at end of file
diff --git a/tests/specs/run/type_directives_02/type_reference.d.ts b/tests/specs/run/type_directives_02/type_reference.d.ts
new file mode 100644
index 000000000..f9b8de5ed
--- /dev/null
+++ b/tests/specs/run/type_directives_02/type_reference.d.ts
@@ -0,0 +1 @@
+export const foo: "foo";
diff --git a/tests/specs/run/type_directives_02/type_reference.js b/tests/specs/run/type_directives_02/type_reference.js
new file mode 100644
index 000000000..917d89198
--- /dev/null
+++ b/tests/specs/run/type_directives_02/type_reference.js
@@ -0,0 +1,3 @@
+/// <reference types="./type_reference.d.ts" />
+
+export const foo = "foo";
diff --git a/tests/specs/run/type_headers_deno_types/__test__.jsonc b/tests/specs/run/type_headers_deno_types/__test__.jsonc
new file mode 100644
index 000000000..1a95fa2d4
--- /dev/null
+++ b/tests/specs/run/type_headers_deno_types/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --allow-import --reload --check type_headers_deno_types.ts",
+ "output": "type_headers_deno_types.ts.out"
+}
diff --git a/tests/specs/run/type_headers_deno_types/type_headers_deno_types.ts b/tests/specs/run/type_headers_deno_types/type_headers_deno_types.ts
new file mode 100644
index 000000000..197ac1801
--- /dev/null
+++ b/tests/specs/run/type_headers_deno_types/type_headers_deno_types.ts
@@ -0,0 +1,18 @@
+/**
+ * Following import uses two distinct ways to provide types:
+ * - X-TypeScript-Types headers
+ * - @deno-types directive
+ *
+ * Because "@deno-types" directive must be placed by user explicitly it
+ * should have higher precedence than type header.
+ *
+ * This is verified by providing conflicting type declaration
+ * depending on a way. There should be no TS error, otherwise
+ * it means that wrong type declarations are used (from X-TypeScript-Types)
+ * header.
+ */
+
+// @deno-types="http://localhost:4545/run/type_headers_deno_types.foo.d.ts"
+import { foo } from "http://localhost:4545/run/type_headers_deno_types.foo.js";
+
+foo("hello");
diff --git a/tests/specs/run/type_headers_deno_types/type_headers_deno_types.ts.out b/tests/specs/run/type_headers_deno_types/type_headers_deno_types.ts.out
new file mode 100644
index 000000000..798f98311
--- /dev/null
+++ b/tests/specs/run/type_headers_deno_types/type_headers_deno_types.ts.out
@@ -0,0 +1,5 @@
+Download http://[WILDCARD]:4545/run/type_headers_deno_types.foo.js
+Download http://[WILDCARD]:4545/run/type_headers_deno_types.foo.d.ts
+Download http://[WILDCARD]:4545/run/type_headers_deno_types.d.ts
+Check [WILDCARD]/type_headers_deno_types.ts
+hello
diff --git a/tests/specs/run/unbuffered_stderr/__test__.jsonc b/tests/specs/run/unbuffered_stderr/__test__.jsonc
new file mode 100644
index 000000000..4b8a091f2
--- /dev/null
+++ b/tests/specs/run/unbuffered_stderr/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --reload unbuffered_stderr.ts",
+ "output": "unbuffered_stderr.ts.out"
+}
diff --git a/tests/specs/run/unbuffered_stderr/unbuffered_stderr.ts b/tests/specs/run/unbuffered_stderr/unbuffered_stderr.ts
new file mode 100644
index 000000000..0f1d2a999
--- /dev/null
+++ b/tests/specs/run/unbuffered_stderr/unbuffered_stderr.ts
@@ -0,0 +1 @@
+Deno.stderr.write(new TextEncoder().encode("x"));
diff --git a/tests/specs/run/unbuffered_stderr/unbuffered_stderr.ts.out b/tests/specs/run/unbuffered_stderr/unbuffered_stderr.ts.out
new file mode 100644
index 000000000..c1b0730e0
--- /dev/null
+++ b/tests/specs/run/unbuffered_stderr/unbuffered_stderr.ts.out
@@ -0,0 +1 @@
+x \ No newline at end of file
diff --git a/tests/specs/run/unbuffered_stdout/__test__.jsonc b/tests/specs/run/unbuffered_stdout/__test__.jsonc
new file mode 100644
index 000000000..4225e9d0a
--- /dev/null
+++ b/tests/specs/run/unbuffered_stdout/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --quiet --reload unbuffered_stdout.ts",
+ "output": "unbuffered_stdout.ts.out"
+}
diff --git a/tests/specs/run/unbuffered_stdout/unbuffered_stdout.ts b/tests/specs/run/unbuffered_stdout/unbuffered_stdout.ts
new file mode 100644
index 000000000..9f1e07a97
--- /dev/null
+++ b/tests/specs/run/unbuffered_stdout/unbuffered_stdout.ts
@@ -0,0 +1 @@
+Deno.stdout.write(new TextEncoder().encode("a"));
diff --git a/tests/specs/run/unbuffered_stdout/unbuffered_stdout.ts.out b/tests/specs/run/unbuffered_stdout/unbuffered_stdout.ts.out
new file mode 100644
index 000000000..2e65efe2a
--- /dev/null
+++ b/tests/specs/run/unbuffered_stdout/unbuffered_stdout.ts.out
@@ -0,0 +1 @@
+a \ No newline at end of file
diff --git a/tests/specs/run/unhandled_rejection/__test__.jsonc b/tests/specs/run/unhandled_rejection/__test__.jsonc
new file mode 100644
index 000000000..3a2229206
--- /dev/null
+++ b/tests/specs/run/unhandled_rejection/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --check unhandled_rejection.ts",
+ "output": "unhandled_rejection.ts.out"
+}
diff --git a/tests/specs/run/unhandled_rejection/unhandled_rejection.ts b/tests/specs/run/unhandled_rejection/unhandled_rejection.ts
new file mode 100644
index 000000000..388583434
--- /dev/null
+++ b/tests/specs/run/unhandled_rejection/unhandled_rejection.ts
@@ -0,0 +1,13 @@
+globalThis.addEventListener("unhandledrejection", (e) => {
+ console.log("unhandled rejection at:", e.promise, "reason:", e.reason);
+ e.preventDefault();
+});
+
+class Foo {
+ constructor() {
+ Promise.reject(new Error("bar not available"));
+ }
+}
+
+new Foo();
+Promise.reject();
diff --git a/tests/specs/run/unhandled_rejection/unhandled_rejection.ts.out b/tests/specs/run/unhandled_rejection/unhandled_rejection.ts.out
new file mode 100644
index 000000000..fc5a3915f
--- /dev/null
+++ b/tests/specs/run/unhandled_rejection/unhandled_rejection.ts.out
@@ -0,0 +1,9 @@
+[WILDCARD]
+unhandled rejection at: Promise {
+ <rejected> Error: bar not available
+ at new Foo (file:///[WILDCARD]/unhandled_rejection.ts:8:20)
+ at file:///[WILDCARD]/unhandled_rejection.ts:12:1
+} reason: Error: bar not available
+ at new Foo (file:///[WILDCARD]/unhandled_rejection.ts:8:20)
+ at file:///[WILDCARD]/unhandled_rejection.ts:12:1
+unhandled rejection at: Promise { <rejected> undefined } reason: undefined
diff --git a/tests/specs/run/unhandled_rejection_dynamic_import/__test__.jsonc b/tests/specs/run/unhandled_rejection_dynamic_import/__test__.jsonc
new file mode 100644
index 000000000..6ca0d093b
--- /dev/null
+++ b/tests/specs/run/unhandled_rejection_dynamic_import/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run --allow-read unhandled_rejection_dynamic_import/main.ts",
+ "output": "unhandled_rejection_dynamic_import/main.ts.out",
+ "exitCode": 1
+}
diff --git a/tests/specs/run/unhandled_rejection_dynamic_import/unhandled_rejection_dynamic_import/import.ts b/tests/specs/run/unhandled_rejection_dynamic_import/unhandled_rejection_dynamic_import/import.ts
new file mode 100644
index 000000000..b490f2c20
--- /dev/null
+++ b/tests/specs/run/unhandled_rejection_dynamic_import/unhandled_rejection_dynamic_import/import.ts
@@ -0,0 +1,5 @@
+globalThis.addEventListener("unhandledrejection", () => {
+ console.log("hey");
+});
+console.log("---");
+Promise.reject();
diff --git a/tests/specs/run/unhandled_rejection_dynamic_import/unhandled_rejection_dynamic_import/main.ts b/tests/specs/run/unhandled_rejection_dynamic_import/unhandled_rejection_dynamic_import/main.ts
new file mode 100644
index 000000000..244d84467
--- /dev/null
+++ b/tests/specs/run/unhandled_rejection_dynamic_import/unhandled_rejection_dynamic_import/main.ts
@@ -0,0 +1 @@
+await import("./import.ts");
diff --git a/tests/specs/run/unhandled_rejection_dynamic_import/unhandled_rejection_dynamic_import/main.ts.out b/tests/specs/run/unhandled_rejection_dynamic_import/unhandled_rejection_dynamic_import/main.ts.out
new file mode 100644
index 000000000..f44c6d2ff
--- /dev/null
+++ b/tests/specs/run/unhandled_rejection_dynamic_import/unhandled_rejection_dynamic_import/main.ts.out
@@ -0,0 +1,3 @@
+---
+hey
+error: Uncaught (in promise) undefined
diff --git a/tests/specs/run/unhandled_rejection_dynamic_import2/__test__.jsonc b/tests/specs/run/unhandled_rejection_dynamic_import2/__test__.jsonc
new file mode 100644
index 000000000..a4e588f46
--- /dev/null
+++ b/tests/specs/run/unhandled_rejection_dynamic_import2/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --allow-read unhandled_rejection_dynamic_import2/main.ts",
+ "output": "unhandled_rejection_dynamic_import2/main.ts.out"
+}
diff --git a/tests/specs/run/unhandled_rejection_dynamic_import2/unhandled_rejection_dynamic_import2/import.ts b/tests/specs/run/unhandled_rejection_dynamic_import2/unhandled_rejection_dynamic_import2/import.ts
new file mode 100644
index 000000000..f84297afd
--- /dev/null
+++ b/tests/specs/run/unhandled_rejection_dynamic_import2/unhandled_rejection_dynamic_import2/import.ts
@@ -0,0 +1,3 @@
+export default {
+ a: "a",
+};
diff --git a/tests/specs/run/unhandled_rejection_dynamic_import2/unhandled_rejection_dynamic_import2/main.ts b/tests/specs/run/unhandled_rejection_dynamic_import2/unhandled_rejection_dynamic_import2/main.ts
new file mode 100644
index 000000000..3da2e1d19
--- /dev/null
+++ b/tests/specs/run/unhandled_rejection_dynamic_import2/unhandled_rejection_dynamic_import2/main.ts
@@ -0,0 +1,21 @@
+globalThis.addEventListener("unhandledrejection", (e) => {
+ console.log("unhandled rejection", e.reason);
+ e.preventDefault();
+});
+
+const dummyImport = (await import("./import.ts")).default;
+
+let a = new Promise((resolve, reject) => {
+ throw "errA";
+});
+
+let i = 0;
+while (true) {
+ await new Promise((resolve) => setTimeout(resolve, 100));
+ i++;
+ console.log("running...");
+
+ if (i > 3) {
+ break;
+ }
+}
diff --git a/tests/specs/run/unhandled_rejection_dynamic_import2/unhandled_rejection_dynamic_import2/main.ts.out b/tests/specs/run/unhandled_rejection_dynamic_import2/unhandled_rejection_dynamic_import2/main.ts.out
new file mode 100644
index 000000000..0a913a4b5
--- /dev/null
+++ b/tests/specs/run/unhandled_rejection_dynamic_import2/unhandled_rejection_dynamic_import2/main.ts.out
@@ -0,0 +1,5 @@
+unhandled rejection errA
+running...
+running...
+running...
+running...
diff --git a/tests/specs/run/unhandled_rejection_sync_error/__test__.jsonc b/tests/specs/run/unhandled_rejection_sync_error/__test__.jsonc
new file mode 100644
index 000000000..3f09f9c36
--- /dev/null
+++ b/tests/specs/run/unhandled_rejection_sync_error/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --check unhandled_rejection_sync_error.ts",
+ "output": "unhandled_rejection_sync_error.ts.out"
+}
diff --git a/tests/specs/run/unhandled_rejection_sync_error/unhandled_rejection_sync_error.ts b/tests/specs/run/unhandled_rejection_sync_error/unhandled_rejection_sync_error.ts
new file mode 100644
index 000000000..0dabb1cb7
--- /dev/null
+++ b/tests/specs/run/unhandled_rejection_sync_error/unhandled_rejection_sync_error.ts
@@ -0,0 +1,6 @@
+globalThis.addEventListener("unhandledrejection", (e) => {
+ console.log("unhandled rejection at:", e.promise, "reason:", e.reason);
+ e.preventDefault();
+});
+
+throw new Error("boom!");
diff --git a/tests/specs/run/unhandled_rejection_sync_error/unhandled_rejection_sync_error.ts.out b/tests/specs/run/unhandled_rejection_sync_error/unhandled_rejection_sync_error.ts.out
new file mode 100644
index 000000000..0c1115ef2
--- /dev/null
+++ b/tests/specs/run/unhandled_rejection_sync_error/unhandled_rejection_sync_error.ts.out
@@ -0,0 +1,6 @@
+[WILDCARD]
+unhandled rejection at: Promise {
+ <rejected> Error: boom!
+ at file:///[WILDCARD]unhandled_rejection_sync_error.ts:6:7
+} reason: Error: boom!
+ at file:///[WILDCARD]unhandled_rejection_sync_error.ts:6:7
diff --git a/tests/specs/run/unsafe_proto/__test__.jsonc b/tests/specs/run/unsafe_proto/__test__.jsonc
new file mode 100644
index 000000000..d1c608b51
--- /dev/null
+++ b/tests/specs/run/unsafe_proto/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run -A unsafe_proto/main.js",
+ "output": "unsafe_proto/main.out",
+ "exitCode": 0
+}
diff --git a/tests/specs/run/unsafe_proto/unsafe_proto/main.js b/tests/specs/run/unsafe_proto/unsafe_proto/main.js
new file mode 100644
index 000000000..eb95c55a0
--- /dev/null
+++ b/tests/specs/run/unsafe_proto/unsafe_proto/main.js
@@ -0,0 +1,5 @@
+console.log(Object.hasOwn(Object.prototype, "__proto__"));
+
+new Worker(import.meta.resolve("./worker.js"), {
+ type: "module",
+});
diff --git a/tests/specs/run/unsafe_proto/unsafe_proto/main.out b/tests/specs/run/unsafe_proto/unsafe_proto/main.out
new file mode 100644
index 000000000..4b095fd0f
--- /dev/null
+++ b/tests/specs/run/unsafe_proto/unsafe_proto/main.out
@@ -0,0 +1,2 @@
+false
+false
diff --git a/tests/specs/run/unsafe_proto/unsafe_proto/main_with_unsafe_proto_flag.out b/tests/specs/run/unsafe_proto/unsafe_proto/main_with_unsafe_proto_flag.out
new file mode 100644
index 000000000..bb101b641
--- /dev/null
+++ b/tests/specs/run/unsafe_proto/unsafe_proto/main_with_unsafe_proto_flag.out
@@ -0,0 +1,2 @@
+true
+true
diff --git a/tests/specs/run/unsafe_proto/unsafe_proto/worker.js b/tests/specs/run/unsafe_proto/unsafe_proto/worker.js
new file mode 100644
index 000000000..b22bc8713
--- /dev/null
+++ b/tests/specs/run/unsafe_proto/unsafe_proto/worker.js
@@ -0,0 +1,2 @@
+console.log(Object.hasOwn(Object.prototype, "__proto__"));
+close();
diff --git a/tests/specs/run/unsafe_proto_flag/__test__.jsonc b/tests/specs/run/unsafe_proto_flag/__test__.jsonc
new file mode 100644
index 000000000..8bd2b56ff
--- /dev/null
+++ b/tests/specs/run/unsafe_proto_flag/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run -A --unstable-unsafe-proto unsafe_proto/main.js",
+ "output": "unsafe_proto/main_with_unsafe_proto_flag.out",
+ "exitCode": 0
+}
diff --git a/tests/specs/run/unsafe_proto_flag/unsafe_proto/main.js b/tests/specs/run/unsafe_proto_flag/unsafe_proto/main.js
new file mode 100644
index 000000000..eb95c55a0
--- /dev/null
+++ b/tests/specs/run/unsafe_proto_flag/unsafe_proto/main.js
@@ -0,0 +1,5 @@
+console.log(Object.hasOwn(Object.prototype, "__proto__"));
+
+new Worker(import.meta.resolve("./worker.js"), {
+ type: "module",
+});
diff --git a/tests/specs/run/unsafe_proto_flag/unsafe_proto/main.out b/tests/specs/run/unsafe_proto_flag/unsafe_proto/main.out
new file mode 100644
index 000000000..4b095fd0f
--- /dev/null
+++ b/tests/specs/run/unsafe_proto_flag/unsafe_proto/main.out
@@ -0,0 +1,2 @@
+false
+false
diff --git a/tests/specs/run/unsafe_proto_flag/unsafe_proto/main_with_unsafe_proto_flag.out b/tests/specs/run/unsafe_proto_flag/unsafe_proto/main_with_unsafe_proto_flag.out
new file mode 100644
index 000000000..bb101b641
--- /dev/null
+++ b/tests/specs/run/unsafe_proto_flag/unsafe_proto/main_with_unsafe_proto_flag.out
@@ -0,0 +1,2 @@
+true
+true
diff --git a/tests/specs/run/unsafe_proto_flag/unsafe_proto/worker.js b/tests/specs/run/unsafe_proto_flag/unsafe_proto/worker.js
new file mode 100644
index 000000000..b22bc8713
--- /dev/null
+++ b/tests/specs/run/unsafe_proto_flag/unsafe_proto/worker.js
@@ -0,0 +1,2 @@
+console.log(Object.hasOwn(Object.prototype, "__proto__"));
+close();
diff --git a/tests/specs/run/unstable_broadcast_channel_disabled/__test__.jsonc b/tests/specs/run/unstable_broadcast_channel_disabled/__test__.jsonc
new file mode 100644
index 000000000..fa12c9f91
--- /dev/null
+++ b/tests/specs/run/unstable_broadcast_channel_disabled/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --quiet --reload --allow-read unstable_broadcast_channel.js",
+ "output": "unstable_broadcast_channel.disabled.out"
+}
diff --git a/tests/specs/run/unstable_broadcast_channel_disabled/unstable_broadcast_channel.disabled.out b/tests/specs/run/unstable_broadcast_channel_disabled/unstable_broadcast_channel.disabled.out
new file mode 100644
index 000000000..775866352
--- /dev/null
+++ b/tests/specs/run/unstable_broadcast_channel_disabled/unstable_broadcast_channel.disabled.out
@@ -0,0 +1,2 @@
+main undefined
+worker undefined
diff --git a/tests/specs/run/unstable_broadcast_channel_disabled/unstable_broadcast_channel.js b/tests/specs/run/unstable_broadcast_channel_disabled/unstable_broadcast_channel.js
new file mode 100644
index 000000000..b8576aa22
--- /dev/null
+++ b/tests/specs/run/unstable_broadcast_channel_disabled/unstable_broadcast_channel.js
@@ -0,0 +1,10 @@
+const scope = import.meta.url.slice(-7) === "#worker" ? "worker" : "main";
+
+console.log(scope, globalThis.BroadcastChannel);
+
+if (scope === "worker") {
+ postMessage("done");
+} else {
+ const worker = new Worker(`${import.meta.url}#worker`, { type: "module" });
+ worker.onmessage = () => Deno.exit(0);
+}
diff --git a/tests/specs/run/unstable_broadcast_channel_enabled/__test__.jsonc b/tests/specs/run/unstable_broadcast_channel_enabled/__test__.jsonc
new file mode 100644
index 000000000..f93c7785a
--- /dev/null
+++ b/tests/specs/run/unstable_broadcast_channel_enabled/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --quiet --reload --allow-read --unstable-broadcast-channel unstable_broadcast_channel.js",
+ "output": "unstable_broadcast_channel.enabled.out"
+}
diff --git a/tests/specs/run/unstable_broadcast_channel_enabled/unstable_broadcast_channel.enabled.out b/tests/specs/run/unstable_broadcast_channel_enabled/unstable_broadcast_channel.enabled.out
new file mode 100644
index 000000000..b3701ce44
--- /dev/null
+++ b/tests/specs/run/unstable_broadcast_channel_enabled/unstable_broadcast_channel.enabled.out
@@ -0,0 +1,2 @@
+main [class BroadcastChannel extends EventTarget]
+worker [class BroadcastChannel extends EventTarget]
diff --git a/tests/specs/run/unstable_broadcast_channel_enabled/unstable_broadcast_channel.js b/tests/specs/run/unstable_broadcast_channel_enabled/unstable_broadcast_channel.js
new file mode 100644
index 000000000..b8576aa22
--- /dev/null
+++ b/tests/specs/run/unstable_broadcast_channel_enabled/unstable_broadcast_channel.js
@@ -0,0 +1,10 @@
+const scope = import.meta.url.slice(-7) === "#worker" ? "worker" : "main";
+
+console.log(scope, globalThis.BroadcastChannel);
+
+if (scope === "worker") {
+ postMessage("done");
+} else {
+ const worker = new Worker(`${import.meta.url}#worker`, { type: "module" });
+ worker.onmessage = () => Deno.exit(0);
+}
diff --git a/tests/specs/run/unstable_cron_disabled/__test__.jsonc b/tests/specs/run/unstable_cron_disabled/__test__.jsonc
new file mode 100644
index 000000000..be89db40b
--- /dev/null
+++ b/tests/specs/run/unstable_cron_disabled/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --quiet --reload --allow-read unstable_cron.js",
+ "output": "unstable_cron.disabled.out"
+}
diff --git a/tests/specs/run/unstable_cron_disabled/unstable_cron.disabled.out b/tests/specs/run/unstable_cron_disabled/unstable_cron.disabled.out
new file mode 100644
index 000000000..775866352
--- /dev/null
+++ b/tests/specs/run/unstable_cron_disabled/unstable_cron.disabled.out
@@ -0,0 +1,2 @@
+main undefined
+worker undefined
diff --git a/tests/specs/run/unstable_cron_disabled/unstable_cron.js b/tests/specs/run/unstable_cron_disabled/unstable_cron.js
new file mode 100644
index 000000000..3114f6e55
--- /dev/null
+++ b/tests/specs/run/unstable_cron_disabled/unstable_cron.js
@@ -0,0 +1,10 @@
+const scope = import.meta.url.slice(-7) === "#worker" ? "worker" : "main";
+
+console.log(scope, Deno.cron);
+
+if (scope === "worker") {
+ postMessage("done");
+} else {
+ const worker = new Worker(`${import.meta.url}#worker`, { type: "module" });
+ worker.onmessage = () => Deno.exit(0);
+}
diff --git a/tests/specs/run/unstable_cron_enabled/__test__.jsonc b/tests/specs/run/unstable_cron_enabled/__test__.jsonc
new file mode 100644
index 000000000..07a37e3fe
--- /dev/null
+++ b/tests/specs/run/unstable_cron_enabled/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --quiet --reload --allow-read --unstable-cron unstable_cron.js",
+ "output": "unstable_cron.enabled.out"
+}
diff --git a/tests/specs/run/unstable_cron_enabled/unstable_cron.enabled.out b/tests/specs/run/unstable_cron_enabled/unstable_cron.enabled.out
new file mode 100644
index 000000000..d18304f1f
--- /dev/null
+++ b/tests/specs/run/unstable_cron_enabled/unstable_cron.enabled.out
@@ -0,0 +1,2 @@
+main [Function: cron]
+worker [Function: cron]
diff --git a/tests/specs/run/unstable_cron_enabled/unstable_cron.js b/tests/specs/run/unstable_cron_enabled/unstable_cron.js
new file mode 100644
index 000000000..3114f6e55
--- /dev/null
+++ b/tests/specs/run/unstable_cron_enabled/unstable_cron.js
@@ -0,0 +1,10 @@
+const scope = import.meta.url.slice(-7) === "#worker" ? "worker" : "main";
+
+console.log(scope, Deno.cron);
+
+if (scope === "worker") {
+ postMessage("done");
+} else {
+ const worker = new Worker(`${import.meta.url}#worker`, { type: "module" });
+ worker.onmessage = () => Deno.exit(0);
+}
diff --git a/tests/specs/run/unstable_kv_disabled/__test__.jsonc b/tests/specs/run/unstable_kv_disabled/__test__.jsonc
new file mode 100644
index 000000000..6521c180d
--- /dev/null
+++ b/tests/specs/run/unstable_kv_disabled/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --quiet --reload --allow-read unstable_kv.js",
+ "output": "unstable_kv.disabled.out"
+}
diff --git a/tests/specs/run/unstable_kv_disabled/unstable_kv.disabled.out b/tests/specs/run/unstable_kv_disabled/unstable_kv.disabled.out
new file mode 100644
index 000000000..0d8ac4410
--- /dev/null
+++ b/tests/specs/run/unstable_kv_disabled/unstable_kv.disabled.out
@@ -0,0 +1,10 @@
+main undefined
+main undefined
+main undefined
+main undefined
+main undefined
+worker undefined
+worker undefined
+worker undefined
+worker undefined
+worker undefined
diff --git a/tests/specs/run/unstable_kv_disabled/unstable_kv.js b/tests/specs/run/unstable_kv_disabled/unstable_kv.js
new file mode 100644
index 000000000..17c0e05aa
--- /dev/null
+++ b/tests/specs/run/unstable_kv_disabled/unstable_kv.js
@@ -0,0 +1,14 @@
+const scope = import.meta.url.slice(-7) === "#worker" ? "worker" : "main";
+
+console.log(scope, Deno.AtomicOperation);
+console.log(scope, Deno.Kv);
+console.log(scope, Deno.KvListIterator);
+console.log(scope, Deno.KvU64);
+console.log(scope, Deno.openKv);
+
+if (scope === "worker") {
+ postMessage("done");
+} else {
+ const worker = new Worker(`${import.meta.url}#worker`, { type: "module" });
+ worker.onmessage = () => Deno.exit(0);
+}
diff --git a/tests/specs/run/unstable_kv_enabled/__test__.jsonc b/tests/specs/run/unstable_kv_enabled/__test__.jsonc
new file mode 100644
index 000000000..6e9fea100
--- /dev/null
+++ b/tests/specs/run/unstable_kv_enabled/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --quiet --reload --allow-read --unstable-kv unstable_kv.js",
+ "output": "unstable_kv.enabled.out"
+}
diff --git a/tests/specs/run/unstable_kv_enabled/unstable_kv.enabled.out b/tests/specs/run/unstable_kv_enabled/unstable_kv.enabled.out
new file mode 100644
index 000000000..a1356cefc
--- /dev/null
+++ b/tests/specs/run/unstable_kv_enabled/unstable_kv.enabled.out
@@ -0,0 +1,10 @@
+main [class AtomicOperation]
+main [class Kv]
+main [class KvListIterator extends Object]
+main [class KvU64]
+main [AsyncFunction: openKv]
+worker [class AtomicOperation]
+worker [class Kv]
+worker [class KvListIterator extends Object]
+worker [class KvU64]
+worker [AsyncFunction: openKv]
diff --git a/tests/specs/run/unstable_kv_enabled/unstable_kv.js b/tests/specs/run/unstable_kv_enabled/unstable_kv.js
new file mode 100644
index 000000000..17c0e05aa
--- /dev/null
+++ b/tests/specs/run/unstable_kv_enabled/unstable_kv.js
@@ -0,0 +1,14 @@
+const scope = import.meta.url.slice(-7) === "#worker" ? "worker" : "main";
+
+console.log(scope, Deno.AtomicOperation);
+console.log(scope, Deno.Kv);
+console.log(scope, Deno.KvListIterator);
+console.log(scope, Deno.KvU64);
+console.log(scope, Deno.openKv);
+
+if (scope === "worker") {
+ postMessage("done");
+} else {
+ const worker = new Worker(`${import.meta.url}#worker`, { type: "module" });
+ worker.onmessage = () => Deno.exit(0);
+}
diff --git a/tests/specs/run/unstable_net_disabled/__test__.jsonc b/tests/specs/run/unstable_net_disabled/__test__.jsonc
new file mode 100644
index 000000000..6bccb2ef6
--- /dev/null
+++ b/tests/specs/run/unstable_net_disabled/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --quiet --reload --allow-read unstable_net.js",
+ "output": "unstable_net.disabled.out"
+}
diff --git a/tests/specs/run/unstable_net_disabled/unstable_net.disabled.out b/tests/specs/run/unstable_net_disabled/unstable_net.disabled.out
new file mode 100644
index 000000000..3562f72fd
--- /dev/null
+++ b/tests/specs/run/unstable_net_disabled/unstable_net.disabled.out
@@ -0,0 +1,4 @@
+main undefined
+main undefined
+worker undefined
+worker undefined
diff --git a/tests/specs/run/unstable_net_disabled/unstable_net.js b/tests/specs/run/unstable_net_disabled/unstable_net.js
new file mode 100644
index 000000000..4492b202b
--- /dev/null
+++ b/tests/specs/run/unstable_net_disabled/unstable_net.js
@@ -0,0 +1,11 @@
+const scope = import.meta.url.slice(-7) === "#worker" ? "worker" : "main";
+
+console.log(scope, Deno.listenDatagram);
+console.log(scope, globalThis.WebSocketStream);
+
+if (scope === "worker") {
+ postMessage("done");
+} else {
+ const worker = new Worker(`${import.meta.url}#worker`, { type: "module" });
+ worker.onmessage = () => Deno.exit(0);
+}
diff --git a/tests/specs/run/unstable_net_enabled/__test__.jsonc b/tests/specs/run/unstable_net_enabled/__test__.jsonc
new file mode 100644
index 000000000..8e9696f44
--- /dev/null
+++ b/tests/specs/run/unstable_net_enabled/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --quiet --reload --allow-read --unstable-net unstable_net.js",
+ "output": "unstable_net.enabled.out"
+}
diff --git a/tests/specs/run/unstable_net_enabled/unstable_net.enabled.out b/tests/specs/run/unstable_net_enabled/unstable_net.enabled.out
new file mode 100644
index 000000000..8b86637f3
--- /dev/null
+++ b/tests/specs/run/unstable_net_enabled/unstable_net.enabled.out
@@ -0,0 +1,4 @@
+main [Function: listenDatagram]
+main [class WebSocketStream]
+worker [Function: listenDatagram]
+worker [class WebSocketStream]
diff --git a/tests/specs/run/unstable_net_enabled/unstable_net.js b/tests/specs/run/unstable_net_enabled/unstable_net.js
new file mode 100644
index 000000000..4492b202b
--- /dev/null
+++ b/tests/specs/run/unstable_net_enabled/unstable_net.js
@@ -0,0 +1,11 @@
+const scope = import.meta.url.slice(-7) === "#worker" ? "worker" : "main";
+
+console.log(scope, Deno.listenDatagram);
+console.log(scope, globalThis.WebSocketStream);
+
+if (scope === "worker") {
+ postMessage("done");
+} else {
+ const worker = new Worker(`${import.meta.url}#worker`, { type: "module" });
+ worker.onmessage = () => Deno.exit(0);
+}
diff --git a/tests/specs/run/unstable_worker/__test__.jsonc b/tests/specs/run/unstable_worker/__test__.jsonc
new file mode 100644
index 000000000..7a6e9bfbe
--- /dev/null
+++ b/tests/specs/run/unstable_worker/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --reload --quiet --allow-read unstable_worker.ts",
+ "output": "unstable_worker.ts.out"
+}
diff --git a/tests/specs/run/unstable_worker/unstable_worker.ts b/tests/specs/run/unstable_worker/unstable_worker.ts
new file mode 100644
index 000000000..b0554c5b2
--- /dev/null
+++ b/tests/specs/run/unstable_worker/unstable_worker.ts
@@ -0,0 +1,6 @@
+const w = new Worker(
+ import.meta.resolve("./worker_unstable.ts"),
+ { type: "module", name: "Unstable Worker" },
+);
+
+w.postMessage({});
diff --git a/tests/specs/run/unstable_worker/unstable_worker.ts.out b/tests/specs/run/unstable_worker/unstable_worker.ts.out
new file mode 100644
index 000000000..182dc58a4
--- /dev/null
+++ b/tests/specs/run/unstable_worker/unstable_worker.ts.out
@@ -0,0 +1,2 @@
+[Function: query]
+[Function: consoleSize]
diff --git a/tests/specs/run/unstable_worker/worker_unstable.ts b/tests/specs/run/unstable_worker/worker_unstable.ts
new file mode 100644
index 000000000..219f34e7b
--- /dev/null
+++ b/tests/specs/run/unstable_worker/worker_unstable.ts
@@ -0,0 +1,5 @@
+console.log(Deno.permissions.query);
+console.log(Deno.consoleSize);
+self.onmessage = () => {
+ self.close();
+};
diff --git a/tests/specs/run/unstable_worker_options_disabled/__test__.jsonc b/tests/specs/run/unstable_worker_options_disabled/__test__.jsonc
new file mode 100644
index 000000000..30087244e
--- /dev/null
+++ b/tests/specs/run/unstable_worker_options_disabled/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run --quiet --reload --allow-read unstable_worker_options.js",
+ "output": "unstable_worker_options.disabled.out",
+ "exitCode": 70
+}
diff --git a/tests/specs/run/unstable_worker_options_disabled/unstable_worker_options.disabled.out b/tests/specs/run/unstable_worker_options_disabled/unstable_worker_options.disabled.out
new file mode 100644
index 000000000..ba50ca539
--- /dev/null
+++ b/tests/specs/run/unstable_worker_options_disabled/unstable_worker_options.disabled.out
@@ -0,0 +1 @@
+Unstable API 'Worker.deno.permissions'. The `--unstable-worker-options` flag must be provided.
diff --git a/tests/specs/run/unstable_worker_options_disabled/unstable_worker_options.js b/tests/specs/run/unstable_worker_options_disabled/unstable_worker_options.js
new file mode 100644
index 000000000..213eb3ee6
--- /dev/null
+++ b/tests/specs/run/unstable_worker_options_disabled/unstable_worker_options.js
@@ -0,0 +1,19 @@
+const scope = import.meta.url.slice(-7) === "#worker" ? "worker" : "main";
+
+new Worker(`data:application/javascript;base64,${btoa(`postMessage("ok");`)}`, {
+ type: "module",
+ deno: {
+ permissions: {
+ read: true,
+ },
+ },
+}).onmessage = ({ data }) => {
+ console.log(scope, data);
+
+ if (scope === "main") {
+ const worker = new Worker(`${import.meta.url}#worker`, { type: "module" });
+ worker.onmessage = () => Deno.exit(0);
+ } else {
+ postMessage("done");
+ }
+};
diff --git a/tests/specs/run/unstable_worker_options_enabled/__test__.jsonc b/tests/specs/run/unstable_worker_options_enabled/__test__.jsonc
new file mode 100644
index 000000000..1d397c5f2
--- /dev/null
+++ b/tests/specs/run/unstable_worker_options_enabled/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --quiet --reload --allow-read --unstable-worker-options unstable_worker_options.js",
+ "output": "unstable_worker_options.enabled.out"
+}
diff --git a/tests/specs/run/unstable_worker_options_enabled/unstable_worker_options.enabled.out b/tests/specs/run/unstable_worker_options_enabled/unstable_worker_options.enabled.out
new file mode 100644
index 000000000..57a52b019
--- /dev/null
+++ b/tests/specs/run/unstable_worker_options_enabled/unstable_worker_options.enabled.out
@@ -0,0 +1,2 @@
+main ok
+worker ok
diff --git a/tests/specs/run/unstable_worker_options_enabled/unstable_worker_options.js b/tests/specs/run/unstable_worker_options_enabled/unstable_worker_options.js
new file mode 100644
index 000000000..213eb3ee6
--- /dev/null
+++ b/tests/specs/run/unstable_worker_options_enabled/unstable_worker_options.js
@@ -0,0 +1,19 @@
+const scope = import.meta.url.slice(-7) === "#worker" ? "worker" : "main";
+
+new Worker(`data:application/javascript;base64,${btoa(`postMessage("ok");`)}`, {
+ type: "module",
+ deno: {
+ permissions: {
+ read: true,
+ },
+ },
+}).onmessage = ({ data }) => {
+ console.log(scope, data);
+
+ if (scope === "main") {
+ const worker = new Worker(`${import.meta.url}#worker`, { type: "module" });
+ worker.onmessage = () => Deno.exit(0);
+ } else {
+ postMessage("done");
+ }
+};
diff --git a/tests/specs/run/unsupported_dynamic_import_scheme/__test__.jsonc b/tests/specs/run/unsupported_dynamic_import_scheme/__test__.jsonc
new file mode 100644
index 000000000..7f71dceba
--- /dev/null
+++ b/tests/specs/run/unsupported_dynamic_import_scheme/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "eval import('xxx:')",
+ "output": "unsupported_dynamic_import_scheme.out",
+ "exitCode": 1
+}
diff --git a/tests/specs/run/unsupported_dynamic_import_scheme/unsupported_dynamic_import_scheme.out b/tests/specs/run/unsupported_dynamic_import_scheme/unsupported_dynamic_import_scheme.out
new file mode 100644
index 000000000..c708fced4
--- /dev/null
+++ b/tests/specs/run/unsupported_dynamic_import_scheme/unsupported_dynamic_import_scheme.out
@@ -0,0 +1,7 @@
+error: Uncaught (in promise) TypeError: Unsupported scheme "xxx" for module "xxx:". Supported schemes: [
+ "data",
+ "blob",
+ "file",
+ "http",
+ "https",
+]
diff --git a/tests/specs/run/v8_flags_env_run/__test__.jsonc b/tests/specs/run/v8_flags_env_run/__test__.jsonc
new file mode 100644
index 000000000..39ea666b8
--- /dev/null
+++ b/tests/specs/run/v8_flags_env_run/__test__.jsonc
@@ -0,0 +1,7 @@
+{
+ "args": "run v8_flags.js",
+ "output": "v8_flags.js.out",
+ "envs": {
+ "DENO_V8_FLAGS": "--expose-gc"
+ }
+}
diff --git a/tests/specs/run/v8_flags_env_run/v8_flags.js b/tests/specs/run/v8_flags_env_run/v8_flags.js
new file mode 100644
index 000000000..f7999c4af
--- /dev/null
+++ b/tests/specs/run/v8_flags_env_run/v8_flags.js
@@ -0,0 +1 @@
+console.log(typeof gc);
diff --git a/tests/specs/run/v8_flags_env_run/v8_flags.js.out b/tests/specs/run/v8_flags_env_run/v8_flags.js.out
new file mode 100644
index 000000000..e2dbde096
--- /dev/null
+++ b/tests/specs/run/v8_flags_env_run/v8_flags.js.out
@@ -0,0 +1 @@
+function
diff --git a/tests/specs/run/v8_flags_run/__test__.jsonc b/tests/specs/run/v8_flags_run/__test__.jsonc
new file mode 100644
index 000000000..ff21fb8c5
--- /dev/null
+++ b/tests/specs/run/v8_flags_run/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --v8-flags=--expose-gc v8_flags.js",
+ "output": "v8_flags.js.out"
+}
diff --git a/tests/specs/run/v8_flags_run/v8_flags.js b/tests/specs/run/v8_flags_run/v8_flags.js
new file mode 100644
index 000000000..f7999c4af
--- /dev/null
+++ b/tests/specs/run/v8_flags_run/v8_flags.js
@@ -0,0 +1 @@
+console.log(typeof gc);
diff --git a/tests/specs/run/v8_flags_run/v8_flags.js.out b/tests/specs/run/v8_flags_run/v8_flags.js.out
new file mode 100644
index 000000000..e2dbde096
--- /dev/null
+++ b/tests/specs/run/v8_flags_run/v8_flags.js.out
@@ -0,0 +1 @@
+function
diff --git a/tests/specs/run/v8_flags_unrecognized/__test__.jsonc b/tests/specs/run/v8_flags_unrecognized/__test__.jsonc
new file mode 100644
index 000000000..93472d0d7
--- /dev/null
+++ b/tests/specs/run/v8_flags_unrecognized/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "repl --v8-flags=--foo,bar,--trace-gc,-baz",
+ "output": "v8_flags_unrecognized.out",
+ "exitCode": 1
+}
diff --git a/tests/specs/run/v8_flags_unrecognized/v8_flags_unrecognized.out b/tests/specs/run/v8_flags_unrecognized/v8_flags_unrecognized.out
new file mode 100644
index 000000000..56e70f830
--- /dev/null
+++ b/tests/specs/run/v8_flags_unrecognized/v8_flags_unrecognized.out
@@ -0,0 +1,5 @@
+error: V8 did not recognize flag '--foo'
+error: V8 did not recognize flag 'bar'
+error: V8 did not recognize flag '-baz'
+
+For a list of V8 flags, use '--v8-flags=--help'
diff --git a/tests/specs/run/v8_help/__test__.jsonc b/tests/specs/run/v8_help/__test__.jsonc
new file mode 100644
index 000000000..90cbeb274
--- /dev/null
+++ b/tests/specs/run/v8_help/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "repl --v8-flags=--help",
+ "output": "v8_help.out"
+}
diff --git a/tests/specs/run/v8_help/v8_help.out b/tests/specs/run/v8_help/v8_help.out
new file mode 100644
index 000000000..006d73557
--- /dev/null
+++ b/tests/specs/run/v8_help/v8_help.out
@@ -0,0 +1,4 @@
+[WILDCARD]
+Options:
+[WILDCARD]
+ --trace-gc [WILDCARD]
diff --git a/tests/specs/run/wasm/__test__.jsonc b/tests/specs/run/wasm/__test__.jsonc
new file mode 100644
index 000000000..a3c6f58b2
--- /dev/null
+++ b/tests/specs/run/wasm/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --quiet wasm.ts",
+ "output": "wasm.ts.out"
+}
diff --git a/tests/specs/run/wasm/wasm.ts b/tests/specs/run/wasm/wasm.ts
new file mode 100644
index 000000000..96b5fdffc
--- /dev/null
+++ b/tests/specs/run/wasm/wasm.ts
@@ -0,0 +1,16 @@
+// deno-fmt-ignore
+const wasmCode = new Uint8Array([
+ 0, 97, 115, 109, 1, 0, 0, 0, 1, 133, 128, 128, 128, 0, 1, 96, 0, 1, 127,
+ 3, 130, 128, 128, 128, 0, 1, 0, 4, 132, 128, 128, 128, 0, 1, 112, 0, 0,
+ 5, 131, 128, 128, 128, 0, 1, 0, 1, 6, 129, 128, 128, 128, 0, 0, 7, 145,
+ 128, 128, 128, 0, 2, 6, 109, 101, 109, 111, 114, 121, 2, 0, 4, 109, 97,
+ 105, 110, 0, 0, 10, 138, 128, 128, 128, 0, 1, 132, 128, 128, 128, 0, 0,
+ 65, 42, 11
+ ]);
+
+const wasmModule = new WebAssembly.Module(wasmCode);
+
+const wasmInstance = new WebAssembly.Instance(wasmModule);
+
+const main = wasmInstance.exports.main as CallableFunction;
+console.log(main().toString());
diff --git a/tests/specs/run/wasm/wasm.ts.out b/tests/specs/run/wasm/wasm.ts.out
new file mode 100644
index 000000000..d81cc0710
--- /dev/null
+++ b/tests/specs/run/wasm/wasm.ts.out
@@ -0,0 +1 @@
+42
diff --git a/tests/specs/run/wasm_async/__test__.jsonc b/tests/specs/run/wasm_async/__test__.jsonc
new file mode 100644
index 000000000..583da86e0
--- /dev/null
+++ b/tests/specs/run/wasm_async/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run wasm_async.js",
+ "output": "wasm_async.out"
+}
diff --git a/tests/specs/run/wasm_async/wasm_async.js b/tests/specs/run/wasm_async/wasm_async.js
new file mode 100644
index 000000000..837460ae9
--- /dev/null
+++ b/tests/specs/run/wasm_async/wasm_async.js
@@ -0,0 +1,27 @@
+// The following blob can be created by taking the following s-expr and pass
+// it through wat2wasm.
+// (module
+// (func $add (param $a i32) (param $b i32) (result i32)
+// local.get $a
+// local.get $b
+// i32.add)
+// (export "add" (func $add))
+// )
+// deno-fmt-ignore
+const bytes = new Uint8Array([
+ 0x00, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00, 0x01, 0x07, 0x01, 0x60,
+ 0x02, 0x7f, 0x7f, 0x01, 0x7f, 0x03, 0x02, 0x01, 0x00, 0x07, 0x07, 0x01,
+ 0x03, 0x61, 0x64, 0x64, 0x00, 0x00, 0x0a, 0x09, 0x01, 0x07, 0x00, 0x20,
+ 0x00, 0x20, 0x01, 0x6a, 0x0b
+]);
+
+async function main() {
+ const wasm = await WebAssembly.instantiate(bytes);
+ const result = wasm.instance.exports.add(1, 3);
+ console.log("1 + 3 =", result);
+ if (result != 4) {
+ throw Error("bad");
+ }
+}
+
+main();
diff --git a/tests/specs/run/wasm_async/wasm_async.out b/tests/specs/run/wasm_async/wasm_async.out
new file mode 100644
index 000000000..5cdf17de7
--- /dev/null
+++ b/tests/specs/run/wasm_async/wasm_async.out
@@ -0,0 +1 @@
+1 + 3 = 4
diff --git a/tests/specs/run/wasm_shared/__test__.jsonc b/tests/specs/run/wasm_shared/__test__.jsonc
new file mode 100644
index 000000000..1b6ececa7
--- /dev/null
+++ b/tests/specs/run/wasm_shared/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --quiet wasm_shared.ts",
+ "output": "wasm_shared.out"
+}
diff --git a/tests/specs/run/wasm_shared/wasm_shared.out b/tests/specs/run/wasm_shared/wasm_shared.out
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/tests/specs/run/wasm_shared/wasm_shared.out
diff --git a/tests/specs/run/wasm_shared/wasm_shared.ts b/tests/specs/run/wasm_shared/wasm_shared.ts
new file mode 100644
index 000000000..b713385d5
--- /dev/null
+++ b/tests/specs/run/wasm_shared/wasm_shared.ts
@@ -0,0 +1,6 @@
+const memory = new WebAssembly.Memory({
+ initial: 1,
+ maximum: 10,
+ shared: true,
+});
+console.assert(memory.buffer instanceof SharedArrayBuffer);
diff --git a/tests/specs/run/wasm_streaming_panic_test/__test__.jsonc b/tests/specs/run/wasm_streaming_panic_test/__test__.jsonc
new file mode 100644
index 000000000..e22e1f98a
--- /dev/null
+++ b/tests/specs/run/wasm_streaming_panic_test/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run wasm_streaming_panic_test.js",
+ "output": "wasm_streaming_panic_test.js.out",
+ "exitCode": 1
+}
diff --git a/tests/specs/run/wasm_streaming_panic_test/wasm_streaming_panic_test.js b/tests/specs/run/wasm_streaming_panic_test/wasm_streaming_panic_test.js
new file mode 100644
index 000000000..ec017592f
--- /dev/null
+++ b/tests/specs/run/wasm_streaming_panic_test/wasm_streaming_panic_test.js
@@ -0,0 +1,3 @@
+// https://github.com/denoland/deno/issues/13917
+
+WebAssembly.instantiateStreaming(Response.error());
diff --git a/tests/specs/run/wasm_streaming_panic_test/wasm_streaming_panic_test.js.out b/tests/specs/run/wasm_streaming_panic_test/wasm_streaming_panic_test.js.out
new file mode 100644
index 000000000..4ec523f1d
--- /dev/null
+++ b/tests/specs/run/wasm_streaming_panic_test/wasm_streaming_panic_test.js.out
@@ -0,0 +1,2 @@
+error: Uncaught (in promise) TypeError: Invalid WebAssembly content type
+ at handleWasmStreaming (ext:deno_fetch/26_fetch.js:[WILDCARD])
diff --git a/tests/specs/run/wasm_unreachable/__test__.jsonc b/tests/specs/run/wasm_unreachable/__test__.jsonc
new file mode 100644
index 000000000..cd6165629
--- /dev/null
+++ b/tests/specs/run/wasm_unreachable/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run --allow-read wasm_unreachable.js",
+ "output": "wasm_unreachable.out",
+ "exitCode": 1
+}
diff --git a/tests/specs/run/wasm_unreachable/unreachable.wasm b/tests/specs/run/wasm_unreachable/unreachable.wasm
new file mode 100644
index 000000000..a4110ee39
--- /dev/null
+++ b/tests/specs/run/wasm_unreachable/unreachable.wasm
Binary files differ
diff --git a/tests/specs/run/wasm_unreachable/wasm_unreachable.js b/tests/specs/run/wasm_unreachable/wasm_unreachable.js
new file mode 100644
index 000000000..36aab0d84
--- /dev/null
+++ b/tests/specs/run/wasm_unreachable/wasm_unreachable.js
@@ -0,0 +1,9 @@
+// WebAssembly module containing a single function with an unreachable instruction
+const binary = await Deno.readFile("./unreachable.wasm");
+
+const module = new WebAssembly.Module(binary);
+const instance = new WebAssembly.Instance(module);
+
+// Compare the stack trace with wasm_url.js, which compiles the WASM module with
+// streaming APIs.
+instance.exports.unreachable();
diff --git a/tests/specs/run/wasm_unreachable/wasm_unreachable.out b/tests/specs/run/wasm_unreachable/wasm_unreachable.out
new file mode 100644
index 000000000..c213097ab
--- /dev/null
+++ b/tests/specs/run/wasm_unreachable/wasm_unreachable.out
@@ -0,0 +1,3 @@
+error: Uncaught[WILDCARD] RuntimeError: unreachable
+ at <anonymous> (wasm://wasm/d1c677ea:1:41)
+ at [WILDCARD]/wasm_unreachable.js:[WILDCARD]
diff --git a/tests/specs/run/wasm_url/__test__.jsonc b/tests/specs/run/wasm_url/__test__.jsonc
new file mode 100644
index 000000000..a776527b1
--- /dev/null
+++ b/tests/specs/run/wasm_url/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run --quiet --allow-net=localhost:4545 wasm_url.js",
+ "output": "wasm_url.out",
+ "exitCode": 1
+}
diff --git a/tests/specs/run/wasm_url/wasm_url.js b/tests/specs/run/wasm_url/wasm_url.js
new file mode 100644
index 000000000..71686ef7e
--- /dev/null
+++ b/tests/specs/run/wasm_url/wasm_url.js
@@ -0,0 +1,8 @@
+const module = await WebAssembly.compileStreaming(
+ fetch("http://localhost:4545/assets/unreachable.wasm"),
+);
+const instance = new WebAssembly.Instance(module);
+
+// Compare the stack trace with wasm_unreachable.js, which compiles the WASM
+// module with synchronous APIs.
+instance.exports.unreachable();
diff --git a/tests/specs/run/wasm_url/wasm_url.out b/tests/specs/run/wasm_url/wasm_url.out
new file mode 100644
index 000000000..ae3bf491a
--- /dev/null
+++ b/tests/specs/run/wasm_url/wasm_url.out
@@ -0,0 +1,3 @@
+error: Uncaught (in promise) RuntimeError: unreachable
+ at <anonymous> (http://localhost:4545/assets/unreachable.wasm:1:41)
+ at [WILDCARD]/wasm_url.js:[WILDCARD]
diff --git a/tests/specs/run/weakref/__test__.jsonc b/tests/specs/run/weakref/__test__.jsonc
new file mode 100644
index 000000000..1a5808ec7
--- /dev/null
+++ b/tests/specs/run/weakref/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --quiet --reload weakref.ts",
+ "output": "weakref.ts.out"
+}
diff --git a/tests/specs/run/weakref/weakref.ts b/tests/specs/run/weakref/weakref.ts
new file mode 100644
index 000000000..47c3985fe
--- /dev/null
+++ b/tests/specs/run/weakref/weakref.ts
@@ -0,0 +1 @@
+console.log(WeakRef, FinalizationRegistry);
diff --git a/tests/specs/run/weakref/weakref.ts.out b/tests/specs/run/weakref/weakref.ts.out
new file mode 100644
index 000000000..32bafcf2d
--- /dev/null
+++ b/tests/specs/run/weakref/weakref.ts.out
@@ -0,0 +1 @@
+[Function: WeakRef] [Function: FinalizationRegistry]
diff --git a/tests/specs/run/webstorage_serialization/__test__.jsonc b/tests/specs/run/webstorage_serialization/__test__.jsonc
new file mode 100644
index 000000000..4362a84b2
--- /dev/null
+++ b/tests/specs/run/webstorage_serialization/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run webstorage/serialization.ts",
+ "output": "webstorage/serialization.ts.out"
+}
diff --git a/tests/specs/run/webstorage_serialization/webstorage/config_a.jsonc b/tests/specs/run/webstorage_serialization/webstorage/config_a.jsonc
new file mode 100644
index 000000000..875cb6001
--- /dev/null
+++ b/tests/specs/run/webstorage_serialization/webstorage/config_a.jsonc
@@ -0,0 +1,3 @@
+{
+ "compilerOptions": {}
+}
diff --git a/tests/specs/run/webstorage_serialization/webstorage/config_b.jsonc b/tests/specs/run/webstorage_serialization/webstorage/config_b.jsonc
new file mode 100644
index 000000000..875cb6001
--- /dev/null
+++ b/tests/specs/run/webstorage_serialization/webstorage/config_b.jsonc
@@ -0,0 +1,3 @@
+{
+ "compilerOptions": {}
+}
diff --git a/tests/specs/run/webstorage_serialization/webstorage/fixture.ts b/tests/specs/run/webstorage_serialization/webstorage/fixture.ts
new file mode 100644
index 000000000..cf4bd9f1f
--- /dev/null
+++ b/tests/specs/run/webstorage_serialization/webstorage/fixture.ts
@@ -0,0 +1,2 @@
+import "./logger.ts";
+import "./setter.ts";
diff --git a/tests/specs/run/webstorage_serialization/webstorage/logger.ts b/tests/specs/run/webstorage_serialization/webstorage/logger.ts
new file mode 100644
index 000000000..feadd39eb
--- /dev/null
+++ b/tests/specs/run/webstorage_serialization/webstorage/logger.ts
@@ -0,0 +1 @@
+console.log(globalThis.localStorage);
diff --git a/tests/specs/run/webstorage_serialization/webstorage/serialization.ts b/tests/specs/run/webstorage_serialization/webstorage/serialization.ts
new file mode 100644
index 000000000..f125331bb
--- /dev/null
+++ b/tests/specs/run/webstorage_serialization/webstorage/serialization.ts
@@ -0,0 +1,4 @@
+globalThis.sessionStorage.setItem("hello", "deno");
+
+console.log(globalThis.localStorage);
+console.log(globalThis.sessionStorage);
diff --git a/tests/specs/run/webstorage_serialization/webstorage/serialization.ts.out b/tests/specs/run/webstorage_serialization/webstorage/serialization.ts.out
new file mode 100644
index 000000000..4d80032f0
--- /dev/null
+++ b/tests/specs/run/webstorage_serialization/webstorage/serialization.ts.out
@@ -0,0 +1,2 @@
+Storage {[WILDCARD]
+Storage { hello: "deno", length: 1 }
diff --git a/tests/specs/run/webstorage_serialization/webstorage/setter.ts b/tests/specs/run/webstorage_serialization/webstorage/setter.ts
new file mode 100644
index 000000000..cf5a7bfaf
--- /dev/null
+++ b/tests/specs/run/webstorage_serialization/webstorage/setter.ts
@@ -0,0 +1 @@
+globalThis.localStorage.setItem("hello", "deno");
diff --git a/tests/specs/run/worker_close_in_wasm_reactions/__test__.jsonc b/tests/specs/run/worker_close_in_wasm_reactions/__test__.jsonc
new file mode 100644
index 000000000..104b54756
--- /dev/null
+++ b/tests/specs/run/worker_close_in_wasm_reactions/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --quiet --reload --allow-read worker_close_in_wasm_reactions.js",
+ "output": "worker_close_in_wasm_reactions.js.out"
+}
diff --git a/tests/specs/run/worker_close_in_wasm_reactions/close_in_wasm_reactions.js b/tests/specs/run/worker_close_in_wasm_reactions/close_in_wasm_reactions.js
new file mode 100644
index 000000000..abe573108
--- /dev/null
+++ b/tests/specs/run/worker_close_in_wasm_reactions/close_in_wasm_reactions.js
@@ -0,0 +1,21 @@
+// https://github.com/denoland/deno/issues/12263
+// Test for a panic that happens when a worker is closed in the reactions of a
+// WASM async operation.
+
+// The minimum valid wasm module, plus two additional zero bytes.
+const buffer = new Uint8Array([
+ 0x00,
+ 0x61,
+ 0x73,
+ 0x6D,
+ 0x01,
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x00,
+]);
+WebAssembly.compile(buffer).catch((err) => {
+ console.log("Error:", err);
+ self.close();
+});
diff --git a/tests/specs/run/worker_close_in_wasm_reactions/worker_close_in_wasm_reactions.js b/tests/specs/run/worker_close_in_wasm_reactions/worker_close_in_wasm_reactions.js
new file mode 100644
index 000000000..828320a24
--- /dev/null
+++ b/tests/specs/run/worker_close_in_wasm_reactions/worker_close_in_wasm_reactions.js
@@ -0,0 +1,10 @@
+// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
+
+// https://github.com/denoland/deno/issues/12263
+// Test for a panic that happens when a worker is closed in the reactions of a
+// WASM async operation.
+
+new Worker(
+ import.meta.resolve("./close_in_wasm_reactions.js"),
+ { type: "module" },
+);
diff --git a/tests/specs/run/worker_close_in_wasm_reactions/worker_close_in_wasm_reactions.js.out b/tests/specs/run/worker_close_in_wasm_reactions/worker_close_in_wasm_reactions.js.out
new file mode 100644
index 000000000..904613dae
--- /dev/null
+++ b/tests/specs/run/worker_close_in_wasm_reactions/worker_close_in_wasm_reactions.js.out
@@ -0,0 +1,2 @@
+Error: CompileError: WebAssembly.compile(): reached end while decoding length @+10
+ at file:///[WILDCARD]/close_in_wasm_reactions.js:18:13
diff --git a/tests/specs/run/worker_close_nested/__test__.jsonc b/tests/specs/run/worker_close_nested/__test__.jsonc
new file mode 100644
index 000000000..5cce107c7
--- /dev/null
+++ b/tests/specs/run/worker_close_nested/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --quiet --reload --allow-read worker_close_nested.js",
+ "output": "worker_close_nested.js.out"
+}
diff --git a/tests/specs/run/worker_close_nested/close_nested_child.js b/tests/specs/run/worker_close_nested/close_nested_child.js
new file mode 100644
index 000000000..97980c689
--- /dev/null
+++ b/tests/specs/run/worker_close_nested/close_nested_child.js
@@ -0,0 +1,8 @@
+// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
+
+console.log("Starting the child worker");
+
+setTimeout(() => {
+ console.log("The child worker survived the death of the parent!!!");
+ Deno.exit(1);
+}, 2000);
diff --git a/tests/specs/run/worker_close_nested/close_nested_parent.js b/tests/specs/run/worker_close_nested/close_nested_parent.js
new file mode 100644
index 000000000..d1fe47553
--- /dev/null
+++ b/tests/specs/run/worker_close_nested/close_nested_parent.js
@@ -0,0 +1,13 @@
+// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
+
+console.log("Starting the parent worker");
+
+new Worker(
+ import.meta.resolve("./close_nested_child.js"),
+ { type: "module" },
+);
+
+self.addEventListener("message", () => {
+ console.log("Closing");
+ self.close();
+});
diff --git a/tests/specs/run/worker_close_nested/worker_close_nested.js b/tests/specs/run/worker_close_nested/worker_close_nested.js
new file mode 100644
index 000000000..8d9c88d1c
--- /dev/null
+++ b/tests/specs/run/worker_close_nested/worker_close_nested.js
@@ -0,0 +1,20 @@
+// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
+
+// Test that closing a worker which has living child workers will automatically
+// close the children.
+
+console.log("Starting the main thread");
+
+const worker = new Worker(
+ import.meta.resolve("./close_nested_parent.js"),
+ { type: "module" },
+);
+
+setTimeout(() => {
+ console.log("About to close");
+ worker.postMessage({});
+
+ // Keep the process running for another two seconds, to make sure there's no
+ // output from the child worker.
+ setTimeout(() => {}, 2000);
+}, 1000);
diff --git a/tests/specs/run/worker_close_nested/worker_close_nested.js.out b/tests/specs/run/worker_close_nested/worker_close_nested.js.out
new file mode 100644
index 000000000..496bc6251
--- /dev/null
+++ b/tests/specs/run/worker_close_nested/worker_close_nested.js.out
@@ -0,0 +1,5 @@
+Starting the main thread
+Starting the parent worker
+Starting the child worker
+About to close
+Closing
diff --git a/tests/specs/run/worker_close_race/__test__.jsonc b/tests/specs/run/worker_close_race/__test__.jsonc
new file mode 100644
index 000000000..bdb9665f7
--- /dev/null
+++ b/tests/specs/run/worker_close_race/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --quiet --reload --allow-read worker_close_race.js",
+ "output": "worker_close_race.js.out"
+}
diff --git a/tests/specs/run/worker_close_race/close_race_worker.js b/tests/specs/run/worker_close_race/close_race_worker.js
new file mode 100644
index 000000000..6964be34a
--- /dev/null
+++ b/tests/specs/run/worker_close_race/close_race_worker.js
@@ -0,0 +1,6 @@
+// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
+
+setTimeout(() => {
+ self.postMessage("");
+ self.close();
+}, 500);
diff --git a/tests/specs/run/worker_close_race/worker_close_race.js b/tests/specs/run/worker_close_race/worker_close_race.js
new file mode 100644
index 000000000..188cd9ed8
--- /dev/null
+++ b/tests/specs/run/worker_close_race/worker_close_race.js
@@ -0,0 +1,14 @@
+// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
+
+// https://github.com/denoland/deno/issues/11416
+// Test for a race condition between a worker's `close()` and the main thread's
+// `Worker.prototype.terminate()`.
+
+const worker = new Worker(
+ import.meta.resolve("./close_race_worker.js"),
+ { type: "module" },
+);
+
+worker.onmessage = () => {
+ worker.terminate();
+};
diff --git a/tests/specs/run/worker_close_race/worker_close_race.js.out b/tests/specs/run/worker_close_race/worker_close_race.js.out
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/tests/specs/run/worker_close_race/worker_close_race.js.out
diff --git a/tests/specs/run/worker_drop_handle_race/__test__.jsonc b/tests/specs/run/worker_drop_handle_race/__test__.jsonc
new file mode 100644
index 000000000..cc600d5ef
--- /dev/null
+++ b/tests/specs/run/worker_drop_handle_race/__test__.jsonc
@@ -0,0 +1,5 @@
+{
+ "args": "run --quiet --reload --allow-read worker_drop_handle_race.js",
+ "output": "worker_drop_handle_race.js.out",
+ "exitCode": 1
+}
diff --git a/tests/specs/run/worker_drop_handle_race/drop_handle_race.js b/tests/specs/run/worker_drop_handle_race/drop_handle_race.js
new file mode 100644
index 000000000..30676a600
--- /dev/null
+++ b/tests/specs/run/worker_drop_handle_race/drop_handle_race.js
@@ -0,0 +1,3 @@
+setTimeout(() => {
+ throw new Error();
+}, 1000);
diff --git a/tests/specs/run/worker_drop_handle_race/worker_drop_handle_race.js b/tests/specs/run/worker_drop_handle_race/worker_drop_handle_race.js
new file mode 100644
index 000000000..ef9bcbe07
--- /dev/null
+++ b/tests/specs/run/worker_drop_handle_race/worker_drop_handle_race.js
@@ -0,0 +1,12 @@
+// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
+
+// https://github.com/denoland/deno/issues/11342
+// Test for a panic that happens when the main thread's event loop finishes
+// running while the worker's event loop is still spinning.
+
+// The exception thrown in the worker will not terminate the worker, but it will
+// propagate to the main thread and cause it to exit.
+new Worker(
+ import.meta.resolve("./drop_handle_race.js"),
+ { type: "module" },
+);
diff --git a/tests/specs/run/worker_drop_handle_race/worker_drop_handle_race.js.out b/tests/specs/run/worker_drop_handle_race/worker_drop_handle_race.js.out
new file mode 100644
index 000000000..a1c2e30ad
--- /dev/null
+++ b/tests/specs/run/worker_drop_handle_race/worker_drop_handle_race.js.out
@@ -0,0 +1,7 @@
+error: Uncaught (in worker "") Error
+ throw new Error();
+ ^
+ at [WILDCARD]/drop_handle_race.js:2:9
+ at [WILDCARD]
+error: Uncaught (in promise) Error: Unhandled error in child worker.
+ at Worker.#pollControl [WILDCARD]
diff --git a/tests/specs/run/worker_drop_handle_race_terminate/__test__.jsonc b/tests/specs/run/worker_drop_handle_race_terminate/__test__.jsonc
new file mode 100644
index 000000000..e752074eb
--- /dev/null
+++ b/tests/specs/run/worker_drop_handle_race_terminate/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run worker_drop_handle_race_terminate.js",
+ "output": "worker_drop_handle_race_terminate.js.out"
+}
diff --git a/tests/specs/run/worker_drop_handle_race_terminate/worker_drop_handle_race_terminate.js b/tests/specs/run/worker_drop_handle_race_terminate/worker_drop_handle_race_terminate.js
new file mode 100644
index 000000000..7c4e0b109
--- /dev/null
+++ b/tests/specs/run/worker_drop_handle_race_terminate/worker_drop_handle_race_terminate.js
@@ -0,0 +1,37 @@
+// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
+
+// Test that the panic in https://github.com/denoland/deno/issues/11342 does not
+// happen when calling worker.terminate() after fixing
+// https://github.com/denoland/deno/issues/13705
+
+function getCodeBlobUrl(code) {
+ const blob = new Blob([code], { type: "text/javascript" });
+ return URL.createObjectURL(blob);
+}
+
+const WORKER2 = getCodeBlobUrl(`
+ console.log("Worker 2");
+ self.postMessage(undefined);
+
+ // We sleep synchronously for slightly under 2 seconds in order to make sure
+ // that worker 1 has closed, and that this worker's thread finishes normally
+ // rather than being killed (which happens 2 seconds after calling terminate).
+ Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, 1800);
+ console.log("Finished sleeping in worker 2");
+`);
+
+const WORKER1 = getCodeBlobUrl(`
+ console.log("Worker 1");
+ const worker = new Worker(${JSON.stringify(WORKER2)}, { type: "module" });
+
+ worker.addEventListener("message", () => {
+ console.log("Terminating");
+ worker.terminate();
+ self.close();
+ });
+`);
+
+new Worker(WORKER1, { type: "module" });
+
+// Don't kill the process before worker 2 is finished.
+setTimeout(() => {}, 3000);
diff --git a/tests/specs/run/worker_drop_handle_race_terminate/worker_drop_handle_race_terminate.js.out b/tests/specs/run/worker_drop_handle_race_terminate/worker_drop_handle_race_terminate.js.out
new file mode 100644
index 000000000..5ec1e7ff8
--- /dev/null
+++ b/tests/specs/run/worker_drop_handle_race_terminate/worker_drop_handle_race_terminate.js.out
@@ -0,0 +1,4 @@
+Worker 1
+Worker 2
+Terminating
+Finished sleeping in worker 2
diff --git a/tests/specs/run/worker_event_handler_test/__test__.jsonc b/tests/specs/run/worker_event_handler_test/__test__.jsonc
new file mode 100644
index 000000000..c07fca97c
--- /dev/null
+++ b/tests/specs/run/worker_event_handler_test/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --quiet --reload --allow-read worker_event_handler_test.js",
+ "output": "worker_event_handler_test.js.out"
+}
diff --git a/tests/specs/run/worker_event_handler_test/worker_event_handler_test.js b/tests/specs/run/worker_event_handler_test/worker_event_handler_test.js
new file mode 100644
index 000000000..91c5ba946
--- /dev/null
+++ b/tests/specs/run/worker_event_handler_test/worker_event_handler_test.js
@@ -0,0 +1,5 @@
+const w = new Worker(
+ import.meta.resolve("./worker_event_handlers.js"),
+ { type: "module" },
+);
+w.postMessage({});
diff --git a/tests/specs/run/worker_event_handler_test/worker_event_handler_test.js.out b/tests/specs/run/worker_event_handler_test/worker_event_handler_test.js.out
new file mode 100644
index 000000000..b3eed7f6c
--- /dev/null
+++ b/tests/specs/run/worker_event_handler_test/worker_event_handler_test.js.out
@@ -0,0 +1,11 @@
+Target from self.onmessage: [object DedicatedWorkerGlobalScope]
+Target from message event listener: [object DedicatedWorkerGlobalScope]
+Arguments from self.onerror: [
+ "Uncaught Error: Some error message",
+ "[WILDCARD]/worker_event_handlers.js",
+ 9,
+ 9,
+ Error: Some error message
+ at [WILDCARD]
+]
+Is event canceled?: true
diff --git a/tests/specs/run/worker_event_handler_test/worker_event_handlers.js b/tests/specs/run/worker_event_handler_test/worker_event_handlers.js
new file mode 100644
index 000000000..5e457cd2e
--- /dev/null
+++ b/tests/specs/run/worker_event_handler_test/worker_event_handlers.js
@@ -0,0 +1,26 @@
+self.onmessage = (evt) => {
+ console.log("Target from self.onmessage:", String(evt.target));
+};
+
+self.addEventListener("message", (evt) => {
+ console.log("Target from message event listener:", String(evt.target));
+
+ // Throw an error here so the global's error event will fire.
+ throw new Error("Some error message");
+});
+
+self.onerror = (...args) => {
+ // Take the last 100 characters so the filename doesn't get truncated
+ // depending on the dev's FS structure.
+ args = args.map((v) => typeof v == "string" ? v.slice(-100) : v);
+ console.log("Arguments from self.onerror:", args);
+ return true;
+};
+
+self.addEventListener("error", (evt) => {
+ // Returning true from self.onerror means that subsequent event listeners
+ // should see the event as canceled.
+ console.log("Is event canceled?:", evt.defaultPrevented);
+
+ self.close();
+});
diff --git a/tests/specs/run/worker_message_before_close/__test__.jsonc b/tests/specs/run/worker_message_before_close/__test__.jsonc
new file mode 100644
index 000000000..ae2d65b91
--- /dev/null
+++ b/tests/specs/run/worker_message_before_close/__test__.jsonc
@@ -0,0 +1,4 @@
+{
+ "args": "run --quiet --reload --allow-read worker_message_before_close.js",
+ "output": "worker_message_before_close.js.out"
+}
diff --git a/tests/specs/run/worker_message_before_close/message_before_close.js b/tests/specs/run/worker_message_before_close/message_before_close.js
new file mode 100644
index 000000000..9364b6d82
--- /dev/null
+++ b/tests/specs/run/worker_message_before_close/message_before_close.js
@@ -0,0 +1,4 @@
+onmessage = () => {
+ postMessage({});
+ close();
+};
diff --git a/tests/specs/run/worker_message_before_close/worker_message_before_close.js b/tests/specs/run/worker_message_before_close/worker_message_before_close.js
new file mode 100644
index 000000000..d613bd1ca
--- /dev/null
+++ b/tests/specs/run/worker_message_before_close/worker_message_before_close.js
@@ -0,0 +1,26 @@
+const messagesReceived = new Set();
+
+for (let i = 0; i < 4; i++) {
+ const worker = new Worker(
+ import.meta.resolve("./message_before_close.js"),
+ { type: "module", name: String(i) },
+ );
+
+ worker.addEventListener("message", () => {
+ messagesReceived.add(i);
+ if (messagesReceived.size == 4) {
+ console.log("received all 4 responses from the workers");
+ }
+ });
+
+ worker.postMessage({});
+}
+
+globalThis.addEventListener("unload", () => {
+ if (messagesReceived.size !== 4) {
+ console.log(
+ "received only %d responses from the workers",
+ messagesReceived.size,
+ );
+ }
+});
diff --git a/tests/specs/run/worker_message_before_close/worker_message_before_close.js.out b/tests/specs/run/worker_message_before_close/worker_message_before_close.js.out
new file mode 100644
index 000000000..f91b7b4cb
--- /dev/null
+++ b/tests/specs/run/worker_message_before_close/worker_message_before_close.js.out
@@ -0,0 +1 @@
+received all 4 responses from the workers