summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.dprint.json30
-rw-r--r--.gitattributes6
-rw-r--r--Cargo.toml2
-rw-r--r--cli/Cargo.toml2
-rw-r--r--cli/bench/main.rs35
-rw-r--r--cli/tests/config/deno.json5
-rw-r--r--cli/tests/integration/compile_tests.rs1180
-rw-r--r--cli/tests/integration/js_unit_tests.rs201
-rw-r--r--cli/tests/integration/node_compat_tests.rs31
-rw-r--r--cli/tests/integration/node_unit_tests.rs207
-rw-r--r--cli/tests/node_compat/deno.json5
-rw-r--r--cli/tests/node_compat/test/fixtures/child-process-spawn-node.js14
-rw-r--r--cli/tests/testdata/bench/allow_all.ts43
-rw-r--r--cli/tests/testdata/bench/allow_none.ts23
-rw-r--r--cli/tests/testdata/cat.ts10
-rw-r--r--cli/tests/testdata/cert/listen_tls_alpn_fail.ts20
-rw-r--r--cli/tests/testdata/compile/dynamic_imports/main_unanalyzable.ts18
-rw-r--r--cli/tests/testdata/compile/standalone_follow_redirects_2.js5
-rw-r--r--cli/tests/testdata/coverage/no_snaps_included/no_snaps_included_test.ts11
-rw-r--r--cli/tests/testdata/coverage/no_tests_included/foo.test.js6
-rw-r--r--cli/tests/testdata/coverage/no_tests_included/foo.test.mts6
-rw-r--r--cli/tests/testdata/coverage/no_tests_included/foo.test.ts6
-rw-r--r--cli/tests/testdata/coverage/no_transpiled_lines/index.ts3
-rw-r--r--cli/tests/testdata/echo_server.ts12
-rw-r--r--cli/tests/testdata/run/045_proxy_test.ts121
-rw-r--r--cli/tests/testdata/run/import_meta/main.ts52
-rw-r--r--cli/tests/testdata/run/node_prefix_missing/main.ts.out_feature_enabled2
-rw-r--r--cli/tests/testdata/run/onload/imported.ts13
-rw-r--r--cli/tests/testdata/run/onload/main.ts34
-rw-r--r--cli/tests/testdata/run/onload/nest_imported.ts12
-rw-r--r--cli/tests/testdata/run/textproto.ts173
-rw-r--r--cli/tests/testdata/run/tls_connecttls.js66
-rw-r--r--cli/tests/testdata/run/tls_starttls.js65
-rw-r--r--cli/tests/testdata/run/websocket_server_idletimeout.ts25
-rw-r--r--cli/tests/testdata/test/allow_all.ts43
-rw-r--r--cli/tests/testdata/test/allow_none.ts23
-rw-r--r--cli/tests/testdata/test/ops_sanitizer_closed_inside_started_before.out19
-rw-r--r--cli/tests/testdata/test/ops_sanitizer_missing_details.ts10
-rw-r--r--cli/tests/testdata/test/ops_sanitizer_step_leak.out10
-rw-r--r--cli/tests/testdata/workers/deno_worker.ts16
-rw-r--r--cli/tests/unit/fetch_test.ts2071
-rw-r--r--cli/tests/unit/files_test.ts1095
-rw-r--r--cli/tests/unit/flock_test.ts197
-rw-r--r--cli/tests/unit/http_test.ts2801
-rw-r--r--cli/tests/unit/net_test.ts1274
-rw-r--r--cli/tests/unit/read_dir_test.ts113
-rw-r--r--cli/tests/unit/read_file_test.ts182
-rw-r--r--cli/tests/unit/read_text_file_test.ts208
-rw-r--r--cli/tests/unit/real_path_test.ts114
-rw-r--r--cli/tests/unit/resources_test.ts55
-rw-r--r--cli/tests/unit/serve_test.ts3932
-rw-r--r--cli/tests/unit/stat_test.ts342
-rw-r--r--cli/tests/unit/tls_test.ts1546
-rw-r--r--cli/tests/unit/tty_test.ts32
-rw-r--r--cli/tests/unit/webcrypto_test.ts2047
-rw-r--r--cli/tests/unit/webgpu_test.ts267
-rw-r--r--cli/tests/unit/websocket_test.ts738
-rw-r--r--cli/tests/unit_node/fs_test.ts116
-rw-r--r--cli/tests/unit_node/http_test.ts940
-rw-r--r--cli/tests/unit_node/module_test.ts72
-rw-r--r--test_util/src/lib.rs2
-rw-r--r--test_util/src/servers/mod.rs6
-rw-r--r--tests/Cargo.toml (renamed from cli/tests/Cargo.toml)0
-rw-r--r--tests/config/deno.json5
-rw-r--r--tests/integration/bench_tests.rs (renamed from cli/tests/integration/bench_tests.rs)0
-rw-r--r--tests/integration/bundle_tests.rs (renamed from cli/tests/integration/bundle_tests.rs)0
-rw-r--r--tests/integration/cache_tests.rs (renamed from cli/tests/integration/cache_tests.rs)0
-rw-r--r--tests/integration/cert_tests.rs (renamed from cli/tests/integration/cert_tests.rs)0
-rw-r--r--tests/integration/check_tests.rs (renamed from cli/tests/integration/check_tests.rs)0
-rw-r--r--tests/integration/compile_tests.rs1180
-rw-r--r--tests/integration/coverage_tests.rs (renamed from cli/tests/integration/coverage_tests.rs)0
-rw-r--r--tests/integration/doc_tests.rs (renamed from cli/tests/integration/doc_tests.rs)0
-rw-r--r--tests/integration/eval_tests.rs (renamed from cli/tests/integration/eval_tests.rs)0
-rw-r--r--tests/integration/flags_tests.rs (renamed from cli/tests/integration/flags_tests.rs)0
-rw-r--r--tests/integration/fmt_tests.rs (renamed from cli/tests/integration/fmt_tests.rs)0
-rw-r--r--tests/integration/info_tests.rs (renamed from cli/tests/integration/info_tests.rs)0
-rw-r--r--tests/integration/init_tests.rs (renamed from cli/tests/integration/init_tests.rs)0
-rw-r--r--tests/integration/inspector_tests.rs (renamed from cli/tests/integration/inspector_tests.rs)0
-rw-r--r--tests/integration/install_tests.rs (renamed from cli/tests/integration/install_tests.rs)0
-rw-r--r--tests/integration/js_unit_tests.rs201
-rw-r--r--tests/integration/jsr_tests.rs (renamed from cli/tests/integration/jsr_tests.rs)0
-rw-r--r--tests/integration/jupyter_tests.rs (renamed from cli/tests/integration/jupyter_tests.rs)0
-rw-r--r--tests/integration/lint_tests.rs (renamed from cli/tests/integration/lint_tests.rs)0
-rw-r--r--tests/integration/lsp_tests.rs (renamed from cli/tests/integration/lsp_tests.rs)0
-rw-r--r--tests/integration/mod.rs (renamed from cli/tests/integration/mod.rs)0
-rw-r--r--tests/integration/node_compat_tests.rs31
-rw-r--r--tests/integration/node_unit_tests.rs207
-rw-r--r--tests/integration/npm_tests.rs (renamed from cli/tests/integration/npm_tests.rs)0
-rw-r--r--tests/integration/publish_tests.rs (renamed from cli/tests/integration/publish_tests.rs)0
-rw-r--r--tests/integration/repl_tests.rs (renamed from cli/tests/integration/repl_tests.rs)0
-rw-r--r--tests/integration/run_tests.rs (renamed from cli/tests/integration/run_tests.rs)0
-rw-r--r--tests/integration/shared_library_tests.rs (renamed from cli/tests/integration/shared_library_tests.rs)0
-rw-r--r--tests/integration/task_tests.rs (renamed from cli/tests/integration/task_tests.rs)0
-rw-r--r--tests/integration/test_tests.rs (renamed from cli/tests/integration/test_tests.rs)0
-rw-r--r--tests/integration/upgrade_tests.rs (renamed from cli/tests/integration/upgrade_tests.rs)0
-rw-r--r--tests/integration/vendor_tests.rs (renamed from cli/tests/integration/vendor_tests.rs)0
-rw-r--r--tests/integration/watcher_tests.rs (renamed from cli/tests/integration/watcher_tests.rs)0
-rw-r--r--tests/integration/worker_tests.rs (renamed from cli/tests/integration/worker_tests.rs)0
-rw-r--r--tests/integration_tests.rs (renamed from cli/tests/integration_tests.rs)0
-rw-r--r--tests/integration_tests_runner.rs (renamed from cli/tests/integration_tests_runner.rs)0
-rw-r--r--tests/lib.rs (renamed from cli/tests/lib.rs)0
-rw-r--r--tests/node_compat/common.ts (renamed from cli/tests/node_compat/common.ts)0
-rw-r--r--tests/node_compat/config.jsonc (renamed from cli/tests/node_compat/config.jsonc)0
-rw-r--r--tests/node_compat/deno.json5
-rw-r--r--tests/node_compat/polyfill_globals.js (renamed from cli/tests/node_compat/polyfill_globals.js)0
-rw-r--r--tests/node_compat/runner.ts (renamed from cli/tests/node_compat/runner.ts)0
-rw-r--r--tests/node_compat/test.ts (renamed from cli/tests/node_compat/test.ts)0
-rw-r--r--tests/node_compat/test/common/child_process.js (renamed from cli/tests/node_compat/test/common/child_process.js)0
-rw-r--r--tests/node_compat/test/common/countdown.js (renamed from cli/tests/node_compat/test/common/countdown.js)0
-rw-r--r--tests/node_compat/test/common/dns.js (renamed from cli/tests/node_compat/test/common/dns.js)0
-rw-r--r--tests/node_compat/test/common/duplexpair.js (renamed from cli/tests/node_compat/test/common/duplexpair.js)0
-rw-r--r--tests/node_compat/test/common/fixtures.js (renamed from cli/tests/node_compat/test/common/fixtures.js)0
-rw-r--r--tests/node_compat/test/common/hijackstdio.js (renamed from cli/tests/node_compat/test/common/hijackstdio.js)0
-rw-r--r--tests/node_compat/test/common/index.js (renamed from cli/tests/node_compat/test/common/index.js)0
-rw-r--r--tests/node_compat/test/common/index.mjs (renamed from cli/tests/node_compat/test/common/index.mjs)0
-rw-r--r--tests/node_compat/test/common/internet.js (renamed from cli/tests/node_compat/test/common/internet.js)0
-rw-r--r--tests/node_compat/test/common/package.json (renamed from cli/tests/node_compat/test/common/package.json)0
-rw-r--r--tests/node_compat/test/common/tmpdir.js (renamed from cli/tests/node_compat/test/common/tmpdir.js)0
-rw-r--r--tests/node_compat/test/fixtures/GH-1899-output.js (renamed from cli/tests/node_compat/test/fixtures/GH-1899-output.js)0
-rw-r--r--tests/node_compat/test/fixtures/a.js (renamed from cli/tests/node_compat/test/fixtures/a.js)0
-rw-r--r--tests/node_compat/test/fixtures/child-process-spawn-node.js14
-rw-r--r--tests/node_compat/test/fixtures/child_process_should_emit_error.js (renamed from cli/tests/node_compat/test/fixtures/child_process_should_emit_error.js)0
-rw-r--r--tests/node_compat/test/fixtures/echo.js (renamed from cli/tests/node_compat/test/fixtures/echo.js)0
-rw-r--r--tests/node_compat/test/fixtures/elipses.txt (renamed from cli/tests/node_compat/test/fixtures/elipses.txt)0
-rw-r--r--tests/node_compat/test/fixtures/empty.txt (renamed from cli/tests/node_compat/test/fixtures/empty.txt)0
-rw-r--r--tests/node_compat/test/fixtures/exit.js (renamed from cli/tests/node_compat/test/fixtures/exit.js)0
-rw-r--r--tests/node_compat/test/fixtures/keys/agent1-cert.pem (renamed from cli/tests/node_compat/test/fixtures/keys/agent1-cert.pem)0
-rw-r--r--tests/node_compat/test/fixtures/keys/agent1-key.pem (renamed from cli/tests/node_compat/test/fixtures/keys/agent1-key.pem)0
-rw-r--r--tests/node_compat/test/fixtures/keys/ca1-cert.pem (renamed from cli/tests/node_compat/test/fixtures/keys/ca1-cert.pem)0
-rw-r--r--tests/node_compat/test/fixtures/loop.js (renamed from cli/tests/node_compat/test/fixtures/loop.js)0
-rw-r--r--tests/node_compat/test/fixtures/package.json (renamed from cli/tests/node_compat/test/fixtures/package.json)0
-rw-r--r--tests/node_compat/test/fixtures/print-chars.js (renamed from cli/tests/node_compat/test/fixtures/print-chars.js)0
-rw-r--r--tests/node_compat/test/fixtures/x.txt (renamed from cli/tests/node_compat/test/fixtures/x.txt)0
-rw-r--r--tests/node_compat/test/internet/package.json (renamed from cli/tests/node_compat/test/internet/package.json)0
-rw-r--r--tests/node_compat/test/internet/test-dns-any.js (renamed from cli/tests/node_compat/test/internet/test-dns-any.js)0
-rw-r--r--tests/node_compat/test/internet/test-dns-idna2008.js (renamed from cli/tests/node_compat/test/internet/test-dns-idna2008.js)0
-rw-r--r--tests/node_compat/test/internet/test-dns-ipv4.js (renamed from cli/tests/node_compat/test/internet/test-dns-ipv4.js)0
-rw-r--r--tests/node_compat/test/internet/test-dns-ipv6.js (renamed from cli/tests/node_compat/test/internet/test-dns-ipv6.js)0
-rw-r--r--tests/node_compat/test/internet/test-dns-lookup.js (renamed from cli/tests/node_compat/test/internet/test-dns-lookup.js)0
-rw-r--r--tests/node_compat/test/internet/test-dns-promises-resolve.js (renamed from cli/tests/node_compat/test/internet/test-dns-promises-resolve.js)0
-rw-r--r--tests/node_compat/test/internet/test-dns-regress-6244.js (renamed from cli/tests/node_compat/test/internet/test-dns-regress-6244.js)0
-rw-r--r--tests/node_compat/test/internet/test-dns-setserver-in-callback-of-resolve4.js (renamed from cli/tests/node_compat/test/internet/test-dns-setserver-in-callback-of-resolve4.js)0
-rw-r--r--tests/node_compat/test/internet/test-dns.js (renamed from cli/tests/node_compat/test/internet/test-dns.js)0
-rw-r--r--tests/node_compat/test/internet/test-http-https-default-ports.js (renamed from cli/tests/node_compat/test/internet/test-http-https-default-ports.js)0
-rw-r--r--tests/node_compat/test/parallel/package.json (renamed from cli/tests/node_compat/test/parallel/package.json)0
-rw-r--r--tests/node_compat/test/parallel/test-assert-async.js (renamed from cli/tests/node_compat/test/parallel/test-assert-async.js)0
-rw-r--r--tests/node_compat/test/parallel/test-assert-fail.js (renamed from cli/tests/node_compat/test/parallel/test-assert-fail.js)0
-rw-r--r--tests/node_compat/test/parallel/test-assert-strict-exists.js (renamed from cli/tests/node_compat/test/parallel/test-assert-strict-exists.js)0
-rw-r--r--tests/node_compat/test/parallel/test-assert.js (renamed from cli/tests/node_compat/test/parallel/test-assert.js)0
-rw-r--r--tests/node_compat/test/parallel/test-bad-unicode.js (renamed from cli/tests/node_compat/test/parallel/test-bad-unicode.js)0
-rw-r--r--tests/node_compat/test/parallel/test-btoa-atob.js (renamed from cli/tests/node_compat/test/parallel/test-btoa-atob.js)0
-rw-r--r--tests/node_compat/test/parallel/test-buffer-alloc.js (renamed from cli/tests/node_compat/test/parallel/test-buffer-alloc.js)0
-rw-r--r--tests/node_compat/test/parallel/test-buffer-arraybuffer.js (renamed from cli/tests/node_compat/test/parallel/test-buffer-arraybuffer.js)0
-rw-r--r--tests/node_compat/test/parallel/test-buffer-ascii.js (renamed from cli/tests/node_compat/test/parallel/test-buffer-ascii.js)0
-rw-r--r--tests/node_compat/test/parallel/test-buffer-badhex.js (renamed from cli/tests/node_compat/test/parallel/test-buffer-badhex.js)0
-rw-r--r--tests/node_compat/test/parallel/test-buffer-bigint64.js (renamed from cli/tests/node_compat/test/parallel/test-buffer-bigint64.js)0
-rw-r--r--tests/node_compat/test/parallel/test-buffer-bytelength.js (renamed from cli/tests/node_compat/test/parallel/test-buffer-bytelength.js)0
-rw-r--r--tests/node_compat/test/parallel/test-buffer-compare-offset.js (renamed from cli/tests/node_compat/test/parallel/test-buffer-compare-offset.js)0
-rw-r--r--tests/node_compat/test/parallel/test-buffer-concat.js (renamed from cli/tests/node_compat/test/parallel/test-buffer-concat.js)0
-rw-r--r--tests/node_compat/test/parallel/test-buffer-constants.js (renamed from cli/tests/node_compat/test/parallel/test-buffer-constants.js)0
-rw-r--r--tests/node_compat/test/parallel/test-buffer-copy.js (renamed from cli/tests/node_compat/test/parallel/test-buffer-copy.js)0
-rw-r--r--tests/node_compat/test/parallel/test-buffer-equals.js (renamed from cli/tests/node_compat/test/parallel/test-buffer-equals.js)0
-rw-r--r--tests/node_compat/test/parallel/test-buffer-failed-alloc-typed-arrays.js (renamed from cli/tests/node_compat/test/parallel/test-buffer-failed-alloc-typed-arrays.js)0
-rw-r--r--tests/node_compat/test/parallel/test-buffer-fakes.js (renamed from cli/tests/node_compat/test/parallel/test-buffer-fakes.js)0
-rw-r--r--tests/node_compat/test/parallel/test-buffer-from.js (renamed from cli/tests/node_compat/test/parallel/test-buffer-from.js)0
-rw-r--r--tests/node_compat/test/parallel/test-buffer-includes.js (renamed from cli/tests/node_compat/test/parallel/test-buffer-includes.js)0
-rw-r--r--tests/node_compat/test/parallel/test-buffer-indexof.js (renamed from cli/tests/node_compat/test/parallel/test-buffer-indexof.js)0
-rw-r--r--tests/node_compat/test/parallel/test-buffer-inheritance.js (renamed from cli/tests/node_compat/test/parallel/test-buffer-inheritance.js)0
-rw-r--r--tests/node_compat/test/parallel/test-buffer-isencoding.js (renamed from cli/tests/node_compat/test/parallel/test-buffer-isencoding.js)0
-rw-r--r--tests/node_compat/test/parallel/test-buffer-iterator.js (renamed from cli/tests/node_compat/test/parallel/test-buffer-iterator.js)0
-rw-r--r--tests/node_compat/test/parallel/test-buffer-new.js (renamed from cli/tests/node_compat/test/parallel/test-buffer-new.js)0
-rw-r--r--tests/node_compat/test/parallel/test-buffer-no-negative-allocation.js (renamed from cli/tests/node_compat/test/parallel/test-buffer-no-negative-allocation.js)0
-rw-r--r--tests/node_compat/test/parallel/test-buffer-nopendingdep-map.js (renamed from cli/tests/node_compat/test/parallel/test-buffer-nopendingdep-map.js)0
-rw-r--r--tests/node_compat/test/parallel/test-buffer-of-no-deprecation.js (renamed from cli/tests/node_compat/test/parallel/test-buffer-of-no-deprecation.js)0
-rw-r--r--tests/node_compat/test/parallel/test-buffer-over-max-length.js (renamed from cli/tests/node_compat/test/parallel/test-buffer-over-max-length.js)0
-rw-r--r--tests/node_compat/test/parallel/test-buffer-parent-property.js (renamed from cli/tests/node_compat/test/parallel/test-buffer-parent-property.js)0
-rw-r--r--tests/node_compat/test/parallel/test-buffer-read.js (renamed from cli/tests/node_compat/test/parallel/test-buffer-read.js)0
-rw-r--r--tests/node_compat/test/parallel/test-buffer-readdouble.js (renamed from cli/tests/node_compat/test/parallel/test-buffer-readdouble.js)0
-rw-r--r--tests/node_compat/test/parallel/test-buffer-readfloat.js (renamed from cli/tests/node_compat/test/parallel/test-buffer-readfloat.js)0
-rw-r--r--tests/node_compat/test/parallel/test-buffer-readint.js (renamed from cli/tests/node_compat/test/parallel/test-buffer-readint.js)0
-rw-r--r--tests/node_compat/test/parallel/test-buffer-readuint.js (renamed from cli/tests/node_compat/test/parallel/test-buffer-readuint.js)0
-rw-r--r--tests/node_compat/test/parallel/test-buffer-safe-unsafe.js (renamed from cli/tests/node_compat/test/parallel/test-buffer-safe-unsafe.js)0
-rw-r--r--tests/node_compat/test/parallel/test-buffer-slice.js (renamed from cli/tests/node_compat/test/parallel/test-buffer-slice.js)0
-rw-r--r--tests/node_compat/test/parallel/test-buffer-slow.js (renamed from cli/tests/node_compat/test/parallel/test-buffer-slow.js)0
-rw-r--r--tests/node_compat/test/parallel/test-buffer-swap.js (renamed from cli/tests/node_compat/test/parallel/test-buffer-swap.js)0
-rw-r--r--tests/node_compat/test/parallel/test-buffer-tojson.js (renamed from cli/tests/node_compat/test/parallel/test-buffer-tojson.js)0
-rw-r--r--tests/node_compat/test/parallel/test-buffer-tostring-range.js (renamed from cli/tests/node_compat/test/parallel/test-buffer-tostring-range.js)0
-rw-r--r--tests/node_compat/test/parallel/test-buffer-tostring-rangeerror.js (renamed from cli/tests/node_compat/test/parallel/test-buffer-tostring-rangeerror.js)0
-rw-r--r--tests/node_compat/test/parallel/test-buffer-tostring.js (renamed from cli/tests/node_compat/test/parallel/test-buffer-tostring.js)0
-rw-r--r--tests/node_compat/test/parallel/test-buffer-writedouble.js (renamed from cli/tests/node_compat/test/parallel/test-buffer-writedouble.js)0
-rw-r--r--tests/node_compat/test/parallel/test-buffer-writefloat.js (renamed from cli/tests/node_compat/test/parallel/test-buffer-writefloat.js)0
-rw-r--r--tests/node_compat/test/parallel/test-buffer-writeint.js (renamed from cli/tests/node_compat/test/parallel/test-buffer-writeint.js)0
-rw-r--r--tests/node_compat/test/parallel/test-buffer-writeuint.js (renamed from cli/tests/node_compat/test/parallel/test-buffer-writeuint.js)0
-rw-r--r--tests/node_compat/test/parallel/test-buffer-zero-fill-cli.js (renamed from cli/tests/node_compat/test/parallel/test-buffer-zero-fill-cli.js)0
-rw-r--r--tests/node_compat/test/parallel/test-buffer-zero-fill-reset.js (renamed from cli/tests/node_compat/test/parallel/test-buffer-zero-fill-reset.js)0
-rw-r--r--tests/node_compat/test/parallel/test-buffer-zero-fill.js (renamed from cli/tests/node_compat/test/parallel/test-buffer-zero-fill.js)0
-rw-r--r--tests/node_compat/test/parallel/test-child-process-default-options.js (renamed from cli/tests/node_compat/test/parallel/test-child-process-default-options.js)0
-rw-r--r--tests/node_compat/test/parallel/test-child-process-double-pipe.js (renamed from cli/tests/node_compat/test/parallel/test-child-process-double-pipe.js)0
-rw-r--r--tests/node_compat/test/parallel/test-child-process-exec-abortcontroller-promisified.js (renamed from cli/tests/node_compat/test/parallel/test-child-process-exec-abortcontroller-promisified.js)0
-rw-r--r--tests/node_compat/test/parallel/test-child-process-exec-cwd.js (renamed from cli/tests/node_compat/test/parallel/test-child-process-exec-cwd.js)0
-rw-r--r--tests/node_compat/test/parallel/test-child-process-exec-encoding.js (renamed from cli/tests/node_compat/test/parallel/test-child-process-exec-encoding.js)0
-rw-r--r--tests/node_compat/test/parallel/test-child-process-exec-env.js (renamed from cli/tests/node_compat/test/parallel/test-child-process-exec-env.js)0
-rw-r--r--tests/node_compat/test/parallel/test-child-process-exec-error.js (renamed from cli/tests/node_compat/test/parallel/test-child-process-exec-error.js)0
-rw-r--r--tests/node_compat/test/parallel/test-child-process-exec-kill-throws.js (renamed from cli/tests/node_compat/test/parallel/test-child-process-exec-kill-throws.js)0
-rw-r--r--tests/node_compat/test/parallel/test-child-process-exec-maxbuf.js (renamed from cli/tests/node_compat/test/parallel/test-child-process-exec-maxbuf.js)0
-rw-r--r--tests/node_compat/test/parallel/test-child-process-exec-std-encoding.js (renamed from cli/tests/node_compat/test/parallel/test-child-process-exec-std-encoding.js)0
-rw-r--r--tests/node_compat/test/parallel/test-child-process-exec-stdout-stderr-data-string.js (renamed from cli/tests/node_compat/test/parallel/test-child-process-exec-stdout-stderr-data-string.js)0
-rw-r--r--tests/node_compat/test/parallel/test-child-process-exec-timeout-not-expired.js (renamed from cli/tests/node_compat/test/parallel/test-child-process-exec-timeout-not-expired.js)0
-rw-r--r--tests/node_compat/test/parallel/test-child-process-execfile-maxbuf.js (renamed from cli/tests/node_compat/test/parallel/test-child-process-execfile-maxbuf.js)0
-rw-r--r--tests/node_compat/test/parallel/test-child-process-execfile.js (renamed from cli/tests/node_compat/test/parallel/test-child-process-execfile.js)0
-rw-r--r--tests/node_compat/test/parallel/test-child-process-execfilesync-maxbuf.js (renamed from cli/tests/node_compat/test/parallel/test-child-process-execfilesync-maxbuf.js)0
-rw-r--r--tests/node_compat/test/parallel/test-child-process-execsync-maxbuf.js (renamed from cli/tests/node_compat/test/parallel/test-child-process-execsync-maxbuf.js)0
-rw-r--r--tests/node_compat/test/parallel/test-child-process-exit-code.js (renamed from cli/tests/node_compat/test/parallel/test-child-process-exit-code.js)0
-rw-r--r--tests/node_compat/test/parallel/test-child-process-flush-stdio.js (renamed from cli/tests/node_compat/test/parallel/test-child-process-flush-stdio.js)0
-rw-r--r--tests/node_compat/test/parallel/test-child-process-fork-ref.js (renamed from cli/tests/node_compat/test/parallel/test-child-process-fork-ref.js)0
-rw-r--r--tests/node_compat/test/parallel/test-child-process-fork-ref2.js (renamed from cli/tests/node_compat/test/parallel/test-child-process-fork-ref2.js)0
-rw-r--r--tests/node_compat/test/parallel/test-child-process-ipc-next-tick.js (renamed from cli/tests/node_compat/test/parallel/test-child-process-ipc-next-tick.js)0
-rw-r--r--tests/node_compat/test/parallel/test-child-process-ipc.js (renamed from cli/tests/node_compat/test/parallel/test-child-process-ipc.js)0
-rw-r--r--tests/node_compat/test/parallel/test-child-process-kill.js (renamed from cli/tests/node_compat/test/parallel/test-child-process-kill.js)0
-rw-r--r--tests/node_compat/test/parallel/test-child-process-set-blocking.js (renamed from cli/tests/node_compat/test/parallel/test-child-process-set-blocking.js)0
-rw-r--r--tests/node_compat/test/parallel/test-child-process-spawn-args.js (renamed from cli/tests/node_compat/test/parallel/test-child-process-spawn-args.js)0
-rw-r--r--tests/node_compat/test/parallel/test-child-process-spawn-event.js (renamed from cli/tests/node_compat/test/parallel/test-child-process-spawn-event.js)0
-rw-r--r--tests/node_compat/test/parallel/test-child-process-spawnsync-args.js (renamed from cli/tests/node_compat/test/parallel/test-child-process-spawnsync-args.js)0
-rw-r--r--tests/node_compat/test/parallel/test-child-process-spawnsync-env.js (renamed from cli/tests/node_compat/test/parallel/test-child-process-spawnsync-env.js)0
-rw-r--r--tests/node_compat/test/parallel/test-child-process-spawnsync-maxbuf.js (renamed from cli/tests/node_compat/test/parallel/test-child-process-spawnsync-maxbuf.js)0
-rw-r--r--tests/node_compat/test/parallel/test-child-process-spawnsync-validation-errors.js (renamed from cli/tests/node_compat/test/parallel/test-child-process-spawnsync-validation-errors.js)0
-rw-r--r--tests/node_compat/test/parallel/test-child-process-spawnsync.js (renamed from cli/tests/node_compat/test/parallel/test-child-process-spawnsync.js)0
-rw-r--r--tests/node_compat/test/parallel/test-child-process-stdio-inherit.js (renamed from cli/tests/node_compat/test/parallel/test-child-process-stdio-inherit.js)0
-rw-r--r--tests/node_compat/test/parallel/test-child-process-stdout-flush-exit.js (renamed from cli/tests/node_compat/test/parallel/test-child-process-stdout-flush-exit.js)0
-rw-r--r--tests/node_compat/test/parallel/test-child-process-stdout-flush.js (renamed from cli/tests/node_compat/test/parallel/test-child-process-stdout-flush.js)0
-rw-r--r--tests/node_compat/test/parallel/test-console-async-write-error.js (renamed from cli/tests/node_compat/test/parallel/test-console-async-write-error.js)0
-rw-r--r--tests/node_compat/test/parallel/test-console-group.js (renamed from cli/tests/node_compat/test/parallel/test-console-group.js)0
-rw-r--r--tests/node_compat/test/parallel/test-console-instance.js (renamed from cli/tests/node_compat/test/parallel/test-console-instance.js)0
-rw-r--r--tests/node_compat/test/parallel/test-console-log-stdio-broken-dest.js (renamed from cli/tests/node_compat/test/parallel/test-console-log-stdio-broken-dest.js)0
-rw-r--r--tests/node_compat/test/parallel/test-console-log-throw-primitive.js (renamed from cli/tests/node_compat/test/parallel/test-console-log-throw-primitive.js)0
-rw-r--r--tests/node_compat/test/parallel/test-console-no-swallow-stack-overflow.js (renamed from cli/tests/node_compat/test/parallel/test-console-no-swallow-stack-overflow.js)0
-rw-r--r--tests/node_compat/test/parallel/test-console-sync-write-error.js (renamed from cli/tests/node_compat/test/parallel/test-console-sync-write-error.js)0
-rw-r--r--tests/node_compat/test/parallel/test-console-table.js (renamed from cli/tests/node_compat/test/parallel/test-console-table.js)0
-rw-r--r--tests/node_compat/test/parallel/test-console-tty-colors.js (renamed from cli/tests/node_compat/test/parallel/test-console-tty-colors.js)0
-rw-r--r--tests/node_compat/test/parallel/test-crypto-dh-shared.js (renamed from cli/tests/node_compat/test/parallel/test-crypto-dh-shared.js)0
-rw-r--r--tests/node_compat/test/parallel/test-crypto-dh.js (renamed from cli/tests/node_compat/test/parallel/test-crypto-dh.js)0
-rw-r--r--tests/node_compat/test/parallel/test-crypto-hkdf.js (renamed from cli/tests/node_compat/test/parallel/test-crypto-hkdf.js)0
-rw-r--r--tests/node_compat/test/parallel/test-crypto-hmac.js (renamed from cli/tests/node_compat/test/parallel/test-crypto-hmac.js)0
-rw-r--r--tests/node_compat/test/parallel/test-crypto-prime.js (renamed from cli/tests/node_compat/test/parallel/test-crypto-prime.js)0
-rw-r--r--tests/node_compat/test/parallel/test-crypto-secret-keygen.js (renamed from cli/tests/node_compat/test/parallel/test-crypto-secret-keygen.js)0
-rw-r--r--tests/node_compat/test/parallel/test-crypto-stream.js (renamed from cli/tests/node_compat/test/parallel/test-crypto-stream.js)0
-rw-r--r--tests/node_compat/test/parallel/test-crypto-update-encoding.js (renamed from cli/tests/node_compat/test/parallel/test-crypto-update-encoding.js)0
-rw-r--r--tests/node_compat/test/parallel/test-crypto-x509.js (renamed from cli/tests/node_compat/test/parallel/test-crypto-x509.js)0
-rw-r--r--tests/node_compat/test/parallel/test-dgram-close-during-bind.js (renamed from cli/tests/node_compat/test/parallel/test-dgram-close-during-bind.js)0
-rw-r--r--tests/node_compat/test/parallel/test-dgram-close-signal.js (renamed from cli/tests/node_compat/test/parallel/test-dgram-close-signal.js)0
-rw-r--r--tests/node_compat/test/parallel/test-dgram-custom-lookup.js (renamed from cli/tests/node_compat/test/parallel/test-dgram-custom-lookup.js)0
-rw-r--r--tests/node_compat/test/parallel/test-dgram-ipv6only.js (renamed from cli/tests/node_compat/test/parallel/test-dgram-ipv6only.js)0
-rw-r--r--tests/node_compat/test/parallel/test-dgram-send-cb-quelches-error.js (renamed from cli/tests/node_compat/test/parallel/test-dgram-send-cb-quelches-error.js)0
-rw-r--r--tests/node_compat/test/parallel/test-dgram-socket-buffer-size.js (renamed from cli/tests/node_compat/test/parallel/test-dgram-socket-buffer-size.js)0
-rw-r--r--tests/node_compat/test/parallel/test-dgram-udp6-link-local-address.js (renamed from cli/tests/node_compat/test/parallel/test-dgram-udp6-link-local-address.js)0
-rw-r--r--tests/node_compat/test/parallel/test-diagnostics-channel-has-subscribers.js (renamed from cli/tests/node_compat/test/parallel/test-diagnostics-channel-has-subscribers.js)0
-rw-r--r--tests/node_compat/test/parallel/test-diagnostics-channel-object-channel-pub-sub.js (renamed from cli/tests/node_compat/test/parallel/test-diagnostics-channel-object-channel-pub-sub.js)0
-rw-r--r--tests/node_compat/test/parallel/test-diagnostics-channel-pub-sub.js (renamed from cli/tests/node_compat/test/parallel/test-diagnostics-channel-pub-sub.js)0
-rw-r--r--tests/node_compat/test/parallel/test-diagnostics-channel-symbol-named.js (renamed from cli/tests/node_compat/test/parallel/test-diagnostics-channel-symbol-named.js)0
-rw-r--r--tests/node_compat/test/parallel/test-diagnostics-channel-udp.js (renamed from cli/tests/node_compat/test/parallel/test-diagnostics-channel-udp.js)0
-rw-r--r--tests/node_compat/test/parallel/test-dns-lookup.js (renamed from cli/tests/node_compat/test/parallel/test-dns-lookup.js)0
-rw-r--r--tests/node_compat/test/parallel/test-dns-memory-error.js (renamed from cli/tests/node_compat/test/parallel/test-dns-memory-error.js)0
-rw-r--r--tests/node_compat/test/parallel/test-dns-promises-exists.js (renamed from cli/tests/node_compat/test/parallel/test-dns-promises-exists.js)0
-rw-r--r--tests/node_compat/test/parallel/test-dns-resolveany.js (renamed from cli/tests/node_compat/test/parallel/test-dns-resolveany.js)0
-rw-r--r--tests/node_compat/test/parallel/test-dns-resolvens-typeerror.js (renamed from cli/tests/node_compat/test/parallel/test-dns-resolvens-typeerror.js)0
-rw-r--r--tests/node_compat/test/parallel/test-dns-setservers-type-check.js (renamed from cli/tests/node_compat/test/parallel/test-dns-setservers-type-check.js)0
-rw-r--r--tests/node_compat/test/parallel/test-dns.js (renamed from cli/tests/node_compat/test/parallel/test-dns.js)0
-rw-r--r--tests/node_compat/test/parallel/test-eval-strict-referenceerror.js (renamed from cli/tests/node_compat/test/parallel/test-eval-strict-referenceerror.js)0
-rw-r--r--tests/node_compat/test/parallel/test-eval.js (renamed from cli/tests/node_compat/test/parallel/test-eval.js)0
-rw-r--r--tests/node_compat/test/parallel/test-event-emitter-add-listeners.js (renamed from cli/tests/node_compat/test/parallel/test-event-emitter-add-listeners.js)0
-rw-r--r--tests/node_compat/test/parallel/test-event-emitter-emit-context.js (renamed from cli/tests/node_compat/test/parallel/test-event-emitter-emit-context.js)0
-rw-r--r--tests/node_compat/test/parallel/test-event-emitter-error-monitor.js (renamed from cli/tests/node_compat/test/parallel/test-event-emitter-error-monitor.js)0
-rw-r--r--tests/node_compat/test/parallel/test-event-emitter-errors.js (renamed from cli/tests/node_compat/test/parallel/test-event-emitter-errors.js)0
-rw-r--r--tests/node_compat/test/parallel/test-event-emitter-get-max-listeners.js (renamed from cli/tests/node_compat/test/parallel/test-event-emitter-get-max-listeners.js)0
-rw-r--r--tests/node_compat/test/parallel/test-event-emitter-invalid-listener.js (renamed from cli/tests/node_compat/test/parallel/test-event-emitter-invalid-listener.js)0
-rw-r--r--tests/node_compat/test/parallel/test-event-emitter-listener-count.js (renamed from cli/tests/node_compat/test/parallel/test-event-emitter-listener-count.js)0
-rw-r--r--tests/node_compat/test/parallel/test-event-emitter-listeners-side-effects.js (renamed from cli/tests/node_compat/test/parallel/test-event-emitter-listeners-side-effects.js)0
-rw-r--r--tests/node_compat/test/parallel/test-event-emitter-listeners.js (renamed from cli/tests/node_compat/test/parallel/test-event-emitter-listeners.js)0
-rw-r--r--tests/node_compat/test/parallel/test-event-emitter-max-listeners.js (renamed from cli/tests/node_compat/test/parallel/test-event-emitter-max-listeners.js)0
-rw-r--r--tests/node_compat/test/parallel/test-event-emitter-method-names.js (renamed from cli/tests/node_compat/test/parallel/test-event-emitter-method-names.js)0
-rw-r--r--tests/node_compat/test/parallel/test-event-emitter-modify-in-emit.js (renamed from cli/tests/node_compat/test/parallel/test-event-emitter-modify-in-emit.js)0
-rw-r--r--tests/node_compat/test/parallel/test-event-emitter-no-error-provided-to-error-event.js (renamed from cli/tests/node_compat/test/parallel/test-event-emitter-no-error-provided-to-error-event.js)0
-rw-r--r--tests/node_compat/test/parallel/test-event-emitter-num-args.js (renamed from cli/tests/node_compat/test/parallel/test-event-emitter-num-args.js)0
-rw-r--r--tests/node_compat/test/parallel/test-event-emitter-once.js (renamed from cli/tests/node_compat/test/parallel/test-event-emitter-once.js)0
-rw-r--r--tests/node_compat/test/parallel/test-event-emitter-prepend.js (renamed from cli/tests/node_compat/test/parallel/test-event-emitter-prepend.js)0
-rw-r--r--tests/node_compat/test/parallel/test-event-emitter-remove-all-listeners.js (renamed from cli/tests/node_compat/test/parallel/test-event-emitter-remove-all-listeners.js)0
-rw-r--r--tests/node_compat/test/parallel/test-event-emitter-remove-listeners.js (renamed from cli/tests/node_compat/test/parallel/test-event-emitter-remove-listeners.js)0
-rw-r--r--tests/node_compat/test/parallel/test-event-emitter-set-max-listeners-side-effects.js (renamed from cli/tests/node_compat/test/parallel/test-event-emitter-set-max-listeners-side-effects.js)0
-rw-r--r--tests/node_compat/test/parallel/test-event-emitter-special-event-names.js (renamed from cli/tests/node_compat/test/parallel/test-event-emitter-special-event-names.js)0
-rw-r--r--tests/node_compat/test/parallel/test-event-emitter-subclass.js (renamed from cli/tests/node_compat/test/parallel/test-event-emitter-subclass.js)0
-rw-r--r--tests/node_compat/test/parallel/test-event-emitter-symbols.js (renamed from cli/tests/node_compat/test/parallel/test-event-emitter-symbols.js)0
-rw-r--r--tests/node_compat/test/parallel/test-events-list.js (renamed from cli/tests/node_compat/test/parallel/test-events-list.js)0
-rw-r--r--tests/node_compat/test/parallel/test-events-on-async-iterator.js (renamed from cli/tests/node_compat/test/parallel/test-events-on-async-iterator.js)0
-rw-r--r--tests/node_compat/test/parallel/test-events-once.js (renamed from cli/tests/node_compat/test/parallel/test-events-once.js)0
-rw-r--r--tests/node_compat/test/parallel/test-events-uncaught-exception-stack.js (renamed from cli/tests/node_compat/test/parallel/test-events-uncaught-exception-stack.js)0
-rw-r--r--tests/node_compat/test/parallel/test-eventtarget-brandcheck.js (renamed from cli/tests/node_compat/test/parallel/test-eventtarget-brandcheck.js)0
-rw-r--r--tests/node_compat/test/parallel/test-exception-handler.js (renamed from cli/tests/node_compat/test/parallel/test-exception-handler.js)0
-rw-r--r--tests/node_compat/test/parallel/test-exception-handler2.js (renamed from cli/tests/node_compat/test/parallel/test-exception-handler2.js)0
-rw-r--r--tests/node_compat/test/parallel/test-file-read-noexist.js (renamed from cli/tests/node_compat/test/parallel/test-file-read-noexist.js)0
-rw-r--r--tests/node_compat/test/parallel/test-file-write-stream.js (renamed from cli/tests/node_compat/test/parallel/test-file-write-stream.js)0
-rw-r--r--tests/node_compat/test/parallel/test-file-write-stream2.js (renamed from cli/tests/node_compat/test/parallel/test-file-write-stream2.js)0
-rw-r--r--tests/node_compat/test/parallel/test-file-write-stream3.js (renamed from cli/tests/node_compat/test/parallel/test-file-write-stream3.js)0
-rw-r--r--tests/node_compat/test/parallel/test-file-write-stream4.js (renamed from cli/tests/node_compat/test/parallel/test-file-write-stream4.js)0
-rw-r--r--tests/node_compat/test/parallel/test-fs-access.js (renamed from cli/tests/node_compat/test/parallel/test-fs-access.js)0
-rw-r--r--tests/node_compat/test/parallel/test-fs-append-file-sync.js (renamed from cli/tests/node_compat/test/parallel/test-fs-append-file-sync.js)0
-rw-r--r--tests/node_compat/test/parallel/test-fs-append-file.js (renamed from cli/tests/node_compat/test/parallel/test-fs-append-file.js)0
-rw-r--r--tests/node_compat/test/parallel/test-fs-chmod-mask.js (renamed from cli/tests/node_compat/test/parallel/test-fs-chmod-mask.js)0
-rw-r--r--tests/node_compat/test/parallel/test-fs-chmod.js (renamed from cli/tests/node_compat/test/parallel/test-fs-chmod.js)0
-rw-r--r--tests/node_compat/test/parallel/test-fs-chown-type-check.js (renamed from cli/tests/node_compat/test/parallel/test-fs-chown-type-check.js)0
-rw-r--r--tests/node_compat/test/parallel/test-fs-copyfile.js (renamed from cli/tests/node_compat/test/parallel/test-fs-copyfile.js)0
-rw-r--r--tests/node_compat/test/parallel/test-fs-empty-readStream.js (renamed from cli/tests/node_compat/test/parallel/test-fs-empty-readStream.js)0
-rw-r--r--tests/node_compat/test/parallel/test-fs-mkdir.js (renamed from cli/tests/node_compat/test/parallel/test-fs-mkdir.js)0
-rw-r--r--tests/node_compat/test/parallel/test-fs-open-flags.js (renamed from cli/tests/node_compat/test/parallel/test-fs-open-flags.js)0
-rw-r--r--tests/node_compat/test/parallel/test-fs-open-mode-mask.js (renamed from cli/tests/node_compat/test/parallel/test-fs-open-mode-mask.js)0
-rw-r--r--tests/node_compat/test/parallel/test-fs-open-no-close.js (renamed from cli/tests/node_compat/test/parallel/test-fs-open-no-close.js)0
-rw-r--r--tests/node_compat/test/parallel/test-fs-open-numeric-flags.js (renamed from cli/tests/node_compat/test/parallel/test-fs-open-numeric-flags.js)0
-rw-r--r--tests/node_compat/test/parallel/test-fs-open.js (renamed from cli/tests/node_compat/test/parallel/test-fs-open.js)0
-rw-r--r--tests/node_compat/test/parallel/test-fs-opendir.js (renamed from cli/tests/node_compat/test/parallel/test-fs-opendir.js)0
-rw-r--r--tests/node_compat/test/parallel/test-fs-read-stream-autoClose.js (renamed from cli/tests/node_compat/test/parallel/test-fs-read-stream-autoClose.js)0
-rw-r--r--tests/node_compat/test/parallel/test-fs-read-stream-concurrent-reads.js (renamed from cli/tests/node_compat/test/parallel/test-fs-read-stream-concurrent-reads.js)0
-rw-r--r--tests/node_compat/test/parallel/test-fs-read-stream-double-close.js (renamed from cli/tests/node_compat/test/parallel/test-fs-read-stream-double-close.js)0
-rw-r--r--tests/node_compat/test/parallel/test-fs-read-stream-encoding.js (renamed from cli/tests/node_compat/test/parallel/test-fs-read-stream-encoding.js)0
-rw-r--r--tests/node_compat/test/parallel/test-fs-read-stream-fd.js (renamed from cli/tests/node_compat/test/parallel/test-fs-read-stream-fd.js)0
-rw-r--r--tests/node_compat/test/parallel/test-fs-read-stream-inherit.js (renamed from cli/tests/node_compat/test/parallel/test-fs-read-stream-inherit.js)0
-rw-r--r--tests/node_compat/test/parallel/test-fs-read-stream-patch-open.js (renamed from cli/tests/node_compat/test/parallel/test-fs-read-stream-patch-open.js)0
-rw-r--r--tests/node_compat/test/parallel/test-fs-read-stream-resume.js (renamed from cli/tests/node_compat/test/parallel/test-fs-read-stream-resume.js)0
-rw-r--r--tests/node_compat/test/parallel/test-fs-read-stream-throw-type-error.js (renamed from cli/tests/node_compat/test/parallel/test-fs-read-stream-throw-type-error.js)0
-rw-r--r--tests/node_compat/test/parallel/test-fs-read-stream.js (renamed from cli/tests/node_compat/test/parallel/test-fs-read-stream.js)0
-rw-r--r--tests/node_compat/test/parallel/test-fs-read-type.js (renamed from cli/tests/node_compat/test/parallel/test-fs-read-type.js)0
-rw-r--r--tests/node_compat/test/parallel/test-fs-read-zero-length.js (renamed from cli/tests/node_compat/test/parallel/test-fs-read-zero-length.js)0
-rw-r--r--tests/node_compat/test/parallel/test-fs-read.js (renamed from cli/tests/node_compat/test/parallel/test-fs-read.js)0
-rw-r--r--tests/node_compat/test/parallel/test-fs-readdir-stack-overflow.js (renamed from cli/tests/node_compat/test/parallel/test-fs-readdir-stack-overflow.js)0
-rw-r--r--tests/node_compat/test/parallel/test-fs-readdir.js (renamed from cli/tests/node_compat/test/parallel/test-fs-readdir.js)0
-rw-r--r--tests/node_compat/test/parallel/test-fs-readfile-empty.js (renamed from cli/tests/node_compat/test/parallel/test-fs-readfile-empty.js)0
-rw-r--r--tests/node_compat/test/parallel/test-fs-realpath-native.js (renamed from cli/tests/node_compat/test/parallel/test-fs-realpath-native.js)0
-rw-r--r--tests/node_compat/test/parallel/test-fs-rmdir-recursive-sync-warns-not-found.js (renamed from cli/tests/node_compat/test/parallel/test-fs-rmdir-recursive-sync-warns-not-found.js)0
-rw-r--r--tests/node_compat/test/parallel/test-fs-rmdir-recursive-sync-warns-on-file.js (renamed from cli/tests/node_compat/test/parallel/test-fs-rmdir-recursive-sync-warns-on-file.js)0
-rw-r--r--tests/node_compat/test/parallel/test-fs-rmdir-recursive-throws-not-found.js (renamed from cli/tests/node_compat/test/parallel/test-fs-rmdir-recursive-throws-not-found.js)0
-rw-r--r--tests/node_compat/test/parallel/test-fs-rmdir-recursive-throws-on-file.js (renamed from cli/tests/node_compat/test/parallel/test-fs-rmdir-recursive-throws-on-file.js)0
-rw-r--r--tests/node_compat/test/parallel/test-fs-rmdir-recursive-warns-not-found.js (renamed from cli/tests/node_compat/test/parallel/test-fs-rmdir-recursive-warns-not-found.js)0
-rw-r--r--tests/node_compat/test/parallel/test-fs-rmdir-recursive-warns-on-file.js (renamed from cli/tests/node_compat/test/parallel/test-fs-rmdir-recursive-warns-on-file.js)0
-rw-r--r--tests/node_compat/test/parallel/test-fs-rmdir-recursive.js (renamed from cli/tests/node_compat/test/parallel/test-fs-rmdir-recursive.js)0
-rw-r--r--tests/node_compat/test/parallel/test-fs-rmdir-type-check.js (renamed from cli/tests/node_compat/test/parallel/test-fs-rmdir-type-check.js)0
-rw-r--r--tests/node_compat/test/parallel/test-fs-watchfile.js (renamed from cli/tests/node_compat/test/parallel/test-fs-watchfile.js)0
-rw-r--r--tests/node_compat/test/parallel/test-fs-write-buffer.js (renamed from cli/tests/node_compat/test/parallel/test-fs-write-buffer.js)0
-rw-r--r--tests/node_compat/test/parallel/test-fs-write-file-buffer.js (renamed from cli/tests/node_compat/test/parallel/test-fs-write-file-buffer.js)0
-rw-r--r--tests/node_compat/test/parallel/test-fs-write-file-invalid-path.js (renamed from cli/tests/node_compat/test/parallel/test-fs-write-file-invalid-path.js)0
-rw-r--r--tests/node_compat/test/parallel/test-fs-write-file-sync.js (renamed from cli/tests/node_compat/test/parallel/test-fs-write-file-sync.js)0
-rw-r--r--tests/node_compat/test/parallel/test-fs-write-file.js (renamed from cli/tests/node_compat/test/parallel/test-fs-write-file.js)0
-rw-r--r--tests/node_compat/test/parallel/test-fs-write-no-fd.js (renamed from cli/tests/node_compat/test/parallel/test-fs-write-no-fd.js)0
-rw-r--r--tests/node_compat/test/parallel/test-fs-write-stream-autoclose-option.js (renamed from cli/tests/node_compat/test/parallel/test-fs-write-stream-autoclose-option.js)0
-rw-r--r--tests/node_compat/test/parallel/test-fs-write-stream-close-without-callback.js (renamed from cli/tests/node_compat/test/parallel/test-fs-write-stream-close-without-callback.js)0
-rw-r--r--tests/node_compat/test/parallel/test-fs-write-stream-double-close.js (renamed from cli/tests/node_compat/test/parallel/test-fs-write-stream-double-close.js)0
-rw-r--r--tests/node_compat/test/parallel/test-fs-write-stream-end.js (renamed from cli/tests/node_compat/test/parallel/test-fs-write-stream-end.js)0
-rw-r--r--tests/node_compat/test/parallel/test-fs-write-stream-fs.js (renamed from cli/tests/node_compat/test/parallel/test-fs-write-stream-fs.js)0
-rw-r--r--tests/node_compat/test/parallel/test-fs-write-stream-throw-type-error.js (renamed from cli/tests/node_compat/test/parallel/test-fs-write-stream-throw-type-error.js)0
-rw-r--r--tests/node_compat/test/parallel/test-fs-write-stream.js (renamed from cli/tests/node_compat/test/parallel/test-fs-write-stream.js)0
-rw-r--r--tests/node_compat/test/parallel/test-fs-write-sync.js (renamed from cli/tests/node_compat/test/parallel/test-fs-write-sync.js)0
-rw-r--r--tests/node_compat/test/parallel/test-fs-write.js (renamed from cli/tests/node_compat/test/parallel/test-fs-write.js)0
-rw-r--r--tests/node_compat/test/parallel/test-fs-writev-sync.js (renamed from cli/tests/node_compat/test/parallel/test-fs-writev-sync.js)0
-rw-r--r--tests/node_compat/test/parallel/test-handle-wrap-close-abort.js (renamed from cli/tests/node_compat/test/parallel/test-handle-wrap-close-abort.js)0
-rw-r--r--tests/node_compat/test/parallel/test-http-agent-getname.js (renamed from cli/tests/node_compat/test/parallel/test-http-agent-getname.js)0
-rw-r--r--tests/node_compat/test/parallel/test-http-client-get-url.js (renamed from cli/tests/node_compat/test/parallel/test-http-client-get-url.js)0
-rw-r--r--tests/node_compat/test/parallel/test-http-client-read-in-error.js (renamed from cli/tests/node_compat/test/parallel/test-http-client-read-in-error.js)0
-rw-r--r--tests/node_compat/test/parallel/test-http-localaddress.js (renamed from cli/tests/node_compat/test/parallel/test-http-localaddress.js)0
-rw-r--r--tests/node_compat/test/parallel/test-http-outgoing-internal-headernames-getter.js (renamed from cli/tests/node_compat/test/parallel/test-http-outgoing-internal-headernames-getter.js)0
-rw-r--r--tests/node_compat/test/parallel/test-http-outgoing-internal-headernames-setter.js (renamed from cli/tests/node_compat/test/parallel/test-http-outgoing-internal-headernames-setter.js)0
-rw-r--r--tests/node_compat/test/parallel/test-http-outgoing-internal-headers.js (renamed from cli/tests/node_compat/test/parallel/test-http-outgoing-internal-headers.js)0
-rw-r--r--tests/node_compat/test/parallel/test-http-outgoing-renderHeaders.js (renamed from cli/tests/node_compat/test/parallel/test-http-outgoing-renderHeaders.js)0
-rw-r--r--tests/node_compat/test/parallel/test-http-outgoing-settimeout.js (renamed from cli/tests/node_compat/test/parallel/test-http-outgoing-settimeout.js)0
-rw-r--r--tests/node_compat/test/parallel/test-http-url.parse-auth-with-header-in-request.js (renamed from cli/tests/node_compat/test/parallel/test-http-url.parse-auth-with-header-in-request.js)0
-rw-r--r--tests/node_compat/test/parallel/test-http-url.parse-auth.js (renamed from cli/tests/node_compat/test/parallel/test-http-url.parse-auth.js)0
-rw-r--r--tests/node_compat/test/parallel/test-http-url.parse-basic.js (renamed from cli/tests/node_compat/test/parallel/test-http-url.parse-basic.js)0
-rw-r--r--tests/node_compat/test/parallel/test-http-url.parse-https.request.js (renamed from cli/tests/node_compat/test/parallel/test-http-url.parse-https.request.js)0
-rw-r--r--tests/node_compat/test/parallel/test-http-url.parse-only-support-http-https-protocol.js (renamed from cli/tests/node_compat/test/parallel/test-http-url.parse-only-support-http-https-protocol.js)0
-rw-r--r--tests/node_compat/test/parallel/test-http-url.parse-path.js (renamed from cli/tests/node_compat/test/parallel/test-http-url.parse-path.js)0
-rw-r--r--tests/node_compat/test/parallel/test-http-url.parse-post.js (renamed from cli/tests/node_compat/test/parallel/test-http-url.parse-post.js)0
-rw-r--r--tests/node_compat/test/parallel/test-http-url.parse-search.js (renamed from cli/tests/node_compat/test/parallel/test-http-url.parse-search.js)0
-rw-r--r--tests/node_compat/test/parallel/test-net-access-byteswritten.js (renamed from cli/tests/node_compat/test/parallel/test-net-access-byteswritten.js)0
-rw-r--r--tests/node_compat/test/parallel/test-net-better-error-messages-listen-path.js (renamed from cli/tests/node_compat/test/parallel/test-net-better-error-messages-listen-path.js)0
-rw-r--r--tests/node_compat/test/parallel/test-net-better-error-messages-path.js (renamed from cli/tests/node_compat/test/parallel/test-net-better-error-messages-path.js)0
-rw-r--r--tests/node_compat/test/parallel/test-net-better-error-messages-port-hostname.js (renamed from cli/tests/node_compat/test/parallel/test-net-better-error-messages-port-hostname.js)0
-rw-r--r--tests/node_compat/test/parallel/test-net-connect-after-destroy.js (renamed from cli/tests/node_compat/test/parallel/test-net-connect-after-destroy.js)0
-rw-r--r--tests/node_compat/test/parallel/test-net-connect-buffer.js (renamed from cli/tests/node_compat/test/parallel/test-net-connect-buffer.js)0
-rw-r--r--tests/node_compat/test/parallel/test-net-connect-buffer2.js (renamed from cli/tests/node_compat/test/parallel/test-net-connect-buffer2.js)0
-rw-r--r--tests/node_compat/test/parallel/test-net-connect-destroy.js (renamed from cli/tests/node_compat/test/parallel/test-net-connect-destroy.js)0
-rw-r--r--tests/node_compat/test/parallel/test-net-connect-immediate-destroy.js (renamed from cli/tests/node_compat/test/parallel/test-net-connect-immediate-destroy.js)0
-rw-r--r--tests/node_compat/test/parallel/test-net-connect-immediate-finish.js (renamed from cli/tests/node_compat/test/parallel/test-net-connect-immediate-finish.js)0
-rw-r--r--tests/node_compat/test/parallel/test-net-connect-no-arg.js (renamed from cli/tests/node_compat/test/parallel/test-net-connect-no-arg.js)0
-rw-r--r--tests/node_compat/test/parallel/test-net-dns-error.js (renamed from cli/tests/node_compat/test/parallel/test-net-dns-error.js)0
-rw-r--r--tests/node_compat/test/parallel/test-net-during-close.js (renamed from cli/tests/node_compat/test/parallel/test-net-during-close.js)0
-rw-r--r--tests/node_compat/test/parallel/test-net-end-close.js (renamed from cli/tests/node_compat/test/parallel/test-net-end-close.js)0
-rw-r--r--tests/node_compat/test/parallel/test-net-end-without-connect.js (renamed from cli/tests/node_compat/test/parallel/test-net-end-without-connect.js)0
-rw-r--r--tests/node_compat/test/parallel/test-net-isip.js (renamed from cli/tests/node_compat/test/parallel/test-net-isip.js)0
-rw-r--r--tests/node_compat/test/parallel/test-net-isipv4.js (renamed from cli/tests/node_compat/test/parallel/test-net-isipv4.js)0
-rw-r--r--tests/node_compat/test/parallel/test-net-isipv6.js (renamed from cli/tests/node_compat/test/parallel/test-net-isipv6.js)0
-rw-r--r--tests/node_compat/test/parallel/test-net-listen-close-server-callback-is-not-function.js (renamed from cli/tests/node_compat/test/parallel/test-net-listen-close-server-callback-is-not-function.js)0
-rw-r--r--tests/node_compat/test/parallel/test-net-listen-close-server.js (renamed from cli/tests/node_compat/test/parallel/test-net-listen-close-server.js)0
-rw-r--r--tests/node_compat/test/parallel/test-net-listen-invalid-port.js (renamed from cli/tests/node_compat/test/parallel/test-net-listen-invalid-port.js)0
-rw-r--r--tests/node_compat/test/parallel/test-net-listening.js (renamed from cli/tests/node_compat/test/parallel/test-net-listening.js)0
-rw-r--r--tests/node_compat/test/parallel/test-net-localerror.js (renamed from cli/tests/node_compat/test/parallel/test-net-localerror.js)0
-rw-r--r--tests/node_compat/test/parallel/test-net-options-lookup.js (renamed from cli/tests/node_compat/test/parallel/test-net-options-lookup.js)0
-rw-r--r--tests/node_compat/test/parallel/test-net-pipe-connect-errors.js (renamed from cli/tests/node_compat/test/parallel/test-net-pipe-connect-errors.js)0
-rw-r--r--tests/node_compat/test/parallel/test-net-server-call-listen-multiple-times.js (renamed from cli/tests/node_compat/test/parallel/test-net-server-call-listen-multiple-times.js)0
-rw-r--r--tests/node_compat/test/parallel/test-net-server-listen-options-signal.js (renamed from cli/tests/node_compat/test/parallel/test-net-server-listen-options-signal.js)0
-rw-r--r--tests/node_compat/test/parallel/test-net-server-listen-options.js (renamed from cli/tests/node_compat/test/parallel/test-net-server-listen-options.js)0
-rw-r--r--tests/node_compat/test/parallel/test-net-server-listen-path.js (renamed from cli/tests/node_compat/test/parallel/test-net-server-listen-path.js)0
-rw-r--r--tests/node_compat/test/parallel/test-net-server-listen-remove-callback.js (renamed from cli/tests/node_compat/test/parallel/test-net-server-listen-remove-callback.js)0
-rw-r--r--tests/node_compat/test/parallel/test-net-server-options.js (renamed from cli/tests/node_compat/test/parallel/test-net-server-options.js)0
-rw-r--r--tests/node_compat/test/parallel/test-net-server-try-ports.js (renamed from cli/tests/node_compat/test/parallel/test-net-server-try-ports.js)0
-rw-r--r--tests/node_compat/test/parallel/test-net-server-unref-persistent.js (renamed from cli/tests/node_compat/test/parallel/test-net-server-unref-persistent.js)0
-rw-r--r--tests/node_compat/test/parallel/test-net-server-unref.js (renamed from cli/tests/node_compat/test/parallel/test-net-server-unref.js)0
-rw-r--r--tests/node_compat/test/parallel/test-net-socket-destroy-twice.js (renamed from cli/tests/node_compat/test/parallel/test-net-socket-destroy-twice.js)0
-rw-r--r--tests/node_compat/test/parallel/test-net-socket-no-halfopen-enforcer.js (renamed from cli/tests/node_compat/test/parallel/test-net-socket-no-halfopen-enforcer.js)0
-rw-r--r--tests/node_compat/test/parallel/test-net-socket-timeout.js (renamed from cli/tests/node_compat/test/parallel/test-net-socket-timeout.js)0
-rw-r--r--tests/node_compat/test/parallel/test-net-timeout-no-handle.js (renamed from cli/tests/node_compat/test/parallel/test-net-timeout-no-handle.js)0
-rw-r--r--tests/node_compat/test/parallel/test-net-write-arguments.js (renamed from cli/tests/node_compat/test/parallel/test-net-write-arguments.js)0
-rw-r--r--tests/node_compat/test/parallel/test-next-tick-doesnt-hang.js (renamed from cli/tests/node_compat/test/parallel/test-next-tick-doesnt-hang.js)0
-rw-r--r--tests/node_compat/test/parallel/test-next-tick-fixed-queue-regression.js (renamed from cli/tests/node_compat/test/parallel/test-next-tick-fixed-queue-regression.js)0
-rw-r--r--tests/node_compat/test/parallel/test-next-tick-intentional-starvation.js (renamed from cli/tests/node_compat/test/parallel/test-next-tick-intentional-starvation.js)0
-rw-r--r--tests/node_compat/test/parallel/test-next-tick-ordering.js (renamed from cli/tests/node_compat/test/parallel/test-next-tick-ordering.js)0
-rw-r--r--tests/node_compat/test/parallel/test-next-tick-ordering2.js (renamed from cli/tests/node_compat/test/parallel/test-next-tick-ordering2.js)0
-rw-r--r--tests/node_compat/test/parallel/test-next-tick-when-exiting.js (renamed from cli/tests/node_compat/test/parallel/test-next-tick-when-exiting.js)0
-rw-r--r--tests/node_compat/test/parallel/test-next-tick.js (renamed from cli/tests/node_compat/test/parallel/test-next-tick.js)0
-rw-r--r--tests/node_compat/test/parallel/test-nodeeventtarget.js (renamed from cli/tests/node_compat/test/parallel/test-nodeeventtarget.js)0
-rw-r--r--tests/node_compat/test/parallel/test-os.js (renamed from cli/tests/node_compat/test/parallel/test-os.js)0
-rw-r--r--tests/node_compat/test/parallel/test-outgoing-message-destroy.js (renamed from cli/tests/node_compat/test/parallel/test-outgoing-message-destroy.js)0
-rw-r--r--tests/node_compat/test/parallel/test-outgoing-message-pipe.js (renamed from cli/tests/node_compat/test/parallel/test-outgoing-message-pipe.js)0
-rw-r--r--tests/node_compat/test/parallel/test-parse-args.mjs (renamed from cli/tests/node_compat/test/parallel/test-parse-args.mjs)0
-rw-r--r--tests/node_compat/test/parallel/test-path-basename.js (renamed from cli/tests/node_compat/test/parallel/test-path-basename.js)0
-rw-r--r--tests/node_compat/test/parallel/test-path-dirname.js (renamed from cli/tests/node_compat/test/parallel/test-path-dirname.js)0
-rw-r--r--tests/node_compat/test/parallel/test-path-extname.js (renamed from cli/tests/node_compat/test/parallel/test-path-extname.js)0
-rw-r--r--tests/node_compat/test/parallel/test-path-isabsolute.js (renamed from cli/tests/node_compat/test/parallel/test-path-isabsolute.js)0
-rw-r--r--tests/node_compat/test/parallel/test-path-join.js (renamed from cli/tests/node_compat/test/parallel/test-path-join.js)0
-rw-r--r--tests/node_compat/test/parallel/test-path-makelong.js (renamed from cli/tests/node_compat/test/parallel/test-path-makelong.js)0
-rw-r--r--tests/node_compat/test/parallel/test-path-normalize.js (renamed from cli/tests/node_compat/test/parallel/test-path-normalize.js)0
-rw-r--r--tests/node_compat/test/parallel/test-path-parse-format.js (renamed from cli/tests/node_compat/test/parallel/test-path-parse-format.js)0
-rw-r--r--tests/node_compat/test/parallel/test-path-posix-exists.js (renamed from cli/tests/node_compat/test/parallel/test-path-posix-exists.js)0
-rw-r--r--tests/node_compat/test/parallel/test-path-relative.js (renamed from cli/tests/node_compat/test/parallel/test-path-relative.js)0
-rw-r--r--tests/node_compat/test/parallel/test-path-resolve.js (renamed from cli/tests/node_compat/test/parallel/test-path-resolve.js)0
-rw-r--r--tests/node_compat/test/parallel/test-path-win32-exists.js (renamed from cli/tests/node_compat/test/parallel/test-path-win32-exists.js)0
-rw-r--r--tests/node_compat/test/parallel/test-path-zero-length-strings.js (renamed from cli/tests/node_compat/test/parallel/test-path-zero-length-strings.js)0
-rw-r--r--tests/node_compat/test/parallel/test-path.js (renamed from cli/tests/node_compat/test/parallel/test-path.js)0
-rw-r--r--tests/node_compat/test/parallel/test-process-beforeexit.js (renamed from cli/tests/node_compat/test/parallel/test-process-beforeexit.js)0
-rw-r--r--tests/node_compat/test/parallel/test-process-binding-internalbinding-allowlist.js (renamed from cli/tests/node_compat/test/parallel/test-process-binding-internalbinding-allowlist.js)0
-rw-r--r--tests/node_compat/test/parallel/test-process-env-allowed-flags.js (renamed from cli/tests/node_compat/test/parallel/test-process-env-allowed-flags.js)0
-rw-r--r--tests/node_compat/test/parallel/test-process-exit-from-before-exit.js (renamed from cli/tests/node_compat/test/parallel/test-process-exit-from-before-exit.js)0
-rw-r--r--tests/node_compat/test/parallel/test-process-exit-handler.js (renamed from cli/tests/node_compat/test/parallel/test-process-exit-handler.js)0
-rw-r--r--tests/node_compat/test/parallel/test-process-exit-recursive.js (renamed from cli/tests/node_compat/test/parallel/test-process-exit-recursive.js)0
-rw-r--r--tests/node_compat/test/parallel/test-process-exit.js (renamed from cli/tests/node_compat/test/parallel/test-process-exit.js)0
-rw-r--r--tests/node_compat/test/parallel/test-process-kill-pid.js (renamed from cli/tests/node_compat/test/parallel/test-process-kill-pid.js)0
-rw-r--r--tests/node_compat/test/parallel/test-process-uptime.js (renamed from cli/tests/node_compat/test/parallel/test-process-uptime.js)0
-rw-r--r--tests/node_compat/test/parallel/test-promise-unhandled-silent.js (renamed from cli/tests/node_compat/test/parallel/test-promise-unhandled-silent.js)0
-rw-r--r--tests/node_compat/test/parallel/test-promise-unhandled-throw-handler.js (renamed from cli/tests/node_compat/test/parallel/test-promise-unhandled-throw-handler.js)0
-rw-r--r--tests/node_compat/test/parallel/test-querystring-escape.js (renamed from cli/tests/node_compat/test/parallel/test-querystring-escape.js)0
-rw-r--r--tests/node_compat/test/parallel/test-querystring-maxKeys-non-finite.js (renamed from cli/tests/node_compat/test/parallel/test-querystring-maxKeys-non-finite.js)0
-rw-r--r--tests/node_compat/test/parallel/test-querystring-multichar-separator.js (renamed from cli/tests/node_compat/test/parallel/test-querystring-multichar-separator.js)0
-rw-r--r--tests/node_compat/test/parallel/test-querystring.js (renamed from cli/tests/node_compat/test/parallel/test-querystring.js)0
-rw-r--r--tests/node_compat/test/parallel/test-readline-emit-keypress-events.js (renamed from cli/tests/node_compat/test/parallel/test-readline-emit-keypress-events.js)0
-rw-r--r--tests/node_compat/test/parallel/test-readline-interface-escapecodetimeout.js (renamed from cli/tests/node_compat/test/parallel/test-readline-interface-escapecodetimeout.js)0
-rw-r--r--tests/node_compat/test/parallel/test-readline-interface.js (renamed from cli/tests/node_compat/test/parallel/test-readline-interface.js)0
-rw-r--r--tests/node_compat/test/parallel/test-readline-keys.js (renamed from cli/tests/node_compat/test/parallel/test-readline-keys.js)0
-rw-r--r--tests/node_compat/test/parallel/test-readline-position.js (renamed from cli/tests/node_compat/test/parallel/test-readline-position.js)0
-rw-r--r--tests/node_compat/test/parallel/test-readline-reopen.js (renamed from cli/tests/node_compat/test/parallel/test-readline-reopen.js)0
-rw-r--r--tests/node_compat/test/parallel/test-readline-set-raw-mode.js (renamed from cli/tests/node_compat/test/parallel/test-readline-set-raw-mode.js)0
-rw-r--r--tests/node_compat/test/parallel/test-readline-undefined-columns.js (renamed from cli/tests/node_compat/test/parallel/test-readline-undefined-columns.js)0
-rw-r--r--tests/node_compat/test/parallel/test-readline.js (renamed from cli/tests/node_compat/test/parallel/test-readline.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stdin-from-file-spawn.js (renamed from cli/tests/node_compat/test/parallel/test-stdin-from-file-spawn.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream-add-abort-signal.js (renamed from cli/tests/node_compat/test/parallel/test-stream-add-abort-signal.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream-aliases-legacy.js (renamed from cli/tests/node_compat/test/parallel/test-stream-aliases-legacy.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream-auto-destroy.js (renamed from cli/tests/node_compat/test/parallel/test-stream-auto-destroy.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream-await-drain-writers-in-synchronously-recursion-write.js (renamed from cli/tests/node_compat/test/parallel/test-stream-await-drain-writers-in-synchronously-recursion-write.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream-backpressure.js (renamed from cli/tests/node_compat/test/parallel/test-stream-backpressure.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream-big-packet.js (renamed from cli/tests/node_compat/test/parallel/test-stream-big-packet.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream-big-push.js (renamed from cli/tests/node_compat/test/parallel/test-stream-big-push.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream-buffer-list.js (renamed from cli/tests/node_compat/test/parallel/test-stream-buffer-list.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream-construct.js (renamed from cli/tests/node_compat/test/parallel/test-stream-construct.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream-destroy-event-order.js (renamed from cli/tests/node_compat/test/parallel/test-stream-destroy-event-order.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream-duplex-destroy.js (renamed from cli/tests/node_compat/test/parallel/test-stream-duplex-destroy.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream-duplex-end.js (renamed from cli/tests/node_compat/test/parallel/test-stream-duplex-end.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream-duplex-from.js (renamed from cli/tests/node_compat/test/parallel/test-stream-duplex-from.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream-duplex-props.js (renamed from cli/tests/node_compat/test/parallel/test-stream-duplex-props.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream-duplex-readable-end.js (renamed from cli/tests/node_compat/test/parallel/test-stream-duplex-readable-end.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream-duplex-writable-finished.js (renamed from cli/tests/node_compat/test/parallel/test-stream-duplex-writable-finished.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream-duplex.js (renamed from cli/tests/node_compat/test/parallel/test-stream-duplex.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream-end-paused.js (renamed from cli/tests/node_compat/test/parallel/test-stream-end-paused.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream-error-once.js (renamed from cli/tests/node_compat/test/parallel/test-stream-error-once.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream-events-prepend.js (renamed from cli/tests/node_compat/test/parallel/test-stream-events-prepend.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream-inheritance.js (renamed from cli/tests/node_compat/test/parallel/test-stream-inheritance.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream-ispaused.js (renamed from cli/tests/node_compat/test/parallel/test-stream-ispaused.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream-objectmode-undefined.js (renamed from cli/tests/node_compat/test/parallel/test-stream-objectmode-undefined.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream-once-readable-pipe.js (renamed from cli/tests/node_compat/test/parallel/test-stream-once-readable-pipe.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream-pipe-after-end.js (renamed from cli/tests/node_compat/test/parallel/test-stream-pipe-after-end.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream-pipe-await-drain-manual-resume.js (renamed from cli/tests/node_compat/test/parallel/test-stream-pipe-await-drain-manual-resume.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream-pipe-await-drain-push-while-write.js (renamed from cli/tests/node_compat/test/parallel/test-stream-pipe-await-drain-push-while-write.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream-pipe-await-drain.js (renamed from cli/tests/node_compat/test/parallel/test-stream-pipe-await-drain.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream-pipe-cleanup-pause.js (renamed from cli/tests/node_compat/test/parallel/test-stream-pipe-cleanup-pause.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream-pipe-cleanup.js (renamed from cli/tests/node_compat/test/parallel/test-stream-pipe-cleanup.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream-pipe-error-handling.js (renamed from cli/tests/node_compat/test/parallel/test-stream-pipe-error-handling.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream-pipe-event.js (renamed from cli/tests/node_compat/test/parallel/test-stream-pipe-event.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream-pipe-flow-after-unpipe.js (renamed from cli/tests/node_compat/test/parallel/test-stream-pipe-flow-after-unpipe.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream-pipe-flow.js (renamed from cli/tests/node_compat/test/parallel/test-stream-pipe-flow.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream-pipe-manual-resume.js (renamed from cli/tests/node_compat/test/parallel/test-stream-pipe-manual-resume.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream-pipe-multiple-pipes.js (renamed from cli/tests/node_compat/test/parallel/test-stream-pipe-multiple-pipes.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream-pipe-needDrain.js (renamed from cli/tests/node_compat/test/parallel/test-stream-pipe-needDrain.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream-pipe-same-destination-twice.js (renamed from cli/tests/node_compat/test/parallel/test-stream-pipe-same-destination-twice.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream-pipe-unpipe-streams.js (renamed from cli/tests/node_compat/test/parallel/test-stream-pipe-unpipe-streams.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream-pipe-without-listenerCount.js (renamed from cli/tests/node_compat/test/parallel/test-stream-pipe-without-listenerCount.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream-pipeline-async-iterator.js (renamed from cli/tests/node_compat/test/parallel/test-stream-pipeline-async-iterator.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream-pipeline-queued-end-in-destroy.js (renamed from cli/tests/node_compat/test/parallel/test-stream-pipeline-queued-end-in-destroy.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream-pipeline-with-empty-string.js (renamed from cli/tests/node_compat/test/parallel/test-stream-pipeline-with-empty-string.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream-push-strings.js (renamed from cli/tests/node_compat/test/parallel/test-stream-push-strings.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream-readable-aborted.js (renamed from cli/tests/node_compat/test/parallel/test-stream-readable-aborted.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream-readable-add-chunk-during-data.js (renamed from cli/tests/node_compat/test/parallel/test-stream-readable-add-chunk-during-data.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream-readable-constructor-set-methods.js (renamed from cli/tests/node_compat/test/parallel/test-stream-readable-constructor-set-methods.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream-readable-data.js (renamed from cli/tests/node_compat/test/parallel/test-stream-readable-data.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream-readable-destroy.js (renamed from cli/tests/node_compat/test/parallel/test-stream-readable-destroy.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream-readable-didRead.js (renamed from cli/tests/node_compat/test/parallel/test-stream-readable-didRead.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream-readable-emit-readable-short-stream.js (renamed from cli/tests/node_compat/test/parallel/test-stream-readable-emit-readable-short-stream.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream-readable-emittedReadable.js (renamed from cli/tests/node_compat/test/parallel/test-stream-readable-emittedReadable.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream-readable-end-destroyed.js (renamed from cli/tests/node_compat/test/parallel/test-stream-readable-end-destroyed.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream-readable-ended.js (renamed from cli/tests/node_compat/test/parallel/test-stream-readable-ended.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream-readable-error-end.js (renamed from cli/tests/node_compat/test/parallel/test-stream-readable-error-end.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream-readable-event.js (renamed from cli/tests/node_compat/test/parallel/test-stream-readable-event.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream-readable-flow-recursion.js (renamed from cli/tests/node_compat/test/parallel/test-stream-readable-flow-recursion.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream-readable-hwm-0-async.js (renamed from cli/tests/node_compat/test/parallel/test-stream-readable-hwm-0-async.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream-readable-hwm-0-no-flow-data.js (renamed from cli/tests/node_compat/test/parallel/test-stream-readable-hwm-0-no-flow-data.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream-readable-hwm-0.js (renamed from cli/tests/node_compat/test/parallel/test-stream-readable-hwm-0.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream-readable-infinite-read.js (renamed from cli/tests/node_compat/test/parallel/test-stream-readable-infinite-read.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream-readable-invalid-chunk.js (renamed from cli/tests/node_compat/test/parallel/test-stream-readable-invalid-chunk.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream-readable-needReadable.js (renamed from cli/tests/node_compat/test/parallel/test-stream-readable-needReadable.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream-readable-next-no-null.js (renamed from cli/tests/node_compat/test/parallel/test-stream-readable-next-no-null.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream-readable-no-unneeded-readable.js (renamed from cli/tests/node_compat/test/parallel/test-stream-readable-no-unneeded-readable.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream-readable-object-multi-push-async.js (renamed from cli/tests/node_compat/test/parallel/test-stream-readable-object-multi-push-async.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream-readable-pause-and-resume.js (renamed from cli/tests/node_compat/test/parallel/test-stream-readable-pause-and-resume.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream-readable-readable-then-resume.js (renamed from cli/tests/node_compat/test/parallel/test-stream-readable-readable-then-resume.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream-readable-readable.js (renamed from cli/tests/node_compat/test/parallel/test-stream-readable-readable.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream-readable-reading-readingMore.js (renamed from cli/tests/node_compat/test/parallel/test-stream-readable-reading-readingMore.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream-readable-resume-hwm.js (renamed from cli/tests/node_compat/test/parallel/test-stream-readable-resume-hwm.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream-readable-resumeScheduled.js (renamed from cli/tests/node_compat/test/parallel/test-stream-readable-resumeScheduled.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream-readable-setEncoding-existing-buffers.js (renamed from cli/tests/node_compat/test/parallel/test-stream-readable-setEncoding-existing-buffers.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream-readable-setEncoding-null.js (renamed from cli/tests/node_compat/test/parallel/test-stream-readable-setEncoding-null.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream-readable-unshift.js (renamed from cli/tests/node_compat/test/parallel/test-stream-readable-unshift.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream-readable-with-unimplemented-_read.js (renamed from cli/tests/node_compat/test/parallel/test-stream-readable-with-unimplemented-_read.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream-readableListening-state.js (renamed from cli/tests/node_compat/test/parallel/test-stream-readableListening-state.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream-transform-callback-twice.js (renamed from cli/tests/node_compat/test/parallel/test-stream-transform-callback-twice.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream-transform-constructor-set-methods.js (renamed from cli/tests/node_compat/test/parallel/test-stream-transform-constructor-set-methods.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream-transform-destroy.js (renamed from cli/tests/node_compat/test/parallel/test-stream-transform-destroy.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream-transform-final-sync.js (renamed from cli/tests/node_compat/test/parallel/test-stream-transform-final-sync.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream-transform-final.js (renamed from cli/tests/node_compat/test/parallel/test-stream-transform-final.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream-transform-flush-data.js (renamed from cli/tests/node_compat/test/parallel/test-stream-transform-flush-data.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream-transform-objectmode-falsey-value.js (renamed from cli/tests/node_compat/test/parallel/test-stream-transform-objectmode-falsey-value.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream-transform-split-highwatermark.js (renamed from cli/tests/node_compat/test/parallel/test-stream-transform-split-highwatermark.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream-transform-split-objectmode.js (renamed from cli/tests/node_compat/test/parallel/test-stream-transform-split-objectmode.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream-uint8array.js (renamed from cli/tests/node_compat/test/parallel/test-stream-uint8array.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream-unpipe-event.js (renamed from cli/tests/node_compat/test/parallel/test-stream-unpipe-event.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream-unshift-empty-chunk.js (renamed from cli/tests/node_compat/test/parallel/test-stream-unshift-empty-chunk.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream-unshift-read-race.js (renamed from cli/tests/node_compat/test/parallel/test-stream-unshift-read-race.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream-writable-change-default-encoding.js (renamed from cli/tests/node_compat/test/parallel/test-stream-writable-change-default-encoding.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream-writable-clear-buffer.js (renamed from cli/tests/node_compat/test/parallel/test-stream-writable-clear-buffer.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream-writable-constructor-set-methods.js (renamed from cli/tests/node_compat/test/parallel/test-stream-writable-constructor-set-methods.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream-writable-decoded-encoding.js (renamed from cli/tests/node_compat/test/parallel/test-stream-writable-decoded-encoding.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream-writable-destroy.js (renamed from cli/tests/node_compat/test/parallel/test-stream-writable-destroy.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream-writable-end-cb-error.js (renamed from cli/tests/node_compat/test/parallel/test-stream-writable-end-cb-error.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream-writable-end-multiple.js (renamed from cli/tests/node_compat/test/parallel/test-stream-writable-end-multiple.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream-writable-ended-state.js (renamed from cli/tests/node_compat/test/parallel/test-stream-writable-ended-state.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream-writable-finish-destroyed.js (renamed from cli/tests/node_compat/test/parallel/test-stream-writable-finish-destroyed.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream-writable-finished-state.js (renamed from cli/tests/node_compat/test/parallel/test-stream-writable-finished-state.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream-writable-finished.js (renamed from cli/tests/node_compat/test/parallel/test-stream-writable-finished.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream-writable-invalid-chunk.js (renamed from cli/tests/node_compat/test/parallel/test-stream-writable-invalid-chunk.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream-writable-needdrain-state.js (renamed from cli/tests/node_compat/test/parallel/test-stream-writable-needdrain-state.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream-writable-null.js (renamed from cli/tests/node_compat/test/parallel/test-stream-writable-null.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream-writable-properties.js (renamed from cli/tests/node_compat/test/parallel/test-stream-writable-properties.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream-writable-writable.js (renamed from cli/tests/node_compat/test/parallel/test-stream-writable-writable.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream-writable-write-cb-error.js (renamed from cli/tests/node_compat/test/parallel/test-stream-writable-write-cb-error.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream-writable-write-cb-twice.js (renamed from cli/tests/node_compat/test/parallel/test-stream-writable-write-cb-twice.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream-writable-write-error.js (renamed from cli/tests/node_compat/test/parallel/test-stream-writable-write-error.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream-writable-write-writev-finish.js (renamed from cli/tests/node_compat/test/parallel/test-stream-writable-write-writev-finish.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream-writableState-ending.js (renamed from cli/tests/node_compat/test/parallel/test-stream-writableState-ending.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream-writableState-uncorked-bufferedRequestCount.js (renamed from cli/tests/node_compat/test/parallel/test-stream-writableState-uncorked-bufferedRequestCount.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream-write-destroy.js (renamed from cli/tests/node_compat/test/parallel/test-stream-write-destroy.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream-write-drain.js (renamed from cli/tests/node_compat/test/parallel/test-stream-write-drain.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream-write-final.js (renamed from cli/tests/node_compat/test/parallel/test-stream-write-final.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream-writev.js (renamed from cli/tests/node_compat/test/parallel/test-stream-writev.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream2-base64-single-char-read-end.js (renamed from cli/tests/node_compat/test/parallel/test-stream2-base64-single-char-read-end.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream2-basic.js (renamed from cli/tests/node_compat/test/parallel/test-stream2-basic.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream2-compatibility.js (renamed from cli/tests/node_compat/test/parallel/test-stream2-compatibility.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream2-decode-partial.js (renamed from cli/tests/node_compat/test/parallel/test-stream2-decode-partial.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream2-finish-pipe.js (renamed from cli/tests/node_compat/test/parallel/test-stream2-finish-pipe.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream2-large-read-stall.js (renamed from cli/tests/node_compat/test/parallel/test-stream2-large-read-stall.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream2-objects.js (renamed from cli/tests/node_compat/test/parallel/test-stream2-objects.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream2-pipe-error-handling.js (renamed from cli/tests/node_compat/test/parallel/test-stream2-pipe-error-handling.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream2-pipe-error-once-listener.js (renamed from cli/tests/node_compat/test/parallel/test-stream2-pipe-error-once-listener.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream2-push.js (renamed from cli/tests/node_compat/test/parallel/test-stream2-push.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream2-read-sync-stack.js (renamed from cli/tests/node_compat/test/parallel/test-stream2-read-sync-stack.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream2-readable-empty-buffer-no-eof.js (renamed from cli/tests/node_compat/test/parallel/test-stream2-readable-empty-buffer-no-eof.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream2-readable-from-list.js (renamed from cli/tests/node_compat/test/parallel/test-stream2-readable-from-list.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream2-readable-legacy-drain.js (renamed from cli/tests/node_compat/test/parallel/test-stream2-readable-legacy-drain.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream2-readable-non-empty-end.js (renamed from cli/tests/node_compat/test/parallel/test-stream2-readable-non-empty-end.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream2-readable-wrap-destroy.js (renamed from cli/tests/node_compat/test/parallel/test-stream2-readable-wrap-destroy.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream2-readable-wrap-empty.js (renamed from cli/tests/node_compat/test/parallel/test-stream2-readable-wrap-empty.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream2-readable-wrap-error.js (renamed from cli/tests/node_compat/test/parallel/test-stream2-readable-wrap-error.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream2-readable-wrap.js (renamed from cli/tests/node_compat/test/parallel/test-stream2-readable-wrap.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream2-set-encoding.js (renamed from cli/tests/node_compat/test/parallel/test-stream2-set-encoding.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream2-transform.js (renamed from cli/tests/node_compat/test/parallel/test-stream2-transform.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream2-unpipe-drain.js (renamed from cli/tests/node_compat/test/parallel/test-stream2-unpipe-drain.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream2-unpipe-leak.js (renamed from cli/tests/node_compat/test/parallel/test-stream2-unpipe-leak.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream2-writable.js (renamed from cli/tests/node_compat/test/parallel/test-stream2-writable.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream3-cork-end.js (renamed from cli/tests/node_compat/test/parallel/test-stream3-cork-end.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream3-cork-uncork.js (renamed from cli/tests/node_compat/test/parallel/test-stream3-cork-uncork.js)0
-rw-r--r--tests/node_compat/test/parallel/test-stream3-pause-then-read.js (renamed from cli/tests/node_compat/test/parallel/test-stream3-pause-then-read.js)0
-rw-r--r--tests/node_compat/test/parallel/test-streams-highwatermark.js (renamed from cli/tests/node_compat/test/parallel/test-streams-highwatermark.js)0
-rw-r--r--tests/node_compat/test/parallel/test-timers-api-refs.js (renamed from cli/tests/node_compat/test/parallel/test-timers-api-refs.js)0
-rw-r--r--tests/node_compat/test/parallel/test-timers-args.js (renamed from cli/tests/node_compat/test/parallel/test-timers-args.js)0
-rw-r--r--tests/node_compat/test/parallel/test-timers-clear-null-does-not-throw-error.js (renamed from cli/tests/node_compat/test/parallel/test-timers-clear-null-does-not-throw-error.js)0
-rw-r--r--tests/node_compat/test/parallel/test-timers-clear-object-does-not-throw-error.js (renamed from cli/tests/node_compat/test/parallel/test-timers-clear-object-does-not-throw-error.js)0
-rw-r--r--tests/node_compat/test/parallel/test-timers-clear-timeout-interval-equivalent.js (renamed from cli/tests/node_compat/test/parallel/test-timers-clear-timeout-interval-equivalent.js)0
-rw-r--r--tests/node_compat/test/parallel/test-timers-clearImmediate.js (renamed from cli/tests/node_compat/test/parallel/test-timers-clearImmediate.js)0
-rw-r--r--tests/node_compat/test/parallel/test-timers-interval-throw.js (renamed from cli/tests/node_compat/test/parallel/test-timers-interval-throw.js)0
-rw-r--r--tests/node_compat/test/parallel/test-timers-non-integer-delay.js (renamed from cli/tests/node_compat/test/parallel/test-timers-non-integer-delay.js)0
-rw-r--r--tests/node_compat/test/parallel/test-timers-refresh.js (renamed from cli/tests/node_compat/test/parallel/test-timers-refresh.js)0
-rw-r--r--tests/node_compat/test/parallel/test-timers-same-timeout-wrong-list-deleted.js (renamed from cli/tests/node_compat/test/parallel/test-timers-same-timeout-wrong-list-deleted.js)0
-rw-r--r--tests/node_compat/test/parallel/test-timers-timeout-with-non-integer.js (renamed from cli/tests/node_compat/test/parallel/test-timers-timeout-with-non-integer.js)0
-rw-r--r--tests/node_compat/test/parallel/test-timers-uncaught-exception.js (renamed from cli/tests/node_compat/test/parallel/test-timers-uncaught-exception.js)0
-rw-r--r--tests/node_compat/test/parallel/test-timers-unref-throw-then-ref.js (renamed from cli/tests/node_compat/test/parallel/test-timers-unref-throw-then-ref.js)0
-rw-r--r--tests/node_compat/test/parallel/test-timers-user-call.js (renamed from cli/tests/node_compat/test/parallel/test-timers-user-call.js)0
-rw-r--r--tests/node_compat/test/parallel/test-timers-zero-timeout.js (renamed from cli/tests/node_compat/test/parallel/test-timers-zero-timeout.js)0
-rw-r--r--tests/node_compat/test/parallel/test-tty-stdin-end.js (renamed from cli/tests/node_compat/test/parallel/test-tty-stdin-end.js)0
-rw-r--r--tests/node_compat/test/parallel/test-ttywrap-invalid-fd.js (renamed from cli/tests/node_compat/test/parallel/test-ttywrap-invalid-fd.js)0
-rw-r--r--tests/node_compat/test/parallel/test-url-domain-ascii-unicode.js (renamed from cli/tests/node_compat/test/parallel/test-url-domain-ascii-unicode.js)0
-rw-r--r--tests/node_compat/test/parallel/test-url-fileurltopath.js (renamed from cli/tests/node_compat/test/parallel/test-url-fileurltopath.js)0
-rw-r--r--tests/node_compat/test/parallel/test-url-format-invalid-input.js (renamed from cli/tests/node_compat/test/parallel/test-url-format-invalid-input.js)0
-rw-r--r--tests/node_compat/test/parallel/test-url-format-whatwg.js (renamed from cli/tests/node_compat/test/parallel/test-url-format-whatwg.js)0
-rw-r--r--tests/node_compat/test/parallel/test-url-format.js (renamed from cli/tests/node_compat/test/parallel/test-url-format.js)0
-rw-r--r--tests/node_compat/test/parallel/test-url-parse-invalid-input.js (renamed from cli/tests/node_compat/test/parallel/test-url-parse-invalid-input.js)0
-rw-r--r--tests/node_compat/test/parallel/test-url-parse-query.js (renamed from cli/tests/node_compat/test/parallel/test-url-parse-query.js)0
-rw-r--r--tests/node_compat/test/parallel/test-url-pathtofileurl.js (renamed from cli/tests/node_compat/test/parallel/test-url-pathtofileurl.js)0
-rw-r--r--tests/node_compat/test/parallel/test-url-relative.js (renamed from cli/tests/node_compat/test/parallel/test-url-relative.js)0
-rw-r--r--tests/node_compat/test/parallel/test-url-urltooptions.js (renamed from cli/tests/node_compat/test/parallel/test-url-urltooptions.js)0
-rw-r--r--tests/node_compat/test/parallel/test-util-deprecate-invalid-code.js (renamed from cli/tests/node_compat/test/parallel/test-util-deprecate-invalid-code.js)0
-rw-r--r--tests/node_compat/test/parallel/test-util-deprecate.js (renamed from cli/tests/node_compat/test/parallel/test-util-deprecate.js)0
-rw-r--r--tests/node_compat/test/parallel/test-util-format.js (renamed from cli/tests/node_compat/test/parallel/test-util-format.js)0
-rw-r--r--tests/node_compat/test/parallel/test-util-inherits.js (renamed from cli/tests/node_compat/test/parallel/test-util-inherits.js)0
-rw-r--r--tests/node_compat/test/parallel/test-util-inspect-long-running.js (renamed from cli/tests/node_compat/test/parallel/test-util-inspect-long-running.js)0
-rw-r--r--tests/node_compat/test/parallel/test-util-inspect-namespace.js (renamed from cli/tests/node_compat/test/parallel/test-util-inspect-namespace.js)0
-rw-r--r--tests/node_compat/test/parallel/test-util-inspect-proxy.js (renamed from cli/tests/node_compat/test/parallel/test-util-inspect-proxy.js)0
-rw-r--r--tests/node_compat/test/parallel/test-util-inspect.js (renamed from cli/tests/node_compat/test/parallel/test-util-inspect.js)0
-rw-r--r--tests/node_compat/test/parallel/test-util-isDeepStrictEqual.js (renamed from cli/tests/node_compat/test/parallel/test-util-isDeepStrictEqual.js)0
-rw-r--r--tests/node_compat/test/parallel/test-util-promisify.js (renamed from cli/tests/node_compat/test/parallel/test-util-promisify.js)0
-rw-r--r--tests/node_compat/test/parallel/test-util-types-exists.js (renamed from cli/tests/node_compat/test/parallel/test-util-types-exists.js)0
-rw-r--r--tests/node_compat/test/parallel/test-util-types.js (renamed from cli/tests/node_compat/test/parallel/test-util-types.js)0
-rw-r--r--tests/node_compat/test/parallel/test-util.js (renamed from cli/tests/node_compat/test/parallel/test-util.js)0
-rw-r--r--tests/node_compat/test/parallel/test-vm-new-script-this-context.js (renamed from cli/tests/node_compat/test/parallel/test-vm-new-script-this-context.js)0
-rw-r--r--tests/node_compat/test/parallel/test-vm-static-this.js (renamed from cli/tests/node_compat/test/parallel/test-vm-static-this.js)0
-rw-r--r--tests/node_compat/test/parallel/test-webcrypto-sign-verify.js (renamed from cli/tests/node_compat/test/parallel/test-webcrypto-sign-verify.js)0
-rw-r--r--tests/node_compat/test/parallel/test-whatwg-encoding-custom-api-basics.js (renamed from cli/tests/node_compat/test/parallel/test-whatwg-encoding-custom-api-basics.js)0
-rw-r--r--tests/node_compat/test/parallel/test-whatwg-encoding-custom-textdecoder-ignorebom.js (renamed from cli/tests/node_compat/test/parallel/test-whatwg-encoding-custom-textdecoder-ignorebom.js)0
-rw-r--r--tests/node_compat/test/parallel/test-whatwg-encoding-custom-textdecoder-streaming.js (renamed from cli/tests/node_compat/test/parallel/test-whatwg-encoding-custom-textdecoder-streaming.js)0
-rw-r--r--tests/node_compat/test/parallel/test-whatwg-events-add-event-listener-options-passive.js (renamed from cli/tests/node_compat/test/parallel/test-whatwg-events-add-event-listener-options-passive.js)0
-rw-r--r--tests/node_compat/test/parallel/test-whatwg-events-add-event-listener-options-signal.js (renamed from cli/tests/node_compat/test/parallel/test-whatwg-events-add-event-listener-options-signal.js)0
-rw-r--r--tests/node_compat/test/parallel/test-whatwg-events-customevent.js (renamed from cli/tests/node_compat/test/parallel/test-whatwg-events-customevent.js)0
-rw-r--r--tests/node_compat/test/parallel/test-whatwg-url-custom-deepequal.js (renamed from cli/tests/node_compat/test/parallel/test-whatwg-url-custom-deepequal.js)0
-rw-r--r--tests/node_compat/test/parallel/test-whatwg-url-custom-global.js (renamed from cli/tests/node_compat/test/parallel/test-whatwg-url-custom-global.js)0
-rw-r--r--tests/node_compat/test/parallel/test-whatwg-url-custom-href-side-effect.js (renamed from cli/tests/node_compat/test/parallel/test-whatwg-url-custom-href-side-effect.js)0
-rw-r--r--tests/node_compat/test/parallel/test-whatwg-url-custom-tostringtag.js (renamed from cli/tests/node_compat/test/parallel/test-whatwg-url-custom-tostringtag.js)0
-rw-r--r--tests/node_compat/test/parallel/test-whatwg-url-override-hostname.js (renamed from cli/tests/node_compat/test/parallel/test-whatwg-url-override-hostname.js)0
-rw-r--r--tests/node_compat/test/parallel/test-whatwg-url-properties.js (renamed from cli/tests/node_compat/test/parallel/test-whatwg-url-properties.js)0
-rw-r--r--tests/node_compat/test/parallel/test-zlib-close-after-error.js (renamed from cli/tests/node_compat/test/parallel/test-zlib-close-after-error.js)0
-rw-r--r--tests/node_compat/test/parallel/test-zlib-close-after-write.js (renamed from cli/tests/node_compat/test/parallel/test-zlib-close-after-write.js)0
-rw-r--r--tests/node_compat/test/parallel/test-zlib-convenience-methods.js (renamed from cli/tests/node_compat/test/parallel/test-zlib-convenience-methods.js)0
-rw-r--r--tests/node_compat/test/parallel/test-zlib-deflate-raw-inherits.js (renamed from cli/tests/node_compat/test/parallel/test-zlib-deflate-raw-inherits.js)0
-rw-r--r--tests/node_compat/test/parallel/test-zlib-destroy-pipe.js (renamed from cli/tests/node_compat/test/parallel/test-zlib-destroy-pipe.js)0
-rw-r--r--tests/node_compat/test/parallel/test-zlib-empty-buffer.js (renamed from cli/tests/node_compat/test/parallel/test-zlib-empty-buffer.js)0
-rw-r--r--tests/node_compat/test/parallel/test-zlib-from-string.js (renamed from cli/tests/node_compat/test/parallel/test-zlib-from-string.js)0
-rw-r--r--tests/node_compat/test/parallel/test-zlib-invalid-input.js (renamed from cli/tests/node_compat/test/parallel/test-zlib-invalid-input.js)0
-rw-r--r--tests/node_compat/test/parallel/test-zlib-no-stream.js (renamed from cli/tests/node_compat/test/parallel/test-zlib-no-stream.js)0
-rw-r--r--tests/node_compat/test/parallel/test-zlib-random-byte-pipes.js (renamed from cli/tests/node_compat/test/parallel/test-zlib-random-byte-pipes.js)0
-rw-r--r--tests/node_compat/test/parallel/test-zlib-sync-no-event.js (renamed from cli/tests/node_compat/test/parallel/test-zlib-sync-no-event.js)0
-rw-r--r--tests/node_compat/test/parallel/test-zlib-truncated.js (renamed from cli/tests/node_compat/test/parallel/test-zlib-truncated.js)0
-rw-r--r--tests/node_compat/test/parallel/test-zlib-unzip-one-byte-chunks.js (renamed from cli/tests/node_compat/test/parallel/test-zlib-unzip-one-byte-chunks.js)0
-rw-r--r--tests/node_compat/test/parallel/test-zlib-write-after-end.js (renamed from cli/tests/node_compat/test/parallel/test-zlib-write-after-end.js)0
-rw-r--r--tests/node_compat/test/parallel/test-zlib-write-after-flush.js (renamed from cli/tests/node_compat/test/parallel/test-zlib-write-after-flush.js)0
-rw-r--r--tests/node_compat/test/parallel/test-zlib-zero-byte.js (renamed from cli/tests/node_compat/test/parallel/test-zlib-zero-byte.js)0
-rw-r--r--tests/node_compat/test/parallel/test-zlib-zero-windowBits.js (renamed from cli/tests/node_compat/test/parallel/test-zlib-zero-windowBits.js)0
-rw-r--r--tests/node_compat/test/pseudo-tty/console-dumb-tty.js (renamed from cli/tests/node_compat/test/pseudo-tty/console-dumb-tty.js)0
-rw-r--r--tests/node_compat/test/pseudo-tty/console_colors.js (renamed from cli/tests/node_compat/test/pseudo-tty/console_colors.js)0
-rw-r--r--tests/node_compat/test/pseudo-tty/no_dropped_stdio.js (renamed from cli/tests/node_compat/test/pseudo-tty/no_dropped_stdio.js)0
-rw-r--r--tests/node_compat/test/pseudo-tty/no_interleaved_stdio.js (renamed from cli/tests/node_compat/test/pseudo-tty/no_interleaved_stdio.js)0
-rw-r--r--tests/node_compat/test/pseudo-tty/package.json (renamed from cli/tests/node_compat/test/pseudo-tty/package.json)0
-rw-r--r--tests/node_compat/test/pseudo-tty/test-tty-color-support-warning-2.js (renamed from cli/tests/node_compat/test/pseudo-tty/test-tty-color-support-warning-2.js)0
-rw-r--r--tests/node_compat/test/pseudo-tty/test-tty-color-support-warning.js (renamed from cli/tests/node_compat/test/pseudo-tty/test-tty-color-support-warning.js)0
-rw-r--r--tests/node_compat/test/pseudo-tty/test-tty-stdin-end.js (renamed from cli/tests/node_compat/test/pseudo-tty/test-tty-stdin-end.js)0
-rw-r--r--tests/node_compat/test/pseudo-tty/test-tty-stdout-end.js (renamed from cli/tests/node_compat/test/pseudo-tty/test-tty-stdout-end.js)0
-rw-r--r--tests/node_compat/test/pummel/package.json (renamed from cli/tests/node_compat/test/pummel/package.json)0
-rw-r--r--tests/node_compat/test/sequential/package.json (renamed from cli/tests/node_compat/test/sequential/package.json)0
-rw-r--r--tests/node_compat/test/sequential/test-child-process-exit.js (renamed from cli/tests/node_compat/test/sequential/test-child-process-exit.js)0
-rw-r--r--tests/testdata/allow_run_allowlist_resolution.ts (renamed from cli/tests/testdata/allow_run_allowlist_resolution.ts)0
-rw-r--r--tests/testdata/allow_run_allowlist_resolution.ts.out (renamed from cli/tests/testdata/allow_run_allowlist_resolution.ts.out)0
-rw-r--r--tests/testdata/assets/DenoWinRunner.cs (renamed from cli/tests/testdata/assets/DenoWinRunner.cs)0
-rw-r--r--tests/testdata/assets/DenoWinRunner.ps1 (renamed from cli/tests/testdata/assets/DenoWinRunner.ps1)0
-rw-r--r--tests/testdata/assets/deno_dom_0.1.3-alpha2.wasm (renamed from cli/tests/testdata/assets/deno_dom_0.1.3-alpha2.wasm)bin616631 -> 616631 bytes
-rw-r--r--tests/testdata/assets/fixture.json (renamed from cli/tests/testdata/assets/fixture.json)0
-rw-r--r--tests/testdata/assets/hello.txt (renamed from cli/tests/testdata/assets/hello.txt)0
-rw-r--r--tests/testdata/assets/lock_target.txt (renamed from cli/tests/testdata/assets/lock_target.txt)0
-rw-r--r--tests/testdata/assets/unreachable.wasm (renamed from cli/tests/testdata/assets/unreachable.wasm)bin42 -> 42 bytes
-rw-r--r--tests/testdata/bench/allow_all.out (renamed from cli/tests/testdata/bench/allow_all.out)0
-rw-r--r--tests/testdata/bench/allow_all.ts43
-rw-r--r--tests/testdata/bench/allow_none.out (renamed from cli/tests/testdata/bench/allow_none.out)0
-rw-r--r--tests/testdata/bench/allow_none.ts23
-rw-r--r--tests/testdata/bench/before_unload_prevent_default.out (renamed from cli/tests/testdata/bench/before_unload_prevent_default.out)0
-rw-r--r--tests/testdata/bench/before_unload_prevent_default.ts (renamed from cli/tests/testdata/bench/before_unload_prevent_default.ts)0
-rw-r--r--tests/testdata/bench/bench_formatting.out (renamed from cli/tests/testdata/bench/bench_formatting.out)0
-rw-r--r--tests/testdata/bench/bench_formatting.ts (renamed from cli/tests/testdata/bench/bench_formatting.ts)0
-rw-r--r--tests/testdata/bench/check_local_by_default.out (renamed from cli/tests/testdata/bench/check_local_by_default.out)0
-rw-r--r--tests/testdata/bench/check_local_by_default.ts (renamed from cli/tests/testdata/bench/check_local_by_default.ts)0
-rw-r--r--tests/testdata/bench/check_local_by_default2.out (renamed from cli/tests/testdata/bench/check_local_by_default2.out)0
-rw-r--r--tests/testdata/bench/check_local_by_default2.ts (renamed from cli/tests/testdata/bench/check_local_by_default2.ts)0
-rw-r--r--tests/testdata/bench/clear_timeout.out (renamed from cli/tests/testdata/bench/clear_timeout.out)0
-rw-r--r--tests/testdata/bench/clear_timeout.ts (renamed from cli/tests/testdata/bench/clear_timeout.ts)0
-rw-r--r--tests/testdata/bench/collect.out (renamed from cli/tests/testdata/bench/collect.out)0
-rw-r--r--tests/testdata/bench/collect/bench.ts (renamed from cli/tests/testdata/bench/collect/bench.ts)0
-rw-r--r--tests/testdata/bench/collect/deno.jsonc (renamed from cli/tests/testdata/bench/collect/deno.jsonc)0
-rw-r--r--tests/testdata/bench/collect/deno.malformed.jsonc (renamed from cli/tests/testdata/bench/collect/deno.malformed.jsonc)0
-rw-r--r--tests/testdata/bench/collect/deno2.jsonc (renamed from cli/tests/testdata/bench/collect/deno2.jsonc)0
-rw-r--r--tests/testdata/bench/collect/ignore/bench.ts (renamed from cli/tests/testdata/bench/collect/ignore/bench.ts)0
-rw-r--r--tests/testdata/bench/collect/include/2_bench.ts (renamed from cli/tests/testdata/bench/collect/include/2_bench.ts)0
-rw-r--r--tests/testdata/bench/collect/include/bench.ts (renamed from cli/tests/testdata/bench/collect/include/bench.ts)0
-rw-r--r--tests/testdata/bench/collect2.out (renamed from cli/tests/testdata/bench/collect2.out)0
-rw-r--r--tests/testdata/bench/collect_with_malformed_config.out (renamed from cli/tests/testdata/bench/collect_with_malformed_config.out)0
-rw-r--r--tests/testdata/bench/exit_sanitizer.out (renamed from cli/tests/testdata/bench/exit_sanitizer.out)0
-rw-r--r--tests/testdata/bench/exit_sanitizer.ts (renamed from cli/tests/testdata/bench/exit_sanitizer.ts)0
-rw-r--r--tests/testdata/bench/explicit_start_and_end.out (renamed from cli/tests/testdata/bench/explicit_start_and_end.out)0
-rw-r--r--tests/testdata/bench/explicit_start_and_end.ts (renamed from cli/tests/testdata/bench/explicit_start_and_end.ts)0
-rw-r--r--tests/testdata/bench/explicit_start_and_end_low_precision.out (renamed from cli/tests/testdata/bench/explicit_start_and_end_low_precision.out)0
-rw-r--r--tests/testdata/bench/explicit_start_and_end_low_precision.ts (renamed from cli/tests/testdata/bench/explicit_start_and_end_low_precision.ts)0
-rw-r--r--tests/testdata/bench/fail.out (renamed from cli/tests/testdata/bench/fail.out)0
-rw-r--r--tests/testdata/bench/fail.ts (renamed from cli/tests/testdata/bench/fail.ts)0
-rw-r--r--tests/testdata/bench/file_protocol.out (renamed from cli/tests/testdata/bench/file_protocol.out)0
-rw-r--r--tests/testdata/bench/file_protocol.ts (renamed from cli/tests/testdata/bench/file_protocol.ts)0
-rw-r--r--tests/testdata/bench/filter.out (renamed from cli/tests/testdata/bench/filter.out)0
-rw-r--r--tests/testdata/bench/filter/a_bench.ts (renamed from cli/tests/testdata/bench/filter/a_bench.ts)0
-rw-r--r--tests/testdata/bench/filter/b_bench.ts (renamed from cli/tests/testdata/bench/filter/b_bench.ts)0
-rw-r--r--tests/testdata/bench/filter/c_bench.ts (renamed from cli/tests/testdata/bench/filter/c_bench.ts)0
-rw-r--r--tests/testdata/bench/finally_timeout.out (renamed from cli/tests/testdata/bench/finally_timeout.out)0
-rw-r--r--tests/testdata/bench/finally_timeout.ts (renamed from cli/tests/testdata/bench/finally_timeout.ts)0
-rw-r--r--tests/testdata/bench/group_baseline.out (renamed from cli/tests/testdata/bench/group_baseline.out)0
-rw-r--r--tests/testdata/bench/group_baseline.ts (renamed from cli/tests/testdata/bench/group_baseline.ts)0
-rw-r--r--tests/testdata/bench/ignore.out (renamed from cli/tests/testdata/bench/ignore.out)0
-rw-r--r--tests/testdata/bench/ignore.ts (renamed from cli/tests/testdata/bench/ignore.ts)0
-rw-r--r--tests/testdata/bench/ignore_permissions.out (renamed from cli/tests/testdata/bench/ignore_permissions.out)0
-rw-r--r--tests/testdata/bench/ignore_permissions.ts (renamed from cli/tests/testdata/bench/ignore_permissions.ts)0
-rw-r--r--tests/testdata/bench/interval.out (renamed from cli/tests/testdata/bench/interval.out)0
-rw-r--r--tests/testdata/bench/interval.ts (renamed from cli/tests/testdata/bench/interval.ts)0
-rw-r--r--tests/testdata/bench/load_unload.out (renamed from cli/tests/testdata/bench/load_unload.out)0
-rw-r--r--tests/testdata/bench/load_unload.ts (renamed from cli/tests/testdata/bench/load_unload.ts)0
-rw-r--r--tests/testdata/bench/meta.out (renamed from cli/tests/testdata/bench/meta.out)0
-rw-r--r--tests/testdata/bench/meta.ts (renamed from cli/tests/testdata/bench/meta.ts)0
-rw-r--r--tests/testdata/bench/multifile_summary.out (renamed from cli/tests/testdata/bench/multifile_summary.out)0
-rw-r--r--tests/testdata/bench/multiple_group.ts (renamed from cli/tests/testdata/bench/multiple_group.ts)0
-rw-r--r--tests/testdata/bench/no_check.out (renamed from cli/tests/testdata/bench/no_check.out)0
-rw-r--r--tests/testdata/bench/no_check.ts (renamed from cli/tests/testdata/bench/no_check.ts)0
-rw-r--r--tests/testdata/bench/no_color.ts (renamed from cli/tests/testdata/bench/no_color.ts)0
-rw-r--r--tests/testdata/bench/no_prompt_by_default.out (renamed from cli/tests/testdata/bench/no_prompt_by_default.out)0
-rw-r--r--tests/testdata/bench/no_prompt_by_default.ts (renamed from cli/tests/testdata/bench/no_prompt_by_default.ts)0
-rw-r--r--tests/testdata/bench/no_prompt_with_denied_perms.out (renamed from cli/tests/testdata/bench/no_prompt_with_denied_perms.out)0
-rw-r--r--tests/testdata/bench/no_prompt_with_denied_perms.ts (renamed from cli/tests/testdata/bench/no_prompt_with_denied_perms.ts)0
-rw-r--r--tests/testdata/bench/no_run.out (renamed from cli/tests/testdata/bench/no_run.out)0
-rw-r--r--tests/testdata/bench/no_run.ts (renamed from cli/tests/testdata/bench/no_run.ts)0
-rw-r--r--tests/testdata/bench/only.out (renamed from cli/tests/testdata/bench/only.out)0
-rw-r--r--tests/testdata/bench/only.ts (renamed from cli/tests/testdata/bench/only.ts)0
-rw-r--r--tests/testdata/bench/overloads.out (renamed from cli/tests/testdata/bench/overloads.out)0
-rw-r--r--tests/testdata/bench/overloads.ts (renamed from cli/tests/testdata/bench/overloads.ts)0
-rw-r--r--tests/testdata/bench/pass.json.out (renamed from cli/tests/testdata/bench/pass.json.out)0
-rw-r--r--tests/testdata/bench/pass.out (renamed from cli/tests/testdata/bench/pass.out)0
-rw-r--r--tests/testdata/bench/pass.ts (renamed from cli/tests/testdata/bench/pass.ts)0
-rw-r--r--tests/testdata/bench/quiet.out (renamed from cli/tests/testdata/bench/quiet.out)0
-rw-r--r--tests/testdata/bench/quiet.ts (renamed from cli/tests/testdata/bench/quiet.ts)0
-rw-r--r--tests/testdata/bench/recursive_permissions_pledge.js (renamed from cli/tests/testdata/bench/recursive_permissions_pledge.js)0
-rw-r--r--tests/testdata/bench/unhandled_rejection.out (renamed from cli/tests/testdata/bench/unhandled_rejection.out)0
-rw-r--r--tests/testdata/bench/unhandled_rejection.ts (renamed from cli/tests/testdata/bench/unhandled_rejection.ts)0
-rw-r--r--tests/testdata/bench/unresolved_promise.out (renamed from cli/tests/testdata/bench/unresolved_promise.out)0
-rw-r--r--tests/testdata/bench/unresolved_promise.ts (renamed from cli/tests/testdata/bench/unresolved_promise.ts)0
-rw-r--r--tests/testdata/benches/response_string_perf.js (renamed from cli/tests/testdata/benches/response_string_perf.js)0
-rw-r--r--tests/testdata/benches/text_decoder_perf.js (renamed from cli/tests/testdata/benches/text_decoder_perf.js)0
-rw-r--r--tests/testdata/benches/text_encoder_into_perf.js (renamed from cli/tests/testdata/benches/text_encoder_into_perf.js)0
-rw-r--r--tests/testdata/benches/text_encoder_perf.js (renamed from cli/tests/testdata/benches/text_encoder_perf.js)0
-rw-r--r--tests/testdata/bundle/bare_imports/error_with_bare_import.ts (renamed from cli/tests/testdata/bundle/bare_imports/error_with_bare_import.ts)0
-rw-r--r--tests/testdata/bundle/bare_imports/error_with_bare_import.ts.out (renamed from cli/tests/testdata/bundle/bare_imports/error_with_bare_import.ts.out)0
-rw-r--r--tests/testdata/bundle/bundle.test.out (renamed from cli/tests/testdata/bundle/bundle.test.out)0
-rw-r--r--tests/testdata/bundle/check_local_by_default/no_errors.out (renamed from cli/tests/testdata/bundle/check_local_by_default/no_errors.out)0
-rw-r--r--tests/testdata/bundle/check_local_by_default/no_errors.ts (renamed from cli/tests/testdata/bundle/check_local_by_default/no_errors.ts)0
-rw-r--r--tests/testdata/bundle/check_local_by_default/type_error.out (renamed from cli/tests/testdata/bundle/check_local_by_default/type_error.out)0
-rw-r--r--tests/testdata/bundle/check_local_by_default/type_error.ts (renamed from cli/tests/testdata/bundle/check_local_by_default/type_error.ts)0
-rw-r--r--tests/testdata/bundle/decorators/ts_decorators.out (renamed from cli/tests/testdata/bundle/decorators/ts_decorators.out)0
-rw-r--r--tests/testdata/bundle/decorators/ts_decorators.ts (renamed from cli/tests/testdata/bundle/decorators/ts_decorators.ts)0
-rw-r--r--tests/testdata/bundle/dynamic_import.ts (renamed from cli/tests/testdata/bundle/dynamic_import.ts)0
-rw-r--r--tests/testdata/bundle/file_extensions/js_without_extension.out (renamed from cli/tests/testdata/bundle/file_extensions/js_without_extension.out)0
-rw-r--r--tests/testdata/bundle/file_extensions/ts_without_extension.out (renamed from cli/tests/testdata/bundle/file_extensions/ts_without_extension.out)0
-rw-r--r--tests/testdata/bundle/file_tests-fixture01.ts (renamed from cli/tests/testdata/bundle/file_tests-fixture01.ts)0
-rw-r--r--tests/testdata/bundle/file_tests-fixture02.ts (renamed from cli/tests/testdata/bundle/file_tests-fixture02.ts)0
-rw-r--r--tests/testdata/bundle/file_tests-fixture03.ts (renamed from cli/tests/testdata/bundle/file_tests-fixture03.ts)0
-rw-r--r--tests/testdata/bundle/file_tests-fixture04.ts (renamed from cli/tests/testdata/bundle/file_tests-fixture04.ts)0
-rw-r--r--tests/testdata/bundle/file_tests-fixture05.ts (renamed from cli/tests/testdata/bundle/file_tests-fixture05.ts)0
-rw-r--r--tests/testdata/bundle/file_tests-fixture06.ts (renamed from cli/tests/testdata/bundle/file_tests-fixture06.ts)0
-rw-r--r--tests/testdata/bundle/file_tests-fixture07.ts (renamed from cli/tests/testdata/bundle/file_tests-fixture07.ts)0
-rw-r--r--tests/testdata/bundle/file_tests-fixture08.ts (renamed from cli/tests/testdata/bundle/file_tests-fixture08.ts)0
-rw-r--r--tests/testdata/bundle/file_tests-fixture09.ts (renamed from cli/tests/testdata/bundle/file_tests-fixture09.ts)0
-rw-r--r--tests/testdata/bundle/file_tests-fixture10.ts (renamed from cli/tests/testdata/bundle/file_tests-fixture10.ts)0
-rw-r--r--tests/testdata/bundle/file_tests-fixture11.ts (renamed from cli/tests/testdata/bundle/file_tests-fixture11.ts)0
-rw-r--r--tests/testdata/bundle/file_tests-fixture12.ts (renamed from cli/tests/testdata/bundle/file_tests-fixture12.ts)0
-rw-r--r--tests/testdata/bundle/file_tests-fixture13.ts (renamed from cli/tests/testdata/bundle/file_tests-fixture13.ts)0
-rw-r--r--tests/testdata/bundle/file_tests-fixture14.ts (renamed from cli/tests/testdata/bundle/file_tests-fixture14.ts)0
-rw-r--r--tests/testdata/bundle/file_tests-fixture15.ts (renamed from cli/tests/testdata/bundle/file_tests-fixture15.ts)0
-rw-r--r--tests/testdata/bundle/file_tests-fixture16.ts (renamed from cli/tests/testdata/bundle/file_tests-fixture16.ts)0
-rw-r--r--tests/testdata/bundle/file_tests-fixture16_2.ts (renamed from cli/tests/testdata/bundle/file_tests-fixture16_2.ts)0
-rw-r--r--tests/testdata/bundle/file_tests-subdir-a.ts (renamed from cli/tests/testdata/bundle/file_tests-subdir-a.ts)0
-rw-r--r--tests/testdata/bundle/file_tests-subdir-b.ts (renamed from cli/tests/testdata/bundle/file_tests-subdir-b.ts)0
-rw-r--r--tests/testdata/bundle/file_tests-subdir-c.ts (renamed from cli/tests/testdata/bundle/file_tests-subdir-c.ts)0
-rw-r--r--tests/testdata/bundle/file_tests-subdir-d.ts (renamed from cli/tests/testdata/bundle/file_tests-subdir-d.ts)0
-rw-r--r--tests/testdata/bundle/file_tests-subdir-e.ts (renamed from cli/tests/testdata/bundle/file_tests-subdir-e.ts)0
-rw-r--r--tests/testdata/bundle/file_tests-subdir-f.ts (renamed from cli/tests/testdata/bundle/file_tests-subdir-f.ts)0
-rw-r--r--tests/testdata/bundle/file_tests-subdir-g.ts (renamed from cli/tests/testdata/bundle/file_tests-subdir-g.ts)0
-rw-r--r--tests/testdata/bundle/file_tests-subdir-h.ts (renamed from cli/tests/testdata/bundle/file_tests-subdir-h.ts)0
-rw-r--r--tests/testdata/bundle/file_tests-subdir-i.ts (renamed from cli/tests/testdata/bundle/file_tests-subdir-i.ts)0
-rw-r--r--tests/testdata/bundle/file_tests-subdir-j.ts (renamed from cli/tests/testdata/bundle/file_tests-subdir-j.ts)0
-rw-r--r--tests/testdata/bundle/file_tests-subdir-k.ts (renamed from cli/tests/testdata/bundle/file_tests-subdir-k.ts)0
-rw-r--r--tests/testdata/bundle/file_tests-subdir-l.ts (renamed from cli/tests/testdata/bundle/file_tests-subdir-l.ts)0
-rw-r--r--tests/testdata/bundle/file_tests-subdir-m.ts (renamed from cli/tests/testdata/bundle/file_tests-subdir-m.ts)0
-rw-r--r--tests/testdata/bundle/file_tests-subdir-n.ts (renamed from cli/tests/testdata/bundle/file_tests-subdir-n.ts)0
-rw-r--r--tests/testdata/bundle/file_tests-subdir-o.ts (renamed from cli/tests/testdata/bundle/file_tests-subdir-o.ts)0
-rw-r--r--tests/testdata/bundle/file_tests-subdir-p.ts (renamed from cli/tests/testdata/bundle/file_tests-subdir-p.ts)0
-rw-r--r--tests/testdata/bundle/file_tests-subdir-q.ts (renamed from cli/tests/testdata/bundle/file_tests-subdir-q.ts)0
-rw-r--r--tests/testdata/bundle/fixture01.out (renamed from cli/tests/testdata/bundle/fixture01.out)0
-rw-r--r--tests/testdata/bundle/fixture02.out (renamed from cli/tests/testdata/bundle/fixture02.out)0
-rw-r--r--tests/testdata/bundle/fixture03.out (renamed from cli/tests/testdata/bundle/fixture03.out)0
-rw-r--r--tests/testdata/bundle/fixture04.out (renamed from cli/tests/testdata/bundle/fixture04.out)0
-rw-r--r--tests/testdata/bundle/fixture05.out (renamed from cli/tests/testdata/bundle/fixture05.out)0
-rw-r--r--tests/testdata/bundle/fixture06.out (renamed from cli/tests/testdata/bundle/fixture06.out)0
-rw-r--r--tests/testdata/bundle/fixture07.out (renamed from cli/tests/testdata/bundle/fixture07.out)0
-rw-r--r--tests/testdata/bundle/fixture08.out (renamed from cli/tests/testdata/bundle/fixture08.out)0
-rw-r--r--tests/testdata/bundle/fixture09.out (renamed from cli/tests/testdata/bundle/fixture09.out)0
-rw-r--r--tests/testdata/bundle/fixture10.out (renamed from cli/tests/testdata/bundle/fixture10.out)0
-rw-r--r--tests/testdata/bundle/fixture11.out (renamed from cli/tests/testdata/bundle/fixture11.out)0
-rw-r--r--tests/testdata/bundle/fixture12.out (renamed from cli/tests/testdata/bundle/fixture12.out)0
-rw-r--r--tests/testdata/bundle/fixture13.out (renamed from cli/tests/testdata/bundle/fixture13.out)0
-rw-r--r--tests/testdata/bundle/fixture14.out (renamed from cli/tests/testdata/bundle/fixture14.out)0
-rw-r--r--tests/testdata/bundle/fixture15.out (renamed from cli/tests/testdata/bundle/fixture15.out)0
-rw-r--r--tests/testdata/bundle/fixture16.out (renamed from cli/tests/testdata/bundle/fixture16.out)0
-rw-r--r--tests/testdata/bundle/https_deno.land-x-lib-a.ts (renamed from cli/tests/testdata/bundle/https_deno.land-x-lib-a.ts)0
-rw-r--r--tests/testdata/bundle/https_deno.land-x-lib-b.js (renamed from cli/tests/testdata/bundle/https_deno.land-x-lib-b.js)0
-rw-r--r--tests/testdata/bundle/https_deno.land-x-lib-c.d.ts (renamed from cli/tests/testdata/bundle/https_deno.land-x-lib-c.d.ts)0
-rw-r--r--tests/testdata/bundle/https_deno.land-x-lib-c.js (renamed from cli/tests/testdata/bundle/https_deno.land-x-lib-c.js)0
-rw-r--r--tests/testdata/bundle/https_deno.land-x-lib-mod.d.ts (renamed from cli/tests/testdata/bundle/https_deno.land-x-lib-mod.d.ts)0
-rw-r--r--tests/testdata/bundle/https_deno.land-x-lib-mod.js (renamed from cli/tests/testdata/bundle/https_deno.land-x-lib-mod.js)0
-rw-r--r--tests/testdata/bundle/ignore_directives.test.out (renamed from cli/tests/testdata/bundle/ignore_directives.test.out)0
-rw-r--r--tests/testdata/bundle/import_map/import_map.json (renamed from cli/tests/testdata/bundle/import_map/import_map.json)0
-rw-r--r--tests/testdata/bundle/import_map/main.ts (renamed from cli/tests/testdata/bundle/import_map/main.ts)0
-rw-r--r--tests/testdata/bundle/jsx.out (renamed from cli/tests/testdata/bundle/jsx.out)0
-rw-r--r--tests/testdata/bundle/lockfile/check_error.json (renamed from cli/tests/testdata/bundle/lockfile/check_error.json)0
-rw-r--r--tests/testdata/bundle/lockfile/check_error.out (renamed from cli/tests/testdata/bundle/lockfile/check_error.out)0
-rw-r--r--tests/testdata/bundle/shebang_file.bundle.out (renamed from cli/tests/testdata/bundle/shebang_file.bundle.out)0
-rw-r--r--tests/testdata/cache/036_import_map_fetch.out (renamed from cli/tests/testdata/cache/036_import_map_fetch.out)0
-rw-r--r--tests/testdata/cache/037_fetch_multiple.out (renamed from cli/tests/testdata/cache/037_fetch_multiple.out)0
-rw-r--r--tests/testdata/cache/095_cache_with_bare_import.ts (renamed from cli/tests/testdata/cache/095_cache_with_bare_import.ts)0
-rw-r--r--tests/testdata/cache/095_cache_with_bare_import.ts.out (renamed from cli/tests/testdata/cache/095_cache_with_bare_import.ts.out)0
-rw-r--r--tests/testdata/cache/cache_extensionless.out (renamed from cli/tests/testdata/cache/cache_extensionless.out)0
-rw-r--r--tests/testdata/cache/cache_random_extension.out (renamed from cli/tests/testdata/cache/cache_random_extension.out)0
-rw-r--r--tests/testdata/cache/check_local_by_default.out (renamed from cli/tests/testdata/cache/check_local_by_default.out)0
-rw-r--r--tests/testdata/cache/check_local_by_default.ts (renamed from cli/tests/testdata/cache/check_local_by_default.ts)0
-rw-r--r--tests/testdata/cache/check_local_by_default2.out (renamed from cli/tests/testdata/cache/check_local_by_default2.out)0
-rw-r--r--tests/testdata/cache/check_local_by_default2.ts (renamed from cli/tests/testdata/cache/check_local_by_default2.ts)0
-rw-r--r--tests/testdata/cache/ignore_require.js (renamed from cli/tests/testdata/cache/ignore_require.js)0
-rw-r--r--tests/testdata/cache/json_import/main.ts (renamed from cli/tests/testdata/cache/json_import/main.ts)0
-rw-r--r--tests/testdata/cache/json_import/test.json (renamed from cli/tests/testdata/cache/json_import/test.json)0
-rw-r--r--tests/testdata/cache/performance_stats.out (renamed from cli/tests/testdata/cache/performance_stats.out)0
-rw-r--r--tests/testdata/cache/redirect_cache.out (renamed from cli/tests/testdata/cache/redirect_cache.out)0
-rw-r--r--tests/testdata/cat.ts10
-rw-r--r--tests/testdata/cert/cafile_info.ts (renamed from cli/tests/testdata/cert/cafile_info.ts)0
-rw-r--r--tests/testdata/cert/cafile_info.ts.out (renamed from cli/tests/testdata/cert/cafile_info.ts.out)0
-rw-r--r--tests/testdata/cert/cafile_ts_fetch.ts (renamed from cli/tests/testdata/cert/cafile_ts_fetch.ts)0
-rw-r--r--tests/testdata/cert/cafile_ts_fetch.ts.out (renamed from cli/tests/testdata/cert/cafile_ts_fetch.ts.out)0
-rw-r--r--tests/testdata/cert/cafile_ts_fetch_unsafe_ssl.ts.out (renamed from cli/tests/testdata/cert/cafile_ts_fetch_unsafe_ssl.ts.out)0
-rw-r--r--tests/testdata/cert/cafile_url_imports.ts (renamed from cli/tests/testdata/cert/cafile_url_imports.ts)0
-rw-r--r--tests/testdata/cert/cafile_url_imports.ts.out (renamed from cli/tests/testdata/cert/cafile_url_imports.ts.out)0
-rw-r--r--tests/testdata/cert/cafile_url_imports_unsafe_ssl.ts.out (renamed from cli/tests/testdata/cert/cafile_url_imports_unsafe_ssl.ts.out)0
-rw-r--r--tests/testdata/cert/deno_land_unsafe_ssl.ts (renamed from cli/tests/testdata/cert/deno_land_unsafe_ssl.ts)0
-rw-r--r--tests/testdata/cert/deno_land_unsafe_ssl.ts.out (renamed from cli/tests/testdata/cert/deno_land_unsafe_ssl.ts.out)0
-rw-r--r--tests/testdata/cert/ip_address_unsafe_ssl.ts (renamed from cli/tests/testdata/cert/ip_address_unsafe_ssl.ts)0
-rw-r--r--tests/testdata/cert/ip_address_unsafe_ssl.ts.out (renamed from cli/tests/testdata/cert/ip_address_unsafe_ssl.ts.out)0
-rw-r--r--tests/testdata/cert/listen_tls_alpn.ts (renamed from cli/tests/testdata/cert/listen_tls_alpn.ts)0
-rw-r--r--tests/testdata/cert/listen_tls_alpn_fail.ts20
-rw-r--r--tests/testdata/cert/localhost_unsafe_ssl.ts.out (renamed from cli/tests/testdata/cert/localhost_unsafe_ssl.ts.out)0
-rw-r--r--tests/testdata/check/all/check_all.out (renamed from cli/tests/testdata/check/all/check_all.out)0
-rw-r--r--tests/testdata/check/all/check_all.ts (renamed from cli/tests/testdata/check/all/check_all.ts)0
-rw-r--r--tests/testdata/check/broadcast_channel.ts (renamed from cli/tests/testdata/check/broadcast_channel.ts)0
-rw-r--r--tests/testdata/check/cache_config_on_off/deno.json (renamed from cli/tests/testdata/check/cache_config_on_off/deno.json)0
-rw-r--r--tests/testdata/check/cache_config_on_off/main.ts (renamed from cli/tests/testdata/check/cache_config_on_off/main.ts)0
-rw-r--r--tests/testdata/check/declaration_header_file_with_no_exports.ts (renamed from cli/tests/testdata/check/declaration_header_file_with_no_exports.ts)0
-rw-r--r--tests/testdata/check/declaration_header_file_with_no_exports_js.d.ts (renamed from cli/tests/testdata/check/declaration_header_file_with_no_exports_js.d.ts)0
-rw-r--r--tests/testdata/check/declaration_header_file_with_no_exports_js.js (renamed from cli/tests/testdata/check/declaration_header_file_with_no_exports_js.js)0
-rw-r--r--tests/testdata/check/deno_not_found/main.out (renamed from cli/tests/testdata/check/deno_not_found/main.out)0
-rw-r--r--tests/testdata/check/deno_not_found/main.ts (renamed from cli/tests/testdata/check/deno_not_found/main.ts)0
-rw-r--r--tests/testdata/check/dts/check_dts.d.ts (renamed from cli/tests/testdata/check/dts/check_dts.d.ts)0
-rw-r--r--tests/testdata/check/dts/check_dts.out (renamed from cli/tests/testdata/check/dts/check_dts.out)0
-rw-r--r--tests/testdata/check/exclude_option/deno.exclude_dir.json (renamed from cli/tests/testdata/check/exclude_option/deno.exclude_dir.json)0
-rw-r--r--tests/testdata/check/exclude_option/deno.exclude_glob.json (renamed from cli/tests/testdata/check/exclude_option/deno.exclude_glob.json)0
-rw-r--r--tests/testdata/check/exclude_option/deno.json (renamed from cli/tests/testdata/check/exclude_option/deno.json)0
-rw-r--r--tests/testdata/check/exclude_option/exclude_option.ts.error.out (renamed from cli/tests/testdata/check/exclude_option/exclude_option.ts.error.out)0
-rw-r--r--tests/testdata/check/exclude_option/ignored/index.ts (renamed from cli/tests/testdata/check/exclude_option/ignored/index.ts)0
-rw-r--r--tests/testdata/check/exclude_option/index.ts (renamed from cli/tests/testdata/check/exclude_option/index.ts)0
-rw-r--r--tests/testdata/check/excluded_file_specified/check.out (renamed from cli/tests/testdata/check/excluded_file_specified/check.out)0
-rw-r--r--tests/testdata/check/excluded_file_specified/deno.json (renamed from cli/tests/testdata/check/excluded_file_specified/deno.json)0
-rw-r--r--tests/testdata/check/excluded_file_specified/lib/types.d.ts (renamed from cli/tests/testdata/check/excluded_file_specified/lib/types.d.ts)0
-rw-r--r--tests/testdata/check/export_equals_declaration_file/main.ts (renamed from cli/tests/testdata/check/export_equals_declaration_file/main.ts)0
-rw-r--r--tests/testdata/check/export_equals_declaration_file/other.d.ts (renamed from cli/tests/testdata/check/export_equals_declaration_file/other.d.ts)0
-rw-r--r--tests/testdata/check/export_equals_declaration_file/other.js (renamed from cli/tests/testdata/check/export_equals_declaration_file/other.js)0
-rw-r--r--tests/testdata/check/jsx_not_checked/main.jsx (renamed from cli/tests/testdata/check/jsx_not_checked/main.jsx)0
-rw-r--r--tests/testdata/check/jsx_not_checked/main.out (renamed from cli/tests/testdata/check/jsx_not_checked/main.out)0
-rw-r--r--tests/testdata/check/jsx_not_checked/other.ts (renamed from cli/tests/testdata/check/jsx_not_checked/other.ts)0
-rw-r--r--tests/testdata/check/jsximportsource_importmap_config/deno.json (renamed from cli/tests/testdata/check/jsximportsource_importmap_config/deno.json)0
-rw-r--r--tests/testdata/check/jsximportsource_importmap_config/import_map.json (renamed from cli/tests/testdata/check/jsximportsource_importmap_config/import_map.json)0
-rw-r--r--tests/testdata/check/jsximportsource_importmap_config/jsx_runtime.ts (renamed from cli/tests/testdata/check/jsximportsource_importmap_config/jsx_runtime.ts)0
-rw-r--r--tests/testdata/check/jsximportsource_importmap_config/main.bundle.js (renamed from cli/tests/testdata/check/jsximportsource_importmap_config/main.bundle.js)0
-rw-r--r--tests/testdata/check/jsximportsource_importmap_config/main.tsx (renamed from cli/tests/testdata/check/jsximportsource_importmap_config/main.tsx)0
-rw-r--r--tests/testdata/check/module_detection_force.ts (renamed from cli/tests/testdata/check/module_detection_force.ts)0
-rw-r--r--tests/testdata/check/module_detection_force/import.ts (renamed from cli/tests/testdata/check/module_detection_force/import.ts)0
-rw-r--r--tests/testdata/check/module_detection_force/main.ts (renamed from cli/tests/testdata/check/module_detection_force/main.ts)0
-rw-r--r--tests/testdata/check/no_error_truncation/deno.json (renamed from cli/tests/testdata/check/no_error_truncation/deno.json)0
-rw-r--r--tests/testdata/check/no_error_truncation/main.out (renamed from cli/tests/testdata/check/no_error_truncation/main.out)0
-rw-r--r--tests/testdata/check/no_error_truncation/main.ts (renamed from cli/tests/testdata/check/no_error_truncation/main.ts)0
-rw-r--r--tests/testdata/check/node_builtin_modules/mod.js (renamed from cli/tests/testdata/check/node_builtin_modules/mod.js)0
-rw-r--r--tests/testdata/check/node_builtin_modules/mod.js.out (renamed from cli/tests/testdata/check/node_builtin_modules/mod.js.out)0
-rw-r--r--tests/testdata/check/node_builtin_modules/mod.ts (renamed from cli/tests/testdata/check/node_builtin_modules/mod.ts)0
-rw-r--r--tests/testdata/check/node_builtin_modules/mod.ts.out (renamed from cli/tests/testdata/check/node_builtin_modules/mod.ts.out)0
-rw-r--r--tests/testdata/check/npm_install_diagnostics/main.out (renamed from cli/tests/testdata/check/npm_install_diagnostics/main.out)0
-rw-r--r--tests/testdata/check/npm_install_diagnostics/main.ts (renamed from cli/tests/testdata/check/npm_install_diagnostics/main.ts)0
-rw-r--r--tests/testdata/check/response_json.ts (renamed from cli/tests/testdata/check/response_json.ts)0
-rw-r--r--tests/testdata/check/types_dts/deno.json (renamed from cli/tests/testdata/check/types_dts/deno.json)0
-rw-r--r--tests/testdata/check/types_dts/main.out (renamed from cli/tests/testdata/check/types_dts/main.out)0
-rw-r--r--tests/testdata/check/types_dts/main.ts (renamed from cli/tests/testdata/check/types_dts/main.ts)0
-rw-r--r--tests/testdata/check/types_dts/types.d.ts (renamed from cli/tests/testdata/check/types_dts/types.d.ts)0
-rw-r--r--tests/testdata/commonjs/data.json (renamed from cli/tests/testdata/commonjs/data.json)0
-rw-r--r--tests/testdata/commonjs/example.js (renamed from cli/tests/testdata/commonjs/example.js)0
-rw-r--r--tests/testdata/commonjs/node_modules/colorette/index.cjs (renamed from cli/tests/testdata/commonjs/node_modules/colorette/index.cjs)0
-rw-r--r--tests/testdata/commonjs/node_modules/colorette/index.js (renamed from cli/tests/testdata/commonjs/node_modules/colorette/index.js)0
-rw-r--r--tests/testdata/commonjs/node_modules/colorette/package.json (renamed from cli/tests/testdata/commonjs/node_modules/colorette/package.json)0
-rw-r--r--tests/testdata/commonjs/node_modules/imports_exports/import_export.js (renamed from cli/tests/testdata/commonjs/node_modules/imports_exports/import_export.js)0
-rw-r--r--tests/testdata/commonjs/node_modules/imports_exports/import_polyfill.js (renamed from cli/tests/testdata/commonjs/node_modules/imports_exports/import_polyfill.js)0
-rw-r--r--tests/testdata/commonjs/node_modules/imports_exports/package.json (renamed from cli/tests/testdata/commonjs/node_modules/imports_exports/package.json)0
-rw-r--r--tests/testdata/commonjs/node_modules/imports_exports/require_export.cjs (renamed from cli/tests/testdata/commonjs/node_modules/imports_exports/require_export.cjs)0
-rw-r--r--tests/testdata/commonjs/node_modules/imports_exports/require_polyfill.js (renamed from cli/tests/testdata/commonjs/node_modules/imports_exports/require_polyfill.js)0
-rw-r--r--tests/testdata/commonjs/node_modules/left-pad/README.md (renamed from cli/tests/testdata/commonjs/node_modules/left-pad/README.md)0
-rw-r--r--tests/testdata/commonjs/node_modules/left-pad/index.js (renamed from cli/tests/testdata/commonjs/node_modules/left-pad/index.js)0
-rw-r--r--tests/testdata/commonjs/node_modules/left-pad/package.json (renamed from cli/tests/testdata/commonjs/node_modules/left-pad/package.json)0
-rw-r--r--tests/testdata/commonjs/package.json (renamed from cli/tests/testdata/commonjs/package.json)0
-rw-r--r--tests/testdata/compile/args.ts (renamed from cli/tests/testdata/compile/args.ts)0
-rw-r--r--tests/testdata/compile/check_local_by_default.ts (renamed from cli/tests/testdata/compile/check_local_by_default.ts)0
-rw-r--r--tests/testdata/compile/check_local_by_default2.ts (renamed from cli/tests/testdata/compile/check_local_by_default2.ts)0
-rw-r--r--tests/testdata/compile/dynamic_imports/import1.ts (renamed from cli/tests/testdata/compile/dynamic_imports/import1.ts)0
-rw-r--r--tests/testdata/compile/dynamic_imports/import2.ts (renamed from cli/tests/testdata/compile/dynamic_imports/import2.ts)0
-rw-r--r--tests/testdata/compile/dynamic_imports/import_path (renamed from cli/tests/testdata/compile/dynamic_imports/import_path)0
-rw-r--r--tests/testdata/compile/dynamic_imports/main.out (renamed from cli/tests/testdata/compile/dynamic_imports/main.out)0
-rw-r--r--tests/testdata/compile/dynamic_imports/main.ts (renamed from cli/tests/testdata/compile/dynamic_imports/main.ts)0
-rw-r--r--tests/testdata/compile/dynamic_imports/main_unanalyzable.ts18
-rw-r--r--tests/testdata/compile/dynamic_imports_tmp_lit/main.info.out (renamed from cli/tests/testdata/compile/dynamic_imports_tmp_lit/main.info.out)0
-rw-r--r--tests/testdata/compile/dynamic_imports_tmp_lit/main.js (renamed from cli/tests/testdata/compile/dynamic_imports_tmp_lit/main.js)0
-rw-r--r--tests/testdata/compile/dynamic_imports_tmp_lit/other/data.json (renamed from cli/tests/testdata/compile/dynamic_imports_tmp_lit/other/data.json)0
-rw-r--r--tests/testdata/compile/dynamic_imports_tmp_lit/other/sub/data2.json (renamed from cli/tests/testdata/compile/dynamic_imports_tmp_lit/other/sub/data2.json)0
-rw-r--r--tests/testdata/compile/dynamic_imports_tmp_lit/sub/a.js (renamed from cli/tests/testdata/compile/dynamic_imports_tmp_lit/sub/a.js)0
-rw-r--r--tests/testdata/compile/dynamic_imports_tmp_lit/sub/b.ts (renamed from cli/tests/testdata/compile/dynamic_imports_tmp_lit/sub/b.ts)0
-rw-r--r--tests/testdata/compile/node_modules_symlink_outside/main.out (renamed from cli/tests/testdata/compile/node_modules_symlink_outside/main.out)0
-rw-r--r--tests/testdata/compile/node_modules_symlink_outside/main.ts (renamed from cli/tests/testdata/compile/node_modules_symlink_outside/main.ts)0
-rw-r--r--tests/testdata/compile/node_modules_symlink_outside/main_compile_file.out (renamed from cli/tests/testdata/compile/node_modules_symlink_outside/main_compile_file.out)0
-rw-r--r--tests/testdata/compile/node_modules_symlink_outside/main_compile_folder.out (renamed from cli/tests/testdata/compile/node_modules_symlink_outside/main_compile_folder.out)0
-rw-r--r--tests/testdata/compile/npm_fs/main.out (renamed from cli/tests/testdata/compile/npm_fs/main.out)0
-rw-r--r--tests/testdata/compile/npm_fs/main.ts (renamed from cli/tests/testdata/compile/npm_fs/main.ts)0
-rw-r--r--tests/testdata/compile/standalone_error.ts (renamed from cli/tests/testdata/compile/standalone_error.ts)0
-rw-r--r--tests/testdata/compile/standalone_error_module_with_imports_1.ts (renamed from cli/tests/testdata/compile/standalone_error_module_with_imports_1.ts)0
-rw-r--r--tests/testdata/compile/standalone_error_module_with_imports_2.ts (renamed from cli/tests/testdata/compile/standalone_error_module_with_imports_2.ts)0
-rw-r--r--tests/testdata/compile/standalone_follow_redirects.ts (renamed from cli/tests/testdata/compile/standalone_follow_redirects.ts)0
-rw-r--r--tests/testdata/compile/standalone_follow_redirects_2.js5
-rw-r--r--tests/testdata/compile/standalone_import_datauri.ts (renamed from cli/tests/testdata/compile/standalone_import_datauri.ts)0
-rw-r--r--tests/testdata/compile/standalone_import_map.json (renamed from cli/tests/testdata/compile/standalone_import_map.json)0
-rw-r--r--tests/testdata/compile/standalone_import_map.ts (renamed from cli/tests/testdata/compile/standalone_import_map.ts)0
-rw-r--r--tests/testdata/compile/standalone_import_map_config.json (renamed from cli/tests/testdata/compile/standalone_import_map_config.json)0
-rw-r--r--tests/testdata/compile/standalone_runtime_flags.ts (renamed from cli/tests/testdata/compile/standalone_runtime_flags.ts)0
-rw-r--r--tests/testdata/compile/unstable_features.ts (renamed from cli/tests/testdata/compile/unstable_features.ts)0
-rw-r--r--tests/testdata/compile/vfs_implicit_read_permission/main.out (renamed from cli/tests/testdata/compile/vfs_implicit_read_permission/main.out)0
-rw-r--r--tests/testdata/compile/vfs_implicit_read_permission/main.ts (renamed from cli/tests/testdata/compile/vfs_implicit_read_permission/main.ts)0
-rw-r--r--tests/testdata/compile/workers/basic.out (renamed from cli/tests/testdata/compile/workers/basic.out)0
-rw-r--r--tests/testdata/compile/workers/basic.ts (renamed from cli/tests/testdata/compile/workers/basic.ts)0
-rw-r--r--tests/testdata/compile/workers/not_in_module_map.ts (renamed from cli/tests/testdata/compile/workers/not_in_module_map.ts)0
-rw-r--r--tests/testdata/compile/workers/worker.ts (renamed from cli/tests/testdata/compile/workers/worker.ts)0
-rw-r--r--tests/testdata/coverage/branch.ts (renamed from cli/tests/testdata/coverage/branch.ts)0
-rw-r--r--tests/testdata/coverage/branch_expected.lcov (renamed from cli/tests/testdata/coverage/branch_expected.lcov)0
-rw-r--r--tests/testdata/coverage/branch_expected.out (renamed from cli/tests/testdata/coverage/branch_expected.out)0
-rw-r--r--tests/testdata/coverage/branch_test.ts (renamed from cli/tests/testdata/coverage/branch_test.ts)0
-rw-r--r--tests/testdata/coverage/complex.ts (renamed from cli/tests/testdata/coverage/complex.ts)0
-rw-r--r--tests/testdata/coverage/complex_expected.lcov (renamed from cli/tests/testdata/coverage/complex_expected.lcov)0
-rw-r--r--tests/testdata/coverage/complex_expected.out (renamed from cli/tests/testdata/coverage/complex_expected.out)0
-rw-r--r--tests/testdata/coverage/complex_test.ts (renamed from cli/tests/testdata/coverage/complex_test.ts)0
-rw-r--r--tests/testdata/coverage/doesnt_exist.out (renamed from cli/tests/testdata/coverage/doesnt_exist.out)0
-rw-r--r--tests/testdata/coverage/final_blankline.js (renamed from cli/tests/testdata/coverage/final_blankline.js)0
-rw-r--r--tests/testdata/coverage/final_blankline_expected.lcov (renamed from cli/tests/testdata/coverage/final_blankline_expected.lcov)0
-rw-r--r--tests/testdata/coverage/final_blankline_expected.out (renamed from cli/tests/testdata/coverage/final_blankline_expected.out)0
-rw-r--r--tests/testdata/coverage/final_blankline_test.js (renamed from cli/tests/testdata/coverage/final_blankline_test.js)0
-rw-r--r--tests/testdata/coverage/invalid_cache/mod.test.ts (renamed from cli/tests/testdata/coverage/invalid_cache/mod.test.ts)0
-rw-r--r--tests/testdata/coverage/invalid_cache/mod_after.ts (renamed from cli/tests/testdata/coverage/invalid_cache/mod_after.ts)0
-rw-r--r--tests/testdata/coverage/invalid_cache/mod_before.ts (renamed from cli/tests/testdata/coverage/invalid_cache/mod_before.ts)0
-rw-r--r--tests/testdata/coverage/multifile/a_test.js (renamed from cli/tests/testdata/coverage/multifile/a_test.js)0
-rw-r--r--tests/testdata/coverage/multifile/b_test.js (renamed from cli/tests/testdata/coverage/multifile/b_test.js)0
-rw-r--r--tests/testdata/coverage/multifile/expected.lcov (renamed from cli/tests/testdata/coverage/multifile/expected.lcov)0
-rw-r--r--tests/testdata/coverage/multifile/expected.out (renamed from cli/tests/testdata/coverage/multifile/expected.out)0
-rw-r--r--tests/testdata/coverage/multifile/mod.js (renamed from cli/tests/testdata/coverage/multifile/mod.js)0
-rw-r--r--tests/testdata/coverage/multisource/bar.ts (renamed from cli/tests/testdata/coverage/multisource/bar.ts)0
-rw-r--r--tests/testdata/coverage/multisource/baz/quux.ts (renamed from cli/tests/testdata/coverage/multisource/baz/quux.ts)0
-rw-r--r--tests/testdata/coverage/multisource/baz/qux.ts (renamed from cli/tests/testdata/coverage/multisource/baz/qux.ts)0
-rw-r--r--tests/testdata/coverage/multisource/foo.ts (renamed from cli/tests/testdata/coverage/multisource/foo.ts)0
-rw-r--r--tests/testdata/coverage/multisource/test.ts (renamed from cli/tests/testdata/coverage/multisource/test.ts)0
-rw-r--r--tests/testdata/coverage/no_internal_code_test.ts (renamed from cli/tests/testdata/coverage/no_internal_code_test.ts)0
-rw-r--r--tests/testdata/coverage/no_internal_node_code_test.ts (renamed from cli/tests/testdata/coverage/no_internal_node_code_test.ts)0
-rw-r--r--tests/testdata/coverage/no_npm_coverage/expected.out (renamed from cli/tests/testdata/coverage/no_npm_coverage/expected.out)0
-rw-r--r--tests/testdata/coverage/no_npm_coverage/no_npm_coverage.ts (renamed from cli/tests/testdata/coverage/no_npm_coverage/no_npm_coverage.ts)0
-rw-r--r--tests/testdata/coverage/no_npm_coverage/no_npm_coverage_test.ts (renamed from cli/tests/testdata/coverage/no_npm_coverage/no_npm_coverage_test.ts)0
-rw-r--r--tests/testdata/coverage/no_snaps_included/__snapshots__/no_snaps_included_test.ts.snap (renamed from cli/tests/testdata/coverage/no_snaps_included/__snapshots__/no_snaps_included_test.ts.snap)0
-rw-r--r--tests/testdata/coverage/no_snaps_included/expected.out (renamed from cli/tests/testdata/coverage/no_snaps_included/expected.out)0
-rw-r--r--tests/testdata/coverage/no_snaps_included/no_snaps_included.ts (renamed from cli/tests/testdata/coverage/no_snaps_included/no_snaps_included.ts)0
-rw-r--r--tests/testdata/coverage/no_snaps_included/no_snaps_included_test.ts11
-rw-r--r--tests/testdata/coverage/no_tests_included/expected.out (renamed from cli/tests/testdata/coverage/no_tests_included/expected.out)0
-rw-r--r--tests/testdata/coverage/no_tests_included/foo.test.js6
-rw-r--r--tests/testdata/coverage/no_tests_included/foo.test.mts6
-rw-r--r--tests/testdata/coverage/no_tests_included/foo.test.ts6
-rw-r--r--tests/testdata/coverage/no_tests_included/foo.ts (renamed from cli/tests/testdata/coverage/no_tests_included/foo.ts)0
-rw-r--r--tests/testdata/coverage/no_transpiled_lines/expected.lcov (renamed from cli/tests/testdata/coverage/no_transpiled_lines/expected.lcov)0
-rw-r--r--tests/testdata/coverage/no_transpiled_lines/expected.out (renamed from cli/tests/testdata/coverage/no_transpiled_lines/expected.out)0
-rw-r--r--tests/testdata/coverage/no_transpiled_lines/index.ts3
-rw-r--r--tests/testdata/coverage/no_transpiled_lines/interface.ts (renamed from cli/tests/testdata/coverage/no_transpiled_lines/interface.ts)0
-rw-r--r--tests/testdata/coverage/no_transpiled_lines/repro_test.ts (renamed from cli/tests/testdata/coverage/no_transpiled_lines/repro_test.ts)0
-rw-r--r--tests/testdata/doc/060_deno_doc_displays_all_overloads_in_details_view.ts (renamed from cli/tests/testdata/doc/060_deno_doc_displays_all_overloads_in_details_view.ts)0
-rw-r--r--tests/testdata/doc/060_deno_doc_displays_all_overloads_in_details_view.ts.out (renamed from cli/tests/testdata/doc/060_deno_doc_displays_all_overloads_in_details_view.ts.out)0
-rw-r--r--tests/testdata/doc/deno_doc.ts (renamed from cli/tests/testdata/doc/deno_doc.ts)0
-rw-r--r--tests/testdata/doc/deno_doc2.ts (renamed from cli/tests/testdata/doc/deno_doc2.ts)0
-rw-r--r--tests/testdata/doc/deno_doc_builtin.out (renamed from cli/tests/testdata/doc/deno_doc_builtin.out)0
-rw-r--r--tests/testdata/doc/import_map.json (renamed from cli/tests/testdata/doc/import_map.json)0
-rw-r--r--tests/testdata/doc/invalid_url.out (renamed from cli/tests/testdata/doc/invalid_url.out)0
-rw-r--r--tests/testdata/doc/lint_success.out (renamed from cli/tests/testdata/doc/lint_success.out)0
-rw-r--r--tests/testdata/doc/lint_success.ts (renamed from cli/tests/testdata/doc/lint_success.ts)0
-rw-r--r--tests/testdata/doc/lint_success_html.out (renamed from cli/tests/testdata/doc/lint_success_html.out)0
-rw-r--r--tests/testdata/doc/lint_success_json.out (renamed from cli/tests/testdata/doc/lint_success_json.out)0
-rw-r--r--tests/testdata/doc/module/fun.js (renamed from cli/tests/testdata/doc/module/fun.js)0
-rw-r--r--tests/testdata/doc/referenced_private_types.out (renamed from cli/tests/testdata/doc/referenced_private_types.out)0
-rw-r--r--tests/testdata/doc/referenced_private_types.ts (renamed from cli/tests/testdata/doc/referenced_private_types.ts)0
-rw-r--r--tests/testdata/doc/referenced_private_types_fixed.out (renamed from cli/tests/testdata/doc/referenced_private_types_fixed.out)0
-rw-r--r--tests/testdata/doc/referenced_private_types_fixed.ts (renamed from cli/tests/testdata/doc/referenced_private_types_fixed.ts)0
-rw-r--r--tests/testdata/doc/referenced_private_types_lint.out (renamed from cli/tests/testdata/doc/referenced_private_types_lint.out)0
-rw-r--r--tests/testdata/doc/types_header.out (renamed from cli/tests/testdata/doc/types_header.out)0
-rw-r--r--tests/testdata/doc/types_header.ts (renamed from cli/tests/testdata/doc/types_header.ts)0
-rw-r--r--tests/testdata/doc/types_hint.out (renamed from cli/tests/testdata/doc/types_hint.out)0
-rw-r--r--tests/testdata/doc/types_hint.ts (renamed from cli/tests/testdata/doc/types_hint.ts)0
-rw-r--r--tests/testdata/doc/types_ref.js (renamed from cli/tests/testdata/doc/types_ref.js)0
-rw-r--r--tests/testdata/doc/types_ref.out (renamed from cli/tests/testdata/doc/types_ref.out)0
-rw-r--r--tests/testdata/doc/use_import_map.js (renamed from cli/tests/testdata/doc/use_import_map.js)0
-rw-r--r--tests/testdata/doc/use_import_map.out (renamed from cli/tests/testdata/doc/use_import_map.out)0
-rw-r--r--tests/testdata/dynamic_import/b.js (renamed from cli/tests/testdata/dynamic_import/b.js)0
-rw-r--r--tests/testdata/dynamic_import/c.js (renamed from cli/tests/testdata/dynamic_import/c.js)0
-rw-r--r--tests/testdata/dynamic_import/empty_1.ts (renamed from cli/tests/testdata/dynamic_import/empty_1.ts)0
-rw-r--r--tests/testdata/dynamic_import/empty_2.ts (renamed from cli/tests/testdata/dynamic_import/empty_2.ts)0
-rw-r--r--tests/testdata/dynamic_import/permissions_blob_local.ts (renamed from cli/tests/testdata/dynamic_import/permissions_blob_local.ts)0
-rw-r--r--tests/testdata/dynamic_import/permissions_blob_local.ts.out (renamed from cli/tests/testdata/dynamic_import/permissions_blob_local.ts.out)0
-rw-r--r--tests/testdata/dynamic_import/permissions_blob_remote.ts (renamed from cli/tests/testdata/dynamic_import/permissions_blob_remote.ts)0
-rw-r--r--tests/testdata/dynamic_import/permissions_blob_remote.ts.out (renamed from cli/tests/testdata/dynamic_import/permissions_blob_remote.ts.out)0
-rw-r--r--tests/testdata/dynamic_import/permissions_data_local.ts (renamed from cli/tests/testdata/dynamic_import/permissions_data_local.ts)0
-rw-r--r--tests/testdata/dynamic_import/permissions_data_local.ts.out (renamed from cli/tests/testdata/dynamic_import/permissions_data_local.ts.out)0
-rw-r--r--tests/testdata/dynamic_import/permissions_data_remote.ts (renamed from cli/tests/testdata/dynamic_import/permissions_data_remote.ts)0
-rw-r--r--tests/testdata/dynamic_import/permissions_data_remote.ts.out (renamed from cli/tests/testdata/dynamic_import/permissions_data_remote.ts.out)0
-rw-r--r--tests/testdata/dynamic_import/permissions_remote_remote.ts (renamed from cli/tests/testdata/dynamic_import/permissions_remote_remote.ts)0
-rw-r--r--tests/testdata/dynamic_import/permissions_remote_remote.ts.out (renamed from cli/tests/testdata/dynamic_import/permissions_remote_remote.ts.out)0
-rw-r--r--tests/testdata/dynamic_import/static_analysis_no_permissions.ts (renamed from cli/tests/testdata/dynamic_import/static_analysis_no_permissions.ts)0
-rw-r--r--tests/testdata/dynamic_import/static_analysis_no_permissions.ts.out (renamed from cli/tests/testdata/dynamic_import/static_analysis_no_permissions.ts.out)0
-rw-r--r--tests/testdata/dynamic_import/static_remote.ts (renamed from cli/tests/testdata/dynamic_import/static_remote.ts)0
-rw-r--r--tests/testdata/echo.ts (renamed from cli/tests/testdata/echo.ts)0
-rw-r--r--tests/testdata/echo_server.ts12
-rw-r--r--tests/testdata/encoding/utf-16be.ts (renamed from cli/tests/testdata/encoding/utf-16be.ts)bin58 -> 58 bytes
-rw-r--r--tests/testdata/encoding/utf-16le.ts (renamed from cli/tests/testdata/encoding/utf-16le.ts)bin58 -> 58 bytes
-rw-r--r--tests/testdata/encoding/utf-8.ts (renamed from cli/tests/testdata/encoding/utf-8.ts)0
-rw-r--r--tests/testdata/encoding/windows-1255 (renamed from cli/tests/testdata/encoding/windows-1255)0
-rw-r--r--tests/testdata/env (renamed from cli/tests/testdata/env)0
-rw-r--r--tests/testdata/error_cause_recursive_aggregate.ts (renamed from cli/tests/testdata/error_cause_recursive_aggregate.ts)0
-rw-r--r--tests/testdata/error_cause_recursive_aggregate.ts.out (renamed from cli/tests/testdata/error_cause_recursive_aggregate.ts.out)0
-rw-r--r--tests/testdata/error_cause_recursive_tail.ts (renamed from cli/tests/testdata/error_cause_recursive_tail.ts)0
-rw-r--r--tests/testdata/error_cause_recursive_tail.ts.out (renamed from cli/tests/testdata/error_cause_recursive_tail.ts.out)0
-rw-r--r--tests/testdata/eval/check_local_by_default.out (renamed from cli/tests/testdata/eval/check_local_by_default.out)0
-rw-r--r--tests/testdata/eval/check_local_by_default2.out (renamed from cli/tests/testdata/eval/check_local_by_default2.out)0
-rw-r--r--tests/testdata/eval/check_local_by_default2.ts (renamed from cli/tests/testdata/eval/check_local_by_default2.ts)0
-rw-r--r--tests/testdata/eval/dyn_import_eval.out (renamed from cli/tests/testdata/eval/dyn_import_eval.out)0
-rw-r--r--tests/testdata/eval/env_file_missing.out (renamed from cli/tests/testdata/eval/env_file_missing.out)0
-rw-r--r--tests/testdata/file_extensions/js_without_extension (renamed from cli/tests/testdata/file_extensions/js_without_extension)0
-rw-r--r--tests/testdata/file_extensions/js_without_extension.out (renamed from cli/tests/testdata/file_extensions/js_without_extension.out)0
-rw-r--r--tests/testdata/file_extensions/ts_with_extension.out (renamed from cli/tests/testdata/file_extensions/ts_with_extension.out)0
-rw-r--r--tests/testdata/file_extensions/ts_with_extension.ts (renamed from cli/tests/testdata/file_extensions/ts_with_extension.ts)0
-rw-r--r--tests/testdata/file_extensions/ts_with_js_extension.js (renamed from cli/tests/testdata/file_extensions/ts_with_js_extension.js)0
-rw-r--r--tests/testdata/file_extensions/ts_with_js_extension.out (renamed from cli/tests/testdata/file_extensions/ts_with_js_extension.out)0
-rw-r--r--tests/testdata/file_extensions/ts_without_extension (renamed from cli/tests/testdata/file_extensions/ts_without_extension)0
-rw-r--r--tests/testdata/file_extensions/ts_without_extension.out (renamed from cli/tests/testdata/file_extensions/ts_without_extension.out)0
-rw-r--r--tests/testdata/fmt/badly_formatted.ipynb (renamed from cli/tests/testdata/fmt/badly_formatted.ipynb)0
-rw-r--r--tests/testdata/fmt/badly_formatted.json (renamed from cli/tests/testdata/fmt/badly_formatted.json)0
-rw-r--r--tests/testdata/fmt/badly_formatted.md (renamed from cli/tests/testdata/fmt/badly_formatted.md)0
-rw-r--r--tests/testdata/fmt/badly_formatted.mjs (renamed from cli/tests/testdata/fmt/badly_formatted.mjs)0
-rw-r--r--tests/testdata/fmt/badly_formatted_fixed.ipynb (renamed from cli/tests/testdata/fmt/badly_formatted_fixed.ipynb)0
-rw-r--r--tests/testdata/fmt/badly_formatted_fixed.js (renamed from cli/tests/testdata/fmt/badly_formatted_fixed.js)0
-rw-r--r--tests/testdata/fmt/badly_formatted_fixed.json (renamed from cli/tests/testdata/fmt/badly_formatted_fixed.json)0
-rw-r--r--tests/testdata/fmt/badly_formatted_fixed.md (renamed from cli/tests/testdata/fmt/badly_formatted_fixed.md)0
-rw-r--r--tests/testdata/fmt/deno.glob.json (renamed from cli/tests/testdata/fmt/deno.glob.json)0
-rw-r--r--tests/testdata/fmt/deno.malformed.jsonc (renamed from cli/tests/testdata/fmt/deno.malformed.jsonc)0
-rw-r--r--tests/testdata/fmt/deno.malformed2.jsonc (renamed from cli/tests/testdata/fmt/deno.malformed2.jsonc)0
-rw-r--r--tests/testdata/fmt/expected_fmt_check_formatted_files.out (renamed from cli/tests/testdata/fmt/expected_fmt_check_formatted_files.out)0
-rw-r--r--tests/testdata/fmt/expected_fmt_check_ignore.out (renamed from cli/tests/testdata/fmt/expected_fmt_check_ignore.out)0
-rw-r--r--tests/testdata/fmt/expected_fmt_check_verbose_formatted_files.out (renamed from cli/tests/testdata/fmt/expected_fmt_check_verbose_formatted_files.out)0
-rw-r--r--tests/testdata/fmt/fmt_check_parse_error.out (renamed from cli/tests/testdata/fmt/fmt_check_parse_error.out)0
-rw-r--r--tests/testdata/fmt/fmt_with_config.out (renamed from cli/tests/testdata/fmt/fmt_with_config.out)0
-rw-r--r--tests/testdata/fmt/fmt_with_config_and_flags.out (renamed from cli/tests/testdata/fmt/fmt_with_config_and_flags.out)0
-rw-r--r--tests/testdata/fmt/fmt_with_config_default.out (renamed from cli/tests/testdata/fmt/fmt_with_config_default.out)0
-rw-r--r--tests/testdata/fmt/fmt_with_deprecated_config.out (renamed from cli/tests/testdata/fmt/fmt_with_deprecated_config.out)0
-rw-r--r--tests/testdata/fmt/fmt_with_malformed_config.out (renamed from cli/tests/testdata/fmt/fmt_with_malformed_config.out)0
-rw-r--r--tests/testdata/fmt/fmt_with_malformed_config2.out (renamed from cli/tests/testdata/fmt/fmt_with_malformed_config2.out)0
-rw-r--r--tests/testdata/fmt/glob/data/tes.ts (renamed from cli/tests/testdata/fmt/glob/data/tes.ts)0
-rw-r--r--tests/testdata/fmt/glob/data/test1.js (renamed from cli/tests/testdata/fmt/glob/data/test1.js)0
-rw-r--r--tests/testdata/fmt/glob/data/test1.ts (renamed from cli/tests/testdata/fmt/glob/data/test1.ts)0
-rw-r--r--tests/testdata/fmt/glob/data/test12.ts (renamed from cli/tests/testdata/fmt/glob/data/test12.ts)0
-rw-r--r--tests/testdata/fmt/glob/nested/fizz/bar.ts (renamed from cli/tests/testdata/fmt/glob/nested/fizz/bar.ts)0
-rw-r--r--tests/testdata/fmt/glob/nested/fizz/bazz.ts (renamed from cli/tests/testdata/fmt/glob/nested/fizz/bazz.ts)0
-rw-r--r--tests/testdata/fmt/glob/nested/fizz/fizz.ts (renamed from cli/tests/testdata/fmt/glob/nested/fizz/fizz.ts)0
-rw-r--r--tests/testdata/fmt/glob/nested/fizz/foo.ts (renamed from cli/tests/testdata/fmt/glob/nested/fizz/foo.ts)0
-rw-r--r--tests/testdata/fmt/glob/nested/foo/bar.ts (renamed from cli/tests/testdata/fmt/glob/nested/foo/bar.ts)0
-rw-r--r--tests/testdata/fmt/glob/nested/foo/bazz.ts (renamed from cli/tests/testdata/fmt/glob/nested/foo/bazz.ts)0
-rw-r--r--tests/testdata/fmt/glob/nested/foo/fizz.ts (renamed from cli/tests/testdata/fmt/glob/nested/foo/fizz.ts)0
-rw-r--r--tests/testdata/fmt/glob/nested/foo/foo.ts (renamed from cli/tests/testdata/fmt/glob/nested/foo/foo.ts)0
-rw-r--r--tests/testdata/fmt/glob/pages/[id].ts (renamed from cli/tests/testdata/fmt/glob/pages/[id].ts)0
-rw-r--r--tests/testdata/fmt/invalid_data.json (renamed from cli/tests/testdata/fmt/invalid_data.json)bin51200 -> 51200 bytes
-rw-r--r--tests/testdata/fmt/invalid_data.out (renamed from cli/tests/testdata/fmt/invalid_data.out)0
-rw-r--r--tests/testdata/fmt/parse_error/parse_error.ts (renamed from cli/tests/testdata/fmt/parse_error/parse_error.ts)0
-rw-r--r--tests/testdata/fmt/regular/formatted1.js (renamed from cli/tests/testdata/fmt/regular/formatted1.js)0
-rw-r--r--tests/testdata/fmt/regular/formatted2.ts (renamed from cli/tests/testdata/fmt/regular/formatted2.ts)0
-rw-r--r--tests/testdata/fmt/regular/formatted3.markdown (renamed from cli/tests/testdata/fmt/regular/formatted3.markdown)0
-rw-r--r--tests/testdata/fmt/regular/formatted4.jsonc (renamed from cli/tests/testdata/fmt/regular/formatted4.jsonc)0
-rw-r--r--tests/testdata/fmt/with_config/deno.deprecated.jsonc (renamed from cli/tests/testdata/fmt/with_config/deno.deprecated.jsonc)0
-rw-r--r--tests/testdata/fmt/with_config/deno.jsonc (renamed from cli/tests/testdata/fmt/with_config/deno.jsonc)0
-rw-r--r--tests/testdata/fmt/with_config/subdir/a.ts (renamed from cli/tests/testdata/fmt/with_config/subdir/a.ts)0
-rw-r--r--tests/testdata/fmt/with_config/subdir/b.ts (renamed from cli/tests/testdata/fmt/with_config/subdir/b.ts)0
-rw-r--r--tests/testdata/fmt/with_config/subdir/c.md (renamed from cli/tests/testdata/fmt/with_config/subdir/c.md)0
-rw-r--r--tests/testdata/import_attributes/data.json (renamed from cli/tests/testdata/import_attributes/data.json)0
-rw-r--r--tests/testdata/import_attributes/dynamic_error.out (renamed from cli/tests/testdata/import_attributes/dynamic_error.out)0
-rw-r--r--tests/testdata/import_attributes/dynamic_error.ts (renamed from cli/tests/testdata/import_attributes/dynamic_error.ts)0
-rw-r--r--tests/testdata/import_attributes/dynamic_import.out (renamed from cli/tests/testdata/import_attributes/dynamic_import.out)0
-rw-r--r--tests/testdata/import_attributes/dynamic_import.ts (renamed from cli/tests/testdata/import_attributes/dynamic_import.ts)0
-rw-r--r--tests/testdata/import_attributes/json_with_shebang.json (renamed from cli/tests/testdata/import_attributes/json_with_shebang.json)0
-rw-r--r--tests/testdata/import_attributes/json_with_shebang.ts (renamed from cli/tests/testdata/import_attributes/json_with_shebang.ts)0
-rw-r--r--tests/testdata/import_attributes/json_with_shebang.ts.out (renamed from cli/tests/testdata/import_attributes/json_with_shebang.ts.out)0
-rw-r--r--tests/testdata/import_attributes/static_error.out (renamed from cli/tests/testdata/import_attributes/static_error.out)0
-rw-r--r--tests/testdata/import_attributes/static_error.ts (renamed from cli/tests/testdata/import_attributes/static_error.ts)0
-rw-r--r--tests/testdata/import_attributes/static_export.out (renamed from cli/tests/testdata/import_attributes/static_export.out)0
-rw-r--r--tests/testdata/import_attributes/static_export.ts (renamed from cli/tests/testdata/import_attributes/static_export.ts)0
-rw-r--r--tests/testdata/import_attributes/static_import.out (renamed from cli/tests/testdata/import_attributes/static_import.out)0
-rw-r--r--tests/testdata/import_attributes/static_import.ts (renamed from cli/tests/testdata/import_attributes/static_import.ts)0
-rw-r--r--tests/testdata/import_attributes/static_reexport.ts (renamed from cli/tests/testdata/import_attributes/static_reexport.ts)0
-rw-r--r--tests/testdata/import_attributes/type_check.out (renamed from cli/tests/testdata/import_attributes/type_check.out)0
-rw-r--r--tests/testdata/import_attributes/type_check.ts (renamed from cli/tests/testdata/import_attributes/type_check.ts)0
-rw-r--r--tests/testdata/import_maps/config.json (renamed from cli/tests/testdata/import_maps/config.json)0
-rw-r--r--tests/testdata/import_maps/import_map.json (renamed from cli/tests/testdata/import_maps/import_map.json)0
-rw-r--r--tests/testdata/import_maps/import_map_invalid.json (renamed from cli/tests/testdata/import_maps/import_map_invalid.json)0
-rw-r--r--tests/testdata/import_maps/import_map_remote.json (renamed from cli/tests/testdata/import_maps/import_map_remote.json)0
-rw-r--r--tests/testdata/import_maps/lodash/lodash.ts (renamed from cli/tests/testdata/import_maps/lodash/lodash.ts)0
-rw-r--r--tests/testdata/import_maps/lodash/other_file.ts (renamed from cli/tests/testdata/import_maps/lodash/other_file.ts)0
-rw-r--r--tests/testdata/import_maps/moment/moment.ts (renamed from cli/tests/testdata/import_maps/moment/moment.ts)0
-rw-r--r--tests/testdata/import_maps/moment/other_file.ts (renamed from cli/tests/testdata/import_maps/moment/other_file.ts)0
-rw-r--r--tests/testdata/import_maps/print_hello.ts (renamed from cli/tests/testdata/import_maps/print_hello.ts)0
-rw-r--r--tests/testdata/import_maps/scope/scoped.ts (renamed from cli/tests/testdata/import_maps/scope/scoped.ts)0
-rw-r--r--tests/testdata/import_maps/scoped_moment.ts (renamed from cli/tests/testdata/import_maps/scoped_moment.ts)0
-rw-r--r--tests/testdata/import_maps/test.ts (renamed from cli/tests/testdata/import_maps/test.ts)0
-rw-r--r--tests/testdata/import_maps/test_remote.ts (renamed from cli/tests/testdata/import_maps/test_remote.ts)0
-rw-r--r--tests/testdata/import_maps/vue.ts (renamed from cli/tests/testdata/import_maps/vue.ts)0
-rw-r--r--tests/testdata/info/031_info_ts_error.out (renamed from cli/tests/testdata/info/031_info_ts_error.out)0
-rw-r--r--tests/testdata/info/031_info_ts_error.ts (renamed from cli/tests/testdata/info/031_info_ts_error.ts)0
-rw-r--r--tests/testdata/info/041_info_flag.out (renamed from cli/tests/testdata/info/041_info_flag.out)0
-rw-r--r--tests/testdata/info/041_info_flag_location.out (renamed from cli/tests/testdata/info/041_info_flag_location.out)0
-rw-r--r--tests/testdata/info/049_info_flag_script_jsx.out (renamed from cli/tests/testdata/info/049_info_flag_script_jsx.out)0
-rw-r--r--tests/testdata/info/054_info_local_imports.out (renamed from cli/tests/testdata/info/054_info_local_imports.out)0
-rw-r--r--tests/testdata/info/065_import_map_info.out (renamed from cli/tests/testdata/info/065_import_map_info.out)0
-rw-r--r--tests/testdata/info/076_info_json_deps_order.out (renamed from cli/tests/testdata/info/076_info_json_deps_order.out)0
-rw-r--r--tests/testdata/info/076_info_json_deps_order.ts (renamed from cli/tests/testdata/info/076_info_json_deps_order.ts)0
-rw-r--r--tests/testdata/info/data_null_error/data_null_error.out (renamed from cli/tests/testdata/info/data_null_error/data_null_error.out)0
-rw-r--r--tests/testdata/info/data_null_error/mod.ts (renamed from cli/tests/testdata/info/data_null_error/mod.ts)0
-rw-r--r--tests/testdata/info/data_null_error/types.d.ts (renamed from cli/tests/testdata/info/data_null_error/types.d.ts)0
-rw-r--r--tests/testdata/info/error_009_missing_js_module.js (renamed from cli/tests/testdata/info/error_009_missing_js_module.js)0
-rw-r--r--tests/testdata/info/error_009_missing_js_module.js.out (renamed from cli/tests/testdata/info/error_009_missing_js_module.js.out)0
-rw-r--r--tests/testdata/info/info_json.out (renamed from cli/tests/testdata/info/info_json.out)0
-rw-r--r--tests/testdata/info/info_json_location.out (renamed from cli/tests/testdata/info/info_json_location.out)0
-rw-r--r--tests/testdata/info/info_missing_module.out (renamed from cli/tests/testdata/info/info_missing_module.out)0
-rw-r--r--tests/testdata/info/info_recursive_imports_test.out (renamed from cli/tests/testdata/info/info_recursive_imports_test.out)0
-rw-r--r--tests/testdata/info/info_recursive_imports_test.ts (renamed from cli/tests/testdata/info/info_recursive_imports_test.ts)0
-rw-r--r--tests/testdata/info/info_type_import.out (renamed from cli/tests/testdata/info/info_type_import.out)0
-rw-r--r--tests/testdata/info/info_type_import.ts (renamed from cli/tests/testdata/info/info_type_import.ts)0
-rw-r--r--tests/testdata/info/json_output/main.out (renamed from cli/tests/testdata/info/json_output/main.out)0
-rw-r--r--tests/testdata/info/json_output/main.ts (renamed from cli/tests/testdata/info/json_output/main.ts)0
-rw-r--r--tests/testdata/info/multiple_imports.out (renamed from cli/tests/testdata/info/multiple_imports.out)0
-rw-r--r--tests/testdata/info/recursive_imports/A.ts (renamed from cli/tests/testdata/info/recursive_imports/A.ts)0
-rw-r--r--tests/testdata/info/recursive_imports/B.ts (renamed from cli/tests/testdata/info/recursive_imports/B.ts)0
-rw-r--r--tests/testdata/info/recursive_imports/C.ts (renamed from cli/tests/testdata/info/recursive_imports/C.ts)0
-rw-r--r--tests/testdata/info/recursive_imports/common.ts (renamed from cli/tests/testdata/info/recursive_imports/common.ts)0
-rw-r--r--tests/testdata/info/types_header.out (renamed from cli/tests/testdata/info/types_header.out)0
-rw-r--r--tests/testdata/info/with_config/deno-override.json (renamed from cli/tests/testdata/info/with_config/deno-override.json)0
-rw-r--r--tests/testdata/info/with_config/deno.json (renamed from cli/tests/testdata/info/with_config/deno.json)0
-rw-r--r--tests/testdata/info/with_config/import_map.json (renamed from cli/tests/testdata/info/with_config/import_map.json)0
-rw-r--r--tests/testdata/info/with_config/test.ts (renamed from cli/tests/testdata/info/with_config/test.ts)0
-rw-r--r--tests/testdata/info/with_config/with_config.out (renamed from cli/tests/testdata/info/with_config/with_config.out)0
-rw-r--r--tests/testdata/info/with_import_map/deno.json (renamed from cli/tests/testdata/info/with_import_map/deno.json)0
-rw-r--r--tests/testdata/info/with_import_map/deno.lock (renamed from cli/tests/testdata/info/with_import_map/deno.lock)0
-rw-r--r--tests/testdata/info/with_import_map/main.tsx (renamed from cli/tests/testdata/info/with_import_map/main.tsx)0
-rw-r--r--tests/testdata/info/with_import_map/with_import_map.out (renamed from cli/tests/testdata/info/with_import_map/with_import_map.out)0
-rw-r--r--tests/testdata/inspector/bar.js (renamed from cli/tests/testdata/inspector/bar.js)0
-rw-r--r--tests/testdata/inspector/error_with_npm_import.js (renamed from cli/tests/testdata/inspector/error_with_npm_import.js)0
-rw-r--r--tests/testdata/inspector/foo.ts (renamed from cli/tests/testdata/inspector/foo.ts)0
-rw-r--r--tests/testdata/inspector/inspect_wait.js (renamed from cli/tests/testdata/inspector/inspect_wait.js)0
-rw-r--r--tests/testdata/inspector/inspector1.js (renamed from cli/tests/testdata/inspector/inspector1.js)0
-rw-r--r--tests/testdata/inspector/inspector2.js (renamed from cli/tests/testdata/inspector/inspector2.js)0
-rw-r--r--tests/testdata/inspector/inspector3.js (renamed from cli/tests/testdata/inspector/inspector3.js)0
-rw-r--r--tests/testdata/inspector/inspector4.js (renamed from cli/tests/testdata/inspector/inspector4.js)0
-rw-r--r--tests/testdata/inspector/inspector_test.js (renamed from cli/tests/testdata/inspector/inspector_test.js)0
-rw-r--r--tests/testdata/inspector/memory.js (renamed from cli/tests/testdata/inspector/memory.js)0
-rw-r--r--tests/testdata/inspector/test.ts (renamed from cli/tests/testdata/inspector/test.ts)0
-rw-r--r--tests/testdata/install/check_local_by_default.ts (renamed from cli/tests/testdata/install/check_local_by_default.ts)0
-rw-r--r--tests/testdata/install/check_local_by_default2.ts (renamed from cli/tests/testdata/install/check_local_by_default2.ts)0
-rw-r--r--tests/testdata/jsr/deps/main.out (renamed from cli/tests/testdata/jsr/deps/main.out)0
-rw-r--r--tests/testdata/jsr/deps/main.ts (renamed from cli/tests/testdata/jsr/deps/main.ts)0
-rw-r--r--tests/testdata/jsr/deps/main_info.out (renamed from cli/tests/testdata/jsr/deps/main_info.out)0
-rw-r--r--tests/testdata/jsr/module_graph/main.out (renamed from cli/tests/testdata/jsr/module_graph/main.out)0
-rw-r--r--tests/testdata/jsr/module_graph/main.ts (renamed from cli/tests/testdata/jsr/module_graph/main.ts)0
-rw-r--r--tests/testdata/jsr/module_graph/main_info.out (renamed from cli/tests/testdata/jsr/module_graph/main_info.out)0
-rw-r--r--tests/testdata/jsr/no_module_graph/main.out (renamed from cli/tests/testdata/jsr/no_module_graph/main.out)0
-rw-r--r--tests/testdata/jsr/no_module_graph/main.ts (renamed from cli/tests/testdata/jsr/no_module_graph/main.ts)0
-rw-r--r--tests/testdata/jsr/no_module_graph/main_info.out (renamed from cli/tests/testdata/jsr/no_module_graph/main_info.out)0
-rw-r--r--tests/testdata/jsr/no_module_graph/multiple.out (renamed from cli/tests/testdata/jsr/no_module_graph/multiple.out)0
-rw-r--r--tests/testdata/jsr/no_module_graph/multiple.ts (renamed from cli/tests/testdata/jsr/no_module_graph/multiple.ts)0
-rw-r--r--tests/testdata/jsr/registry/@denotest/add/1.0.0/mod.ts (renamed from cli/tests/testdata/jsr/registry/@denotest/add/1.0.0/mod.ts)0
-rw-r--r--tests/testdata/jsr/registry/@denotest/add/1.0.0_meta.json (renamed from cli/tests/testdata/jsr/registry/@denotest/add/1.0.0_meta.json)0
-rw-r--r--tests/testdata/jsr/registry/@denotest/add/meta.json (renamed from cli/tests/testdata/jsr/registry/@denotest/add/meta.json)0
-rw-r--r--tests/testdata/jsr/registry/@denotest/deps/1.0.0/mod.ts (renamed from cli/tests/testdata/jsr/registry/@denotest/deps/1.0.0/mod.ts)0
-rw-r--r--tests/testdata/jsr/registry/@denotest/deps/1.0.0_meta.json (renamed from cli/tests/testdata/jsr/registry/@denotest/deps/1.0.0_meta.json)0
-rw-r--r--tests/testdata/jsr/registry/@denotest/deps/meta.json (renamed from cli/tests/testdata/jsr/registry/@denotest/deps/meta.json)0
-rw-r--r--tests/testdata/jsr/registry/@denotest/module_graph/1.4.0/mod.ts (renamed from cli/tests/testdata/jsr/registry/@denotest/module_graph/1.4.0/mod.ts)0
-rw-r--r--tests/testdata/jsr/registry/@denotest/module_graph/1.4.0/other.ts (renamed from cli/tests/testdata/jsr/registry/@denotest/module_graph/1.4.0/other.ts)0
-rw-r--r--tests/testdata/jsr/registry/@denotest/module_graph/1.4.0_meta.json (renamed from cli/tests/testdata/jsr/registry/@denotest/module_graph/1.4.0_meta.json)0
-rw-r--r--tests/testdata/jsr/registry/@denotest/module_graph/meta.json (renamed from cli/tests/testdata/jsr/registry/@denotest/module_graph/meta.json)0
-rw-r--r--tests/testdata/jsr/registry/@denotest/no_module_graph/0.1.0/TestClass.ts (renamed from cli/tests/testdata/jsr/registry/@denotest/no_module_graph/0.1.0/TestClass.ts)0
-rw-r--r--tests/testdata/jsr/registry/@denotest/no_module_graph/0.1.0/mod.ts (renamed from cli/tests/testdata/jsr/registry/@denotest/no_module_graph/0.1.0/mod.ts)0
-rw-r--r--tests/testdata/jsr/registry/@denotest/no_module_graph/0.1.0_meta.json (renamed from cli/tests/testdata/jsr/registry/@denotest/no_module_graph/0.1.0_meta.json)0
-rw-r--r--tests/testdata/jsr/registry/@denotest/no_module_graph/0.1.1/TestClass.ts (renamed from cli/tests/testdata/jsr/registry/@denotest/no_module_graph/0.1.1/TestClass.ts)0
-rw-r--r--tests/testdata/jsr/registry/@denotest/no_module_graph/0.1.1/mod.ts (renamed from cli/tests/testdata/jsr/registry/@denotest/no_module_graph/0.1.1/mod.ts)0
-rw-r--r--tests/testdata/jsr/registry/@denotest/no_module_graph/0.1.1_meta.json (renamed from cli/tests/testdata/jsr/registry/@denotest/no_module_graph/0.1.1_meta.json)0
-rw-r--r--tests/testdata/jsr/registry/@denotest/no_module_graph/0.2.0/TestClass.ts (renamed from cli/tests/testdata/jsr/registry/@denotest/no_module_graph/0.2.0/TestClass.ts)0
-rw-r--r--tests/testdata/jsr/registry/@denotest/no_module_graph/0.2.0/mod.ts (renamed from cli/tests/testdata/jsr/registry/@denotest/no_module_graph/0.2.0/mod.ts)0
-rw-r--r--tests/testdata/jsr/registry/@denotest/no_module_graph/0.2.0_meta.json (renamed from cli/tests/testdata/jsr/registry/@denotest/no_module_graph/0.2.0_meta.json)0
-rw-r--r--tests/testdata/jsr/registry/@denotest/no_module_graph/meta.json (renamed from cli/tests/testdata/jsr/registry/@denotest/no_module_graph/meta.json)0
-rw-r--r--tests/testdata/jsr/registry/@denotest/subset_type_graph/0.1.0/mod.ts (renamed from cli/tests/testdata/jsr/registry/@denotest/subset_type_graph/0.1.0/mod.ts)0
-rw-r--r--tests/testdata/jsr/registry/@denotest/subset_type_graph/0.1.0_meta.json (renamed from cli/tests/testdata/jsr/registry/@denotest/subset_type_graph/0.1.0_meta.json)0
-rw-r--r--tests/testdata/jsr/registry/@denotest/subset_type_graph/meta.json (renamed from cli/tests/testdata/jsr/registry/@denotest/subset_type_graph/meta.json)0
-rw-r--r--tests/testdata/jsr/registry/@denotest/subset_type_graph_invalid/0.1.0/mod.ts (renamed from cli/tests/testdata/jsr/registry/@denotest/subset_type_graph_invalid/0.1.0/mod.ts)0
-rw-r--r--tests/testdata/jsr/registry/@denotest/subset_type_graph_invalid/0.1.0_meta.json (renamed from cli/tests/testdata/jsr/registry/@denotest/subset_type_graph_invalid/0.1.0_meta.json)0
-rw-r--r--tests/testdata/jsr/registry/@denotest/subset_type_graph_invalid/meta.json (renamed from cli/tests/testdata/jsr/registry/@denotest/subset_type_graph_invalid/meta.json)0
-rw-r--r--tests/testdata/jsr/subset_type_graph/main.check.out (renamed from cli/tests/testdata/jsr/subset_type_graph/main.check.out)0
-rw-r--r--tests/testdata/jsr/subset_type_graph/main.ts (renamed from cli/tests/testdata/jsr/subset_type_graph/main.ts)0
-rw-r--r--tests/testdata/jsr/version_not_found/main.out (renamed from cli/tests/testdata/jsr/version_not_found/main.out)0
-rw-r--r--tests/testdata/jsr/version_not_found/main.ts (renamed from cli/tests/testdata/jsr/version_not_found/main.ts)0
-rw-r--r--tests/testdata/jsx/deno-jsx-error.jsonc (renamed from cli/tests/testdata/jsx/deno-jsx-error.jsonc)0
-rw-r--r--tests/testdata/jsx/deno-jsx-import-map.jsonc (renamed from cli/tests/testdata/jsx/deno-jsx-import-map.jsonc)0
-rw-r--r--tests/testdata/jsx/deno-jsx-precompile.jsonc (renamed from cli/tests/testdata/jsx/deno-jsx-precompile.jsonc)0
-rw-r--r--tests/testdata/jsx/deno-jsx.json (renamed from cli/tests/testdata/jsx/deno-jsx.json)0
-rw-r--r--tests/testdata/jsx/deno-jsx.jsonc (renamed from cli/tests/testdata/jsx/deno-jsx.jsonc)0
-rw-r--r--tests/testdata/jsx/deno-jsxdev-import-map.jsonc (renamed from cli/tests/testdata/jsx/deno-jsxdev-import-map.jsonc)0
-rw-r--r--tests/testdata/jsx/deno-jsxdev.jsonc (renamed from cli/tests/testdata/jsx/deno-jsxdev.jsonc)0
-rw-r--r--tests/testdata/jsx/deno.lock (renamed from cli/tests/testdata/jsx/deno.lock)0
-rw-r--r--tests/testdata/jsx/import-map-scoped.json (renamed from cli/tests/testdata/jsx/import-map-scoped.json)0
-rw-r--r--tests/testdata/jsx/import-map.json (renamed from cli/tests/testdata/jsx/import-map.json)0
-rw-r--r--tests/testdata/jsx/jsx-dev-runtime/index.ts (renamed from cli/tests/testdata/jsx/jsx-dev-runtime/index.ts)0
-rw-r--r--tests/testdata/jsx/jsx-precompile/index.ts (renamed from cli/tests/testdata/jsx/jsx-precompile/index.ts)0
-rw-r--r--tests/testdata/jsx/jsx-runtime/index.ts (renamed from cli/tests/testdata/jsx/jsx-runtime/index.ts)0
-rw-r--r--tests/testdata/jupyter/install_command_not_exists.out (renamed from cli/tests/testdata/jupyter/install_command_not_exists.out)0
-rw-r--r--tests/testdata/jupyter/integration_test.ipynb (renamed from cli/tests/testdata/jupyter/integration_test.ipynb)0
-rw-r--r--tests/testdata/lint/Deno.compact.format.jsonc (renamed from cli/tests/testdata/lint/Deno.compact.format.jsonc)0
-rw-r--r--tests/testdata/lint/Deno.jsonc (renamed from cli/tests/testdata/lint/Deno.jsonc)0
-rw-r--r--tests/testdata/lint/Deno.malformed.jsonc (renamed from cli/tests/testdata/lint/Deno.malformed.jsonc)0
-rw-r--r--tests/testdata/lint/Deno.malformed2.jsonc (renamed from cli/tests/testdata/lint/Deno.malformed2.jsonc)0
-rw-r--r--tests/testdata/lint/Deno.no_tags.jsonc (renamed from cli/tests/testdata/lint/Deno.no_tags.jsonc)0
-rw-r--r--tests/testdata/lint/deno.glob.json (renamed from cli/tests/testdata/lint/deno.glob.json)0
-rw-r--r--tests/testdata/lint/expected.out (renamed from cli/tests/testdata/lint/expected.out)0
-rw-r--r--tests/testdata/lint/expected_compact.out (renamed from cli/tests/testdata/lint/expected_compact.out)0
-rw-r--r--tests/testdata/lint/expected_from_stdin.out (renamed from cli/tests/testdata/lint/expected_from_stdin.out)0
-rw-r--r--tests/testdata/lint/expected_from_stdin_json.out (renamed from cli/tests/testdata/lint/expected_from_stdin_json.out)0
-rw-r--r--tests/testdata/lint/expected_glob.out (renamed from cli/tests/testdata/lint/expected_glob.out)0
-rw-r--r--tests/testdata/lint/expected_ignore.out (renamed from cli/tests/testdata/lint/expected_ignore.out)0
-rw-r--r--tests/testdata/lint/expected_json.out (renamed from cli/tests/testdata/lint/expected_json.out)0
-rw-r--r--tests/testdata/lint/expected_quiet.out (renamed from cli/tests/testdata/lint/expected_quiet.out)0
-rw-r--r--tests/testdata/lint/expected_rules.out (renamed from cli/tests/testdata/lint/expected_rules.out)0
-rw-r--r--tests/testdata/lint/expected_verbose.out (renamed from cli/tests/testdata/lint/expected_verbose.out)0
-rw-r--r--tests/testdata/lint/glob/data/tes.ts (renamed from cli/tests/testdata/lint/glob/data/tes.ts)0
-rw-r--r--tests/testdata/lint/glob/data/test1.js (renamed from cli/tests/testdata/lint/glob/data/test1.js)0
-rw-r--r--tests/testdata/lint/glob/data/test1.ts (renamed from cli/tests/testdata/lint/glob/data/test1.ts)0
-rw-r--r--tests/testdata/lint/glob/data/test12.ts (renamed from cli/tests/testdata/lint/glob/data/test12.ts)0
-rw-r--r--tests/testdata/lint/glob/nested/fizz/bar.ts (renamed from cli/tests/testdata/lint/glob/nested/fizz/bar.ts)0
-rw-r--r--tests/testdata/lint/glob/nested/fizz/bazz.ts (renamed from cli/tests/testdata/lint/glob/nested/fizz/bazz.ts)0
-rw-r--r--tests/testdata/lint/glob/nested/fizz/fizz.ts (renamed from cli/tests/testdata/lint/glob/nested/fizz/fizz.ts)0
-rw-r--r--tests/testdata/lint/glob/nested/fizz/foo.ts (renamed from cli/tests/testdata/lint/glob/nested/fizz/foo.ts)0
-rw-r--r--tests/testdata/lint/glob/nested/foo/bar.ts (renamed from cli/tests/testdata/lint/glob/nested/foo/bar.ts)0
-rw-r--r--tests/testdata/lint/glob/nested/foo/bazz.ts (renamed from cli/tests/testdata/lint/glob/nested/foo/bazz.ts)0
-rw-r--r--tests/testdata/lint/glob/nested/foo/fizz.ts (renamed from cli/tests/testdata/lint/glob/nested/foo/fizz.ts)0
-rw-r--r--tests/testdata/lint/glob/nested/foo/foo.ts (renamed from cli/tests/testdata/lint/glob/nested/foo/foo.ts)0
-rw-r--r--tests/testdata/lint/glob/pages/[id].ts (renamed from cli/tests/testdata/lint/glob/pages/[id].ts)0
-rw-r--r--tests/testdata/lint/watch/badly_linted.js (renamed from cli/tests/testdata/lint/watch/badly_linted.js)0
-rw-r--r--tests/testdata/lint/watch/badly_linted.js.out (renamed from cli/tests/testdata/lint/watch/badly_linted.js.out)0
-rw-r--r--tests/testdata/lint/watch/badly_linted_fixed1.js (renamed from cli/tests/testdata/lint/watch/badly_linted_fixed1.js)0
-rw-r--r--tests/testdata/lint/watch/badly_linted_fixed1.js.out (renamed from cli/tests/testdata/lint/watch/badly_linted_fixed1.js.out)0
-rw-r--r--tests/testdata/lint/watch/badly_linted_fixed2.js (renamed from cli/tests/testdata/lint/watch/badly_linted_fixed2.js)0
-rw-r--r--tests/testdata/lint/watch/badly_linted_fixed2.js.out (renamed from cli/tests/testdata/lint/watch/badly_linted_fixed2.js.out)0
-rw-r--r--tests/testdata/lint/with_config.out (renamed from cli/tests/testdata/lint/with_config.out)0
-rw-r--r--tests/testdata/lint/with_config/a.ts (renamed from cli/tests/testdata/lint/with_config/a.ts)0
-rw-r--r--tests/testdata/lint/with_config/b.ts (renamed from cli/tests/testdata/lint/with_config/b.ts)0
-rw-r--r--tests/testdata/lint/with_config_and_flags.out (renamed from cli/tests/testdata/lint/with_config_and_flags.out)0
-rw-r--r--tests/testdata/lint/with_config_without_tags.out (renamed from cli/tests/testdata/lint/with_config_without_tags.out)0
-rw-r--r--tests/testdata/lint/with_malformed_config.out (renamed from cli/tests/testdata/lint/with_malformed_config.out)0
-rw-r--r--tests/testdata/lint/with_malformed_config2.out (renamed from cli/tests/testdata/lint/with_malformed_config2.out)0
-rw-r--r--tests/testdata/lint/with_report_config_compact.out (renamed from cli/tests/testdata/lint/with_report_config_compact.out)0
-rw-r--r--tests/testdata/lint/with_report_config_override.out (renamed from cli/tests/testdata/lint/with_report_config_override.out)0
-rw-r--r--tests/testdata/lint/without_config/file1.js (renamed from cli/tests/testdata/lint/without_config/file1.js)0
-rw-r--r--tests/testdata/lint/without_config/file2.ts (renamed from cli/tests/testdata/lint/without_config/file2.ts)0
-rw-r--r--tests/testdata/lint/without_config/ignored_file.ts (renamed from cli/tests/testdata/lint/without_config/ignored_file.ts)0
-rw-r--r--tests/testdata/lint/without_config/malformed.js (renamed from cli/tests/testdata/lint/without_config/malformed.js)0
-rw-r--r--tests/testdata/lockfile/basic/bench.nolock.out (renamed from cli/tests/testdata/lockfile/basic/bench.nolock.out)0
-rw-r--r--tests/testdata/lockfile/basic/deno.json (renamed from cli/tests/testdata/lockfile/basic/deno.json)0
-rw-r--r--tests/testdata/lockfile/basic/deno.lock (renamed from cli/tests/testdata/lockfile/basic/deno.lock)0
-rw-r--r--tests/testdata/lockfile/basic/doc.nolock.out (renamed from cli/tests/testdata/lockfile/basic/doc.nolock.out)0
-rw-r--r--tests/testdata/lockfile/basic/fail.out (renamed from cli/tests/testdata/lockfile/basic/fail.out)0
-rw-r--r--tests/testdata/lockfile/basic/info.nolock.out (renamed from cli/tests/testdata/lockfile/basic/info.nolock.out)0
-rw-r--r--tests/testdata/lockfile/basic/main.bench.ts (renamed from cli/tests/testdata/lockfile/basic/main.bench.ts)0
-rw-r--r--tests/testdata/lockfile/basic/main.test.ts (renamed from cli/tests/testdata/lockfile/basic/main.test.ts)0
-rw-r--r--tests/testdata/lockfile/basic/main.ts (renamed from cli/tests/testdata/lockfile/basic/main.ts)0
-rw-r--r--tests/testdata/lockfile/basic/mod.ts (renamed from cli/tests/testdata/lockfile/basic/mod.ts)0
-rw-r--r--tests/testdata/lockfile/basic/test.nolock.out (renamed from cli/tests/testdata/lockfile/basic/test.nolock.out)0
-rw-r--r--tests/testdata/lockfile/no_dts/deno.lock.out (renamed from cli/tests/testdata/lockfile/no_dts/deno.lock.out)0
-rw-r--r--tests/testdata/lockfile/no_dts/main.cache.out (renamed from cli/tests/testdata/lockfile/no_dts/main.cache.out)0
-rw-r--r--tests/testdata/lockfile/no_dts/main.ts (renamed from cli/tests/testdata/lockfile/no_dts/main.ts)0
-rw-r--r--tests/testdata/lockfile/no_dts/mod.d.ts (renamed from cli/tests/testdata/lockfile/no_dts/mod.d.ts)0
-rw-r--r--tests/testdata/lockfile/no_dts/mod.js (renamed from cli/tests/testdata/lockfile/no_dts/mod.js)0
-rw-r--r--tests/testdata/lsp/deno.import_map.jsonc (renamed from cli/tests/testdata/lsp/deno.import_map.jsonc)0
-rw-r--r--tests/testdata/lsp/deno.lint.exclude.jsonc (renamed from cli/tests/testdata/lsp/deno.lint.exclude.jsonc)0
-rw-r--r--tests/testdata/lsp/diagnostics_deno_types.json (renamed from cli/tests/testdata/lsp/diagnostics_deno_types.json)0
-rw-r--r--tests/testdata/lsp/import-map.json (renamed from cli/tests/testdata/lsp/import-map.json)0
-rw-r--r--tests/testdata/lsp/large_file.txt (renamed from cli/tests/testdata/lsp/large_file.txt)0
-rw-r--r--tests/testdata/lsp/registries/a_latest_.json (renamed from cli/tests/testdata/lsp/registries/a_latest_.json)0
-rw-r--r--tests/testdata/lsp/registries/a_v1.0.0_.json (renamed from cli/tests/testdata/lsp/registries/a_v1.0.0_.json)0
-rw-r--r--tests/testdata/lsp/registries/a_v1.0.0_b.json (renamed from cli/tests/testdata/lsp/registries/a_v1.0.0_b.json)0
-rw-r--r--tests/testdata/lsp/registries/a_v1.0.1_.json (renamed from cli/tests/testdata/lsp/registries/a_v1.0.1_.json)0
-rw-r--r--tests/testdata/lsp/registries/a_v2.0.0_.json (renamed from cli/tests/testdata/lsp/registries/a_v2.0.0_.json)0
-rw-r--r--tests/testdata/lsp/registries/a_versions_.json (renamed from cli/tests/testdata/lsp/registries/a_versions_.json)0
-rw-r--r--tests/testdata/lsp/registries/a_versions_v1..json (renamed from cli/tests/testdata/lsp/registries/a_versions_v1..json)0
-rw-r--r--tests/testdata/lsp/registries/b_latest_.json (renamed from cli/tests/testdata/lsp/registries/b_latest_.json)0
-rw-r--r--tests/testdata/lsp/registries/b_v0.0.1_.json (renamed from cli/tests/testdata/lsp/registries/b_v0.0.1_.json)0
-rw-r--r--tests/testdata/lsp/registries/b_v0.0.2_.json (renamed from cli/tests/testdata/lsp/registries/b_v0.0.2_.json)0
-rw-r--r--tests/testdata/lsp/registries/b_v0.0.3_.json (renamed from cli/tests/testdata/lsp/registries/b_v0.0.3_.json)0
-rw-r--r--tests/testdata/lsp/registries/b_versions_.json (renamed from cli/tests/testdata/lsp/registries/b_versions_.json)0
-rw-r--r--tests/testdata/lsp/registries/cde_tags.json (renamed from cli/tests/testdata/lsp/registries/cde_tags.json)0
-rw-r--r--tests/testdata/lsp/registries/cdef_tags.json (renamed from cli/tests/testdata/lsp/registries/cdef_tags.json)0
-rw-r--r--tests/testdata/lsp/registries/complex.json (renamed from cli/tests/testdata/lsp/registries/complex.json)0
-rw-r--r--tests/testdata/lsp/registries/complex_efg.json (renamed from cli/tests/testdata/lsp/registries/complex_efg.json)0
-rw-r--r--tests/testdata/lsp/registries/complex_efg_0.2.0.json (renamed from cli/tests/testdata/lsp/registries/complex_efg_0.2.0.json)0
-rw-r--r--tests/testdata/lsp/registries/def_tags.json (renamed from cli/tests/testdata/lsp/registries/def_tags.json)0
-rw-r--r--tests/testdata/lsp/registries/deno-import-intellisense-complex.json (renamed from cli/tests/testdata/lsp/registries/deno-import-intellisense-complex.json)0
-rw-r--r--tests/testdata/lsp/registries/deno-import-intellisense-key-first.json (renamed from cli/tests/testdata/lsp/registries/deno-import-intellisense-key-first.json)0
-rw-r--r--tests/testdata/lsp/registries/deno-import-intellisense.json (renamed from cli/tests/testdata/lsp/registries/deno-import-intellisense.json)0
-rw-r--r--tests/testdata/lsp/registries/doc_a.json (renamed from cli/tests/testdata/lsp/registries/doc_a.json)0
-rw-r--r--tests/testdata/lsp/registries/doc_a_latest_mod.ts.json (renamed from cli/tests/testdata/lsp/registries/doc_a_latest_mod.ts.json)0
-rw-r--r--tests/testdata/lsp/registries/key_first.json (renamed from cli/tests/testdata/lsp/registries/key_first.json)0
-rw-r--r--tests/testdata/lsp/registries/modules_.json (renamed from cli/tests/testdata/lsp/registries/modules_.json)0
-rw-r--r--tests/testdata/lsp/registries/modules_a.json (renamed from cli/tests/testdata/lsp/registries/modules_a.json)0
-rw-r--r--tests/testdata/lsp/types.tsconfig.json (renamed from cli/tests/testdata/lsp/types.tsconfig.json)0
-rw-r--r--tests/testdata/lsp/x_deno_warning_redirect.js (renamed from cli/tests/testdata/lsp/x_deno_warning_redirect.js)0
-rw-r--r--tests/testdata/malformed_config/deno.json (renamed from cli/tests/testdata/malformed_config/deno.json)0
-rw-r--r--tests/testdata/module_graph/file_tests-a.mjs (renamed from cli/tests/testdata/module_graph/file_tests-a.mjs)0
-rw-r--r--tests/testdata/module_graph/file_tests-b-mod.js (renamed from cli/tests/testdata/module_graph/file_tests-b-mod.js)0
-rw-r--r--tests/testdata/module_graph/file_tests-b.ts (renamed from cli/tests/testdata/module_graph/file_tests-b.ts)0
-rw-r--r--tests/testdata/module_graph/file_tests-c-mod.ts (renamed from cli/tests/testdata/module_graph/file_tests-c-mod.ts)0
-rw-r--r--tests/testdata/module_graph/file_tests-checkwithconfig.ts (renamed from cli/tests/testdata/module_graph/file_tests-checkwithconfig.ts)0
-rw-r--r--tests/testdata/module_graph/file_tests-diag.ts (renamed from cli/tests/testdata/module_graph/file_tests-diag.ts)0
-rw-r--r--tests/testdata/module_graph/file_tests-dynamicimport.ts (renamed from cli/tests/testdata/module_graph/file_tests-dynamicimport.ts)0
-rw-r--r--tests/testdata/module_graph/file_tests-importjson.ts (renamed from cli/tests/testdata/module_graph/file_tests-importjson.ts)0
-rw-r--r--tests/testdata/module_graph/file_tests-importremap.ts (renamed from cli/tests/testdata/module_graph/file_tests-importremap.ts)0
-rw-r--r--tests/testdata/module_graph/file_tests-main.ts (renamed from cli/tests/testdata/module_graph/file_tests-main.ts)0
-rw-r--r--tests/testdata/module_graph/file_tests-some.json (renamed from cli/tests/testdata/module_graph/file_tests-some.json)0
-rw-r--r--tests/testdata/module_graph/file_typesref.d.ts (renamed from cli/tests/testdata/module_graph/file_typesref.d.ts)0
-rw-r--r--tests/testdata/module_graph/file_typesref.js (renamed from cli/tests/testdata/module_graph/file_typesref.js)0
-rw-r--r--tests/testdata/module_graph/https_deno.land-std-http-server.ts (renamed from cli/tests/testdata/module_graph/https_deno.land-std-http-server.ts)0
-rw-r--r--tests/testdata/module_graph/https_deno.land-x-a-mod.ts (renamed from cli/tests/testdata/module_graph/https_deno.land-x-a-mod.ts)0
-rw-r--r--tests/testdata/module_graph/https_deno.land-x-a.ts (renamed from cli/tests/testdata/module_graph/https_deno.land-x-a.ts)0
-rw-r--r--tests/testdata/module_graph/https_deno.land-x-import_map.ts (renamed from cli/tests/testdata/module_graph/https_deno.land-x-import_map.ts)0
-rw-r--r--tests/testdata/module_graph/https_deno.land-x-jquery.js (renamed from cli/tests/testdata/module_graph/https_deno.land-x-jquery.js)0
-rw-r--r--tests/testdata/module_graph/https_deno.land-x-lib-a.ts (renamed from cli/tests/testdata/module_graph/https_deno.land-x-lib-a.ts)0
-rw-r--r--tests/testdata/module_graph/https_deno.land-x-lib-b.js (renamed from cli/tests/testdata/module_graph/https_deno.land-x-lib-b.js)0
-rw-r--r--tests/testdata/module_graph/https_deno.land-x-lib-c.d.ts (renamed from cli/tests/testdata/module_graph/https_deno.land-x-lib-c.d.ts)0
-rw-r--r--tests/testdata/module_graph/https_deno.land-x-lib-c.js (renamed from cli/tests/testdata/module_graph/https_deno.land-x-lib-c.js)0
-rw-r--r--tests/testdata/module_graph/https_deno.land-x-lib-mod.d.ts (renamed from cli/tests/testdata/module_graph/https_deno.land-x-lib-mod.d.ts)0
-rw-r--r--tests/testdata/module_graph/https_deno.land-x-lib-mod.js (renamed from cli/tests/testdata/module_graph/https_deno.land-x-lib-mod.js)0
-rw-r--r--tests/testdata/module_graph/https_deno.land-x-mod.ts (renamed from cli/tests/testdata/module_graph/https_deno.land-x-mod.ts)0
-rw-r--r--tests/testdata/module_graph/https_deno.land-x-transpile.tsx (renamed from cli/tests/testdata/module_graph/https_deno.land-x-transpile.tsx)0
-rw-r--r--tests/testdata/module_graph/https_unpkg.com-lodash-index.js (renamed from cli/tests/testdata/module_graph/https_unpkg.com-lodash-index.js)0
-rw-r--r--tests/testdata/module_graph/lockfile.json (renamed from cli/tests/testdata/module_graph/lockfile.json)0
-rw-r--r--tests/testdata/module_graph/lockfile_fail.json (renamed from cli/tests/testdata/module_graph/lockfile_fail.json)0
-rw-r--r--tests/testdata/module_graph/tsconfig.json (renamed from cli/tests/testdata/module_graph/tsconfig.json)0
-rw-r--r--tests/testdata/module_graph/tsconfig_01.json (renamed from cli/tests/testdata/module_graph/tsconfig_01.json)0
-rw-r--r--tests/testdata/navigator_language.ts (renamed from cli/tests/testdata/navigator_language.ts)0
-rw-r--r--tests/testdata/navigator_languages.ts (renamed from cli/tests/testdata/navigator_languages.ts)0
-rw-r--r--tests/testdata/node/rejection_handled_web_process.ts (renamed from cli/tests/testdata/node/rejection_handled_web_process.ts)0
-rw-r--r--tests/testdata/node/rejection_handled_web_process.ts.out (renamed from cli/tests/testdata/node/rejection_handled_web_process.ts.out)0
-rw-r--r--tests/testdata/node/require_esm_error/esm.js (renamed from cli/tests/testdata/node/require_esm_error/esm.js)0
-rw-r--r--tests/testdata/node/require_esm_error/main.out (renamed from cli/tests/testdata/node/require_esm_error/main.out)0
-rw-r--r--tests/testdata/node/require_esm_error/main.ts (renamed from cli/tests/testdata/node/require_esm_error/main.ts)0
-rw-r--r--tests/testdata/node/test.js (renamed from cli/tests/testdata/node/test.js)0
-rw-r--r--tests/testdata/node/test.out (renamed from cli/tests/testdata/node/test.out)0
-rw-r--r--tests/testdata/node/unhandled_rejection_web.ts (renamed from cli/tests/testdata/node/unhandled_rejection_web.ts)0
-rw-r--r--tests/testdata/node/unhandled_rejection_web.ts.out (renamed from cli/tests/testdata/node/unhandled_rejection_web.ts.out)0
-rw-r--r--tests/testdata/node/unhandled_rejection_web_process.ts (renamed from cli/tests/testdata/node/unhandled_rejection_web_process.ts)0
-rw-r--r--tests/testdata/node/unhandled_rejection_web_process.ts.out (renamed from cli/tests/testdata/node/unhandled_rejection_web_process.ts.out)0
-rw-r--r--tests/testdata/npm/README.md (renamed from cli/tests/testdata/npm/README.md)0
-rw-r--r--tests/testdata/npm/binary_package/main.js (renamed from cli/tests/testdata/npm/binary_package/main.js)0
-rw-r--r--tests/testdata/npm/builtin_module_module/main.js (renamed from cli/tests/testdata/npm/builtin_module_module/main.js)0
-rw-r--r--tests/testdata/npm/builtin_module_module/main.out (renamed from cli/tests/testdata/npm/builtin_module_module/main.out)0
-rw-r--r--tests/testdata/npm/cached_only/main.out (renamed from cli/tests/testdata/npm/cached_only/main.out)0
-rw-r--r--tests/testdata/npm/cached_only/main.ts (renamed from cli/tests/testdata/npm/cached_only/main.ts)0
-rw-r--r--tests/testdata/npm/cached_only_after_first_run/main1.ts (renamed from cli/tests/testdata/npm/cached_only_after_first_run/main1.ts)0
-rw-r--r--tests/testdata/npm/cached_only_after_first_run/main2.ts (renamed from cli/tests/testdata/npm/cached_only_after_first_run/main2.ts)0
-rw-r--r--tests/testdata/npm/check_errors/main.ts (renamed from cli/tests/testdata/npm/check_errors/main.ts)0
-rw-r--r--tests/testdata/npm/check_errors/main_all.out (renamed from cli/tests/testdata/npm/check_errors/main_all.out)0
-rw-r--r--tests/testdata/npm/check_errors/main_local.out (renamed from cli/tests/testdata/npm/check_errors/main_local.out)0
-rw-r--r--tests/testdata/npm/child_process_fork_test/main.out (renamed from cli/tests/testdata/npm/child_process_fork_test/main.out)0
-rw-r--r--tests/testdata/npm/child_process_fork_test/main.ts (renamed from cli/tests/testdata/npm/child_process_fork_test/main.ts)0
-rw-r--r--tests/testdata/npm/cjs-invalid-name-exports/main.out (renamed from cli/tests/testdata/npm/cjs-invalid-name-exports/main.out)0
-rw-r--r--tests/testdata/npm/cjs-invalid-name-exports/main.ts (renamed from cli/tests/testdata/npm/cjs-invalid-name-exports/main.ts)0
-rw-r--r--tests/testdata/npm/cjs_local_global_decls/main.out (renamed from cli/tests/testdata/npm/cjs_local_global_decls/main.out)0
-rw-r--r--tests/testdata/npm/cjs_local_global_decls/main.ts (renamed from cli/tests/testdata/npm/cjs_local_global_decls/main.ts)0
-rw-r--r--tests/testdata/npm/cjs_module_export_assignment/main.out (renamed from cli/tests/testdata/npm/cjs_module_export_assignment/main.out)0
-rw-r--r--tests/testdata/npm/cjs_module_export_assignment/main.ts (renamed from cli/tests/testdata/npm/cjs_module_export_assignment/main.ts)0
-rw-r--r--tests/testdata/npm/cjs_module_export_assignment_number/main.out (renamed from cli/tests/testdata/npm/cjs_module_export_assignment_number/main.out)0
-rw-r--r--tests/testdata/npm/cjs_module_export_assignment_number/main.ts (renamed from cli/tests/testdata/npm/cjs_module_export_assignment_number/main.ts)0
-rw-r--r--tests/testdata/npm/cjs_reexport_collision/main.out (renamed from cli/tests/testdata/npm/cjs_reexport_collision/main.out)0
-rw-r--r--tests/testdata/npm/cjs_reexport_collision/main.ts (renamed from cli/tests/testdata/npm/cjs_reexport_collision/main.ts)0
-rw-r--r--tests/testdata/npm/cjs_require_esm_error/main.out (renamed from cli/tests/testdata/npm/cjs_require_esm_error/main.out)0
-rw-r--r--tests/testdata/npm/cjs_require_esm_error/main.ts (renamed from cli/tests/testdata/npm/cjs_require_esm_error/main.ts)0
-rw-r--r--tests/testdata/npm/cjs_require_esm_mjs_error/main.out (renamed from cli/tests/testdata/npm/cjs_require_esm_mjs_error/main.out)0
-rw-r--r--tests/testdata/npm/cjs_require_esm_mjs_error/main.ts (renamed from cli/tests/testdata/npm/cjs_require_esm_mjs_error/main.ts)0
-rw-r--r--tests/testdata/npm/cjs_sub_path/main.js (renamed from cli/tests/testdata/npm/cjs_sub_path/main.js)0
-rw-r--r--tests/testdata/npm/cjs_sub_path/main.out (renamed from cli/tests/testdata/npm/cjs_sub_path/main.out)0
-rw-r--r--tests/testdata/npm/cjs_this_in_exports/main.js (renamed from cli/tests/testdata/npm/cjs_this_in_exports/main.js)0
-rw-r--r--tests/testdata/npm/cjs_this_in_exports/main.out (renamed from cli/tests/testdata/npm/cjs_this_in_exports/main.out)0
-rw-r--r--tests/testdata/npm/cjs_with_deps/main.js (renamed from cli/tests/testdata/npm/cjs_with_deps/main.js)0
-rw-r--r--tests/testdata/npm/cjs_with_deps/main.out (renamed from cli/tests/testdata/npm/cjs_with_deps/main.out)0
-rw-r--r--tests/testdata/npm/cjs_with_deps/main_info.out (renamed from cli/tests/testdata/npm/cjs_with_deps/main_info.out)0
-rw-r--r--tests/testdata/npm/cjs_with_deps/main_info_json.out (renamed from cli/tests/testdata/npm/cjs_with_deps/main_info_json.out)0
-rw-r--r--tests/testdata/npm/cjs_with_deps/main_node_modules.out (renamed from cli/tests/testdata/npm/cjs_with_deps/main_node_modules.out)0
-rw-r--r--tests/testdata/npm/cjs_yargs/main.js (renamed from cli/tests/testdata/npm/cjs_yargs/main.js)0
-rw-r--r--tests/testdata/npm/cjs_yargs/main.out (renamed from cli/tests/testdata/npm/cjs_yargs/main.out)0
-rw-r--r--tests/testdata/npm/compare_globals/main.out (renamed from cli/tests/testdata/npm/compare_globals/main.out)0
-rw-r--r--tests/testdata/npm/compare_globals/main.ts (renamed from cli/tests/testdata/npm/compare_globals/main.ts)0
-rw-r--r--tests/testdata/npm/conditional_exports/main.js (renamed from cli/tests/testdata/npm/conditional_exports/main.js)0
-rw-r--r--tests/testdata/npm/conditional_exports/main.out (renamed from cli/tests/testdata/npm/conditional_exports/main.out)0
-rw-r--r--tests/testdata/npm/conditional_exports/main_node_modules.out (renamed from cli/tests/testdata/npm/conditional_exports/main_node_modules.out)0
-rw-r--r--tests/testdata/npm/create_require/main.out (renamed from cli/tests/testdata/npm/create_require/main.out)0
-rw-r--r--tests/testdata/npm/create_require/main.ts (renamed from cli/tests/testdata/npm/create_require/main.ts)0
-rw-r--r--tests/testdata/npm/d_ext/main.out (renamed from cli/tests/testdata/npm/d_ext/main.out)0
-rw-r--r--tests/testdata/npm/d_ext/main.ts (renamed from cli/tests/testdata/npm/d_ext/main.ts)0
-rw-r--r--tests/testdata/npm/deno_cache.out (renamed from cli/tests/testdata/npm/deno_cache.out)0
-rw-r--r--tests/testdata/npm/deno_run_cjs.out (renamed from cli/tests/testdata/npm/deno_run_cjs.out)0
-rw-r--r--tests/testdata/npm/deno_run_cowsay.out (renamed from cli/tests/testdata/npm/deno_run_cowsay.out)0
-rw-r--r--tests/testdata/npm/deno_run_cowsay_no_permissions.out (renamed from cli/tests/testdata/npm/deno_run_cowsay_no_permissions.out)0
-rw-r--r--tests/testdata/npm/deno_run_cowthink.out (renamed from cli/tests/testdata/npm/deno_run_cowthink.out)0
-rw-r--r--tests/testdata/npm/deno_run_esm.out (renamed from cli/tests/testdata/npm/deno_run_esm.out)0
-rw-r--r--tests/testdata/npm/deno_run_no_bin_entrypoint.out (renamed from cli/tests/testdata/npm/deno_run_no_bin_entrypoint.out)0
-rw-r--r--tests/testdata/npm/deno_run_no_bin_entrypoint_non_existent_subpath.out (renamed from cli/tests/testdata/npm/deno_run_no_bin_entrypoint_non_existent_subpath.out)0
-rw-r--r--tests/testdata/npm/deno_run_no_ext.out (renamed from cli/tests/testdata/npm/deno_run_no_ext.out)0
-rw-r--r--tests/testdata/npm/deno_run_non_existent.out (renamed from cli/tests/testdata/npm/deno_run_non_existent.out)0
-rw-r--r--tests/testdata/npm/deno_run_special_chars_in_bin_name.out (renamed from cli/tests/testdata/npm/deno_run_special_chars_in_bin_name.out)0
-rw-r--r--tests/testdata/npm/different_nested_dep/main.js (renamed from cli/tests/testdata/npm/different_nested_dep/main.js)0
-rw-r--r--tests/testdata/npm/different_nested_dep/main.out (renamed from cli/tests/testdata/npm/different_nested_dep/main.out)0
-rw-r--r--tests/testdata/npm/different_nested_dep/package.json (renamed from cli/tests/testdata/npm/different_nested_dep/package.json)0
-rw-r--r--tests/testdata/npm/directory_import/folder_index_js.out (renamed from cli/tests/testdata/npm/directory_import/folder_index_js.out)0
-rw-r--r--tests/testdata/npm/directory_import/folder_index_js.ts (renamed from cli/tests/testdata/npm/directory_import/folder_index_js.ts)0
-rw-r--r--tests/testdata/npm/directory_import/folder_no_index.out (renamed from cli/tests/testdata/npm/directory_import/folder_no_index.out)0
-rw-r--r--tests/testdata/npm/directory_import/folder_no_index.ts (renamed from cli/tests/testdata/npm/directory_import/folder_no_index.ts)0
-rw-r--r--tests/testdata/npm/dual_cjs_esm/main.out (renamed from cli/tests/testdata/npm/dual_cjs_esm/main.out)0
-rw-r--r--tests/testdata/npm/dual_cjs_esm/main.ts (renamed from cli/tests/testdata/npm/dual_cjs_esm/main.ts)0
-rw-r--r--tests/testdata/npm/dynamic_import/main.out (renamed from cli/tests/testdata/npm/dynamic_import/main.out)0
-rw-r--r--tests/testdata/npm/dynamic_import/main.ts (renamed from cli/tests/testdata/npm/dynamic_import/main.ts)0
-rw-r--r--tests/testdata/npm/dynamic_import/other.ts (renamed from cli/tests/testdata/npm/dynamic_import/other.ts)0
-rw-r--r--tests/testdata/npm/dynamic_import_deno_ts_from_npm/add.ts (renamed from cli/tests/testdata/npm/dynamic_import_deno_ts_from_npm/add.ts)0
-rw-r--r--tests/testdata/npm/dynamic_import_deno_ts_from_npm/main.out (renamed from cli/tests/testdata/npm/dynamic_import_deno_ts_from_npm/main.out)0
-rw-r--r--tests/testdata/npm/dynamic_import_deno_ts_from_npm/main.ts (renamed from cli/tests/testdata/npm/dynamic_import_deno_ts_from_npm/main.ts)0
-rw-r--r--tests/testdata/npm/dynamic_import_deno_ts_from_npm/subtract.mts (renamed from cli/tests/testdata/npm/dynamic_import_deno_ts_from_npm/subtract.mts)0
-rw-r--r--tests/testdata/npm/dynamic_import_invalid_package_name/main.out (renamed from cli/tests/testdata/npm/dynamic_import_invalid_package_name/main.out)0
-rw-r--r--tests/testdata/npm/dynamic_import_invalid_package_name/main.ts (renamed from cli/tests/testdata/npm/dynamic_import_invalid_package_name/main.ts)0
-rw-r--r--tests/testdata/npm/dynamic_import_json/main.js (renamed from cli/tests/testdata/npm/dynamic_import_json/main.js)0
-rw-r--r--tests/testdata/npm/dynamic_import_json/main.out (renamed from cli/tests/testdata/npm/dynamic_import_json/main.out)0
-rw-r--r--tests/testdata/npm/dynamic_import_reload_same_package/main.out (renamed from cli/tests/testdata/npm/dynamic_import_reload_same_package/main.out)0
-rw-r--r--tests/testdata/npm/dynamic_import_reload_same_package/main.ts (renamed from cli/tests/testdata/npm/dynamic_import_reload_same_package/main.ts)0
-rw-r--r--tests/testdata/npm/dynamic_import_reload_same_package/other.ts (renamed from cli/tests/testdata/npm/dynamic_import_reload_same_package/other.ts)0
-rw-r--r--tests/testdata/npm/env_var_re_export/main.js (renamed from cli/tests/testdata/npm/env_var_re_export/main.js)0
-rw-r--r--tests/testdata/npm/error_version_after_subpath/main.js (renamed from cli/tests/testdata/npm/error_version_after_subpath/main.js)0
-rw-r--r--tests/testdata/npm/error_version_after_subpath/main.out (renamed from cli/tests/testdata/npm/error_version_after_subpath/main.out)0
-rw-r--r--tests/testdata/npm/esm/main.js (renamed from cli/tests/testdata/npm/esm/main.js)0
-rw-r--r--tests/testdata/npm/esm/main.out (renamed from cli/tests/testdata/npm/esm/main.out)0
-rw-r--r--tests/testdata/npm/esm/test.js (renamed from cli/tests/testdata/npm/esm/test.js)0
-rw-r--r--tests/testdata/npm/esm/test.out (renamed from cli/tests/testdata/npm/esm/test.out)0
-rw-r--r--tests/testdata/npm/esm_import_cjs_default/main.out (renamed from cli/tests/testdata/npm/esm_import_cjs_default/main.out)0
-rw-r--r--tests/testdata/npm/esm_import_cjs_default/main.ts (renamed from cli/tests/testdata/npm/esm_import_cjs_default/main.ts)0
-rw-r--r--tests/testdata/npm/file_dts_dmts_dcts/main.out (renamed from cli/tests/testdata/npm/file_dts_dmts_dcts/main.out)0
-rw-r--r--tests/testdata/npm/file_dts_dmts_dcts/main.ts (renamed from cli/tests/testdata/npm/file_dts_dmts_dcts/main.ts)0
-rw-r--r--tests/testdata/npm/import_json/main.js (renamed from cli/tests/testdata/npm/import_json/main.js)0
-rw-r--r--tests/testdata/npm/import_json/main.out (renamed from cli/tests/testdata/npm/import_json/main.out)0
-rw-r--r--tests/testdata/npm/import_map/import_map.json (renamed from cli/tests/testdata/npm/import_map/import_map.json)0
-rw-r--r--tests/testdata/npm/import_map/main.js (renamed from cli/tests/testdata/npm/import_map/main.js)0
-rw-r--r--tests/testdata/npm/import_map/main.out (renamed from cli/tests/testdata/npm/import_map/main.out)0
-rw-r--r--tests/testdata/npm/imports_package_json/import_not_defined.js (renamed from cli/tests/testdata/npm/imports_package_json/import_not_defined.js)0
-rw-r--r--tests/testdata/npm/imports_package_json/import_not_defined.out (renamed from cli/tests/testdata/npm/imports_package_json/import_not_defined.out)0
-rw-r--r--tests/testdata/npm/imports_package_json/main.js (renamed from cli/tests/testdata/npm/imports_package_json/main.js)0
-rw-r--r--tests/testdata/npm/imports_package_json/main.out (renamed from cli/tests/testdata/npm/imports_package_json/main.out)0
-rw-r--r--tests/testdata/npm/imports_package_json/package.json (renamed from cli/tests/testdata/npm/imports_package_json/package.json)0
-rw-r--r--tests/testdata/npm/imports_package_json/sub_path_import_not_defined.js (renamed from cli/tests/testdata/npm/imports_package_json/sub_path_import_not_defined.js)0
-rw-r--r--tests/testdata/npm/imports_package_json/sub_path_import_not_defined.out (renamed from cli/tests/testdata/npm/imports_package_json/sub_path_import_not_defined.out)0
-rw-r--r--tests/testdata/npm/info/chalk.out (renamed from cli/tests/testdata/npm/info/chalk.out)0
-rw-r--r--tests/testdata/npm/info/chalk_json.out (renamed from cli/tests/testdata/npm/info/chalk_json.out)0
-rw-r--r--tests/testdata/npm/invalid_package_name/main.js (renamed from cli/tests/testdata/npm/invalid_package_name/main.js)0
-rw-r--r--tests/testdata/npm/invalid_package_name/main.out (renamed from cli/tests/testdata/npm/invalid_package_name/main.out)0
-rw-r--r--tests/testdata/npm/local_dir_resolves_symlinks/index.js (renamed from cli/tests/testdata/npm/local_dir_resolves_symlinks/index.js)0
-rw-r--r--tests/testdata/npm/local_dir_resolves_symlinks/index.out (renamed from cli/tests/testdata/npm/local_dir_resolves_symlinks/index.out)0
-rw-r--r--tests/testdata/npm/local_dir_resolves_symlinks/package.json (renamed from cli/tests/testdata/npm/local_dir_resolves_symlinks/package.json)0
-rw-r--r--tests/testdata/npm/lock_file/lock.json (renamed from cli/tests/testdata/npm/lock_file/lock.json)0
-rw-r--r--tests/testdata/npm/lock_file/main.js (renamed from cli/tests/testdata/npm/lock_file/main.js)0
-rw-r--r--tests/testdata/npm/lock_file/main.out (renamed from cli/tests/testdata/npm/lock_file/main.out)0
-rw-r--r--tests/testdata/npm/mixed_case_package_name/global.out (renamed from cli/tests/testdata/npm/mixed_case_package_name/global.out)0
-rw-r--r--tests/testdata/npm/mixed_case_package_name/global.ts (renamed from cli/tests/testdata/npm/mixed_case_package_name/global.ts)0
-rw-r--r--tests/testdata/npm/mixed_case_package_name/local.out (renamed from cli/tests/testdata/npm/mixed_case_package_name/local.out)0
-rw-r--r--tests/testdata/npm/mixed_case_package_name/local.ts (renamed from cli/tests/testdata/npm/mixed_case_package_name/local.ts)0
-rw-r--r--tests/testdata/npm/no_npm_after_first_run/main1.ts (renamed from cli/tests/testdata/npm/no_npm_after_first_run/main1.ts)0
-rw-r--r--tests/testdata/npm/no_types_cjs/main.ts (renamed from cli/tests/testdata/npm/no_types_cjs/main.ts)0
-rw-r--r--tests/testdata/npm/no_types_in_conditional_exports/main.out (renamed from cli/tests/testdata/npm/no_types_in_conditional_exports/main.out)0
-rw-r--r--tests/testdata/npm/no_types_in_conditional_exports/main.ts (renamed from cli/tests/testdata/npm/no_types_in_conditional_exports/main.ts)0
-rw-r--r--tests/testdata/npm/node_modules_deno_node_modules/main.out (renamed from cli/tests/testdata/npm/node_modules_deno_node_modules/main.out)0
-rw-r--r--tests/testdata/npm/node_modules_deno_node_modules/main.ts (renamed from cli/tests/testdata/npm/node_modules_deno_node_modules/main.ts)0
-rw-r--r--tests/testdata/npm/node_modules_import/main.out (renamed from cli/tests/testdata/npm/node_modules_import/main.out)0
-rw-r--r--tests/testdata/npm/node_modules_import/main.ts (renamed from cli/tests/testdata/npm/node_modules_import/main.ts)0
-rw-r--r--tests/testdata/npm/node_modules_import/main_check.out (renamed from cli/tests/testdata/npm/node_modules_import/main_check.out)0
-rw-r--r--tests/testdata/npm/node_modules_import/package.json (renamed from cli/tests/testdata/npm/node_modules_import/package.json)0
-rw-r--r--tests/testdata/npm/nonexistent_file/main.js (renamed from cli/tests/testdata/npm/nonexistent_file/main.js)0
-rw-r--r--tests/testdata/npm/nonexistent_file/main.out (renamed from cli/tests/testdata/npm/nonexistent_file/main.out)0
-rw-r--r--tests/testdata/npm/peer_deps_with_copied_folders/main.out (renamed from cli/tests/testdata/npm/peer_deps_with_copied_folders/main.out)0
-rw-r--r--tests/testdata/npm/peer_deps_with_copied_folders/main.ts (renamed from cli/tests/testdata/npm/peer_deps_with_copied_folders/main.ts)0
-rw-r--r--tests/testdata/npm/peer_deps_with_copied_folders/main_info.out (renamed from cli/tests/testdata/npm/peer_deps_with_copied_folders/main_info.out)0
-rw-r--r--tests/testdata/npm/peer_deps_with_copied_folders/main_info_json.out (renamed from cli/tests/testdata/npm/peer_deps_with_copied_folders/main_info_json.out)0
-rw-r--r--tests/testdata/npm/peer_deps_with_copied_folders/main_node_modules.out (renamed from cli/tests/testdata/npm/peer_deps_with_copied_folders/main_node_modules.out)0
-rw-r--r--tests/testdata/npm/peer_deps_with_copied_folders/main_node_modules_reload.out (renamed from cli/tests/testdata/npm/peer_deps_with_copied_folders/main_node_modules_reload.out)0
-rw-r--r--tests/testdata/npm/permissions_outside_package/foo/config.js (renamed from cli/tests/testdata/npm/permissions_outside_package/foo/config.js)0
-rw-r--r--tests/testdata/npm/permissions_outside_package/foo/package.json (renamed from cli/tests/testdata/npm/permissions_outside_package/foo/package.json)0
-rw-r--r--tests/testdata/npm/permissions_outside_package/main.out (renamed from cli/tests/testdata/npm/permissions_outside_package/main.out)0
-rw-r--r--tests/testdata/npm/permissions_outside_package/main.ts (renamed from cli/tests/testdata/npm/permissions_outside_package/main.ts)0
-rw-r--r--tests/testdata/npm/registry/@babel/parser/parser-7.19.0.tgz (renamed from cli/tests/testdata/npm/registry/@babel/parser/parser-7.19.0.tgz)bin444189 -> 444189 bytes
-rw-r--r--tests/testdata/npm/registry/@babel/parser/registry.json (renamed from cli/tests/testdata/npm/registry/@babel/parser/registry.json)0
-rw-r--r--tests/testdata/npm/registry/@denotest/CAPITALS/1.0.0/index.js (renamed from cli/tests/testdata/npm/registry/@denotest/CAPITALS/1.0.0/index.js)0
-rw-r--r--tests/testdata/npm/registry/@denotest/CAPITALS/1.0.0/package.json (renamed from cli/tests/testdata/npm/registry/@denotest/CAPITALS/1.0.0/package.json)0
-rw-r--r--tests/testdata/npm/registry/@denotest/MixedCase/1.0.0/index.js (renamed from cli/tests/testdata/npm/registry/@denotest/MixedCase/1.0.0/index.js)0
-rw-r--r--tests/testdata/npm/registry/@denotest/MixedCase/1.0.0/package.json (renamed from cli/tests/testdata/npm/registry/@denotest/MixedCase/1.0.0/package.json)0
-rw-r--r--tests/testdata/npm/registry/@denotest/bin/0.5.0/cli.mjs (renamed from cli/tests/testdata/npm/registry/@denotest/bin/0.5.0/cli.mjs)0
-rw-r--r--tests/testdata/npm/registry/@denotest/bin/0.5.0/package.json (renamed from cli/tests/testdata/npm/registry/@denotest/bin/0.5.0/package.json)0
-rw-r--r--tests/testdata/npm/registry/@denotest/bin/0.6.0/cli-cjs.js (renamed from cli/tests/testdata/npm/registry/@denotest/bin/0.6.0/cli-cjs.js)0
-rw-r--r--tests/testdata/npm/registry/@denotest/bin/0.6.0/cli.mjs (renamed from cli/tests/testdata/npm/registry/@denotest/bin/0.6.0/cli.mjs)0
-rw-r--r--tests/testdata/npm/registry/@denotest/bin/0.6.0/package.json (renamed from cli/tests/testdata/npm/registry/@denotest/bin/0.6.0/package.json)0
-rw-r--r--tests/testdata/npm/registry/@denotest/bin/1.0.0/cli-cjs.js (renamed from cli/tests/testdata/npm/registry/@denotest/bin/1.0.0/cli-cjs.js)0
-rw-r--r--tests/testdata/npm/registry/@denotest/bin/1.0.0/cli-no-ext (renamed from cli/tests/testdata/npm/registry/@denotest/bin/1.0.0/cli-no-ext)0
-rw-r--r--tests/testdata/npm/registry/@denotest/bin/1.0.0/cli.mjs (renamed from cli/tests/testdata/npm/registry/@denotest/bin/1.0.0/cli.mjs)0
-rw-r--r--tests/testdata/npm/registry/@denotest/bin/1.0.0/package.json (renamed from cli/tests/testdata/npm/registry/@denotest/bin/1.0.0/package.json)0
-rw-r--r--tests/testdata/npm/registry/@denotest/binary-package-linux/1.0.0/index.js (renamed from cli/tests/testdata/npm/registry/@denotest/binary-package-linux/1.0.0/index.js)0
-rw-r--r--tests/testdata/npm/registry/@denotest/binary-package-linux/1.0.0/package.json (renamed from cli/tests/testdata/npm/registry/@denotest/binary-package-linux/1.0.0/package.json)0
-rw-r--r--tests/testdata/npm/registry/@denotest/binary-package-mac/1.0.0/index.js (renamed from cli/tests/testdata/npm/registry/@denotest/binary-package-mac/1.0.0/index.js)0
-rw-r--r--tests/testdata/npm/registry/@denotest/binary-package-mac/1.0.0/package.json (renamed from cli/tests/testdata/npm/registry/@denotest/binary-package-mac/1.0.0/package.json)0
-rw-r--r--tests/testdata/npm/registry/@denotest/binary-package-windows/1.0.0/index.js (renamed from cli/tests/testdata/npm/registry/@denotest/binary-package-windows/1.0.0/index.js)0
-rw-r--r--tests/testdata/npm/registry/@denotest/binary-package-windows/1.0.0/package.json (renamed from cli/tests/testdata/npm/registry/@denotest/binary-package-windows/1.0.0/package.json)0
-rw-r--r--tests/testdata/npm/registry/@denotest/binary-package/1.0.0/index.js (renamed from cli/tests/testdata/npm/registry/@denotest/binary-package/1.0.0/index.js)0
-rw-r--r--tests/testdata/npm/registry/@denotest/binary-package/1.0.0/package.json (renamed from cli/tests/testdata/npm/registry/@denotest/binary-package/1.0.0/package.json)0
-rw-r--r--tests/testdata/npm/registry/@denotest/breaking-change-between-versions/1.0.0/index.d.ts (renamed from cli/tests/testdata/npm/registry/@denotest/breaking-change-between-versions/1.0.0/index.d.ts)0
-rw-r--r--tests/testdata/npm/registry/@denotest/breaking-change-between-versions/1.0.0/index.js (renamed from cli/tests/testdata/npm/registry/@denotest/breaking-change-between-versions/1.0.0/index.js)0
-rw-r--r--tests/testdata/npm/registry/@denotest/breaking-change-between-versions/1.0.0/package.json (renamed from cli/tests/testdata/npm/registry/@denotest/breaking-change-between-versions/1.0.0/package.json)0
-rw-r--r--tests/testdata/npm/registry/@denotest/breaking-change-between-versions/2.0.0/index.d.ts (renamed from cli/tests/testdata/npm/registry/@denotest/breaking-change-between-versions/2.0.0/index.d.ts)0
-rw-r--r--tests/testdata/npm/registry/@denotest/breaking-change-between-versions/2.0.0/index.js (renamed from cli/tests/testdata/npm/registry/@denotest/breaking-change-between-versions/2.0.0/index.js)0
-rw-r--r--tests/testdata/npm/registry/@denotest/breaking-change-between-versions/2.0.0/package.json (renamed from cli/tests/testdata/npm/registry/@denotest/breaking-change-between-versions/2.0.0/package.json)0
-rw-r--r--tests/testdata/npm/registry/@denotest/builtin-module-module/1.0.0/index.js (renamed from cli/tests/testdata/npm/registry/@denotest/builtin-module-module/1.0.0/index.js)0
-rw-r--r--tests/testdata/npm/registry/@denotest/builtin-module-module/1.0.0/package.json (renamed from cli/tests/testdata/npm/registry/@denotest/builtin-module-module/1.0.0/package.json)0
-rw-r--r--tests/testdata/npm/registry/@denotest/check-error/1.0.0/index.d.ts (renamed from cli/tests/testdata/npm/registry/@denotest/check-error/1.0.0/index.d.ts)0
-rw-r--r--tests/testdata/npm/registry/@denotest/check-error/1.0.0/index.js (renamed from cli/tests/testdata/npm/registry/@denotest/check-error/1.0.0/index.js)0
-rw-r--r--tests/testdata/npm/registry/@denotest/check-error/1.0.0/other_dir.d.ts (renamed from cli/tests/testdata/npm/registry/@denotest/check-error/1.0.0/other_dir.d.ts)0
-rw-r--r--tests/testdata/npm/registry/@denotest/check-error/1.0.0/other_dir/index.js (renamed from cli/tests/testdata/npm/registry/@denotest/check-error/1.0.0/other_dir/index.js)0
-rw-r--r--tests/testdata/npm/registry/@denotest/check-error/1.0.0/package.json (renamed from cli/tests/testdata/npm/registry/@denotest/check-error/1.0.0/package.json)0
-rw-r--r--tests/testdata/npm/registry/@denotest/check-error/1.0.0/sub_dir/index.d.ts (renamed from cli/tests/testdata/npm/registry/@denotest/check-error/1.0.0/sub_dir/index.d.ts)0
-rw-r--r--tests/testdata/npm/registry/@denotest/check-error/1.0.0/sub_dir/index.js (renamed from cli/tests/testdata/npm/registry/@denotest/check-error/1.0.0/sub_dir/index.js)0
-rw-r--r--tests/testdata/npm/registry/@denotest/check-error/1.0.0/sub_dir/lib.d.ts (renamed from cli/tests/testdata/npm/registry/@denotest/check-error/1.0.0/sub_dir/lib.d.ts)0
-rw-r--r--tests/testdata/npm/registry/@denotest/child-process-fork/1.0.0/forked_path.js (renamed from cli/tests/testdata/npm/registry/@denotest/child-process-fork/1.0.0/forked_path.js)0
-rw-r--r--tests/testdata/npm/registry/@denotest/child-process-fork/1.0.0/index.js (renamed from cli/tests/testdata/npm/registry/@denotest/child-process-fork/1.0.0/index.js)0
-rw-r--r--tests/testdata/npm/registry/@denotest/child-process-fork/1.0.0/package.json (renamed from cli/tests/testdata/npm/registry/@denotest/child-process-fork/1.0.0/package.json)0
-rw-r--r--tests/testdata/npm/registry/@denotest/cjs-default-export/1.0.0/index.d.ts (renamed from cli/tests/testdata/npm/registry/@denotest/cjs-default-export/1.0.0/index.d.ts)0
-rw-r--r--tests/testdata/npm/registry/@denotest/cjs-default-export/1.0.0/index.js (renamed from cli/tests/testdata/npm/registry/@denotest/cjs-default-export/1.0.0/index.js)0
-rw-r--r--tests/testdata/npm/registry/@denotest/cjs-default-export/1.0.0/package.json (renamed from cli/tests/testdata/npm/registry/@denotest/cjs-default-export/1.0.0/package.json)0
-rw-r--r--tests/testdata/npm/registry/@denotest/cjs-invalid-name-exports/1.0.0/index.js (renamed from cli/tests/testdata/npm/registry/@denotest/cjs-invalid-name-exports/1.0.0/index.js)0
-rw-r--r--tests/testdata/npm/registry/@denotest/cjs-invalid-name-exports/1.0.0/package.json (renamed from cli/tests/testdata/npm/registry/@denotest/cjs-invalid-name-exports/1.0.0/package.json)0
-rw-r--r--tests/testdata/npm/registry/@denotest/cjs-local-global-decls/1.0.0/index.js (renamed from cli/tests/testdata/npm/registry/@denotest/cjs-local-global-decls/1.0.0/index.js)0
-rw-r--r--tests/testdata/npm/registry/@denotest/cjs-local-global-decls/1.0.0/other.js (renamed from cli/tests/testdata/npm/registry/@denotest/cjs-local-global-decls/1.0.0/other.js)0
-rw-r--r--tests/testdata/npm/registry/@denotest/cjs-local-global-decls/1.0.0/package.json (renamed from cli/tests/testdata/npm/registry/@denotest/cjs-local-global-decls/1.0.0/package.json)0
-rw-r--r--tests/testdata/npm/registry/@denotest/cjs-module-export-assignment-number/1.0.0/index.d.ts (renamed from cli/tests/testdata/npm/registry/@denotest/cjs-module-export-assignment-number/1.0.0/index.d.ts)0
-rw-r--r--tests/testdata/npm/registry/@denotest/cjs-module-export-assignment-number/1.0.0/index.js (renamed from cli/tests/testdata/npm/registry/@denotest/cjs-module-export-assignment-number/1.0.0/index.js)0
-rw-r--r--tests/testdata/npm/registry/@denotest/cjs-module-export-assignment-number/1.0.0/package.json (renamed from cli/tests/testdata/npm/registry/@denotest/cjs-module-export-assignment-number/1.0.0/package.json)0
-rw-r--r--tests/testdata/npm/registry/@denotest/cjs-module-export-assignment/1.0.0/index.d.ts (renamed from cli/tests/testdata/npm/registry/@denotest/cjs-module-export-assignment/1.0.0/index.d.ts)0
-rw-r--r--tests/testdata/npm/registry/@denotest/cjs-module-export-assignment/1.0.0/index.js (renamed from cli/tests/testdata/npm/registry/@denotest/cjs-module-export-assignment/1.0.0/index.js)0
-rw-r--r--tests/testdata/npm/registry/@denotest/cjs-module-export-assignment/1.0.0/package.json (renamed from cli/tests/testdata/npm/registry/@denotest/cjs-module-export-assignment/1.0.0/package.json)0
-rw-r--r--tests/testdata/npm/registry/@denotest/cjs-reexport-collision/1.0.0/index.js (renamed from cli/tests/testdata/npm/registry/@denotest/cjs-reexport-collision/1.0.0/index.js)0
-rw-r--r--tests/testdata/npm/registry/@denotest/cjs-reexport-collision/1.0.0/other_file.js (renamed from cli/tests/testdata/npm/registry/@denotest/cjs-reexport-collision/1.0.0/other_file.js)0
-rw-r--r--tests/testdata/npm/registry/@denotest/cjs-reexport-collision/1.0.0/package.json (renamed from cli/tests/testdata/npm/registry/@denotest/cjs-reexport-collision/1.0.0/package.json)0
-rw-r--r--tests/testdata/npm/registry/@denotest/cjs-require-esm-error/1.0.0/esm/my_es_module.js (renamed from cli/tests/testdata/npm/registry/@denotest/cjs-require-esm-error/1.0.0/esm/my_es_module.js)0
-rw-r--r--tests/testdata/npm/registry/@denotest/cjs-require-esm-error/1.0.0/esm/package.json (renamed from cli/tests/testdata/npm/registry/@denotest/cjs-require-esm-error/1.0.0/esm/package.json)0
-rw-r--r--tests/testdata/npm/registry/@denotest/cjs-require-esm-error/1.0.0/esm_mjs.mjs (renamed from cli/tests/testdata/npm/registry/@denotest/cjs-require-esm-error/1.0.0/esm_mjs.mjs)0
-rw-r--r--tests/testdata/npm/registry/@denotest/cjs-require-esm-error/1.0.0/index.js (renamed from cli/tests/testdata/npm/registry/@denotest/cjs-require-esm-error/1.0.0/index.js)0
-rw-r--r--tests/testdata/npm/registry/@denotest/cjs-require-esm-error/1.0.0/package.json (renamed from cli/tests/testdata/npm/registry/@denotest/cjs-require-esm-error/1.0.0/package.json)0
-rw-r--r--tests/testdata/npm/registry/@denotest/cjs-require-esm-error/1.0.0/require_mjs.js (renamed from cli/tests/testdata/npm/registry/@denotest/cjs-require-esm-error/1.0.0/require_mjs.js)0
-rw-r--r--tests/testdata/npm/registry/@denotest/cjs-this-in-exports/1.0.0/index.js (renamed from cli/tests/testdata/npm/registry/@denotest/cjs-this-in-exports/1.0.0/index.js)0
-rw-r--r--tests/testdata/npm/registry/@denotest/cjs-this-in-exports/1.0.0/package.json (renamed from cli/tests/testdata/npm/registry/@denotest/cjs-this-in-exports/1.0.0/package.json)0
-rw-r--r--tests/testdata/npm/registry/@denotest/cjs-with-file-stem/1.0.0/index.js (renamed from cli/tests/testdata/npm/registry/@denotest/cjs-with-file-stem/1.0.0/index.js)0
-rw-r--r--tests/testdata/npm/registry/@denotest/cjs-with-file-stem/1.0.0/other.service.js (renamed from cli/tests/testdata/npm/registry/@denotest/cjs-with-file-stem/1.0.0/other.service.js)0
-rw-r--r--tests/testdata/npm/registry/@denotest/cjs-with-file-stem/1.0.0/package.json (renamed from cli/tests/testdata/npm/registry/@denotest/cjs-with-file-stem/1.0.0/package.json)0
-rw-r--r--tests/testdata/npm/registry/@denotest/cjs-with-file-stem/1.0.0/tslib.js (renamed from cli/tests/testdata/npm/registry/@denotest/cjs-with-file-stem/1.0.0/tslib.js)0
-rw-r--r--tests/testdata/npm/registry/@denotest/conditional-exports-strict/1.0.0/cjs/index.cjs (renamed from cli/tests/testdata/npm/registry/@denotest/conditional-exports-strict/1.0.0/cjs/index.cjs)0
-rw-r--r--tests/testdata/npm/registry/@denotest/conditional-exports-strict/1.0.0/esm/client/bar.js (renamed from cli/tests/testdata/npm/registry/@denotest/conditional-exports-strict/1.0.0/esm/client/bar.js)0
-rw-r--r--tests/testdata/npm/registry/@denotest/conditional-exports-strict/1.0.0/esm/client/foo.js (renamed from cli/tests/testdata/npm/registry/@denotest/conditional-exports-strict/1.0.0/esm/client/foo.js)0
-rw-r--r--tests/testdata/npm/registry/@denotest/conditional-exports-strict/1.0.0/esm/client/index.js (renamed from cli/tests/testdata/npm/registry/@denotest/conditional-exports-strict/1.0.0/esm/client/index.js)0
-rw-r--r--tests/testdata/npm/registry/@denotest/conditional-exports-strict/1.0.0/esm/client/m.js (renamed from cli/tests/testdata/npm/registry/@denotest/conditional-exports-strict/1.0.0/esm/client/m.js)0
-rw-r--r--tests/testdata/npm/registry/@denotest/conditional-exports-strict/1.0.0/esm/index.js (renamed from cli/tests/testdata/npm/registry/@denotest/conditional-exports-strict/1.0.0/esm/index.js)0
-rw-r--r--tests/testdata/npm/registry/@denotest/conditional-exports-strict/1.0.0/foo.js (renamed from cli/tests/testdata/npm/registry/@denotest/conditional-exports-strict/1.0.0/foo.js)0
-rw-r--r--tests/testdata/npm/registry/@denotest/conditional-exports-strict/1.0.0/package.json (renamed from cli/tests/testdata/npm/registry/@denotest/conditional-exports-strict/1.0.0/package.json)0
-rw-r--r--tests/testdata/npm/registry/@denotest/conditional-exports/1.0.0/cjs/index.cjs (renamed from cli/tests/testdata/npm/registry/@denotest/conditional-exports/1.0.0/cjs/index.cjs)0
-rw-r--r--tests/testdata/npm/registry/@denotest/conditional-exports/1.0.0/esm/client/bar.js (renamed from cli/tests/testdata/npm/registry/@denotest/conditional-exports/1.0.0/esm/client/bar.js)0
-rw-r--r--tests/testdata/npm/registry/@denotest/conditional-exports/1.0.0/esm/client/foo.js (renamed from cli/tests/testdata/npm/registry/@denotest/conditional-exports/1.0.0/esm/client/foo.js)0
-rw-r--r--tests/testdata/npm/registry/@denotest/conditional-exports/1.0.0/esm/client/index.js (renamed from cli/tests/testdata/npm/registry/@denotest/conditional-exports/1.0.0/esm/client/index.js)0
-rw-r--r--tests/testdata/npm/registry/@denotest/conditional-exports/1.0.0/esm/client/m.js (renamed from cli/tests/testdata/npm/registry/@denotest/conditional-exports/1.0.0/esm/client/m.js)0
-rw-r--r--tests/testdata/npm/registry/@denotest/conditional-exports/1.0.0/esm/index.js (renamed from cli/tests/testdata/npm/registry/@denotest/conditional-exports/1.0.0/esm/index.js)0
-rw-r--r--tests/testdata/npm/registry/@denotest/conditional-exports/1.0.0/foo.js (renamed from cli/tests/testdata/npm/registry/@denotest/conditional-exports/1.0.0/foo.js)0
-rw-r--r--tests/testdata/npm/registry/@denotest/conditional-exports/1.0.0/package.json (renamed from cli/tests/testdata/npm/registry/@denotest/conditional-exports/1.0.0/package.json)0
-rw-r--r--tests/testdata/npm/registry/@denotest/create-require/1.0.0/index.js (renamed from cli/tests/testdata/npm/registry/@denotest/create-require/1.0.0/index.js)0
-rw-r--r--tests/testdata/npm/registry/@denotest/create-require/1.0.0/package.json (renamed from cli/tests/testdata/npm/registry/@denotest/create-require/1.0.0/package.json)0
-rw-r--r--tests/testdata/npm/registry/@denotest/d-ext/1.0.0/index.d.ts (renamed from cli/tests/testdata/npm/registry/@denotest/d-ext/1.0.0/index.d.ts)0
-rw-r--r--tests/testdata/npm/registry/@denotest/d-ext/1.0.0/index.js (renamed from cli/tests/testdata/npm/registry/@denotest/d-ext/1.0.0/index.js)0
-rw-r--r--tests/testdata/npm/registry/@denotest/d-ext/1.0.0/package.json (renamed from cli/tests/testdata/npm/registry/@denotest/d-ext/1.0.0/package.json)0
-rw-r--r--tests/testdata/npm/registry/@denotest/d-ext/1.0.0/types.d.ts (renamed from cli/tests/testdata/npm/registry/@denotest/d-ext/1.0.0/types.d.ts)0
-rw-r--r--tests/testdata/npm/registry/@denotest/different-nested-dep-child/1.0.0/index.js (renamed from cli/tests/testdata/npm/registry/@denotest/different-nested-dep-child/1.0.0/index.js)0
-rw-r--r--tests/testdata/npm/registry/@denotest/different-nested-dep-child/1.0.0/package.json (renamed from cli/tests/testdata/npm/registry/@denotest/different-nested-dep-child/1.0.0/package.json)0
-rw-r--r--tests/testdata/npm/registry/@denotest/different-nested-dep-child/2.0.0/index.js (renamed from cli/tests/testdata/npm/registry/@denotest/different-nested-dep-child/2.0.0/index.js)0
-rw-r--r--tests/testdata/npm/registry/@denotest/different-nested-dep-child/2.0.0/package.json (renamed from cli/tests/testdata/npm/registry/@denotest/different-nested-dep-child/2.0.0/package.json)0
-rw-r--r--tests/testdata/npm/registry/@denotest/different-nested-dep/1.0.0/index.js (renamed from cli/tests/testdata/npm/registry/@denotest/different-nested-dep/1.0.0/index.js)0
-rw-r--r--tests/testdata/npm/registry/@denotest/different-nested-dep/1.0.0/package.json (renamed from cli/tests/testdata/npm/registry/@denotest/different-nested-dep/1.0.0/package.json)0
-rw-r--r--tests/testdata/npm/registry/@denotest/dual-cjs-esm-dep-missing/1.0.0/index.cjs (renamed from cli/tests/testdata/npm/registry/@denotest/dual-cjs-esm-dep-missing/1.0.0/index.cjs)0
-rw-r--r--tests/testdata/npm/registry/@denotest/dual-cjs-esm-dep-missing/1.0.0/index.d.ts (renamed from cli/tests/testdata/npm/registry/@denotest/dual-cjs-esm-dep-missing/1.0.0/index.d.ts)0
-rw-r--r--tests/testdata/npm/registry/@denotest/dual-cjs-esm-dep-missing/1.0.0/index.mjs (renamed from cli/tests/testdata/npm/registry/@denotest/dual-cjs-esm-dep-missing/1.0.0/index.mjs)0
-rw-r--r--tests/testdata/npm/registry/@denotest/dual-cjs-esm-dep-missing/1.0.0/package.json (renamed from cli/tests/testdata/npm/registry/@denotest/dual-cjs-esm-dep-missing/1.0.0/package.json)0
-rw-r--r--tests/testdata/npm/registry/@denotest/dual-cjs-esm-dep/1.0.0/index.cjs (renamed from cli/tests/testdata/npm/registry/@denotest/dual-cjs-esm-dep/1.0.0/index.cjs)0
-rw-r--r--tests/testdata/npm/registry/@denotest/dual-cjs-esm-dep/1.0.0/index.d.ts (renamed from cli/tests/testdata/npm/registry/@denotest/dual-cjs-esm-dep/1.0.0/index.d.ts)0
-rw-r--r--tests/testdata/npm/registry/@denotest/dual-cjs-esm-dep/1.0.0/index.mjs (renamed from cli/tests/testdata/npm/registry/@denotest/dual-cjs-esm-dep/1.0.0/index.mjs)0
-rw-r--r--tests/testdata/npm/registry/@denotest/dual-cjs-esm-dep/1.0.0/package.json (renamed from cli/tests/testdata/npm/registry/@denotest/dual-cjs-esm-dep/1.0.0/package.json)0
-rw-r--r--tests/testdata/npm/registry/@denotest/dual-cjs-esm/1.0.0/cjs/main.cjs (renamed from cli/tests/testdata/npm/registry/@denotest/dual-cjs-esm/1.0.0/cjs/main.cjs)0
-rw-r--r--tests/testdata/npm/registry/@denotest/dual-cjs-esm/1.0.0/cjs/package.json (renamed from cli/tests/testdata/npm/registry/@denotest/dual-cjs-esm/1.0.0/cjs/package.json)0
-rw-r--r--tests/testdata/npm/registry/@denotest/dual-cjs-esm/1.0.0/main.cjs (renamed from cli/tests/testdata/npm/registry/@denotest/dual-cjs-esm/1.0.0/main.cjs)0
-rw-r--r--tests/testdata/npm/registry/@denotest/dual-cjs-esm/1.0.0/main.d.cts (renamed from cli/tests/testdata/npm/registry/@denotest/dual-cjs-esm/1.0.0/main.d.cts)0
-rw-r--r--tests/testdata/npm/registry/@denotest/dual-cjs-esm/1.0.0/main.d.mts (renamed from cli/tests/testdata/npm/registry/@denotest/dual-cjs-esm/1.0.0/main.d.mts)0
-rw-r--r--tests/testdata/npm/registry/@denotest/dual-cjs-esm/1.0.0/main.mjs (renamed from cli/tests/testdata/npm/registry/@denotest/dual-cjs-esm/1.0.0/main.mjs)0
-rw-r--r--tests/testdata/npm/registry/@denotest/dual-cjs-esm/1.0.0/package.json (renamed from cli/tests/testdata/npm/registry/@denotest/dual-cjs-esm/1.0.0/package.json)0
-rw-r--r--tests/testdata/npm/registry/@denotest/dual-cjs-esm/1.0.0/subpath/main.cjs (renamed from cli/tests/testdata/npm/registry/@denotest/dual-cjs-esm/1.0.0/subpath/main.cjs)0
-rw-r--r--tests/testdata/npm/registry/@denotest/dual-cjs-esm/1.0.0/subpath/main.mjs (renamed from cli/tests/testdata/npm/registry/@denotest/dual-cjs-esm/1.0.0/subpath/main.mjs)0
-rw-r--r--tests/testdata/npm/registry/@denotest/dual-cjs-esm/1.0.0/subpath/package.json (renamed from cli/tests/testdata/npm/registry/@denotest/dual-cjs-esm/1.0.0/subpath/package.json)0
-rw-r--r--tests/testdata/npm/registry/@denotest/dynamic-import/1.0.0/index.js (renamed from cli/tests/testdata/npm/registry/@denotest/dynamic-import/1.0.0/index.js)0
-rw-r--r--tests/testdata/npm/registry/@denotest/dynamic-import/1.0.0/package.json (renamed from cli/tests/testdata/npm/registry/@denotest/dynamic-import/1.0.0/package.json)0
-rw-r--r--tests/testdata/npm/registry/@denotest/env-var-re-export/1.0.0/dev.cjs (renamed from cli/tests/testdata/npm/registry/@denotest/env-var-re-export/1.0.0/dev.cjs)0
-rw-r--r--tests/testdata/npm/registry/@denotest/env-var-re-export/1.0.0/index.cjs (renamed from cli/tests/testdata/npm/registry/@denotest/env-var-re-export/1.0.0/index.cjs)0
-rw-r--r--tests/testdata/npm/registry/@denotest/env-var-re-export/1.0.0/package.json (renamed from cli/tests/testdata/npm/registry/@denotest/env-var-re-export/1.0.0/package.json)0
-rw-r--r--tests/testdata/npm/registry/@denotest/env-var-re-export/1.0.0/prod.cjs (renamed from cli/tests/testdata/npm/registry/@denotest/env-var-re-export/1.0.0/prod.cjs)0
-rw-r--r--tests/testdata/npm/registry/@denotest/esm-basic/1.0.0/main.d.mts (renamed from cli/tests/testdata/npm/registry/@denotest/esm-basic/1.0.0/main.d.mts)0
-rw-r--r--tests/testdata/npm/registry/@denotest/esm-basic/1.0.0/main.mjs (renamed from cli/tests/testdata/npm/registry/@denotest/esm-basic/1.0.0/main.mjs)0
-rw-r--r--tests/testdata/npm/registry/@denotest/esm-basic/1.0.0/other.mjs (renamed from cli/tests/testdata/npm/registry/@denotest/esm-basic/1.0.0/other.mjs)0
-rw-r--r--tests/testdata/npm/registry/@denotest/esm-basic/1.0.0/package.json (renamed from cli/tests/testdata/npm/registry/@denotest/esm-basic/1.0.0/package.json)0
-rw-r--r--tests/testdata/npm/registry/@denotest/esm-import-cjs-default/1.0.0/index.mjs (renamed from cli/tests/testdata/npm/registry/@denotest/esm-import-cjs-default/1.0.0/index.mjs)0
-rw-r--r--tests/testdata/npm/registry/@denotest/esm-import-cjs-default/1.0.0/local.cjs (renamed from cli/tests/testdata/npm/registry/@denotest/esm-import-cjs-default/1.0.0/local.cjs)0
-rw-r--r--tests/testdata/npm/registry/@denotest/esm-import-cjs-default/1.0.0/package.json (renamed from cli/tests/testdata/npm/registry/@denotest/esm-import-cjs-default/1.0.0/package.json)0
-rw-r--r--tests/testdata/npm/registry/@denotest/file-dts-dmts-dcts/1.0.0/main.cjs (renamed from cli/tests/testdata/npm/registry/@denotest/file-dts-dmts-dcts/1.0.0/main.cjs)0
-rw-r--r--tests/testdata/npm/registry/@denotest/file-dts-dmts-dcts/1.0.0/main.d.cts (renamed from cli/tests/testdata/npm/registry/@denotest/file-dts-dmts-dcts/1.0.0/main.d.cts)0
-rw-r--r--tests/testdata/npm/registry/@denotest/file-dts-dmts-dcts/1.0.0/main.d.mts (renamed from cli/tests/testdata/npm/registry/@denotest/file-dts-dmts-dcts/1.0.0/main.d.mts)0
-rw-r--r--tests/testdata/npm/registry/@denotest/file-dts-dmts-dcts/1.0.0/main.d.ts (renamed from cli/tests/testdata/npm/registry/@denotest/file-dts-dmts-dcts/1.0.0/main.d.ts)0
-rw-r--r--tests/testdata/npm/registry/@denotest/file-dts-dmts-dcts/1.0.0/main.js (renamed from cli/tests/testdata/npm/registry/@denotest/file-dts-dmts-dcts/1.0.0/main.js)0
-rw-r--r--tests/testdata/npm/registry/@denotest/file-dts-dmts-dcts/1.0.0/main.mjs (renamed from cli/tests/testdata/npm/registry/@denotest/file-dts-dmts-dcts/1.0.0/main.mjs)0
-rw-r--r--tests/testdata/npm/registry/@denotest/file-dts-dmts-dcts/1.0.0/package.json (renamed from cli/tests/testdata/npm/registry/@denotest/file-dts-dmts-dcts/1.0.0/package.json)0
-rw-r--r--tests/testdata/npm/registry/@denotest/globals/1.0.0/index.d.ts (renamed from cli/tests/testdata/npm/registry/@denotest/globals/1.0.0/index.d.ts)0
-rw-r--r--tests/testdata/npm/registry/@denotest/globals/1.0.0/index.js (renamed from cli/tests/testdata/npm/registry/@denotest/globals/1.0.0/index.js)0
-rw-r--r--tests/testdata/npm/registry/@denotest/globals/1.0.0/package.json (renamed from cli/tests/testdata/npm/registry/@denotest/globals/1.0.0/package.json)0
-rw-r--r--tests/testdata/npm/registry/@denotest/imports-package-json/1.0.0/hi.js (renamed from cli/tests/testdata/npm/registry/@denotest/imports-package-json/1.0.0/hi.js)0
-rw-r--r--tests/testdata/npm/registry/@denotest/imports-package-json/1.0.0/import_not_defined.js (renamed from cli/tests/testdata/npm/registry/@denotest/imports-package-json/1.0.0/import_not_defined.js)0
-rw-r--r--tests/testdata/npm/registry/@denotest/imports-package-json/1.0.0/main.js (renamed from cli/tests/testdata/npm/registry/@denotest/imports-package-json/1.0.0/main.js)0
-rw-r--r--tests/testdata/npm/registry/@denotest/imports-package-json/1.0.0/package.json (renamed from cli/tests/testdata/npm/registry/@denotest/imports-package-json/1.0.0/package.json)0
-rw-r--r--tests/testdata/npm/registry/@denotest/imports-package-json/1.0.0/sub_path/bye.js (renamed from cli/tests/testdata/npm/registry/@denotest/imports-package-json/1.0.0/sub_path/bye.js)0
-rw-r--r--tests/testdata/npm/registry/@denotest/imports-package-json/1.0.0/sub_path/import_not_defined.js (renamed from cli/tests/testdata/npm/registry/@denotest/imports-package-json/1.0.0/sub_path/import_not_defined.js)0
-rw-r--r--tests/testdata/npm/registry/@denotest/imports-package-json/1.0.0/sub_path/main.js (renamed from cli/tests/testdata/npm/registry/@denotest/imports-package-json/1.0.0/sub_path/main.js)0
-rw-r--r--tests/testdata/npm/registry/@denotest/imports-package-json/1.0.0/sub_path/package.json (renamed from cli/tests/testdata/npm/registry/@denotest/imports-package-json/1.0.0/sub_path/package.json)0
-rw-r--r--tests/testdata/npm/registry/@denotest/no-types-cjs/1.0.0/main.js (renamed from cli/tests/testdata/npm/registry/@denotest/no-types-cjs/1.0.0/main.js)0
-rw-r--r--tests/testdata/npm/registry/@denotest/no-types-cjs/1.0.0/package.json (renamed from cli/tests/testdata/npm/registry/@denotest/no-types-cjs/1.0.0/package.json)0
-rw-r--r--tests/testdata/npm/registry/@denotest/no-types-in-conditional-exports/1.0.0/lib/foo-esm.js (renamed from cli/tests/testdata/npm/registry/@denotest/no-types-in-conditional-exports/1.0.0/lib/foo-esm.js)0
-rw-r--r--tests/testdata/npm/registry/@denotest/no-types-in-conditional-exports/1.0.0/lib/foo.js (renamed from cli/tests/testdata/npm/registry/@denotest/no-types-in-conditional-exports/1.0.0/lib/foo.js)0
-rw-r--r--tests/testdata/npm/registry/@denotest/no-types-in-conditional-exports/1.0.0/package.json (renamed from cli/tests/testdata/npm/registry/@denotest/no-types-in-conditional-exports/1.0.0/package.json)0
-rw-r--r--tests/testdata/npm/registry/@denotest/non-existent-dep-version/1.0.0/index.js (renamed from cli/tests/testdata/npm/registry/@denotest/non-existent-dep-version/1.0.0/index.js)0
-rw-r--r--tests/testdata/npm/registry/@denotest/non-existent-dep-version/1.0.0/package.json (renamed from cli/tests/testdata/npm/registry/@denotest/non-existent-dep-version/1.0.0/package.json)0
-rw-r--r--tests/testdata/npm/registry/@denotest/non-existent-dep/1.0.0/index.js (renamed from cli/tests/testdata/npm/registry/@denotest/non-existent-dep/1.0.0/index.js)0
-rw-r--r--tests/testdata/npm/registry/@denotest/non-existent-dep/1.0.0/package.json (renamed from cli/tests/testdata/npm/registry/@denotest/non-existent-dep/1.0.0/package.json)0
-rw-r--r--tests/testdata/npm/registry/@denotest/peer-dep-test-child/1.0.0/index.js (renamed from cli/tests/testdata/npm/registry/@denotest/peer-dep-test-child/1.0.0/index.js)0
-rw-r--r--tests/testdata/npm/registry/@denotest/peer-dep-test-child/1.0.0/package.json (renamed from cli/tests/testdata/npm/registry/@denotest/peer-dep-test-child/1.0.0/package.json)0
-rw-r--r--tests/testdata/npm/registry/@denotest/peer-dep-test-child/2.0.0/index.js (renamed from cli/tests/testdata/npm/registry/@denotest/peer-dep-test-child/2.0.0/index.js)0
-rw-r--r--tests/testdata/npm/registry/@denotest/peer-dep-test-child/2.0.0/package.json (renamed from cli/tests/testdata/npm/registry/@denotest/peer-dep-test-child/2.0.0/package.json)0
-rw-r--r--tests/testdata/npm/registry/@denotest/peer-dep-test-grandchild/1.0.0/dist/index.js (renamed from cli/tests/testdata/npm/registry/@denotest/peer-dep-test-grandchild/1.0.0/dist/index.js)0
-rw-r--r--tests/testdata/npm/registry/@denotest/peer-dep-test-grandchild/1.0.0/index.js (renamed from cli/tests/testdata/npm/registry/@denotest/peer-dep-test-grandchild/1.0.0/index.js)0
-rw-r--r--tests/testdata/npm/registry/@denotest/peer-dep-test-grandchild/1.0.0/package.json (renamed from cli/tests/testdata/npm/registry/@denotest/peer-dep-test-grandchild/1.0.0/package.json)0
-rw-r--r--tests/testdata/npm/registry/@denotest/peer-dep-test-peer/1.0.0/index.js (renamed from cli/tests/testdata/npm/registry/@denotest/peer-dep-test-peer/1.0.0/index.js)0
-rw-r--r--tests/testdata/npm/registry/@denotest/peer-dep-test-peer/1.0.0/package.json (renamed from cli/tests/testdata/npm/registry/@denotest/peer-dep-test-peer/1.0.0/package.json)0
-rw-r--r--tests/testdata/npm/registry/@denotest/peer-dep-test-peer/2.0.0/index.js (renamed from cli/tests/testdata/npm/registry/@denotest/peer-dep-test-peer/2.0.0/index.js)0
-rw-r--r--tests/testdata/npm/registry/@denotest/peer-dep-test-peer/2.0.0/package.json (renamed from cli/tests/testdata/npm/registry/@denotest/peer-dep-test-peer/2.0.0/package.json)0
-rw-r--r--tests/testdata/npm/registry/@denotest/permissions-outside-package/1.0.0/index.js (renamed from cli/tests/testdata/npm/registry/@denotest/permissions-outside-package/1.0.0/index.js)0
-rw-r--r--tests/testdata/npm/registry/@denotest/permissions-outside-package/1.0.0/package.json (renamed from cli/tests/testdata/npm/registry/@denotest/permissions-outside-package/1.0.0/package.json)0
-rw-r--r--tests/testdata/npm/registry/@denotest/require-added-nm-folder/1.0.0/index.js (renamed from cli/tests/testdata/npm/registry/@denotest/require-added-nm-folder/1.0.0/index.js)0
-rw-r--r--tests/testdata/npm/registry/@denotest/require-added-nm-folder/1.0.0/package.json (renamed from cli/tests/testdata/npm/registry/@denotest/require-added-nm-folder/1.0.0/package.json)0
-rw-r--r--tests/testdata/npm/registry/@denotest/reserved-word-exports/1.0.0/index.cjs (renamed from cli/tests/testdata/npm/registry/@denotest/reserved-word-exports/1.0.0/index.cjs)0
-rw-r--r--tests/testdata/npm/registry/@denotest/reserved-word-exports/1.0.0/package.json (renamed from cli/tests/testdata/npm/registry/@denotest/reserved-word-exports/1.0.0/package.json)0
-rw-r--r--tests/testdata/npm/registry/@denotest/special-chars-in-bin-name/1.0.0/main.mjs (renamed from cli/tests/testdata/npm/registry/@denotest/special-chars-in-bin-name/1.0.0/main.mjs)0
-rw-r--r--tests/testdata/npm/registry/@denotest/special-chars-in-bin-name/1.0.0/package.json (renamed from cli/tests/testdata/npm/registry/@denotest/special-chars-in-bin-name/1.0.0/package.json)0
-rw-r--r--tests/testdata/npm/registry/@denotest/sub-folders/1.0.0/folder_index_js/index.d.ts (renamed from cli/tests/testdata/npm/registry/@denotest/sub-folders/1.0.0/folder_index_js/index.d.ts)0
-rw-r--r--tests/testdata/npm/registry/@denotest/sub-folders/1.0.0/folder_index_js/index.js (renamed from cli/tests/testdata/npm/registry/@denotest/sub-folders/1.0.0/folder_index_js/index.js)0
-rw-r--r--tests/testdata/npm/registry/@denotest/sub-folders/1.0.0/folder_no_index/random_name.js (renamed from cli/tests/testdata/npm/registry/@denotest/sub-folders/1.0.0/folder_no_index/random_name.js)0
-rw-r--r--tests/testdata/npm/registry/@denotest/sub-folders/1.0.0/main.mjs (renamed from cli/tests/testdata/npm/registry/@denotest/sub-folders/1.0.0/main.mjs)0
-rw-r--r--tests/testdata/npm/registry/@denotest/sub-folders/1.0.0/package.json (renamed from cli/tests/testdata/npm/registry/@denotest/sub-folders/1.0.0/package.json)0
-rw-r--r--tests/testdata/npm/registry/@denotest/types-ambient/1.0.0/index.d.ts (renamed from cli/tests/testdata/npm/registry/@denotest/types-ambient/1.0.0/index.d.ts)0
-rw-r--r--tests/testdata/npm/registry/@denotest/types-ambient/1.0.0/index.js (renamed from cli/tests/testdata/npm/registry/@denotest/types-ambient/1.0.0/index.js)0
-rw-r--r--tests/testdata/npm/registry/@denotest/types-ambient/1.0.0/package.json (renamed from cli/tests/testdata/npm/registry/@denotest/types-ambient/1.0.0/package.json)0
-rw-r--r--tests/testdata/npm/registry/@denotest/types-entry-value-not-exists/1.0.0/dist/main.d.ts (renamed from cli/tests/testdata/npm/registry/@denotest/types-entry-value-not-exists/1.0.0/dist/main.d.ts)0
-rw-r--r--tests/testdata/npm/registry/@denotest/types-entry-value-not-exists/1.0.0/dist/main.js (renamed from cli/tests/testdata/npm/registry/@denotest/types-entry-value-not-exists/1.0.0/dist/main.js)0
-rw-r--r--tests/testdata/npm/registry/@denotest/types-entry-value-not-exists/1.0.0/package.json (renamed from cli/tests/testdata/npm/registry/@denotest/types-entry-value-not-exists/1.0.0/package.json)0
-rw-r--r--tests/testdata/npm/registry/@denotest/types-exports-import-types/1.0.0/dist/main.d.ts (renamed from cli/tests/testdata/npm/registry/@denotest/types-exports-import-types/1.0.0/dist/main.d.ts)0
-rw-r--r--tests/testdata/npm/registry/@denotest/types-exports-import-types/1.0.0/dist/main.mjs (renamed from cli/tests/testdata/npm/registry/@denotest/types-exports-import-types/1.0.0/dist/main.mjs)0
-rw-r--r--tests/testdata/npm/registry/@denotest/types-exports-import-types/1.0.0/package.json (renamed from cli/tests/testdata/npm/registry/@denotest/types-exports-import-types/1.0.0/package.json)0
-rw-r--r--tests/testdata/npm/registry/@denotest/types-exports-subpaths/1.0.0/client.d.ts (renamed from cli/tests/testdata/npm/registry/@denotest/types-exports-subpaths/1.0.0/client.d.ts)0
-rw-r--r--tests/testdata/npm/registry/@denotest/types-exports-subpaths/1.0.0/dist/client.mjs (renamed from cli/tests/testdata/npm/registry/@denotest/types-exports-subpaths/1.0.0/dist/client.mjs)0
-rw-r--r--tests/testdata/npm/registry/@denotest/types-exports-subpaths/1.0.0/dist/entry-a.d.ts (renamed from cli/tests/testdata/npm/registry/@denotest/types-exports-subpaths/1.0.0/dist/entry-a.d.ts)0
-rw-r--r--tests/testdata/npm/registry/@denotest/types-exports-subpaths/1.0.0/dist/entry-a.js (renamed from cli/tests/testdata/npm/registry/@denotest/types-exports-subpaths/1.0.0/dist/entry-a.js)0
-rw-r--r--tests/testdata/npm/registry/@denotest/types-exports-subpaths/1.0.0/dist/entry-b.d.ts (renamed from cli/tests/testdata/npm/registry/@denotest/types-exports-subpaths/1.0.0/dist/entry-b.d.ts)0
-rw-r--r--tests/testdata/npm/registry/@denotest/types-exports-subpaths/1.0.0/dist/entry-b.js (renamed from cli/tests/testdata/npm/registry/@denotest/types-exports-subpaths/1.0.0/dist/entry-b.js)0
-rw-r--r--tests/testdata/npm/registry/@denotest/types-exports-subpaths/1.0.0/entry-import.d.ts (renamed from cli/tests/testdata/npm/registry/@denotest/types-exports-subpaths/1.0.0/entry-import.d.ts)0
-rw-r--r--tests/testdata/npm/registry/@denotest/types-exports-subpaths/1.0.0/entry-import.js (renamed from cli/tests/testdata/npm/registry/@denotest/types-exports-subpaths/1.0.0/entry-import.js)0
-rw-r--r--tests/testdata/npm/registry/@denotest/types-exports-subpaths/1.0.0/entry-js-only.js (renamed from cli/tests/testdata/npm/registry/@denotest/types-exports-subpaths/1.0.0/entry-js-only.js)0
-rw-r--r--tests/testdata/npm/registry/@denotest/types-exports-subpaths/1.0.0/entry-types.d.ts (renamed from cli/tests/testdata/npm/registry/@denotest/types-exports-subpaths/1.0.0/entry-types.d.ts)0
-rw-r--r--tests/testdata/npm/registry/@denotest/types-exports-subpaths/1.0.0/package.json (renamed from cli/tests/testdata/npm/registry/@denotest/types-exports-subpaths/1.0.0/package.json)0
-rw-r--r--tests/testdata/npm/registry/@denotest/types-no-types-entry/1.0.0/dist/main.d.ts (renamed from cli/tests/testdata/npm/registry/@denotest/types-no-types-entry/1.0.0/dist/main.d.ts)0
-rw-r--r--tests/testdata/npm/registry/@denotest/types-no-types-entry/1.0.0/dist/main.js (renamed from cli/tests/testdata/npm/registry/@denotest/types-no-types-entry/1.0.0/dist/main.js)0
-rw-r--r--tests/testdata/npm/registry/@denotest/types-no-types-entry/1.0.0/package.json (renamed from cli/tests/testdata/npm/registry/@denotest/types-no-types-entry/1.0.0/package.json)0
-rw-r--r--tests/testdata/npm/registry/@denotest/types/1.0.0/index.d.ts (renamed from cli/tests/testdata/npm/registry/@denotest/types/1.0.0/index.d.ts)0
-rw-r--r--tests/testdata/npm/registry/@denotest/types/1.0.0/package.json (renamed from cli/tests/testdata/npm/registry/@denotest/types/1.0.0/package.json)0
-rw-r--r--tests/testdata/npm/registry/@denotest/types_imported/1.0.0/index.d.ts (renamed from cli/tests/testdata/npm/registry/@denotest/types_imported/1.0.0/index.d.ts)0
-rw-r--r--tests/testdata/npm/registry/@denotest/types_imported/1.0.0/package.json (renamed from cli/tests/testdata/npm/registry/@denotest/types_imported/1.0.0/package.json)0
-rw-r--r--tests/testdata/npm/registry/@denotest/types_imported/1.0.0/subpath.d.ts (renamed from cli/tests/testdata/npm/registry/@denotest/types_imported/1.0.0/subpath.d.ts)0
-rw-r--r--tests/testdata/npm/registry/@denotest/typescript-file/1.0.0/index.ts (renamed from cli/tests/testdata/npm/registry/@denotest/typescript-file/1.0.0/index.ts)0
-rw-r--r--tests/testdata/npm/registry/@denotest/typescript-file/1.0.0/package.json (renamed from cli/tests/testdata/npm/registry/@denotest/typescript-file/1.0.0/package.json)0
-rw-r--r--tests/testdata/npm/registry/@ljharb/has-package-exports-patterns/has-package-exports-patterns-0.0.2.tgz (renamed from cli/tests/testdata/npm/registry/@ljharb/has-package-exports-patterns/has-package-exports-patterns-0.0.2.tgz)bin483 -> 483 bytes
-rw-r--r--tests/testdata/npm/registry/@ljharb/has-package-exports-patterns/registry.json (renamed from cli/tests/testdata/npm/registry/@ljharb/has-package-exports-patterns/registry.json)0
-rw-r--r--tests/testdata/npm/registry/@types/node/node-18.8.2.tgz (renamed from cli/tests/testdata/npm/registry/@types/node/node-18.8.2.tgz)bin649087 -> 649087 bytes
-rw-r--r--tests/testdata/npm/registry/@types/node/registry.json (renamed from cli/tests/testdata/npm/registry/@types/node/registry.json)0
-rw-r--r--tests/testdata/npm/registry/@vue/compiler-core/compiler-core-3.2.38.tgz (renamed from cli/tests/testdata/npm/registry/@vue/compiler-core/compiler-core-3.2.38.tgz)bin158201 -> 158201 bytes
-rw-r--r--tests/testdata/npm/registry/@vue/compiler-core/registry.json (renamed from cli/tests/testdata/npm/registry/@vue/compiler-core/registry.json)0
-rw-r--r--tests/testdata/npm/registry/@vue/compiler-dom/compiler-dom-3.2.38.tgz (renamed from cli/tests/testdata/npm/registry/@vue/compiler-dom/compiler-dom-3.2.38.tgz)bin197010 -> 197010 bytes
-rw-r--r--tests/testdata/npm/registry/@vue/compiler-dom/registry.json (renamed from cli/tests/testdata/npm/registry/@vue/compiler-dom/registry.json)0
-rw-r--r--tests/testdata/npm/registry/@vue/compiler-sfc/compiler-sfc-3.2.38.tgz (renamed from cli/tests/testdata/npm/registry/@vue/compiler-sfc/compiler-sfc-3.2.38.tgz)bin469167 -> 469167 bytes
-rw-r--r--tests/testdata/npm/registry/@vue/compiler-sfc/registry.json (renamed from cli/tests/testdata/npm/registry/@vue/compiler-sfc/registry.json)0
-rw-r--r--tests/testdata/npm/registry/@vue/compiler-ssr/compiler-ssr-3.2.38.tgz (renamed from cli/tests/testdata/npm/registry/@vue/compiler-ssr/compiler-ssr-3.2.38.tgz)bin13870 -> 13870 bytes
-rw-r--r--tests/testdata/npm/registry/@vue/compiler-ssr/registry.json (renamed from cli/tests/testdata/npm/registry/@vue/compiler-ssr/registry.json)0
-rw-r--r--tests/testdata/npm/registry/@vue/reactivity-transform/reactivity-transform-3.2.38.tgz (renamed from cli/tests/testdata/npm/registry/@vue/reactivity-transform/reactivity-transform-3.2.38.tgz)bin7582 -> 7582 bytes
-rw-r--r--tests/testdata/npm/registry/@vue/reactivity-transform/registry.json (renamed from cli/tests/testdata/npm/registry/@vue/reactivity-transform/registry.json)0
-rw-r--r--tests/testdata/npm/registry/@vue/reactivity/reactivity-3.2.38.tgz (renamed from cli/tests/testdata/npm/registry/@vue/reactivity/reactivity-3.2.38.tgz)bin57456 -> 57456 bytes
-rw-r--r--tests/testdata/npm/registry/@vue/reactivity/registry.json (renamed from cli/tests/testdata/npm/registry/@vue/reactivity/registry.json)0
-rw-r--r--tests/testdata/npm/registry/@vue/runtime-core/registry.json (renamed from cli/tests/testdata/npm/registry/@vue/runtime-core/registry.json)0
-rw-r--r--tests/testdata/npm/registry/@vue/runtime-core/runtime-core-3.2.38.tgz (renamed from cli/tests/testdata/npm/registry/@vue/runtime-core/runtime-core-3.2.38.tgz)bin217627 -> 217627 bytes
-rw-r--r--tests/testdata/npm/registry/@vue/runtime-dom/registry.json (renamed from cli/tests/testdata/npm/registry/@vue/runtime-dom/registry.json)0
-rw-r--r--tests/testdata/npm/registry/@vue/runtime-dom/runtime-dom-3.2.38.tgz (renamed from cli/tests/testdata/npm/registry/@vue/runtime-dom/runtime-dom-3.2.38.tgz)bin315216 -> 315216 bytes
-rw-r--r--tests/testdata/npm/registry/@vue/server-renderer/registry.json (renamed from cli/tests/testdata/npm/registry/@vue/server-renderer/registry.json)0
-rw-r--r--tests/testdata/npm/registry/@vue/server-renderer/server-renderer-3.2.38.tgz (renamed from cli/tests/testdata/npm/registry/@vue/server-renderer/server-renderer-3.2.38.tgz)bin120768 -> 120768 bytes
-rw-r--r--tests/testdata/npm/registry/@vue/shared/registry.json (renamed from cli/tests/testdata/npm/registry/@vue/shared/registry.json)0
-rw-r--r--tests/testdata/npm/registry/@vue/shared/shared-3.2.38.tgz (renamed from cli/tests/testdata/npm/registry/@vue/shared/shared-3.2.38.tgz)bin20773 -> 20773 bytes
-rw-r--r--tests/testdata/npm/registry/ajv-formats/ajv-formats-2.1.1.tgz (renamed from cli/tests/testdata/npm/registry/ajv-formats/ajv-formats-2.1.1.tgz)bin14851 -> 14851 bytes
-rw-r--r--tests/testdata/npm/registry/ajv-formats/registry.json (renamed from cli/tests/testdata/npm/registry/ajv-formats/registry.json)0
-rw-r--r--tests/testdata/npm/registry/ajv/ajv-8.11.0.tgz (renamed from cli/tests/testdata/npm/registry/ajv/ajv-8.11.0.tgz)bin219252 -> 219252 bytes
-rw-r--r--tests/testdata/npm/registry/ajv/registry.json (renamed from cli/tests/testdata/npm/registry/ajv/registry.json)0
-rw-r--r--tests/testdata/npm/registry/ansi-regex/ansi-regex-3.0.1.tgz (renamed from cli/tests/testdata/npm/registry/ansi-regex/ansi-regex-3.0.1.tgz)bin2246 -> 2246 bytes
-rw-r--r--tests/testdata/npm/registry/ansi-regex/ansi-regex-5.0.1.tgz (renamed from cli/tests/testdata/npm/registry/ansi-regex/ansi-regex-5.0.1.tgz)bin2768 -> 2768 bytes
-rw-r--r--tests/testdata/npm/registry/ansi-regex/registry.json (renamed from cli/tests/testdata/npm/registry/ansi-regex/registry.json)0
-rw-r--r--tests/testdata/npm/registry/ansi-styles/ansi-styles-4.3.0.tgz (renamed from cli/tests/testdata/npm/registry/ansi-styles/ansi-styles-4.3.0.tgz)bin5849 -> 5849 bytes
-rw-r--r--tests/testdata/npm/registry/ansi-styles/registry.json (renamed from cli/tests/testdata/npm/registry/ansi-styles/registry.json)0
-rw-r--r--tests/testdata/npm/registry/asn1/asn1-0.2.6.tgz (renamed from cli/tests/testdata/npm/registry/asn1/asn1-0.2.6.tgz)bin5977 -> 5977 bytes
-rw-r--r--tests/testdata/npm/registry/asn1/registry.json (renamed from cli/tests/testdata/npm/registry/asn1/registry.json)0
-rw-r--r--tests/testdata/npm/registry/assertion-error/assertion-error-1.1.0.tgz (renamed from cli/tests/testdata/npm/registry/assertion-error/assertion-error-1.1.0.tgz)bin2668 -> 2668 bytes
-rw-r--r--tests/testdata/npm/registry/assertion-error/registry.json (renamed from cli/tests/testdata/npm/registry/assertion-error/registry.json)0
-rw-r--r--tests/testdata/npm/registry/autoprefixer/autoprefixer-10.4.14.tgz (renamed from cli/tests/testdata/npm/registry/autoprefixer/autoprefixer-10.4.14.tgz)bin46185 -> 46185 bytes
-rw-r--r--tests/testdata/npm/registry/autoprefixer/registry.json (renamed from cli/tests/testdata/npm/registry/autoprefixer/registry.json)0
-rw-r--r--tests/testdata/npm/registry/bcrypt-pbkdf/bcrypt-pbkdf-1.0.2.tgz (renamed from cli/tests/testdata/npm/registry/bcrypt-pbkdf/bcrypt-pbkdf-1.0.2.tgz)bin11109 -> 11109 bytes
-rw-r--r--tests/testdata/npm/registry/bcrypt-pbkdf/registry.json (renamed from cli/tests/testdata/npm/registry/bcrypt-pbkdf/registry.json)0
-rw-r--r--tests/testdata/npm/registry/browserslist/browserslist-4.21.5.tgz (renamed from cli/tests/testdata/npm/registry/browserslist/browserslist-4.21.5.tgz)bin15212 -> 15212 bytes
-rw-r--r--tests/testdata/npm/registry/browserslist/registry.json (renamed from cli/tests/testdata/npm/registry/browserslist/registry.json)0
-rw-r--r--tests/testdata/npm/registry/buildcheck/buildcheck-0.0.3.tgz (renamed from cli/tests/testdata/npm/registry/buildcheck/buildcheck-0.0.3.tgz)bin12331 -> 12331 bytes
-rw-r--r--tests/testdata/npm/registry/buildcheck/registry.json (renamed from cli/tests/testdata/npm/registry/buildcheck/registry.json)0
-rw-r--r--tests/testdata/npm/registry/camelcase/camelcase-5.3.1.tgz (renamed from cli/tests/testdata/npm/registry/camelcase/camelcase-5.3.1.tgz)bin3028 -> 3028 bytes
-rw-r--r--tests/testdata/npm/registry/camelcase/registry.json (renamed from cli/tests/testdata/npm/registry/camelcase/registry.json)0
-rw-r--r--tests/testdata/npm/registry/caniuse-lite/caniuse-lite-1.0.30001473.tgz (renamed from cli/tests/testdata/npm/registry/caniuse-lite/caniuse-lite-1.0.30001473.tgz)bin275752 -> 275752 bytes
-rw-r--r--tests/testdata/npm/registry/caniuse-lite/registry.json (renamed from cli/tests/testdata/npm/registry/caniuse-lite/registry.json)0
-rw-r--r--tests/testdata/npm/registry/chai/chai-4.3.6.tgz (renamed from cli/tests/testdata/npm/registry/chai/chai-4.3.6.tgz)bin140277 -> 140277 bytes
-rw-r--r--tests/testdata/npm/registry/chai/registry.json (renamed from cli/tests/testdata/npm/registry/chai/registry.json)0
-rw-r--r--tests/testdata/npm/registry/chalk/chalk-4.1.2.tgz (renamed from cli/tests/testdata/npm/registry/chalk/chalk-4.1.2.tgz)bin11577 -> 11577 bytes
-rw-r--r--tests/testdata/npm/registry/chalk/chalk-5.0.1.tgz (renamed from cli/tests/testdata/npm/registry/chalk/chalk-5.0.1.tgz)bin13294 -> 13294 bytes
-rw-r--r--tests/testdata/npm/registry/chalk/registry.json (renamed from cli/tests/testdata/npm/registry/chalk/registry.json)0
-rw-r--r--tests/testdata/npm/registry/check-error/check-error-1.0.2.tgz (renamed from cli/tests/testdata/npm/registry/check-error/check-error-1.0.2.tgz)bin4986 -> 4986 bytes
-rw-r--r--tests/testdata/npm/registry/check-error/registry.json (renamed from cli/tests/testdata/npm/registry/check-error/registry.json)0
-rw-r--r--tests/testdata/npm/registry/cliui/cliui-6.0.0.tgz (renamed from cli/tests/testdata/npm/registry/cliui/cliui-6.0.0.tgz)bin5566 -> 5566 bytes
-rw-r--r--tests/testdata/npm/registry/cliui/registry.json (renamed from cli/tests/testdata/npm/registry/cliui/registry.json)0
-rw-r--r--tests/testdata/npm/registry/color-convert/color-convert-2.0.1.tgz (renamed from cli/tests/testdata/npm/registry/color-convert/color-convert-2.0.1.tgz)bin8996 -> 8996 bytes
-rw-r--r--tests/testdata/npm/registry/color-convert/registry.json (renamed from cli/tests/testdata/npm/registry/color-convert/registry.json)0
-rw-r--r--tests/testdata/npm/registry/color-name/color-name-1.1.4.tgz (renamed from cli/tests/testdata/npm/registry/color-name/color-name-1.1.4.tgz)bin2868 -> 2868 bytes
-rw-r--r--tests/testdata/npm/registry/color-name/registry.json (renamed from cli/tests/testdata/npm/registry/color-name/registry.json)0
-rw-r--r--tests/testdata/npm/registry/cowsay/cowsay-1.5.0.tgz (renamed from cli/tests/testdata/npm/registry/cowsay/cowsay-1.5.0.tgz)bin80330 -> 80330 bytes
-rw-r--r--tests/testdata/npm/registry/cowsay/registry.json (renamed from cli/tests/testdata/npm/registry/cowsay/registry.json)0
-rw-r--r--tests/testdata/npm/registry/cpu-features/cpu-features-0.0.4.tgz (renamed from cli/tests/testdata/npm/registry/cpu-features/cpu-features-0.0.4.tgz)bin90867 -> 90867 bytes
-rw-r--r--tests/testdata/npm/registry/cpu-features/registry.json (renamed from cli/tests/testdata/npm/registry/cpu-features/registry.json)0
-rw-r--r--tests/testdata/npm/registry/crypto-js/crypto-js-4.1.1.tgz (renamed from cli/tests/testdata/npm/registry/crypto-js/crypto-js-4.1.1.tgz)bin71882 -> 71882 bytes
-rw-r--r--tests/testdata/npm/registry/crypto-js/registry.json (renamed from cli/tests/testdata/npm/registry/crypto-js/registry.json)0
-rw-r--r--tests/testdata/npm/registry/csstype/csstype-2.6.20.tgz (renamed from cli/tests/testdata/npm/registry/csstype/csstype-2.6.20.tgz)bin289961 -> 289961 bytes
-rw-r--r--tests/testdata/npm/registry/csstype/registry.json (renamed from cli/tests/testdata/npm/registry/csstype/registry.json)0
-rw-r--r--tests/testdata/npm/registry/decamelize/decamelize-1.2.0.tgz (renamed from cli/tests/testdata/npm/registry/decamelize/decamelize-1.2.0.tgz)bin1691 -> 1691 bytes
-rw-r--r--tests/testdata/npm/registry/decamelize/registry.json (renamed from cli/tests/testdata/npm/registry/decamelize/registry.json)0
-rw-r--r--tests/testdata/npm/registry/deep-eql/deep-eql-3.0.1.tgz (renamed from cli/tests/testdata/npm/registry/deep-eql/deep-eql-3.0.1.tgz)bin10566 -> 10566 bytes
-rw-r--r--tests/testdata/npm/registry/deep-eql/registry.json (renamed from cli/tests/testdata/npm/registry/deep-eql/registry.json)0
-rw-r--r--tests/testdata/npm/registry/define-properties/define-properties-1.2.0.tgz (renamed from cli/tests/testdata/npm/registry/define-properties/define-properties-1.2.0.tgz)bin5093 -> 5093 bytes
-rw-r--r--tests/testdata/npm/registry/define-properties/registry.json (renamed from cli/tests/testdata/npm/registry/define-properties/registry.json)0
-rw-r--r--tests/testdata/npm/registry/electron-to-chromium/electron-to-chromium-1.4.348.tgz (renamed from cli/tests/testdata/npm/registry/electron-to-chromium/electron-to-chromium-1.4.348.tgz)bin32855 -> 32855 bytes
-rw-r--r--tests/testdata/npm/registry/electron-to-chromium/registry.json (renamed from cli/tests/testdata/npm/registry/electron-to-chromium/registry.json)0
-rw-r--r--tests/testdata/npm/registry/emoji-regex/emoji-regex-8.0.0.tgz (renamed from cli/tests/testdata/npm/registry/emoji-regex/emoji-regex-8.0.0.tgz)bin6664 -> 6664 bytes
-rw-r--r--tests/testdata/npm/registry/emoji-regex/registry.json (renamed from cli/tests/testdata/npm/registry/emoji-regex/registry.json)0
-rw-r--r--tests/testdata/npm/registry/escalade/escalade-3.1.1.tgz (renamed from cli/tests/testdata/npm/registry/escalade/escalade-3.1.1.tgz)bin4312 -> 4312 bytes
-rw-r--r--tests/testdata/npm/registry/escalade/registry.json (renamed from cli/tests/testdata/npm/registry/escalade/registry.json)0
-rw-r--r--tests/testdata/npm/registry/estree-walker/estree-walker-2.0.2.tgz (renamed from cli/tests/testdata/npm/registry/estree-walker/estree-walker-2.0.2.tgz)bin8353 -> 8353 bytes
-rw-r--r--tests/testdata/npm/registry/estree-walker/registry.json (renamed from cli/tests/testdata/npm/registry/estree-walker/registry.json)0
-rw-r--r--tests/testdata/npm/registry/fast-deep-equal/fast-deep-equal-3.1.3.tgz (renamed from cli/tests/testdata/npm/registry/fast-deep-equal/fast-deep-equal-3.1.3.tgz)bin3656 -> 3656 bytes
-rw-r--r--tests/testdata/npm/registry/fast-deep-equal/registry.json (renamed from cli/tests/testdata/npm/registry/fast-deep-equal/registry.json)0
-rw-r--r--tests/testdata/npm/registry/find-up/find-up-4.1.0.tgz (renamed from cli/tests/testdata/npm/registry/find-up/find-up-4.1.0.tgz)bin3745 -> 3745 bytes
-rw-r--r--tests/testdata/npm/registry/find-up/registry.json (renamed from cli/tests/testdata/npm/registry/find-up/registry.json)0
-rw-r--r--tests/testdata/npm/registry/fraction.js/fraction.js-4.2.0.tgz (renamed from cli/tests/testdata/npm/registry/fraction.js/fraction.js-4.2.0.tgz)bin16713 -> 16713 bytes
-rw-r--r--tests/testdata/npm/registry/fraction.js/registry.json (renamed from cli/tests/testdata/npm/registry/fraction.js/registry.json)0
-rw-r--r--tests/testdata/npm/registry/fs-extra/fs-extra-10.1.0.tgz (renamed from cli/tests/testdata/npm/registry/fs-extra/fs-extra-10.1.0.tgz)bin16920 -> 16920 bytes
-rw-r--r--tests/testdata/npm/registry/fs-extra/registry.json (renamed from cli/tests/testdata/npm/registry/fs-extra/registry.json)0
-rw-r--r--tests/testdata/npm/registry/function-bind/function-bind-1.1.1.tgz (renamed from cli/tests/testdata/npm/registry/function-bind/function-bind-1.1.1.tgz)bin6301 -> 6301 bytes
-rw-r--r--tests/testdata/npm/registry/function-bind/registry.json (renamed from cli/tests/testdata/npm/registry/function-bind/registry.json)0
-rw-r--r--tests/testdata/npm/registry/get-caller-file/get-caller-file-2.0.5.tgz (renamed from cli/tests/testdata/npm/registry/get-caller-file/get-caller-file-2.0.5.tgz)bin2383 -> 2383 bytes
-rw-r--r--tests/testdata/npm/registry/get-caller-file/registry.json (renamed from cli/tests/testdata/npm/registry/get-caller-file/registry.json)0
-rw-r--r--tests/testdata/npm/registry/get-func-name/get-func-name-2.0.0.tgz (renamed from cli/tests/testdata/npm/registry/get-func-name/get-func-name-2.0.0.tgz)bin3581 -> 3581 bytes
-rw-r--r--tests/testdata/npm/registry/get-func-name/registry.json (renamed from cli/tests/testdata/npm/registry/get-func-name/registry.json)0
-rw-r--r--tests/testdata/npm/registry/get-intrinsic/get-intrinsic-1.2.0.tgz (renamed from cli/tests/testdata/npm/registry/get-intrinsic/get-intrinsic-1.2.0.tgz)bin11608 -> 11608 bytes
-rw-r--r--tests/testdata/npm/registry/get-intrinsic/registry.json (renamed from cli/tests/testdata/npm/registry/get-intrinsic/registry.json)0
-rw-r--r--tests/testdata/npm/registry/get-stdin/get-stdin-8.0.0.tgz (renamed from cli/tests/testdata/npm/registry/get-stdin/get-stdin-8.0.0.tgz)bin2235 -> 2235 bytes
-rw-r--r--tests/testdata/npm/registry/get-stdin/registry.json (renamed from cli/tests/testdata/npm/registry/get-stdin/registry.json)0
-rw-r--r--tests/testdata/npm/registry/globals/globals-13.17.0.tgz (renamed from cli/tests/testdata/npm/registry/globals/globals-13.17.0.tgz)bin9431 -> 9431 bytes
-rw-r--r--tests/testdata/npm/registry/globals/registry.json (renamed from cli/tests/testdata/npm/registry/globals/registry.json)0
-rw-r--r--tests/testdata/npm/registry/graceful-fs/graceful-fs-4.2.10.tgz (renamed from cli/tests/testdata/npm/registry/graceful-fs/graceful-fs-4.2.10.tgz)bin9770 -> 9770 bytes
-rw-r--r--tests/testdata/npm/registry/graceful-fs/registry.json (renamed from cli/tests/testdata/npm/registry/graceful-fs/registry.json)0
-rw-r--r--tests/testdata/npm/registry/has-flag/has-flag-4.0.0.tgz (renamed from cli/tests/testdata/npm/registry/has-flag/has-flag-4.0.0.tgz)bin2206 -> 2206 bytes
-rw-r--r--tests/testdata/npm/registry/has-flag/registry.json (renamed from cli/tests/testdata/npm/registry/has-flag/registry.json)0
-rw-r--r--tests/testdata/npm/registry/has-package-exports/has-package-exports-1.3.0.tgz (renamed from cli/tests/testdata/npm/registry/has-package-exports/has-package-exports-1.3.0.tgz)bin6761 -> 6761 bytes
-rw-r--r--tests/testdata/npm/registry/has-package-exports/registry.json (renamed from cli/tests/testdata/npm/registry/has-package-exports/registry.json)0
-rw-r--r--tests/testdata/npm/registry/has-property-descriptors/has-property-descriptors-1.0.0.tgz (renamed from cli/tests/testdata/npm/registry/has-property-descriptors/has-property-descriptors-1.0.0.tgz)bin3854 -> 3854 bytes
-rw-r--r--tests/testdata/npm/registry/has-property-descriptors/registry.json (renamed from cli/tests/testdata/npm/registry/has-property-descriptors/registry.json)0
-rw-r--r--tests/testdata/npm/registry/has-symbols/has-symbols-1.0.3.tgz (renamed from cli/tests/testdata/npm/registry/has-symbols/has-symbols-1.0.3.tgz)bin7067 -> 7067 bytes
-rw-r--r--tests/testdata/npm/registry/has-symbols/registry.json (renamed from cli/tests/testdata/npm/registry/has-symbols/registry.json)0
-rw-r--r--tests/testdata/npm/registry/has/has-1.0.3.tgz (renamed from cli/tests/testdata/npm/registry/has/has-1.0.3.tgz)bin1553 -> 1553 bytes
-rw-r--r--tests/testdata/npm/registry/has/registry.json (renamed from cli/tests/testdata/npm/registry/has/registry.json)0
-rw-r--r--tests/testdata/npm/registry/is-fullwidth-code-point/is-fullwidth-code-point-2.0.0.tgz (renamed from cli/tests/testdata/npm/registry/is-fullwidth-code-point/is-fullwidth-code-point-2.0.0.tgz)bin2063 -> 2063 bytes
-rw-r--r--tests/testdata/npm/registry/is-fullwidth-code-point/is-fullwidth-code-point-3.0.0.tgz (renamed from cli/tests/testdata/npm/registry/is-fullwidth-code-point/is-fullwidth-code-point-3.0.0.tgz)bin2169 -> 2169 bytes
-rw-r--r--tests/testdata/npm/registry/is-fullwidth-code-point/registry.json (renamed from cli/tests/testdata/npm/registry/is-fullwidth-code-point/registry.json)0
-rw-r--r--tests/testdata/npm/registry/js-tokens/js-tokens-4.0.0.tgz (renamed from cli/tests/testdata/npm/registry/js-tokens/js-tokens-4.0.0.tgz)bin6542 -> 6542 bytes
-rw-r--r--tests/testdata/npm/registry/js-tokens/registry.json (renamed from cli/tests/testdata/npm/registry/js-tokens/registry.json)0
-rw-r--r--tests/testdata/npm/registry/json-schema-traverse/json-schema-traverse-1.0.0.tgz (renamed from cli/tests/testdata/npm/registry/json-schema-traverse/json-schema-traverse-1.0.0.tgz)bin6074 -> 6074 bytes
-rw-r--r--tests/testdata/npm/registry/json-schema-traverse/registry.json (renamed from cli/tests/testdata/npm/registry/json-schema-traverse/registry.json)0
-rw-r--r--tests/testdata/npm/registry/jsonfile/jsonfile-6.1.0.tgz (renamed from cli/tests/testdata/npm/registry/jsonfile/jsonfile-6.1.0.tgz)bin5816 -> 5816 bytes
-rw-r--r--tests/testdata/npm/registry/jsonfile/registry.json (renamed from cli/tests/testdata/npm/registry/jsonfile/registry.json)0
-rw-r--r--tests/testdata/npm/registry/locate-path/locate-path-5.0.0.tgz (renamed from cli/tests/testdata/npm/registry/locate-path/locate-path-5.0.0.tgz)bin2723 -> 2723 bytes
-rw-r--r--tests/testdata/npm/registry/locate-path/registry.json (renamed from cli/tests/testdata/npm/registry/locate-path/registry.json)0
-rw-r--r--tests/testdata/npm/registry/loose-envify/loose-envify-1.4.0.tgz (renamed from cli/tests/testdata/npm/registry/loose-envify/loose-envify-1.4.0.tgz)bin2842 -> 2842 bytes
-rw-r--r--tests/testdata/npm/registry/loose-envify/registry.json (renamed from cli/tests/testdata/npm/registry/loose-envify/registry.json)0
-rw-r--r--tests/testdata/npm/registry/loupe/loupe-2.3.4.tgz (renamed from cli/tests/testdata/npm/registry/loupe/loupe-2.3.4.tgz)bin14566 -> 14566 bytes
-rw-r--r--tests/testdata/npm/registry/loupe/registry.json (renamed from cli/tests/testdata/npm/registry/loupe/registry.json)0
-rw-r--r--tests/testdata/npm/registry/magic-string/magic-string-0.25.9.tgz (renamed from cli/tests/testdata/npm/registry/magic-string/magic-string-0.25.9.tgz)bin71318 -> 71318 bytes
-rw-r--r--tests/testdata/npm/registry/magic-string/registry.json (renamed from cli/tests/testdata/npm/registry/magic-string/registry.json)0
-rw-r--r--tests/testdata/npm/registry/mkdirp/mkdirp-1.0.4.tgz (renamed from cli/tests/testdata/npm/registry/mkdirp/mkdirp-1.0.4.tgz)bin6665 -> 6665 bytes
-rw-r--r--tests/testdata/npm/registry/mkdirp/registry.json (renamed from cli/tests/testdata/npm/registry/mkdirp/registry.json)0
-rw-r--r--tests/testdata/npm/registry/nan/nan-2.16.0.tgz (renamed from cli/tests/testdata/npm/registry/nan/nan-2.16.0.tgz)bin75350 -> 75350 bytes
-rw-r--r--tests/testdata/npm/registry/nan/registry.json (renamed from cli/tests/testdata/npm/registry/nan/registry.json)0
-rw-r--r--tests/testdata/npm/registry/nanoid/nanoid-3.3.4.tgz (renamed from cli/tests/testdata/npm/registry/nanoid/nanoid-3.3.4.tgz)bin5417 -> 5417 bytes
-rw-r--r--tests/testdata/npm/registry/nanoid/registry.json (renamed from cli/tests/testdata/npm/registry/nanoid/registry.json)0
-rw-r--r--tests/testdata/npm/registry/node-releases/node-releases-2.0.10.tgz (renamed from cli/tests/testdata/npm/registry/node-releases/node-releases-2.0.10.tgz)bin3742 -> 3742 bytes
-rw-r--r--tests/testdata/npm/registry/node-releases/registry.json (renamed from cli/tests/testdata/npm/registry/node-releases/registry.json)0
-rw-r--r--tests/testdata/npm/registry/normalize-range/normalize-range-0.1.2.tgz (renamed from cli/tests/testdata/npm/registry/normalize-range/normalize-range-0.1.2.tgz)bin3234 -> 3234 bytes
-rw-r--r--tests/testdata/npm/registry/normalize-range/registry.json (renamed from cli/tests/testdata/npm/registry/normalize-range/registry.json)0
-rw-r--r--tests/testdata/npm/registry/object-keys/object-keys-1.1.1.tgz (renamed from cli/tests/testdata/npm/registry/object-keys/object-keys-1.1.1.tgz)bin7677 -> 7677 bytes
-rw-r--r--tests/testdata/npm/registry/object-keys/registry.json (renamed from cli/tests/testdata/npm/registry/object-keys/registry.json)0
-rw-r--r--tests/testdata/npm/registry/p-limit/p-limit-2.3.0.tgz (renamed from cli/tests/testdata/npm/registry/p-limit/p-limit-2.3.0.tgz)bin3140 -> 3140 bytes
-rw-r--r--tests/testdata/npm/registry/p-limit/registry.json (renamed from cli/tests/testdata/npm/registry/p-limit/registry.json)0
-rw-r--r--tests/testdata/npm/registry/p-locate/p-locate-4.1.0.tgz (renamed from cli/tests/testdata/npm/registry/p-locate/p-locate-4.1.0.tgz)bin3060 -> 3060 bytes
-rw-r--r--tests/testdata/npm/registry/p-locate/registry.json (renamed from cli/tests/testdata/npm/registry/p-locate/registry.json)0
-rw-r--r--tests/testdata/npm/registry/p-try/p-try-2.2.0.tgz (renamed from cli/tests/testdata/npm/registry/p-try/p-try-2.2.0.tgz)bin2194 -> 2194 bytes
-rw-r--r--tests/testdata/npm/registry/p-try/registry.json (renamed from cli/tests/testdata/npm/registry/p-try/registry.json)0
-rw-r--r--tests/testdata/npm/registry/path-exists/path-exists-4.0.0.tgz (renamed from cli/tests/testdata/npm/registry/path-exists/path-exists-4.0.0.tgz)bin2073 -> 2073 bytes
-rw-r--r--tests/testdata/npm/registry/path-exists/registry.json (renamed from cli/tests/testdata/npm/registry/path-exists/registry.json)0
-rw-r--r--tests/testdata/npm/registry/pathval/pathval-1.1.1.tgz (renamed from cli/tests/testdata/npm/registry/pathval/pathval-1.1.1.tgz)bin5554 -> 5554 bytes
-rw-r--r--tests/testdata/npm/registry/pathval/registry.json (renamed from cli/tests/testdata/npm/registry/pathval/registry.json)0
-rw-r--r--tests/testdata/npm/registry/picocolors/picocolors-1.0.0.tgz (renamed from cli/tests/testdata/npm/registry/picocolors/picocolors-1.0.0.tgz)bin2411 -> 2411 bytes
-rw-r--r--tests/testdata/npm/registry/picocolors/registry.json (renamed from cli/tests/testdata/npm/registry/picocolors/registry.json)0
-rw-r--r--tests/testdata/npm/registry/postcss-value-parser/postcss-value-parser-4.2.0.tgz (renamed from cli/tests/testdata/npm/registry/postcss-value-parser/postcss-value-parser-4.2.0.tgz)bin7997 -> 7997 bytes
-rw-r--r--tests/testdata/npm/registry/postcss-value-parser/registry.json (renamed from cli/tests/testdata/npm/registry/postcss-value-parser/registry.json)0
-rw-r--r--tests/testdata/npm/registry/postcss/postcss-8.4.16.tgz (renamed from cli/tests/testdata/npm/registry/postcss/postcss-8.4.16.tgz)bin44045 -> 44045 bytes
-rw-r--r--tests/testdata/npm/registry/postcss/registry.json (renamed from cli/tests/testdata/npm/registry/postcss/registry.json)0
-rw-r--r--tests/testdata/npm/registry/punycode/punycode-2.1.1.tgz (renamed from cli/tests/testdata/npm/registry/punycode/punycode-2.1.1.tgz)bin7270 -> 7270 bytes
-rw-r--r--tests/testdata/npm/registry/punycode/registry.json (renamed from cli/tests/testdata/npm/registry/punycode/registry.json)0
-rw-r--r--tests/testdata/npm/registry/react-dom/react-dom-18.2.0.tgz (renamed from cli/tests/testdata/npm/registry/react-dom/react-dom-18.2.0.tgz)bin1087708 -> 1087708 bytes
-rw-r--r--tests/testdata/npm/registry/react-dom/registry.json (renamed from cli/tests/testdata/npm/registry/react-dom/registry.json)0
-rw-r--r--tests/testdata/npm/registry/react/react-18.2.0.tgz (renamed from cli/tests/testdata/npm/registry/react/react-18.2.0.tgz)bin81152 -> 81152 bytes
-rw-r--r--tests/testdata/npm/registry/react/registry.json (renamed from cli/tests/testdata/npm/registry/react/registry.json)0
-rw-r--r--tests/testdata/npm/registry/require-directory/registry.json (renamed from cli/tests/testdata/npm/registry/require-directory/registry.json)0
-rw-r--r--tests/testdata/npm/registry/require-directory/require-directory-2.1.1.tgz (renamed from cli/tests/testdata/npm/registry/require-directory/require-directory-2.1.1.tgz)bin4372 -> 4372 bytes
-rw-r--r--tests/testdata/npm/registry/require-from-string/registry.json (renamed from cli/tests/testdata/npm/registry/require-from-string/registry.json)0
-rw-r--r--tests/testdata/npm/registry/require-from-string/require-from-string-2.0.2.tgz (renamed from cli/tests/testdata/npm/registry/require-from-string/require-from-string-2.0.2.tgz)bin1816 -> 1816 bytes
-rw-r--r--tests/testdata/npm/registry/require-main-filename/registry.json (renamed from cli/tests/testdata/npm/registry/require-main-filename/registry.json)0
-rw-r--r--tests/testdata/npm/registry/require-main-filename/require-main-filename-2.0.0.tgz (renamed from cli/tests/testdata/npm/registry/require-main-filename/require-main-filename-2.0.0.tgz)bin1965 -> 1965 bytes
-rw-r--r--tests/testdata/npm/registry/safer-buffer/registry.json (renamed from cli/tests/testdata/npm/registry/safer-buffer/registry.json)0
-rw-r--r--tests/testdata/npm/registry/safer-buffer/safer-buffer-2.1.2.tgz (renamed from cli/tests/testdata/npm/registry/safer-buffer/safer-buffer-2.1.2.tgz)bin12035 -> 12035 bytes
-rw-r--r--tests/testdata/npm/registry/scheduler/registry.json (renamed from cli/tests/testdata/npm/registry/scheduler/registry.json)0
-rw-r--r--tests/testdata/npm/registry/scheduler/scheduler-0.23.0.tgz (renamed from cli/tests/testdata/npm/registry/scheduler/scheduler-0.23.0.tgz)bin17697 -> 17697 bytes
-rw-r--r--tests/testdata/npm/registry/set-blocking/registry.json (renamed from cli/tests/testdata/npm/registry/set-blocking/registry.json)0
-rw-r--r--tests/testdata/npm/registry/set-blocking/set-blocking-2.0.0.tgz (renamed from cli/tests/testdata/npm/registry/set-blocking/set-blocking-2.0.0.tgz)bin2212 -> 2212 bytes
-rw-r--r--tests/testdata/npm/registry/source-map-js/registry.json (renamed from cli/tests/testdata/npm/registry/source-map-js/registry.json)0
-rw-r--r--tests/testdata/npm/registry/source-map-js/source-map-js-1.0.2.tgz (renamed from cli/tests/testdata/npm/registry/source-map-js/source-map-js-1.0.2.tgz)bin38056 -> 38056 bytes
-rw-r--r--tests/testdata/npm/registry/source-map/registry.json (renamed from cli/tests/testdata/npm/registry/source-map/registry.json)0
-rw-r--r--tests/testdata/npm/registry/source-map/source-map-0.6.1.tgz (renamed from cli/tests/testdata/npm/registry/source-map/source-map-0.6.1.tgz)bin199644 -> 199644 bytes
-rw-r--r--tests/testdata/npm/registry/sourcemap-codec/registry.json (renamed from cli/tests/testdata/npm/registry/sourcemap-codec/registry.json)0
-rw-r--r--tests/testdata/npm/registry/sourcemap-codec/sourcemap-codec-1.4.8.tgz (renamed from cli/tests/testdata/npm/registry/sourcemap-codec/sourcemap-codec-1.4.8.tgz)bin7135 -> 7135 bytes
-rw-r--r--tests/testdata/npm/registry/ssh2/registry.json (renamed from cli/tests/testdata/npm/registry/ssh2/registry.json)0
-rw-r--r--tests/testdata/npm/registry/ssh2/ssh2-1.11.0.tgz (renamed from cli/tests/testdata/npm/registry/ssh2/ssh2-1.11.0.tgz)bin247466 -> 247466 bytes
-rw-r--r--tests/testdata/npm/registry/string-width/registry.json (renamed from cli/tests/testdata/npm/registry/string-width/registry.json)0
-rw-r--r--tests/testdata/npm/registry/string-width/string-width-2.1.1.tgz (renamed from cli/tests/testdata/npm/registry/string-width/string-width-2.1.1.tgz)bin1972 -> 1972 bytes
-rw-r--r--tests/testdata/npm/registry/string-width/string-width-4.2.3.tgz (renamed from cli/tests/testdata/npm/registry/string-width/string-width-4.2.3.tgz)bin2383 -> 2383 bytes
-rw-r--r--tests/testdata/npm/registry/strip-ansi/registry.json (renamed from cli/tests/testdata/npm/registry/strip-ansi/registry.json)0
-rw-r--r--tests/testdata/npm/registry/strip-ansi/strip-ansi-4.0.0.tgz (renamed from cli/tests/testdata/npm/registry/strip-ansi/strip-ansi-4.0.0.tgz)bin1644 -> 1644 bytes
-rw-r--r--tests/testdata/npm/registry/strip-ansi/strip-ansi-6.0.1.tgz (renamed from cli/tests/testdata/npm/registry/strip-ansi/strip-ansi-6.0.1.tgz)bin2041 -> 2041 bytes
-rw-r--r--tests/testdata/npm/registry/strip-final-newline/registry.json (renamed from cli/tests/testdata/npm/registry/strip-final-newline/registry.json)0
-rw-r--r--tests/testdata/npm/registry/strip-final-newline/strip-final-newline-2.0.0.tgz (renamed from cli/tests/testdata/npm/registry/strip-final-newline/strip-final-newline-2.0.0.tgz)bin1704 -> 1704 bytes
-rw-r--r--tests/testdata/npm/registry/supports-color/registry.json (renamed from cli/tests/testdata/npm/registry/supports-color/registry.json)0
-rw-r--r--tests/testdata/npm/registry/supports-color/supports-color-7.2.0.tgz (renamed from cli/tests/testdata/npm/registry/supports-color/supports-color-7.2.0.tgz)bin3210 -> 3210 bytes
-rw-r--r--tests/testdata/npm/registry/supports-esm/registry.json (renamed from cli/tests/testdata/npm/registry/supports-esm/registry.json)0
-rw-r--r--tests/testdata/npm/registry/supports-esm/supports-esm-1.0.0.tgz (renamed from cli/tests/testdata/npm/registry/supports-esm/supports-esm-1.0.0.tgz)bin1879 -> 1879 bytes
-rw-r--r--tests/testdata/npm/registry/tweetnacl/registry.json (renamed from cli/tests/testdata/npm/registry/tweetnacl/registry.json)0
-rw-r--r--tests/testdata/npm/registry/tweetnacl/tweetnacl-0.14.5.tgz (renamed from cli/tests/testdata/npm/registry/tweetnacl/tweetnacl-0.14.5.tgz)bin49663 -> 49663 bytes
-rw-r--r--tests/testdata/npm/registry/type-detect/registry.json (renamed from cli/tests/testdata/npm/registry/type-detect/registry.json)0
-rw-r--r--tests/testdata/npm/registry/type-detect/type-detect-4.0.8.tgz (renamed from cli/tests/testdata/npm/registry/type-detect/type-detect-4.0.8.tgz)bin8070 -> 8070 bytes
-rw-r--r--tests/testdata/npm/registry/type-fest/registry.json (renamed from cli/tests/testdata/npm/registry/type-fest/registry.json)0
-rw-r--r--tests/testdata/npm/registry/type-fest/type-fest-0.20.2.tgz (renamed from cli/tests/testdata/npm/registry/type-fest/type-fest-0.20.2.tgz)bin37225 -> 37225 bytes
-rw-r--r--tests/testdata/npm/registry/universalify/registry.json (renamed from cli/tests/testdata/npm/registry/universalify/registry.json)0
-rw-r--r--tests/testdata/npm/registry/universalify/universalify-2.0.0.tgz (renamed from cli/tests/testdata/npm/registry/universalify/universalify-2.0.0.tgz)bin2067 -> 2067 bytes
-rw-r--r--tests/testdata/npm/registry/update-browserslist-db/registry.json (renamed from cli/tests/testdata/npm/registry/update-browserslist-db/registry.json)0
-rw-r--r--tests/testdata/npm/registry/update-browserslist-db/update-browserslist-db-1.0.10.tgz (renamed from cli/tests/testdata/npm/registry/update-browserslist-db/update-browserslist-db-1.0.10.tgz)bin4797 -> 4797 bytes
-rw-r--r--tests/testdata/npm/registry/uri-js/registry.json (renamed from cli/tests/testdata/npm/registry/uri-js/registry.json)0
-rw-r--r--tests/testdata/npm/registry/uri-js/uri-js-4.4.1.tgz (renamed from cli/tests/testdata/npm/registry/uri-js/uri-js-4.4.1.tgz)bin132003 -> 132003 bytes
-rw-r--r--tests/testdata/npm/registry/vue/registry.json (renamed from cli/tests/testdata/npm/registry/vue/registry.json)0
-rw-r--r--tests/testdata/npm/registry/vue/vue-3.2.38.tgz (renamed from cli/tests/testdata/npm/registry/vue/vue-3.2.38.tgz)bin651102 -> 651102 bytes
-rw-r--r--tests/testdata/npm/registry/which-module/registry.json (renamed from cli/tests/testdata/npm/registry/which-module/registry.json)0
-rw-r--r--tests/testdata/npm/registry/which-module/which-module-2.0.0.tgz (renamed from cli/tests/testdata/npm/registry/which-module/which-module-2.0.0.tgz)bin2232 -> 2232 bytes
-rw-r--r--tests/testdata/npm/registry/wrap-ansi/registry.json (renamed from cli/tests/testdata/npm/registry/wrap-ansi/registry.json)0
-rw-r--r--tests/testdata/npm/registry/wrap-ansi/wrap-ansi-6.2.0.tgz (renamed from cli/tests/testdata/npm/registry/wrap-ansi/wrap-ansi-6.2.0.tgz)bin4004 -> 4004 bytes
-rw-r--r--tests/testdata/npm/registry/y18n/registry.json (renamed from cli/tests/testdata/npm/registry/y18n/registry.json)0
-rw-r--r--tests/testdata/npm/registry/y18n/y18n-4.0.3.tgz (renamed from cli/tests/testdata/npm/registry/y18n/y18n-4.0.3.tgz)bin4296 -> 4296 bytes
-rw-r--r--tests/testdata/npm/registry/yargs-parser/registry.json (renamed from cli/tests/testdata/npm/registry/yargs-parser/registry.json)0
-rw-r--r--tests/testdata/npm/registry/yargs-parser/yargs-parser-18.1.3.tgz (renamed from cli/tests/testdata/npm/registry/yargs-parser/yargs-parser-18.1.3.tgz)bin19027 -> 19027 bytes
-rw-r--r--tests/testdata/npm/registry/yargs/registry.json (renamed from cli/tests/testdata/npm/registry/yargs/registry.json)0
-rw-r--r--tests/testdata/npm/registry/yargs/yargs-15.4.1.tgz (renamed from cli/tests/testdata/npm/registry/yargs/yargs-15.4.1.tgz)bin56286 -> 56286 bytes
-rw-r--r--tests/testdata/npm/reload/main.ts (renamed from cli/tests/testdata/npm/reload/main.ts)0
-rw-r--r--tests/testdata/npm/remote_npm_specifier/main.out (renamed from cli/tests/testdata/npm/remote_npm_specifier/main.out)0
-rw-r--r--tests/testdata/npm/remote_npm_specifier/main.ts (renamed from cli/tests/testdata/npm/remote_npm_specifier/main.ts)0
-rw-r--r--tests/testdata/npm/remote_npm_specifier/remote.ts (renamed from cli/tests/testdata/npm/remote_npm_specifier/remote.ts)0
-rw-r--r--tests/testdata/npm/require_added_nm_folder/main.js (renamed from cli/tests/testdata/npm/require_added_nm_folder/main.js)0
-rw-r--r--tests/testdata/npm/require_added_nm_folder/main.out (renamed from cli/tests/testdata/npm/require_added_nm_folder/main.out)0
-rw-r--r--tests/testdata/npm/require_json/main.js (renamed from cli/tests/testdata/npm/require_json/main.js)0
-rw-r--r--tests/testdata/npm/require_json/main.out (renamed from cli/tests/testdata/npm/require_json/main.out)0
-rw-r--r--tests/testdata/npm/require_main/main.js (renamed from cli/tests/testdata/npm/require_main/main.js)0
-rw-r--r--tests/testdata/npm/require_main/main.out (renamed from cli/tests/testdata/npm/require_main/main.out)0
-rw-r--r--tests/testdata/npm/require_resolve_url/package.json (renamed from cli/tests/testdata/npm/require_resolve_url/package.json)0
-rw-r--r--tests/testdata/npm/require_resolve_url/url_paths.out (renamed from cli/tests/testdata/npm/require_resolve_url/url_paths.out)0
-rw-r--r--tests/testdata/npm/require_resolve_url/url_paths.ts (renamed from cli/tests/testdata/npm/require_resolve_url/url_paths.ts)0
-rw-r--r--tests/testdata/npm/reserved_word_exports/main.out (renamed from cli/tests/testdata/npm/reserved_word_exports/main.out)0
-rw-r--r--tests/testdata/npm/reserved_word_exports/main.ts (renamed from cli/tests/testdata/npm/reserved_word_exports/main.ts)0
-rw-r--r--tests/testdata/npm/run_existing_npm_package/main.out (renamed from cli/tests/testdata/npm/run_existing_npm_package/main.out)0
-rw-r--r--tests/testdata/npm/run_existing_npm_package/package.json (renamed from cli/tests/testdata/npm/run_existing_npm_package/package.json)0
-rw-r--r--tests/testdata/npm/run_existing_npm_package_with_subpath/main.out (renamed from cli/tests/testdata/npm/run_existing_npm_package_with_subpath/main.out)0
-rw-r--r--tests/testdata/npm/run_existing_npm_package_with_subpath/package.json (renamed from cli/tests/testdata/npm/run_existing_npm_package_with_subpath/package.json)0
-rw-r--r--tests/testdata/npm/sub_paths/main.jsx (renamed from cli/tests/testdata/npm/sub_paths/main.jsx)0
-rw-r--r--tests/testdata/npm/sub_paths/main.out (renamed from cli/tests/testdata/npm/sub_paths/main.out)0
-rw-r--r--tests/testdata/npm/tarball_with_global_header/main.js (renamed from cli/tests/testdata/npm/tarball_with_global_header/main.js)0
-rw-r--r--tests/testdata/npm/tarball_with_global_header/main.out (renamed from cli/tests/testdata/npm/tarball_with_global_header/main.out)0
-rw-r--r--tests/testdata/npm/translate_cjs_to_esm/main.js (renamed from cli/tests/testdata/npm/translate_cjs_to_esm/main.js)0
-rw-r--r--tests/testdata/npm/translate_cjs_to_esm/main.out (renamed from cli/tests/testdata/npm/translate_cjs_to_esm/main.out)0
-rw-r--r--tests/testdata/npm/types/main.out (renamed from cli/tests/testdata/npm/types/main.out)0
-rw-r--r--tests/testdata/npm/types/main.ts (renamed from cli/tests/testdata/npm/types/main.ts)0
-rw-r--r--tests/testdata/npm/types_ambient_module/import_map.json (renamed from cli/tests/testdata/npm/types_ambient_module/import_map.json)0
-rw-r--r--tests/testdata/npm/types_ambient_module/main.out (renamed from cli/tests/testdata/npm/types_ambient_module/main.out)0
-rw-r--r--tests/testdata/npm/types_ambient_module/main.ts (renamed from cli/tests/testdata/npm/types_ambient_module/main.ts)0
-rw-r--r--tests/testdata/npm/types_ambient_module/main_import_map.out (renamed from cli/tests/testdata/npm/types_ambient_module/main_import_map.out)0
-rw-r--r--tests/testdata/npm/types_ambient_module/main_import_map.ts (renamed from cli/tests/testdata/npm/types_ambient_module/main_import_map.ts)0
-rw-r--r--tests/testdata/npm/types_entry_value_not_exists/main.out (renamed from cli/tests/testdata/npm/types_entry_value_not_exists/main.out)0
-rw-r--r--tests/testdata/npm/types_entry_value_not_exists/main.ts (renamed from cli/tests/testdata/npm/types_entry_value_not_exists/main.ts)0
-rw-r--r--tests/testdata/npm/types_exports_import_types/main.out (renamed from cli/tests/testdata/npm/types_exports_import_types/main.out)0
-rw-r--r--tests/testdata/npm/types_exports_import_types/main.ts (renamed from cli/tests/testdata/npm/types_exports_import_types/main.ts)0
-rw-r--r--tests/testdata/npm/types_no_types_entry/main.out (renamed from cli/tests/testdata/npm/types_no_types_entry/main.out)0
-rw-r--r--tests/testdata/npm/types_no_types_entry/main.ts (renamed from cli/tests/testdata/npm/types_no_types_entry/main.ts)0
-rw-r--r--tests/testdata/npm/typescript_file_in_package/main.out (renamed from cli/tests/testdata/npm/typescript_file_in_package/main.out)0
-rw-r--r--tests/testdata/npm/typescript_file_in_package/main.ts (renamed from cli/tests/testdata/npm/typescript_file_in_package/main.ts)0
-rw-r--r--tests/testdata/package_json/basic/fail_check.check.out (renamed from cli/tests/testdata/package_json/basic/fail_check.check.out)0
-rw-r--r--tests/testdata/package_json/basic/fail_check.ts (renamed from cli/tests/testdata/package_json/basic/fail_check.ts)0
-rw-r--r--tests/testdata/package_json/basic/lib.bench.out (renamed from cli/tests/testdata/package_json/basic/lib.bench.out)0
-rw-r--r--tests/testdata/package_json/basic/lib.bench.ts (renamed from cli/tests/testdata/package_json/basic/lib.bench.ts)0
-rw-r--r--tests/testdata/package_json/basic/lib.test.out (renamed from cli/tests/testdata/package_json/basic/lib.test.out)0
-rw-r--r--tests/testdata/package_json/basic/lib.test.ts (renamed from cli/tests/testdata/package_json/basic/lib.test.ts)0
-rw-r--r--tests/testdata/package_json/basic/lib.ts (renamed from cli/tests/testdata/package_json/basic/lib.ts)0
-rw-r--r--tests/testdata/package_json/basic/main.cache.out (renamed from cli/tests/testdata/package_json/basic/main.cache.out)0
-rw-r--r--tests/testdata/package_json/basic/main.check.out (renamed from cli/tests/testdata/package_json/basic/main.check.out)0
-rw-r--r--tests/testdata/package_json/basic/main.info.out (renamed from cli/tests/testdata/package_json/basic/main.info.out)0
-rw-r--r--tests/testdata/package_json/basic/main.ts (renamed from cli/tests/testdata/package_json/basic/main.ts)0
-rw-r--r--tests/testdata/package_json/basic/package.json (renamed from cli/tests/testdata/package_json/basic/package.json)0
-rw-r--r--tests/testdata/package_json/deno_json/deno.json (renamed from cli/tests/testdata/package_json/deno_json/deno.json)0
-rw-r--r--tests/testdata/package_json/deno_json/main.check.out (renamed from cli/tests/testdata/package_json/deno_json/main.check.out)0
-rw-r--r--tests/testdata/package_json/deno_json/main.out (renamed from cli/tests/testdata/package_json/deno_json/main.out)0
-rw-r--r--tests/testdata/package_json/deno_json/main.ts (renamed from cli/tests/testdata/package_json/deno_json/main.ts)0
-rw-r--r--tests/testdata/package_json/deno_json/other.ts (renamed from cli/tests/testdata/package_json/deno_json/other.ts)0
-rw-r--r--tests/testdata/package_json/deno_json/package.json (renamed from cli/tests/testdata/package_json/deno_json/package.json)0
-rw-r--r--tests/testdata/package_json/invalid_value/error.ts (renamed from cli/tests/testdata/package_json/invalid_value/error.ts)0
-rw-r--r--tests/testdata/package_json/invalid_value/error.ts.out (renamed from cli/tests/testdata/package_json/invalid_value/error.ts.out)0
-rw-r--r--tests/testdata/package_json/invalid_value/ok.ts (renamed from cli/tests/testdata/package_json/invalid_value/ok.ts)0
-rw-r--r--tests/testdata/package_json/invalid_value/ok.ts.out (renamed from cli/tests/testdata/package_json/invalid_value/ok.ts.out)0
-rw-r--r--tests/testdata/package_json/invalid_value/package.json (renamed from cli/tests/testdata/package_json/invalid_value/package.json)0
-rw-r--r--tests/testdata/package_json/invalid_value/task.out (renamed from cli/tests/testdata/package_json/invalid_value/task.out)0
-rw-r--r--tests/testdata/publish/deno_jsonc.out (renamed from cli/tests/testdata/publish/deno_jsonc.out)0
-rw-r--r--tests/testdata/publish/deno_jsonc/deno.jsonc (renamed from cli/tests/testdata/publish/deno_jsonc/deno.jsonc)0
-rw-r--r--tests/testdata/publish/deno_jsonc/mod.ts (renamed from cli/tests/testdata/publish/deno_jsonc/mod.ts)0
-rw-r--r--tests/testdata/publish/deno_jsonc/std_http.ts (renamed from cli/tests/testdata/publish/deno_jsonc/std_http.ts)0
-rw-r--r--tests/testdata/publish/dry_run.out (renamed from cli/tests/testdata/publish/dry_run.out)0
-rw-r--r--tests/testdata/publish/invalid_fast_check.out (renamed from cli/tests/testdata/publish/invalid_fast_check.out)0
-rw-r--r--tests/testdata/publish/invalid_fast_check/deno.json (renamed from cli/tests/testdata/publish/invalid_fast_check/deno.json)0
-rw-r--r--tests/testdata/publish/invalid_fast_check/mod.ts (renamed from cli/tests/testdata/publish/invalid_fast_check/mod.ts)0
-rw-r--r--tests/testdata/publish/invalid_import.out (renamed from cli/tests/testdata/publish/invalid_import.out)0
-rw-r--r--tests/testdata/publish/invalid_import/deno.json (renamed from cli/tests/testdata/publish/invalid_import/deno.json)0
-rw-r--r--tests/testdata/publish/invalid_import/mod.ts (renamed from cli/tests/testdata/publish/invalid_import/mod.ts)0
-rw-r--r--tests/testdata/publish/invalid_path.out (renamed from cli/tests/testdata/publish/invalid_path.out)0
-rw-r--r--tests/testdata/publish/invalid_path/deno.json (renamed from cli/tests/testdata/publish/invalid_path/deno.json)0
-rw-r--r--tests/testdata/publish/invalid_path/mod.ts (renamed from cli/tests/testdata/publish/invalid_path/mod.ts)0
-rw-r--r--tests/testdata/publish/invalid_path/path with spaces.txt (renamed from cli/tests/testdata/publish/invalid_path/path with spaces.txt)0
-rw-r--r--tests/testdata/publish/javascript_decl_file.out (renamed from cli/tests/testdata/publish/javascript_decl_file.out)0
-rw-r--r--tests/testdata/publish/javascript_decl_file/deno.json (renamed from cli/tests/testdata/publish/javascript_decl_file/deno.json)0
-rw-r--r--tests/testdata/publish/javascript_decl_file/mod.d.ts (renamed from cli/tests/testdata/publish/javascript_decl_file/mod.d.ts)0
-rw-r--r--tests/testdata/publish/javascript_decl_file/mod.js (renamed from cli/tests/testdata/publish/javascript_decl_file/mod.js)0
-rw-r--r--tests/testdata/publish/javascript_missing_decl_file.out (renamed from cli/tests/testdata/publish/javascript_missing_decl_file.out)0
-rw-r--r--tests/testdata/publish/javascript_missing_decl_file/deno.json (renamed from cli/tests/testdata/publish/javascript_missing_decl_file/deno.json)0
-rw-r--r--tests/testdata/publish/javascript_missing_decl_file/mod.js (renamed from cli/tests/testdata/publish/javascript_missing_decl_file/mod.js)0
-rw-r--r--tests/testdata/publish/javascript_missing_decl_file/other.js (renamed from cli/tests/testdata/publish/javascript_missing_decl_file/other.js)0
-rw-r--r--tests/testdata/publish/missing_deno_json.out (renamed from cli/tests/testdata/publish/missing_deno_json.out)0
-rw-r--r--tests/testdata/publish/missing_deno_json/main.ts (renamed from cli/tests/testdata/publish/missing_deno_json/main.ts)0
-rw-r--r--tests/testdata/publish/no_token.out (renamed from cli/tests/testdata/publish/no_token.out)0
-rw-r--r--tests/testdata/publish/no_zap.out (renamed from cli/tests/testdata/publish/no_zap.out)0
-rw-r--r--tests/testdata/publish/node_specifier.out (renamed from cli/tests/testdata/publish/node_specifier.out)0
-rw-r--r--tests/testdata/publish/node_specifier/deno.json (renamed from cli/tests/testdata/publish/node_specifier/deno.json)0
-rw-r--r--tests/testdata/publish/node_specifier/mod.ts (renamed from cli/tests/testdata/publish/node_specifier/mod.ts)0
-rw-r--r--tests/testdata/publish/successful.out (renamed from cli/tests/testdata/publish/successful.out)0
-rw-r--r--tests/testdata/publish/successful/deno.json (renamed from cli/tests/testdata/publish/successful/deno.json)0
-rw-r--r--tests/testdata/publish/successful/mod.ts (renamed from cli/tests/testdata/publish/successful/mod.ts)0
-rw-r--r--tests/testdata/publish/successful/std_http.ts (renamed from cli/tests/testdata/publish/successful/std_http.ts)0
-rw-r--r--tests/testdata/publish/symlink.out (renamed from cli/tests/testdata/publish/symlink.out)0
-rw-r--r--tests/testdata/publish/symlink/deno.json (renamed from cli/tests/testdata/publish/symlink/deno.json)0
-rw-r--r--tests/testdata/publish/symlink/mod.ts (renamed from cli/tests/testdata/publish/symlink/mod.ts)0
l---------tests/testdata/publish/symlink/symlink (renamed from cli/tests/testdata/publish/symlink/symlink)0
-rw-r--r--tests/testdata/publish/unanalyzable_dynamic_import.out (renamed from cli/tests/testdata/publish/unanalyzable_dynamic_import.out)0
-rw-r--r--tests/testdata/publish/unanalyzable_dynamic_import/deno.json (renamed from cli/tests/testdata/publish/unanalyzable_dynamic_import/deno.json)0
-rw-r--r--tests/testdata/publish/unanalyzable_dynamic_import/mod.ts (renamed from cli/tests/testdata/publish/unanalyzable_dynamic_import/mod.ts)0
-rw-r--r--tests/testdata/publish/workspace.out (renamed from cli/tests/testdata/publish/workspace.out)0
-rw-r--r--tests/testdata/publish/workspace/bar/deno.json (renamed from cli/tests/testdata/publish/workspace/bar/deno.json)0
-rw-r--r--tests/testdata/publish/workspace/bar/mod.ts (renamed from cli/tests/testdata/publish/workspace/bar/mod.ts)0
-rw-r--r--tests/testdata/publish/workspace/deno.json (renamed from cli/tests/testdata/publish/workspace/deno.json)0
-rw-r--r--tests/testdata/publish/workspace/foo/deno.json (renamed from cli/tests/testdata/publish/workspace/foo/deno.json)0
-rw-r--r--tests/testdata/publish/workspace/foo/mod.ts (renamed from cli/tests/testdata/publish/workspace/foo/mod.ts)0
-rw-r--r--tests/testdata/publish/workspace_individual.out (renamed from cli/tests/testdata/publish/workspace_individual.out)0
-rw-r--r--tests/testdata/repl/import_type.ts (renamed from cli/tests/testdata/repl/import_type.ts)0
-rw-r--r--tests/testdata/run/001_hello.js (renamed from cli/tests/testdata/run/001_hello.js)0
-rw-r--r--tests/testdata/run/001_hello.js.out (renamed from cli/tests/testdata/run/001_hello.js.out)0
-rw-r--r--tests/testdata/run/002_hello.ts (renamed from cli/tests/testdata/run/002_hello.ts)0
-rw-r--r--tests/testdata/run/002_hello.ts.out (renamed from cli/tests/testdata/run/002_hello.ts.out)0
-rw-r--r--tests/testdata/run/003_relative_import.ts (renamed from cli/tests/testdata/run/003_relative_import.ts)0
-rw-r--r--tests/testdata/run/003_relative_import.ts.out (renamed from cli/tests/testdata/run/003_relative_import.ts.out)0
-rw-r--r--tests/testdata/run/004_set_timeout.ts (renamed from cli/tests/testdata/run/004_set_timeout.ts)0
-rw-r--r--tests/testdata/run/004_set_timeout.ts.out (renamed from cli/tests/testdata/run/004_set_timeout.ts.out)0
-rw-r--r--tests/testdata/run/005_more_imports.ts (renamed from cli/tests/testdata/run/005_more_imports.ts)0
-rw-r--r--tests/testdata/run/005_more_imports.ts.out (renamed from cli/tests/testdata/run/005_more_imports.ts.out)0
-rw-r--r--tests/testdata/run/006_url_imports.ts (renamed from cli/tests/testdata/run/006_url_imports.ts)0
-rw-r--r--tests/testdata/run/006_url_imports.ts.out (renamed from cli/tests/testdata/run/006_url_imports.ts.out)0
-rw-r--r--tests/testdata/run/012_async.ts (renamed from cli/tests/testdata/run/012_async.ts)0
-rw-r--r--tests/testdata/run/012_async.ts.out (renamed from cli/tests/testdata/run/012_async.ts.out)0
-rw-r--r--tests/testdata/run/013_dynamic_import.ts (renamed from cli/tests/testdata/run/013_dynamic_import.ts)0
-rw-r--r--tests/testdata/run/013_dynamic_import.ts.out (renamed from cli/tests/testdata/run/013_dynamic_import.ts.out)0
-rw-r--r--tests/testdata/run/014_duplicate_import.ts (renamed from cli/tests/testdata/run/014_duplicate_import.ts)0
-rw-r--r--tests/testdata/run/014_duplicate_import.ts.out (renamed from cli/tests/testdata/run/014_duplicate_import.ts.out)0
-rw-r--r--tests/testdata/run/015_duplicate_parallel_import.js (renamed from cli/tests/testdata/run/015_duplicate_parallel_import.js)0
-rw-r--r--tests/testdata/run/015_duplicate_parallel_import.js.out (renamed from cli/tests/testdata/run/015_duplicate_parallel_import.js.out)0
-rw-r--r--tests/testdata/run/016_double_await.ts (renamed from cli/tests/testdata/run/016_double_await.ts)0
-rw-r--r--tests/testdata/run/016_double_await.ts.out (renamed from cli/tests/testdata/run/016_double_await.ts.out)0
-rw-r--r--tests/testdata/run/017_import_redirect.ts (renamed from cli/tests/testdata/run/017_import_redirect.ts)0
-rw-r--r--tests/testdata/run/017_import_redirect.ts.out (renamed from cli/tests/testdata/run/017_import_redirect.ts.out)0
-rw-r--r--tests/testdata/run/017_import_redirect_info.out (renamed from cli/tests/testdata/run/017_import_redirect_info.out)0
-rw-r--r--tests/testdata/run/018_async_catch.ts (renamed from cli/tests/testdata/run/018_async_catch.ts)0
-rw-r--r--tests/testdata/run/018_async_catch.ts.out (renamed from cli/tests/testdata/run/018_async_catch.ts.out)0
-rw-r--r--tests/testdata/run/019_media_types.ts (renamed from cli/tests/testdata/run/019_media_types.ts)0
-rw-r--r--tests/testdata/run/019_media_types.ts.out (renamed from cli/tests/testdata/run/019_media_types.ts.out)0
-rw-r--r--tests/testdata/run/020_json_modules.ts (renamed from cli/tests/testdata/run/020_json_modules.ts)0
-rw-r--r--tests/testdata/run/020_json_modules.ts.out (renamed from cli/tests/testdata/run/020_json_modules.ts.out)0
-rw-r--r--tests/testdata/run/021_mjs_modules.ts (renamed from cli/tests/testdata/run/021_mjs_modules.ts)0
-rw-r--r--tests/testdata/run/021_mjs_modules.ts.out (renamed from cli/tests/testdata/run/021_mjs_modules.ts.out)0
-rw-r--r--tests/testdata/run/023_no_ext (renamed from cli/tests/testdata/run/023_no_ext)0
-rw-r--r--tests/testdata/run/023_no_ext.out (renamed from cli/tests/testdata/run/023_no_ext.out)0
-rw-r--r--tests/testdata/run/025_hrtime.ts (renamed from cli/tests/testdata/run/025_hrtime.ts)0
-rw-r--r--tests/testdata/run/025_hrtime.ts.out (renamed from cli/tests/testdata/run/025_hrtime.ts.out)0
-rw-r--r--tests/testdata/run/025_reload_js_type_error.js (renamed from cli/tests/testdata/run/025_reload_js_type_error.js)0
-rw-r--r--tests/testdata/run/025_reload_js_type_error.js.out (renamed from cli/tests/testdata/run/025_reload_js_type_error.js.out)0
-rw-r--r--tests/testdata/run/026_redirect_javascript.js (renamed from cli/tests/testdata/run/026_redirect_javascript.js)0
-rw-r--r--tests/testdata/run/026_redirect_javascript.js.out (renamed from cli/tests/testdata/run/026_redirect_javascript.js.out)0
-rw-r--r--tests/testdata/run/027_redirect_typescript.ts (renamed from cli/tests/testdata/run/027_redirect_typescript.ts)0
-rw-r--r--tests/testdata/run/027_redirect_typescript.ts.out (renamed from cli/tests/testdata/run/027_redirect_typescript.ts.out)0
-rw-r--r--tests/testdata/run/028_args.ts (renamed from cli/tests/testdata/run/028_args.ts)0
-rw-r--r--tests/testdata/run/028_args.ts.out (renamed from cli/tests/testdata/run/028_args.ts.out)0
-rw-r--r--tests/testdata/run/033_import_map.out (renamed from cli/tests/testdata/run/033_import_map.out)0
-rw-r--r--tests/testdata/run/033_import_map_in_config_file.out (renamed from cli/tests/testdata/run/033_import_map_in_config_file.out)0
-rw-r--r--tests/testdata/run/033_import_map_in_flag_has_precedence.out (renamed from cli/tests/testdata/run/033_import_map_in_flag_has_precedence.out)0
-rw-r--r--tests/testdata/run/033_import_map_remote.out (renamed from cli/tests/testdata/run/033_import_map_remote.out)0
-rw-r--r--tests/testdata/run/035_cached_only_flag.out (renamed from cli/tests/testdata/run/035_cached_only_flag.out)0
-rw-r--r--tests/testdata/run/038_checkjs.js (renamed from cli/tests/testdata/run/038_checkjs.js)0
-rw-r--r--tests/testdata/run/038_checkjs.js.out (renamed from cli/tests/testdata/run/038_checkjs.js.out)0
-rw-r--r--tests/testdata/run/042_dyn_import_evalcontext.ts (renamed from cli/tests/testdata/run/042_dyn_import_evalcontext.ts)0
-rw-r--r--tests/testdata/run/042_dyn_import_evalcontext.ts.out (renamed from cli/tests/testdata/run/042_dyn_import_evalcontext.ts.out)0
-rw-r--r--tests/testdata/run/044_bad_resource.ts (renamed from cli/tests/testdata/run/044_bad_resource.ts)0
-rw-r--r--tests/testdata/run/044_bad_resource.ts.out (renamed from cli/tests/testdata/run/044_bad_resource.ts.out)0
-rw-r--r--tests/testdata/run/045_mod.ts (renamed from cli/tests/testdata/run/045_mod.ts)0
-rw-r--r--tests/testdata/run/045_output.ts (renamed from cli/tests/testdata/run/045_output.ts)0
-rw-r--r--tests/testdata/run/045_programmatic_proxy_client.ts (renamed from cli/tests/testdata/run/045_programmatic_proxy_client.ts)0
-rw-r--r--tests/testdata/run/045_proxy_client.ts (renamed from cli/tests/testdata/run/045_proxy_client.ts)0
-rw-r--r--tests/testdata/run/045_proxy_test.ts121
-rw-r--r--tests/testdata/run/045_proxy_test.ts.out (renamed from cli/tests/testdata/run/045_proxy_test.ts.out)0
-rw-r--r--tests/testdata/run/046_jsx_test.tsx (renamed from cli/tests/testdata/run/046_jsx_test.tsx)0
-rw-r--r--tests/testdata/run/046_jsx_test.tsx.out (renamed from cli/tests/testdata/run/046_jsx_test.tsx.out)0
-rw-r--r--tests/testdata/run/047_jsx_test.jsx (renamed from cli/tests/testdata/run/047_jsx_test.jsx)0
-rw-r--r--tests/testdata/run/047_jsx_test.jsx.out (renamed from cli/tests/testdata/run/047_jsx_test.jsx.out)0
-rw-r--r--tests/testdata/run/048_media_types_jsx.ts (renamed from cli/tests/testdata/run/048_media_types_jsx.ts)0
-rw-r--r--tests/testdata/run/048_media_types_jsx.ts.out (renamed from cli/tests/testdata/run/048_media_types_jsx.ts.out)0
-rw-r--r--tests/testdata/run/052_no_remote_flag.out (renamed from cli/tests/testdata/run/052_no_remote_flag.out)0
-rw-r--r--tests/testdata/run/056_make_temp_file_write_perm.out (renamed from cli/tests/testdata/run/056_make_temp_file_write_perm.out)0
-rw-r--r--tests/testdata/run/056_make_temp_file_write_perm.ts (renamed from cli/tests/testdata/run/056_make_temp_file_write_perm.ts)0
-rw-r--r--tests/testdata/run/058_tasks_microtasks_close.ts (renamed from cli/tests/testdata/run/058_tasks_microtasks_close.ts)0
-rw-r--r--tests/testdata/run/058_tasks_microtasks_close.ts.out (renamed from cli/tests/testdata/run/058_tasks_microtasks_close.ts.out)0
-rw-r--r--tests/testdata/run/059_fs_relative_path_perm.ts (renamed from cli/tests/testdata/run/059_fs_relative_path_perm.ts)0
-rw-r--r--tests/testdata/run/059_fs_relative_path_perm.ts.out (renamed from cli/tests/testdata/run/059_fs_relative_path_perm.ts.out)0
-rw-r--r--tests/testdata/run/061_permissions_request.ts (renamed from cli/tests/testdata/run/061_permissions_request.ts)0
-rw-r--r--tests/testdata/run/061_permissions_request_sync.ts (renamed from cli/tests/testdata/run/061_permissions_request_sync.ts)0
-rw-r--r--tests/testdata/run/062_permissions_request_global.ts (renamed from cli/tests/testdata/run/062_permissions_request_global.ts)0
-rw-r--r--tests/testdata/run/062_permissions_request_global_sync.ts (renamed from cli/tests/testdata/run/062_permissions_request_global_sync.ts)0
-rw-r--r--tests/testdata/run/063_permissions_revoke.ts (renamed from cli/tests/testdata/run/063_permissions_revoke.ts)0
-rw-r--r--tests/testdata/run/063_permissions_revoke.ts.out (renamed from cli/tests/testdata/run/063_permissions_revoke.ts.out)0
-rw-r--r--tests/testdata/run/063_permissions_revoke_sync.ts (renamed from cli/tests/testdata/run/063_permissions_revoke_sync.ts)0
-rw-r--r--tests/testdata/run/064_permissions_revoke_global.ts (renamed from cli/tests/testdata/run/064_permissions_revoke_global.ts)0
-rw-r--r--tests/testdata/run/064_permissions_revoke_global.ts.out (renamed from cli/tests/testdata/run/064_permissions_revoke_global.ts.out)0
-rw-r--r--tests/testdata/run/064_permissions_revoke_global_sync.ts (renamed from cli/tests/testdata/run/064_permissions_revoke_global_sync.ts)0
-rw-r--r--tests/testdata/run/065_permissions_revoke_net.ts (renamed from cli/tests/testdata/run/065_permissions_revoke_net.ts)0
-rw-r--r--tests/testdata/run/065_permissions_revoke_net.ts.out (renamed from cli/tests/testdata/run/065_permissions_revoke_net.ts.out)0
-rw-r--r--tests/testdata/run/066_prompt.ts (renamed from cli/tests/testdata/run/066_prompt.ts)0
-rw-r--r--tests/testdata/run/070_location.ts (renamed from cli/tests/testdata/run/070_location.ts)0
-rw-r--r--tests/testdata/run/070_location.ts.out (renamed from cli/tests/testdata/run/070_location.ts.out)0
-rw-r--r--tests/testdata/run/071_location_unset.ts (renamed from cli/tests/testdata/run/071_location_unset.ts)0
-rw-r--r--tests/testdata/run/071_location_unset.ts.out (renamed from cli/tests/testdata/run/071_location_unset.ts.out)0
-rw-r--r--tests/testdata/run/072_location_relative_fetch.ts (renamed from cli/tests/testdata/run/072_location_relative_fetch.ts)0
-rw-r--r--tests/testdata/run/072_location_relative_fetch.ts.out (renamed from cli/tests/testdata/run/072_location_relative_fetch.ts.out)0
-rw-r--r--tests/testdata/run/075_import_local_query_hash.ts (renamed from cli/tests/testdata/run/075_import_local_query_hash.ts)0
-rw-r--r--tests/testdata/run/075_import_local_query_hash.ts.out (renamed from cli/tests/testdata/run/075_import_local_query_hash.ts.out)0
-rw-r--r--tests/testdata/run/077_fetch_empty.ts (renamed from cli/tests/testdata/run/077_fetch_empty.ts)0
-rw-r--r--tests/testdata/run/077_fetch_empty.ts.out (renamed from cli/tests/testdata/run/077_fetch_empty.ts.out)0
-rw-r--r--tests/testdata/run/078_unload_on_exit.ts (renamed from cli/tests/testdata/run/078_unload_on_exit.ts)0
-rw-r--r--tests/testdata/run/078_unload_on_exit.ts.out (renamed from cli/tests/testdata/run/078_unload_on_exit.ts.out)0
-rw-r--r--tests/testdata/run/079_location_authentication.ts (renamed from cli/tests/testdata/run/079_location_authentication.ts)0
-rw-r--r--tests/testdata/run/079_location_authentication.ts.out (renamed from cli/tests/testdata/run/079_location_authentication.ts.out)0
-rw-r--r--tests/testdata/run/081_location_relative_fetch_redirect.ts (renamed from cli/tests/testdata/run/081_location_relative_fetch_redirect.ts)0
-rw-r--r--tests/testdata/run/081_location_relative_fetch_redirect.ts.out (renamed from cli/tests/testdata/run/081_location_relative_fetch_redirect.ts.out)0
-rw-r--r--tests/testdata/run/082_prepare_stack_trace_throw.js (renamed from cli/tests/testdata/run/082_prepare_stack_trace_throw.js)0
-rw-r--r--tests/testdata/run/082_prepare_stack_trace_throw.js.out (renamed from cli/tests/testdata/run/082_prepare_stack_trace_throw.js.out)0
-rw-r--r--tests/testdata/run/083_legacy_external_source_map.ts (renamed from cli/tests/testdata/run/083_legacy_external_source_map.ts)0
-rw-r--r--tests/testdata/run/088_dynamic_import_already_evaluating.ts (renamed from cli/tests/testdata/run/088_dynamic_import_already_evaluating.ts)0
-rw-r--r--tests/testdata/run/088_dynamic_import_already_evaluating.ts.out (renamed from cli/tests/testdata/run/088_dynamic_import_already_evaluating.ts.out)0
-rw-r--r--tests/testdata/run/088_dynamic_import_target.ts (renamed from cli/tests/testdata/run/088_dynamic_import_target.ts)0
-rw-r--r--tests/testdata/run/089_run_allow_list.ts (renamed from cli/tests/testdata/run/089_run_allow_list.ts)0
-rw-r--r--tests/testdata/run/089_run_allow_list.ts.out (renamed from cli/tests/testdata/run/089_run_allow_list.ts.out)0
-rw-r--r--tests/testdata/run/090_run_permissions_request.ts (renamed from cli/tests/testdata/run/090_run_permissions_request.ts)0
-rw-r--r--tests/testdata/run/090_run_permissions_request_sync.ts (renamed from cli/tests/testdata/run/090_run_permissions_request_sync.ts)0
-rw-r--r--tests/testdata/run/091_use_define_for_class_fields.ts (renamed from cli/tests/testdata/run/091_use_define_for_class_fields.ts)0
-rw-r--r--tests/testdata/run/091_use_define_for_class_fields.ts.out (renamed from cli/tests/testdata/run/091_use_define_for_class_fields.ts.out)0
-rw-r--r--tests/testdata/run/092_import_map_unmapped_bare_specifier.ts (renamed from cli/tests/testdata/run/092_import_map_unmapped_bare_specifier.ts)0
-rw-r--r--tests/testdata/run/092_import_map_unmapped_bare_specifier.ts.out (renamed from cli/tests/testdata/run/092_import_map_unmapped_bare_specifier.ts.out)0
-rw-r--r--tests/testdata/run/aggregate_error.out (renamed from cli/tests/testdata/run/aggregate_error.out)0
-rw-r--r--tests/testdata/run/aggregate_error.ts (renamed from cli/tests/testdata/run/aggregate_error.ts)0
-rw-r--r--tests/testdata/run/async_error.ts (renamed from cli/tests/testdata/run/async_error.ts)0
-rw-r--r--tests/testdata/run/async_error.ts.out (renamed from cli/tests/testdata/run/async_error.ts.out)0
-rw-r--r--tests/testdata/run/auto_discover_lockfile/deno.json (renamed from cli/tests/testdata/run/auto_discover_lockfile/deno.json)0
-rw-r--r--tests/testdata/run/auto_discover_lockfile/deno.lock (renamed from cli/tests/testdata/run/auto_discover_lockfile/deno.lock)0
-rw-r--r--tests/testdata/run/auto_discover_lockfile/main.out (renamed from cli/tests/testdata/run/auto_discover_lockfile/main.out)0
-rw-r--r--tests/testdata/run/auto_discover_lockfile/main.ts (renamed from cli/tests/testdata/run/auto_discover_lockfile/main.ts)0
-rw-r--r--tests/testdata/run/before_unload.js (renamed from cli/tests/testdata/run/before_unload.js)0
-rw-r--r--tests/testdata/run/before_unload.js.out (renamed from cli/tests/testdata/run/before_unload.js.out)0
-rw-r--r--tests/testdata/run/blob_gc_finalization.js (renamed from cli/tests/testdata/run/blob_gc_finalization.js)0
-rw-r--r--tests/testdata/run/blob_gc_finalization.js.out (renamed from cli/tests/testdata/run/blob_gc_finalization.js.out)0
-rw-r--r--tests/testdata/run/byte_order_mark.out (renamed from cli/tests/testdata/run/byte_order_mark.out)0
-rw-r--r--tests/testdata/run/byte_order_mark.ts (renamed from cli/tests/testdata/run/byte_order_mark.ts)0
-rw-r--r--tests/testdata/run/check_js_points_to_ts/bar.ts (renamed from cli/tests/testdata/run/check_js_points_to_ts/bar.ts)0
-rw-r--r--tests/testdata/run/check_js_points_to_ts/foo.d.ts (renamed from cli/tests/testdata/run/check_js_points_to_ts/foo.d.ts)0
-rw-r--r--tests/testdata/run/check_js_points_to_ts/foo.js (renamed from cli/tests/testdata/run/check_js_points_to_ts/foo.js)0
-rw-r--r--tests/testdata/run/check_js_points_to_ts/test.js (renamed from cli/tests/testdata/run/check_js_points_to_ts/test.js)0
-rw-r--r--tests/testdata/run/check_js_points_to_ts/test.js.out (renamed from cli/tests/testdata/run/check_js_points_to_ts/test.js.out)0
-rw-r--r--tests/testdata/run/checkjs.tsconfig.json (renamed from cli/tests/testdata/run/checkjs.tsconfig.json)0
-rw-r--r--tests/testdata/run/cjs_imports/commonjs.cjs (renamed from cli/tests/testdata/run/cjs_imports/commonjs.cjs)0
-rw-r--r--tests/testdata/run/cjs_imports/main.out (renamed from cli/tests/testdata/run/cjs_imports/main.out)0
-rw-r--r--tests/testdata/run/cjs_imports/main.ts (renamed from cli/tests/testdata/run/cjs_imports/main.ts)0
-rw-r--r--tests/testdata/run/classic_workers_event_loop.js (renamed from cli/tests/testdata/run/classic_workers_event_loop.js)0
-rw-r--r--tests/testdata/run/classic_workers_event_loop.js.out (renamed from cli/tests/testdata/run/classic_workers_event_loop.js.out)0
-rw-r--r--tests/testdata/run/colors_without_globalThis.js (renamed from cli/tests/testdata/run/colors_without_globalThis.js)0
-rw-r--r--tests/testdata/run/complex_error.ts (renamed from cli/tests/testdata/run/complex_error.ts)0
-rw-r--r--tests/testdata/run/complex_error.ts.out (renamed from cli/tests/testdata/run/complex_error.ts.out)0
-rw-r--r--tests/testdata/run/complex_permissions_test.ts (renamed from cli/tests/testdata/run/complex_permissions_test.ts)0
-rw-r--r--tests/testdata/run/config/main.out (renamed from cli/tests/testdata/run/config/main.out)0
-rw-r--r--tests/testdata/run/config/main.ts (renamed from cli/tests/testdata/run/config/main.ts)0
-rw-r--r--tests/testdata/run/config/tsconfig.json (renamed from cli/tests/testdata/run/config/tsconfig.json)0
-rw-r--r--tests/testdata/run/config_file_lock_boolean/deno.lock (renamed from cli/tests/testdata/run/config_file_lock_boolean/deno.lock)0
-rw-r--r--tests/testdata/run/config_file_lock_boolean/false.json (renamed from cli/tests/testdata/run/config_file_lock_boolean/false.json)0
-rw-r--r--tests/testdata/run/config_file_lock_boolean/false.main.out (renamed from cli/tests/testdata/run/config_file_lock_boolean/false.main.out)0
-rw-r--r--tests/testdata/run/config_file_lock_boolean/main.ts (renamed from cli/tests/testdata/run/config_file_lock_boolean/main.ts)0
-rw-r--r--tests/testdata/run/config_file_lock_boolean/true.json (renamed from cli/tests/testdata/run/config_file_lock_boolean/true.json)0
-rw-r--r--tests/testdata/run/config_file_lock_boolean/true.main.out (renamed from cli/tests/testdata/run/config_file_lock_boolean/true.main.out)0
-rw-r--r--tests/testdata/run/config_file_lock_path.json (renamed from cli/tests/testdata/run/config_file_lock_path.json)0
-rw-r--r--tests/testdata/run/config_file_lock_path.out (renamed from cli/tests/testdata/run/config_file_lock_path.out)0
-rw-r--r--tests/testdata/run/config_json_import.ts (renamed from cli/tests/testdata/run/config_json_import.ts)0
-rw-r--r--tests/testdata/run/config_json_import.ts.out (renamed from cli/tests/testdata/run/config_json_import.ts.out)0
-rw-r--r--tests/testdata/run/config_types/deno.lock (renamed from cli/tests/testdata/run/config_types/deno.lock)0
-rw-r--r--tests/testdata/run/config_types/main.out (renamed from cli/tests/testdata/run/config_types/main.out)0
-rw-r--r--tests/testdata/run/config_types/main.ts (renamed from cli/tests/testdata/run/config_types/main.ts)0
-rw-r--r--tests/testdata/run/config_types/remote.tsconfig.json (renamed from cli/tests/testdata/run/config_types/remote.tsconfig.json)0
-rw-r--r--tests/testdata/run/config_types/tsconfig.json (renamed from cli/tests/testdata/run/config_types/tsconfig.json)0
-rw-r--r--tests/testdata/run/config_types/types.d.ts (renamed from cli/tests/testdata/run/config_types/types.d.ts)0
-rw-r--r--tests/testdata/run/custom_inspect_url.js (renamed from cli/tests/testdata/run/custom_inspect_url.js)0
-rw-r--r--tests/testdata/run/custom_inspect_url.js.out (renamed from cli/tests/testdata/run/custom_inspect_url.js.out)0
-rw-r--r--tests/testdata/run/decorators/experimental/deno.json (renamed from cli/tests/testdata/run/decorators/experimental/deno.json)0
-rw-r--r--tests/testdata/run/decorators/experimental/no_check/main.out (renamed from cli/tests/testdata/run/decorators/experimental/no_check/main.out)0
-rw-r--r--tests/testdata/run/decorators/experimental/no_check/main.ts (renamed from cli/tests/testdata/run/decorators/experimental/no_check/main.ts)0
-rw-r--r--tests/testdata/run/decorators/experimental/runtime/main.out (renamed from cli/tests/testdata/run/decorators/experimental/runtime/main.out)0
-rw-r--r--tests/testdata/run/decorators/experimental/runtime/main.ts (renamed from cli/tests/testdata/run/decorators/experimental/runtime/main.ts)0
-rw-r--r--tests/testdata/run/decorators/experimental/ts/main.out (renamed from cli/tests/testdata/run/decorators/experimental/ts/main.out)0
-rw-r--r--tests/testdata/run/decorators/experimental/ts/main.ts (renamed from cli/tests/testdata/run/decorators/experimental/ts/main.ts)0
-rw-r--r--tests/testdata/run/decorators/tc39_proposal/main.out (renamed from cli/tests/testdata/run/decorators/tc39_proposal/main.out)0
-rw-r--r--tests/testdata/run/decorators/tc39_proposal/main.ts (renamed from cli/tests/testdata/run/decorators/tc39_proposal/main.ts)0
-rw-r--r--tests/testdata/run/delete_window.js (renamed from cli/tests/testdata/run/delete_window.js)0
-rw-r--r--tests/testdata/run/deno_exit_tampering.ts (renamed from cli/tests/testdata/run/deno_exit_tampering.ts)0
-rw-r--r--tests/testdata/run/deny_all_permission_args.js (renamed from cli/tests/testdata/run/deny_all_permission_args.js)0
-rw-r--r--tests/testdata/run/deny_all_permission_args.out (renamed from cli/tests/testdata/run/deny_all_permission_args.out)0
-rw-r--r--tests/testdata/run/deny_some_permission_args.js (renamed from cli/tests/testdata/run/deny_some_permission_args.js)0
-rw-r--r--tests/testdata/run/deny_some_permission_args.out (renamed from cli/tests/testdata/run/deny_some_permission_args.out)0
-rw-r--r--tests/testdata/run/disallow_http_from_https.js (renamed from cli/tests/testdata/run/disallow_http_from_https.js)0
-rw-r--r--tests/testdata/run/disallow_http_from_https.ts (renamed from cli/tests/testdata/run/disallow_http_from_https.ts)0
-rw-r--r--tests/testdata/run/disallow_http_from_https_js.out (renamed from cli/tests/testdata/run/disallow_http_from_https_js.out)0
-rw-r--r--tests/testdata/run/disallow_http_from_https_ts.out (renamed from cli/tests/testdata/run/disallow_http_from_https_ts.out)0
-rw-r--r--tests/testdata/run/dom_exception_formatting.ts (renamed from cli/tests/testdata/run/dom_exception_formatting.ts)0
-rw-r--r--tests/testdata/run/dom_exception_formatting.ts.out (renamed from cli/tests/testdata/run/dom_exception_formatting.ts.out)0
-rw-r--r--tests/testdata/run/dynamic_import_already_rejected/error_001.ts (renamed from cli/tests/testdata/run/dynamic_import_already_rejected/error_001.ts)0
-rw-r--r--tests/testdata/run/dynamic_import_already_rejected/main.out (renamed from cli/tests/testdata/run/dynamic_import_already_rejected/main.out)0
-rw-r--r--tests/testdata/run/dynamic_import_already_rejected/main.ts (renamed from cli/tests/testdata/run/dynamic_import_already_rejected/main.ts)0
-rw-r--r--tests/testdata/run/dynamic_import_async_error/delayed_error.ts (renamed from cli/tests/testdata/run/dynamic_import_async_error/delayed_error.ts)0
-rw-r--r--tests/testdata/run/dynamic_import_async_error/main.out (renamed from cli/tests/testdata/run/dynamic_import_async_error/main.out)0
-rw-r--r--tests/testdata/run/dynamic_import_async_error/main.ts (renamed from cli/tests/testdata/run/dynamic_import_async_error/main.ts)0
-rw-r--r--tests/testdata/run/dynamic_import_concurrent_non_statically_analyzable/main.out (renamed from cli/tests/testdata/run/dynamic_import_concurrent_non_statically_analyzable/main.out)0
-rw-r--r--tests/testdata/run/dynamic_import_concurrent_non_statically_analyzable/main.ts (renamed from cli/tests/testdata/run/dynamic_import_concurrent_non_statically_analyzable/main.ts)0
-rw-r--r--tests/testdata/run/dynamic_import_concurrent_non_statically_analyzable/mod.ts (renamed from cli/tests/testdata/run/dynamic_import_concurrent_non_statically_analyzable/mod.ts)0
-rw-r--r--tests/testdata/run/dynamic_import_conditional.js (renamed from cli/tests/testdata/run/dynamic_import_conditional.js)0
-rw-r--r--tests/testdata/run/dynamic_import_conditional.js.out (renamed from cli/tests/testdata/run/dynamic_import_conditional.js.out)0
-rw-r--r--tests/testdata/run/dynamic_import_syntax_error.js (renamed from cli/tests/testdata/run/dynamic_import_syntax_error.js)0
-rw-r--r--tests/testdata/run/dynamic_import_syntax_error.js.out (renamed from cli/tests/testdata/run/dynamic_import_syntax_error.js.out)0
-rw-r--r--tests/testdata/run/dynamic_import_syntax_error_import.js (renamed from cli/tests/testdata/run/dynamic_import_syntax_error_import.js)0
-rw-r--r--tests/testdata/run/empty.ts (renamed from cli/tests/testdata/run/empty.ts)0
-rw-r--r--tests/testdata/run/env_file.out (renamed from cli/tests/testdata/run/env_file.out)0
-rw-r--r--tests/testdata/run/env_file.ts (renamed from cli/tests/testdata/run/env_file.ts)0
-rw-r--r--tests/testdata/run/env_file_missing.out (renamed from cli/tests/testdata/run/env_file_missing.out)0
-rw-r--r--tests/testdata/run/error_001.ts (renamed from cli/tests/testdata/run/error_001.ts)0
-rw-r--r--tests/testdata/run/error_001.ts.out (renamed from cli/tests/testdata/run/error_001.ts.out)0
-rw-r--r--tests/testdata/run/error_002.ts (renamed from cli/tests/testdata/run/error_002.ts)0
-rw-r--r--tests/testdata/run/error_002.ts.out (renamed from cli/tests/testdata/run/error_002.ts.out)0
-rw-r--r--tests/testdata/run/error_003_typescript.ts (renamed from cli/tests/testdata/run/error_003_typescript.ts)0
-rw-r--r--tests/testdata/run/error_003_typescript.ts.out (renamed from cli/tests/testdata/run/error_003_typescript.ts.out)0
-rw-r--r--tests/testdata/run/error_004_missing_module.ts (renamed from cli/tests/testdata/run/error_004_missing_module.ts)0
-rw-r--r--tests/testdata/run/error_004_missing_module.ts.out (renamed from cli/tests/testdata/run/error_004_missing_module.ts.out)0
-rw-r--r--tests/testdata/run/error_005_missing_dynamic_import.ts (renamed from cli/tests/testdata/run/error_005_missing_dynamic_import.ts)0
-rw-r--r--tests/testdata/run/error_005_missing_dynamic_import.ts.out (renamed from cli/tests/testdata/run/error_005_missing_dynamic_import.ts.out)0
-rw-r--r--tests/testdata/run/error_006_import_ext_failure.ts (renamed from cli/tests/testdata/run/error_006_import_ext_failure.ts)0
-rw-r--r--tests/testdata/run/error_006_import_ext_failure.ts.out (renamed from cli/tests/testdata/run/error_006_import_ext_failure.ts.out)0
-rw-r--r--tests/testdata/run/error_007_any.ts (renamed from cli/tests/testdata/run/error_007_any.ts)0
-rw-r--r--tests/testdata/run/error_007_any.ts.out (renamed from cli/tests/testdata/run/error_007_any.ts.out)0
-rw-r--r--tests/testdata/run/error_008_checkjs.js (renamed from cli/tests/testdata/run/error_008_checkjs.js)0
-rw-r--r--tests/testdata/run/error_008_checkjs.js.out (renamed from cli/tests/testdata/run/error_008_checkjs.js.out)0
-rw-r--r--tests/testdata/run/error_009_extensions_error.js (renamed from cli/tests/testdata/run/error_009_extensions_error.js)0
-rw-r--r--tests/testdata/run/error_009_extensions_error.js.out (renamed from cli/tests/testdata/run/error_009_extensions_error.js.out)0
-rw-r--r--tests/testdata/run/error_009_missing_js_module.disabled (renamed from cli/tests/testdata/run/error_009_missing_js_module.disabled)0
-rw-r--r--tests/testdata/run/error_011_bad_module_specifier.ts (renamed from cli/tests/testdata/run/error_011_bad_module_specifier.ts)0
-rw-r--r--tests/testdata/run/error_011_bad_module_specifier.ts.out (renamed from cli/tests/testdata/run/error_011_bad_module_specifier.ts.out)0
-rw-r--r--tests/testdata/run/error_012_bad_dynamic_import_specifier.ts (renamed from cli/tests/testdata/run/error_012_bad_dynamic_import_specifier.ts)0
-rw-r--r--tests/testdata/run/error_012_bad_dynamic_import_specifier.ts.out (renamed from cli/tests/testdata/run/error_012_bad_dynamic_import_specifier.ts.out)0
-rw-r--r--tests/testdata/run/error_013_missing_script.out (renamed from cli/tests/testdata/run/error_013_missing_script.out)0
-rw-r--r--tests/testdata/run/error_014_catch_dynamic_import_error.js (renamed from cli/tests/testdata/run/error_014_catch_dynamic_import_error.js)0
-rw-r--r--tests/testdata/run/error_014_catch_dynamic_import_error.js.out (renamed from cli/tests/testdata/run/error_014_catch_dynamic_import_error.js.out)0
-rw-r--r--tests/testdata/run/error_015_dynamic_import_permissions.js (renamed from cli/tests/testdata/run/error_015_dynamic_import_permissions.js)0
-rw-r--r--tests/testdata/run/error_015_dynamic_import_permissions.out (renamed from cli/tests/testdata/run/error_015_dynamic_import_permissions.out)0
-rw-r--r--tests/testdata/run/error_016_dynamic_import_permissions2.js (renamed from cli/tests/testdata/run/error_016_dynamic_import_permissions2.js)0
-rw-r--r--tests/testdata/run/error_016_dynamic_import_permissions2.out (renamed from cli/tests/testdata/run/error_016_dynamic_import_permissions2.out)0
-rw-r--r--tests/testdata/run/error_017_hide_long_source_ts.ts (renamed from cli/tests/testdata/run/error_017_hide_long_source_ts.ts)0
-rw-r--r--tests/testdata/run/error_017_hide_long_source_ts.ts.out (renamed from cli/tests/testdata/run/error_017_hide_long_source_ts.ts.out)0
-rw-r--r--tests/testdata/run/error_018_hide_long_source_js.js (renamed from cli/tests/testdata/run/error_018_hide_long_source_js.js)0
-rw-r--r--tests/testdata/run/error_018_hide_long_source_js.js.out (renamed from cli/tests/testdata/run/error_018_hide_long_source_js.js.out)0
-rw-r--r--tests/testdata/run/error_019_stack_function.ts (renamed from cli/tests/testdata/run/error_019_stack_function.ts)0
-rw-r--r--tests/testdata/run/error_019_stack_function.ts.out (renamed from cli/tests/testdata/run/error_019_stack_function.ts.out)0
-rw-r--r--tests/testdata/run/error_020_stack_constructor.ts (renamed from cli/tests/testdata/run/error_020_stack_constructor.ts)0
-rw-r--r--tests/testdata/run/error_020_stack_constructor.ts.out (renamed from cli/tests/testdata/run/error_020_stack_constructor.ts.out)0
-rw-r--r--tests/testdata/run/error_021_stack_method.ts (renamed from cli/tests/testdata/run/error_021_stack_method.ts)0
-rw-r--r--tests/testdata/run/error_021_stack_method.ts.out (renamed from cli/tests/testdata/run/error_021_stack_method.ts.out)0
-rw-r--r--tests/testdata/run/error_022_stack_custom_error.ts (renamed from cli/tests/testdata/run/error_022_stack_custom_error.ts)0
-rw-r--r--tests/testdata/run/error_022_stack_custom_error.ts.out (renamed from cli/tests/testdata/run/error_022_stack_custom_error.ts.out)0
-rw-r--r--tests/testdata/run/error_023_stack_async.ts (renamed from cli/tests/testdata/run/error_023_stack_async.ts)0
-rw-r--r--tests/testdata/run/error_023_stack_async.ts.out (renamed from cli/tests/testdata/run/error_023_stack_async.ts.out)0
-rw-r--r--tests/testdata/run/error_024_stack_promise_all.ts (renamed from cli/tests/testdata/run/error_024_stack_promise_all.ts)0
-rw-r--r--tests/testdata/run/error_024_stack_promise_all.ts.out (renamed from cli/tests/testdata/run/error_024_stack_promise_all.ts.out)0
-rw-r--r--tests/testdata/run/error_025_tab_indent (renamed from cli/tests/testdata/run/error_025_tab_indent)0
-rw-r--r--tests/testdata/run/error_025_tab_indent.out (renamed from cli/tests/testdata/run/error_025_tab_indent.out)0
-rw-r--r--tests/testdata/run/error_026_remote_import_error.ts (renamed from cli/tests/testdata/run/error_026_remote_import_error.ts)0
-rw-r--r--tests/testdata/run/error_026_remote_import_error.ts.out (renamed from cli/tests/testdata/run/error_026_remote_import_error.ts.out)0
-rw-r--r--tests/testdata/run/error_cause.ts (renamed from cli/tests/testdata/run/error_cause.ts)0
-rw-r--r--tests/testdata/run/error_cause.ts.out (renamed from cli/tests/testdata/run/error_cause.ts.out)0
-rw-r--r--tests/testdata/run/error_cause_recursive.ts (renamed from cli/tests/testdata/run/error_cause_recursive.ts)0
-rw-r--r--tests/testdata/run/error_cause_recursive.ts.out (renamed from cli/tests/testdata/run/error_cause_recursive.ts.out)0
-rw-r--r--tests/testdata/run/error_for_await.ts (renamed from cli/tests/testdata/run/error_for_await.ts)0
-rw-r--r--tests/testdata/run/error_for_await.ts.out (renamed from cli/tests/testdata/run/error_for_await.ts.out)0
-rw-r--r--tests/testdata/run/error_import_map_unable_to_load.out (renamed from cli/tests/testdata/run/error_import_map_unable_to_load.out)0
-rw-r--r--tests/testdata/run/error_local_static_import_from_remote.js (renamed from cli/tests/testdata/run/error_local_static_import_from_remote.js)0
-rw-r--r--tests/testdata/run/error_local_static_import_from_remote.js.out (renamed from cli/tests/testdata/run/error_local_static_import_from_remote.js.out)0
-rw-r--r--tests/testdata/run/error_local_static_import_from_remote.ts (renamed from cli/tests/testdata/run/error_local_static_import_from_remote.ts)0
-rw-r--r--tests/testdata/run/error_local_static_import_from_remote.ts.out (renamed from cli/tests/testdata/run/error_local_static_import_from_remote.ts.out)0
-rw-r--r--tests/testdata/run/error_missing_module_named_import.ts (renamed from cli/tests/testdata/run/error_missing_module_named_import.ts)0
-rw-r--r--tests/testdata/run/error_missing_module_named_import.ts.out (renamed from cli/tests/testdata/run/error_missing_module_named_import.ts.out)0
-rw-r--r--tests/testdata/run/error_name_non_string.js (renamed from cli/tests/testdata/run/error_name_non_string.js)0
-rw-r--r--tests/testdata/run/error_name_non_string.js.out (renamed from cli/tests/testdata/run/error_name_non_string.js.out)0
-rw-r--r--tests/testdata/run/error_no_check.ts (renamed from cli/tests/testdata/run/error_no_check.ts)0
-rw-r--r--tests/testdata/run/error_no_check.ts.out (renamed from cli/tests/testdata/run/error_no_check.ts.out)0
-rw-r--r--tests/testdata/run/error_syntax.js (renamed from cli/tests/testdata/run/error_syntax.js)0
-rw-r--r--tests/testdata/run/error_syntax.js.out (renamed from cli/tests/testdata/run/error_syntax.js.out)0
-rw-r--r--tests/testdata/run/error_syntax_empty_trailing_line.mjs (renamed from cli/tests/testdata/run/error_syntax_empty_trailing_line.mjs)0
-rw-r--r--tests/testdata/run/error_syntax_empty_trailing_line.mjs.out (renamed from cli/tests/testdata/run/error_syntax_empty_trailing_line.mjs.out)0
-rw-r--r--tests/testdata/run/error_type_definitions.ts (renamed from cli/tests/testdata/run/error_type_definitions.ts)0
-rw-r--r--tests/testdata/run/error_type_definitions.ts.out (renamed from cli/tests/testdata/run/error_type_definitions.ts.out)0
-rw-r--r--tests/testdata/run/error_with_errors_prop.js (renamed from cli/tests/testdata/run/error_with_errors_prop.js)0
-rw-r--r--tests/testdata/run/error_with_errors_prop.js.out (renamed from cli/tests/testdata/run/error_with_errors_prop.js.out)0
-rw-r--r--tests/testdata/run/es_private_fields.js (renamed from cli/tests/testdata/run/es_private_fields.js)0
-rw-r--r--tests/testdata/run/es_private_fields.js.out (renamed from cli/tests/testdata/run/es_private_fields.js.out)0
-rw-r--r--tests/testdata/run/eval_context_throw_dom_exception.js (renamed from cli/tests/testdata/run/eval_context_throw_dom_exception.js)0
-rw-r--r--tests/testdata/run/eval_context_throw_dom_exception.js.out (renamed from cli/tests/testdata/run/eval_context_throw_dom_exception.js.out)0
-rw-r--r--tests/testdata/run/event_listener_error.ts (renamed from cli/tests/testdata/run/event_listener_error.ts)0
-rw-r--r--tests/testdata/run/event_listener_error.ts.out (renamed from cli/tests/testdata/run/event_listener_error.ts.out)0
-rw-r--r--tests/testdata/run/event_listener_error_handled.ts (renamed from cli/tests/testdata/run/event_listener_error_handled.ts)0
-rw-r--r--tests/testdata/run/event_listener_error_handled.ts.out (renamed from cli/tests/testdata/run/event_listener_error_handled.ts.out)0
-rw-r--r--tests/testdata/run/event_listener_error_immediate_exit.ts (renamed from cli/tests/testdata/run/event_listener_error_immediate_exit.ts)0
-rw-r--r--tests/testdata/run/event_listener_error_immediate_exit.ts.out (renamed from cli/tests/testdata/run/event_listener_error_immediate_exit.ts.out)0
-rw-r--r--tests/testdata/run/event_listener_error_immediate_exit_worker.ts (renamed from cli/tests/testdata/run/event_listener_error_immediate_exit_worker.ts)0
-rw-r--r--tests/testdata/run/event_listener_error_immediate_exit_worker.ts.out (renamed from cli/tests/testdata/run/event_listener_error_immediate_exit_worker.ts.out)0
-rw-r--r--tests/testdata/run/exec_path.ts (renamed from cli/tests/testdata/run/exec_path.ts)0
-rw-r--r--tests/testdata/run/exit_error42.ts (renamed from cli/tests/testdata/run/exit_error42.ts)0
-rw-r--r--tests/testdata/run/exit_error42.ts.out (renamed from cli/tests/testdata/run/exit_error42.ts.out)0
-rw-r--r--tests/testdata/run/explicit_resource_management/main.out (renamed from cli/tests/testdata/run/explicit_resource_management/main.out)0
-rw-r--r--tests/testdata/run/explicit_resource_management/main.ts (renamed from cli/tests/testdata/run/explicit_resource_management/main.ts)0
-rw-r--r--tests/testdata/run/export_type_def.ts (renamed from cli/tests/testdata/run/export_type_def.ts)0
-rw-r--r--tests/testdata/run/extension_dynamic_import.ts (renamed from cli/tests/testdata/run/extension_dynamic_import.ts)0
-rw-r--r--tests/testdata/run/extension_dynamic_import.ts.out (renamed from cli/tests/testdata/run/extension_dynamic_import.ts.out)0
-rw-r--r--tests/testdata/run/extension_import.ts (renamed from cli/tests/testdata/run/extension_import.ts)0
-rw-r--r--tests/testdata/run/extension_import.ts.out (renamed from cli/tests/testdata/run/extension_import.ts.out)0
-rw-r--r--tests/testdata/run/fetch/hello.txt (renamed from cli/tests/testdata/run/fetch/hello.txt)0
-rw-r--r--tests/testdata/run/fetch/other.ts (renamed from cli/tests/testdata/run/fetch/other.ts)0
-rw-r--r--tests/testdata/run/fetch/test.ts (renamed from cli/tests/testdata/run/fetch/test.ts)0
-rw-r--r--tests/testdata/run/fetch_async_error_stack.ts (renamed from cli/tests/testdata/run/fetch_async_error_stack.ts)0
-rw-r--r--tests/testdata/run/fetch_async_error_stack.ts.out (renamed from cli/tests/testdata/run/fetch_async_error_stack.ts.out)0
-rw-r--r--tests/testdata/run/fetch_response_finalization.js (renamed from cli/tests/testdata/run/fetch_response_finalization.js)0
-rw-r--r--tests/testdata/run/fetch_response_finalization.js.out (renamed from cli/tests/testdata/run/fetch_response_finalization.js.out)0
-rw-r--r--tests/testdata/run/finalization_registry.js (renamed from cli/tests/testdata/run/finalization_registry.js)0
-rw-r--r--tests/testdata/run/finalization_registry.js.out (renamed from cli/tests/testdata/run/finalization_registry.js.out)0
-rw-r--r--tests/testdata/run/fix_dynamic_import_errors.js (renamed from cli/tests/testdata/run/fix_dynamic_import_errors.js)0
-rw-r--r--tests/testdata/run/fix_dynamic_import_errors.js.out (renamed from cli/tests/testdata/run/fix_dynamic_import_errors.js.out)0
-rw-r--r--tests/testdata/run/fix_emittable_skipped.js (renamed from cli/tests/testdata/run/fix_emittable_skipped.js)0
-rw-r--r--tests/testdata/run/fix_emittable_skipped.ts.out (renamed from cli/tests/testdata/run/fix_emittable_skipped.ts.out)0
-rw-r--r--tests/testdata/run/fix_js_import_js.ts (renamed from cli/tests/testdata/run/fix_js_import_js.ts)0
-rw-r--r--tests/testdata/run/fix_js_import_js.ts.out (renamed from cli/tests/testdata/run/fix_js_import_js.ts.out)0
-rw-r--r--tests/testdata/run/fix_js_imports.ts (renamed from cli/tests/testdata/run/fix_js_imports.ts)0
-rw-r--r--tests/testdata/run/fix_js_imports.ts.out (renamed from cli/tests/testdata/run/fix_js_imports.ts.out)0
-rw-r--r--tests/testdata/run/fix_tsc_file_exists.out (renamed from cli/tests/testdata/run/fix_tsc_file_exists.out)0
-rw-r--r--tests/testdata/run/fix_worker_dispatchevent.ts (renamed from cli/tests/testdata/run/fix_worker_dispatchevent.ts)0
-rw-r--r--tests/testdata/run/fix_worker_dispatchevent.ts.out (renamed from cli/tests/testdata/run/fix_worker_dispatchevent.ts.out)0
-rw-r--r--tests/testdata/run/followup_dyn_import_resolves/main.ts (renamed from cli/tests/testdata/run/followup_dyn_import_resolves/main.ts)0
-rw-r--r--tests/testdata/run/followup_dyn_import_resolves/main.ts.out (renamed from cli/tests/testdata/run/followup_dyn_import_resolves/main.ts.out)0
-rw-r--r--tests/testdata/run/followup_dyn_import_resolves/sub1.ts (renamed from cli/tests/testdata/run/followup_dyn_import_resolves/sub1.ts)0
-rw-r--r--tests/testdata/run/followup_dyn_import_resolves/sub2.ts (renamed from cli/tests/testdata/run/followup_dyn_import_resolves/sub2.ts)0
-rw-r--r--tests/testdata/run/heapstats.js (renamed from cli/tests/testdata/run/heapstats.js)0
-rw-r--r--tests/testdata/run/heapstats.js.out (renamed from cli/tests/testdata/run/heapstats.js.out)0
-rw-r--r--tests/testdata/run/http2_request_url.ts (renamed from cli/tests/testdata/run/http2_request_url.ts)0
-rw-r--r--tests/testdata/run/https_import.ts (renamed from cli/tests/testdata/run/https_import.ts)0
-rw-r--r--tests/testdata/run/https_import.ts.out (renamed from cli/tests/testdata/run/https_import.ts.out)0
-rw-r--r--tests/testdata/run/if_main.ts (renamed from cli/tests/testdata/run/if_main.ts)0
-rw-r--r--tests/testdata/run/if_main.ts.out (renamed from cli/tests/testdata/run/if_main.ts.out)0
-rw-r--r--tests/testdata/run/import_blob_url.ts (renamed from cli/tests/testdata/run/import_blob_url.ts)0
-rw-r--r--tests/testdata/run/import_blob_url.ts.out (renamed from cli/tests/testdata/run/import_blob_url.ts.out)0
-rw-r--r--tests/testdata/run/import_blob_url_error_stack.ts (renamed from cli/tests/testdata/run/import_blob_url_error_stack.ts)0
-rw-r--r--tests/testdata/run/import_blob_url_error_stack.ts.out (renamed from cli/tests/testdata/run/import_blob_url_error_stack.ts.out)0
-rw-r--r--tests/testdata/run/import_blob_url_import_relative.ts (renamed from cli/tests/testdata/run/import_blob_url_import_relative.ts)0
-rw-r--r--tests/testdata/run/import_blob_url_import_relative.ts.out (renamed from cli/tests/testdata/run/import_blob_url_import_relative.ts.out)0
-rw-r--r--tests/testdata/run/import_blob_url_imports.ts (renamed from cli/tests/testdata/run/import_blob_url_imports.ts)0
-rw-r--r--tests/testdata/run/import_blob_url_imports.ts.out (renamed from cli/tests/testdata/run/import_blob_url_imports.ts.out)0
-rw-r--r--tests/testdata/run/import_blob_url_jsx.ts (renamed from cli/tests/testdata/run/import_blob_url_jsx.ts)0
-rw-r--r--tests/testdata/run/import_blob_url_jsx.ts.out (renamed from cli/tests/testdata/run/import_blob_url_jsx.ts.out)0
-rw-r--r--tests/testdata/run/import_compression/brotli (renamed from cli/tests/testdata/run/import_compression/brotli)0
-rw-r--r--tests/testdata/run/import_compression/gziped (renamed from cli/tests/testdata/run/import_compression/gziped)bin39 -> 39 bytes
-rw-r--r--tests/testdata/run/import_compression/main.out (renamed from cli/tests/testdata/run/import_compression/main.out)0
-rw-r--r--tests/testdata/run/import_compression/main.ts (renamed from cli/tests/testdata/run/import_compression/main.ts)0
-rw-r--r--tests/testdata/run/import_data_url.ts (renamed from cli/tests/testdata/run/import_data_url.ts)0
-rw-r--r--tests/testdata/run/import_data_url.ts.out (renamed from cli/tests/testdata/run/import_data_url.ts.out)0
-rw-r--r--tests/testdata/run/import_data_url_error_stack.ts (renamed from cli/tests/testdata/run/import_data_url_error_stack.ts)0
-rw-r--r--tests/testdata/run/import_data_url_error_stack.ts.out (renamed from cli/tests/testdata/run/import_data_url_error_stack.ts.out)0
-rw-r--r--tests/testdata/run/import_data_url_import_relative.ts (renamed from cli/tests/testdata/run/import_data_url_import_relative.ts)0
-rw-r--r--tests/testdata/run/import_data_url_import_relative.ts.out (renamed from cli/tests/testdata/run/import_data_url_import_relative.ts.out)0
-rw-r--r--tests/testdata/run/import_data_url_imports.ts (renamed from cli/tests/testdata/run/import_data_url_imports.ts)0
-rw-r--r--tests/testdata/run/import_data_url_imports.ts.out (renamed from cli/tests/testdata/run/import_data_url_imports.ts.out)0
-rw-r--r--tests/testdata/run/import_data_url_jsx.ts (renamed from cli/tests/testdata/run/import_data_url_jsx.ts)0
-rw-r--r--tests/testdata/run/import_data_url_jsx.ts.out (renamed from cli/tests/testdata/run/import_data_url_jsx.ts.out)0
-rw-r--r--tests/testdata/run/import_dynamic_data_url.ts (renamed from cli/tests/testdata/run/import_dynamic_data_url.ts)0
-rw-r--r--tests/testdata/run/import_dynamic_data_url.ts.out (renamed from cli/tests/testdata/run/import_dynamic_data_url.ts.out)0
-rw-r--r--tests/testdata/run/import_extensionless.ts (renamed from cli/tests/testdata/run/import_extensionless.ts)0
-rw-r--r--tests/testdata/run/import_extensionless.ts.out (renamed from cli/tests/testdata/run/import_extensionless.ts.out)0
-rw-r--r--tests/testdata/run/import_file_with_colon.ts (renamed from cli/tests/testdata/run/import_file_with_colon.ts)0
-rw-r--r--tests/testdata/run/import_file_with_colon.ts.out (renamed from cli/tests/testdata/run/import_file_with_colon.ts.out)0
-rw-r--r--tests/testdata/run/import_maps/test_data.ts (renamed from cli/tests/testdata/run/import_maps/test_data.ts)0
-rw-r--r--tests/testdata/run/import_maps/test_data.ts.out (renamed from cli/tests/testdata/run/import_maps/test_data.ts.out)0
-rw-r--r--tests/testdata/run/import_meta/importmap.json (renamed from cli/tests/testdata/run/import_meta/importmap.json)0
-rw-r--r--tests/testdata/run/import_meta/main.out (renamed from cli/tests/testdata/run/import_meta/main.out)0
-rw-r--r--tests/testdata/run/import_meta/main.ts52
-rw-r--r--tests/testdata/run/import_meta/other.ts (renamed from cli/tests/testdata/run/import_meta/other.ts)0
-rw-r--r--tests/testdata/run/import_type.ts (renamed from cli/tests/testdata/run/import_type.ts)0
-rw-r--r--tests/testdata/run/import_type.ts.out (renamed from cli/tests/testdata/run/import_type.ts.out)0
-rw-r--r--tests/testdata/run/inline_js_source_map.ts (renamed from cli/tests/testdata/run/inline_js_source_map.ts)0
-rw-r--r--tests/testdata/run/inline_js_source_map_2.js (renamed from cli/tests/testdata/run/inline_js_source_map_2.js)0
-rw-r--r--tests/testdata/run/inline_js_source_map_2.js.out (renamed from cli/tests/testdata/run/inline_js_source_map_2.js.out)0
-rw-r--r--tests/testdata/run/inline_js_source_map_2.ts (renamed from cli/tests/testdata/run/inline_js_source_map_2.ts)0
-rw-r--r--tests/testdata/run/inline_js_source_map_2_with_inline_contents.js (renamed from cli/tests/testdata/run/inline_js_source_map_2_with_inline_contents.js)0
-rw-r--r--tests/testdata/run/inline_js_source_map_2_with_inline_contents.js.out (renamed from cli/tests/testdata/run/inline_js_source_map_2_with_inline_contents.js.out)0
-rw-r--r--tests/testdata/run/inline_js_source_map_with_contents_from_graph.js (renamed from cli/tests/testdata/run/inline_js_source_map_with_contents_from_graph.js)0
-rw-r--r--tests/testdata/run/inline_js_source_map_with_contents_from_graph.js.out (renamed from cli/tests/testdata/run/inline_js_source_map_with_contents_from_graph.js.out)0
-rw-r--r--tests/testdata/run/issue13562.ts (renamed from cli/tests/testdata/run/issue13562.ts)0
-rw-r--r--tests/testdata/run/issue13562.ts.out (renamed from cli/tests/testdata/run/issue13562.ts.out)0
-rw-r--r--tests/testdata/run/issue9750.js (renamed from cli/tests/testdata/run/issue9750.js)0
-rw-r--r--tests/testdata/run/js_import_detect.ts (renamed from cli/tests/testdata/run/js_import_detect.ts)0
-rw-r--r--tests/testdata/run/js_import_detect.ts.out (renamed from cli/tests/testdata/run/js_import_detect.ts.out)0
-rw-r--r--tests/testdata/run/js_root_with_ts_check.js (renamed from cli/tests/testdata/run/js_root_with_ts_check.js)0
-rw-r--r--tests/testdata/run/js_root_with_ts_check.js.out (renamed from cli/tests/testdata/run/js_root_with_ts_check.js.out)0
-rw-r--r--tests/testdata/run/jsx_import_from_ts.App.jsx (renamed from cli/tests/testdata/run/jsx_import_from_ts.App.jsx)0
-rw-r--r--tests/testdata/run/jsx_import_from_ts.ts (renamed from cli/tests/testdata/run/jsx_import_from_ts.ts)0
-rw-r--r--tests/testdata/run/jsx_import_from_ts.ts.out (renamed from cli/tests/testdata/run/jsx_import_from_ts.ts.out)0
-rw-r--r--tests/testdata/run/jsx_import_source.out (renamed from cli/tests/testdata/run/jsx_import_source.out)0
-rw-r--r--tests/testdata/run/jsx_import_source_dev.out (renamed from cli/tests/testdata/run/jsx_import_source_dev.out)0
-rw-r--r--tests/testdata/run/jsx_import_source_error.out (renamed from cli/tests/testdata/run/jsx_import_source_error.out)0
-rw-r--r--tests/testdata/run/jsx_import_source_import_map.out (renamed from cli/tests/testdata/run/jsx_import_source_import_map.out)0
-rw-r--r--tests/testdata/run/jsx_import_source_import_map_dev.out (renamed from cli/tests/testdata/run/jsx_import_source_import_map_dev.out)0
-rw-r--r--tests/testdata/run/jsx_import_source_no_pragma.tsx (renamed from cli/tests/testdata/run/jsx_import_source_no_pragma.tsx)0
-rw-r--r--tests/testdata/run/jsx_import_source_pragma.tsx (renamed from cli/tests/testdata/run/jsx_import_source_pragma.tsx)0
-rw-r--r--tests/testdata/run/jsx_import_source_pragma_import_map.tsx (renamed from cli/tests/testdata/run/jsx_import_source_pragma_import_map.tsx)0
-rw-r--r--tests/testdata/run/jsx_precompile/no_pragma.out (renamed from cli/tests/testdata/run/jsx_precompile/no_pragma.out)0
-rw-r--r--tests/testdata/run/jsx_precompile/no_pragma.tsx (renamed from cli/tests/testdata/run/jsx_precompile/no_pragma.tsx)0
-rw-r--r--tests/testdata/run/lock_check_err.json (renamed from cli/tests/testdata/run/lock_check_err.json)0
-rw-r--r--tests/testdata/run/lock_check_err.out (renamed from cli/tests/testdata/run/lock_check_err.out)0
-rw-r--r--tests/testdata/run/lock_check_err2.json (renamed from cli/tests/testdata/run/lock_check_err2.json)0
-rw-r--r--tests/testdata/run/lock_check_err2.out (renamed from cli/tests/testdata/run/lock_check_err2.out)0
-rw-r--r--tests/testdata/run/lock_check_ok.json (renamed from cli/tests/testdata/run/lock_check_ok.json)0
-rw-r--r--tests/testdata/run/lock_check_ok2.json (renamed from cli/tests/testdata/run/lock_check_ok2.json)0
-rw-r--r--tests/testdata/run/lock_dynamic_imports.json (renamed from cli/tests/testdata/run/lock_dynamic_imports.json)0
-rw-r--r--tests/testdata/run/lock_dynamic_imports.out (renamed from cli/tests/testdata/run/lock_dynamic_imports.out)0
-rw-r--r--tests/testdata/run/lock_only_http_and_https/b.ts (renamed from cli/tests/testdata/run/lock_only_http_and_https/b.ts)0
-rw-r--r--tests/testdata/run/lock_only_http_and_https/deno.lock (renamed from cli/tests/testdata/run/lock_only_http_and_https/deno.lock)0
-rw-r--r--tests/testdata/run/lock_only_http_and_https/main.out (renamed from cli/tests/testdata/run/lock_only_http_and_https/main.out)0
-rw-r--r--tests/testdata/run/lock_only_http_and_https/main.ts (renamed from cli/tests/testdata/run/lock_only_http_and_https/main.ts)0
-rw-r--r--tests/testdata/run/lock_v2_check_err.json (renamed from cli/tests/testdata/run/lock_v2_check_err.json)0
-rw-r--r--tests/testdata/run/lock_v2_check_err.out (renamed from cli/tests/testdata/run/lock_v2_check_err.out)0
-rw-r--r--tests/testdata/run/lock_v2_check_err2.json (renamed from cli/tests/testdata/run/lock_v2_check_err2.json)0
-rw-r--r--tests/testdata/run/lock_v2_check_err2.out (renamed from cli/tests/testdata/run/lock_v2_check_err2.out)0
-rw-r--r--tests/testdata/run/lock_v2_check_ok.json (renamed from cli/tests/testdata/run/lock_v2_check_ok.json)0
-rw-r--r--tests/testdata/run/lock_v2_check_ok2.json (renamed from cli/tests/testdata/run/lock_v2_check_ok2.json)0
-rw-r--r--tests/testdata/run/lock_v2_dynamic_imports.json (renamed from cli/tests/testdata/run/lock_v2_dynamic_imports.json)0
-rw-r--r--tests/testdata/run/lock_v2_dynamic_imports.out (renamed from cli/tests/testdata/run/lock_v2_dynamic_imports.out)0
-rw-r--r--tests/testdata/run/lock_write_fetch/file_exists.ts (renamed from cli/tests/testdata/run/lock_write_fetch/file_exists.ts)0
-rw-r--r--tests/testdata/run/lock_write_fetch/main.out (renamed from cli/tests/testdata/run/lock_write_fetch/main.out)0
-rw-r--r--tests/testdata/run/lock_write_fetch/main.ts (renamed from cli/tests/testdata/run/lock_write_fetch/main.ts)0
-rw-r--r--tests/testdata/run/long_data_url_formatting.ts (renamed from cli/tests/testdata/run/long_data_url_formatting.ts)0
-rw-r--r--tests/testdata/run/long_data_url_formatting.ts.out (renamed from cli/tests/testdata/run/long_data_url_formatting.ts.out)0
-rw-r--r--tests/testdata/run/main_module/main.out (renamed from cli/tests/testdata/run/main_module/main.out)0
-rw-r--r--tests/testdata/run/main_module/main.ts (renamed from cli/tests/testdata/run/main_module/main.ts)0
-rw-r--r--tests/testdata/run/main_module/other.ts (renamed from cli/tests/testdata/run/main_module/other.ts)0
-rw-r--r--tests/testdata/run/mts_dmts_mjs.out (renamed from cli/tests/testdata/run/mts_dmts_mjs.out)0
-rw-r--r--tests/testdata/run/nested_error/main.ts (renamed from cli/tests/testdata/run/nested_error/main.ts)0
-rw-r--r--tests/testdata/run/nested_error/main.ts.out (renamed from cli/tests/testdata/run/nested_error/main.ts.out)0
-rw-r--r--tests/testdata/run/no_check_imports_not_used_as_values/hello.ts (renamed from cli/tests/testdata/run/no_check_imports_not_used_as_values/hello.ts)0
-rw-r--r--tests/testdata/run/no_check_imports_not_used_as_values/main.out (renamed from cli/tests/testdata/run/no_check_imports_not_used_as_values/main.out)0
-rw-r--r--tests/testdata/run/no_check_imports_not_used_as_values/main.ts (renamed from cli/tests/testdata/run/no_check_imports_not_used_as_values/main.ts)0
-rw-r--r--tests/testdata/run/no_check_imports_not_used_as_values/preserve_imports.tsconfig.json (renamed from cli/tests/testdata/run/no_check_imports_not_used_as_values/preserve_imports.tsconfig.json)0
-rw-r--r--tests/testdata/run/no_check_remote.ts (renamed from cli/tests/testdata/run/no_check_remote.ts)0
-rw-r--r--tests/testdata/run/no_check_remote.ts.disabled.out (renamed from cli/tests/testdata/run/no_check_remote.ts.disabled.out)0
-rw-r--r--tests/testdata/run/no_check_remote.ts.enabled.out (renamed from cli/tests/testdata/run/no_check_remote.ts.enabled.out)0
-rw-r--r--tests/testdata/run/no_lock_flag/deno.json (renamed from cli/tests/testdata/run/no_lock_flag/deno.json)0
-rw-r--r--tests/testdata/run/no_lock_flag/deno.lock (renamed from cli/tests/testdata/run/no_lock_flag/deno.lock)0
-rw-r--r--tests/testdata/run/no_lock_flag/main.out (renamed from cli/tests/testdata/run/no_lock_flag/main.out)0
-rw-r--r--tests/testdata/run/no_lock_flag/main.ts (renamed from cli/tests/testdata/run/no_lock_flag/main.ts)0
-rw-r--r--tests/testdata/run/no_mem_cache.js (renamed from cli/tests/testdata/run/no_mem_cache.js)0
-rw-r--r--tests/testdata/run/no_mem_cache.js.out (renamed from cli/tests/testdata/run/no_mem_cache.js.out)0
-rw-r--r--tests/testdata/run/no_prompt.ts (renamed from cli/tests/testdata/run/no_prompt.ts)0
-rw-r--r--tests/testdata/run/no_validate_asm.js (renamed from cli/tests/testdata/run/no_validate_asm.js)0
-rw-r--r--tests/testdata/run/node_builtin_modules/mod.js (renamed from cli/tests/testdata/run/node_builtin_modules/mod.js)0
-rw-r--r--tests/testdata/run/node_builtin_modules/mod.js.out (renamed from cli/tests/testdata/run/node_builtin_modules/mod.js.out)0
-rw-r--r--tests/testdata/run/node_builtin_modules/mod.ts (renamed from cli/tests/testdata/run/node_builtin_modules/mod.ts)0
-rw-r--r--tests/testdata/run/node_builtin_modules/mod.ts.out (renamed from cli/tests/testdata/run/node_builtin_modules/mod.ts.out)0
-rw-r--r--tests/testdata/run/node_env_var_allowlist.ts (renamed from cli/tests/testdata/run/node_env_var_allowlist.ts)0
-rw-r--r--tests/testdata/run/node_env_var_allowlist.ts.out (renamed from cli/tests/testdata/run/node_env_var_allowlist.ts.out)0
-rw-r--r--tests/testdata/run/node_prefix_missing/config.json (renamed from cli/tests/testdata/run/node_prefix_missing/config.json)0
-rw-r--r--tests/testdata/run/node_prefix_missing/import_map.json (renamed from cli/tests/testdata/run/node_prefix_missing/import_map.json)0
-rw-r--r--tests/testdata/run/node_prefix_missing/main.ts (renamed from cli/tests/testdata/run/node_prefix_missing/main.ts)0
-rw-r--r--tests/testdata/run/node_prefix_missing/main.ts.out (renamed from cli/tests/testdata/run/node_prefix_missing/main.ts.out)0
-rw-r--r--tests/testdata/run/node_prefix_missing/main.ts.out_feature_enabled2
-rw-r--r--tests/testdata/run/onload/imported.ts13
-rw-r--r--tests/testdata/run/onload/main.out (renamed from cli/tests/testdata/run/onload/main.out)0
-rw-r--r--tests/testdata/run/onload/main.ts34
-rw-r--r--tests/testdata/run/onload/nest_imported.ts12
-rw-r--r--tests/testdata/run/op_exit_op_set_exit_code_in_worker.ts (renamed from cli/tests/testdata/run/op_exit_op_set_exit_code_in_worker.ts)0
-rw-r--r--tests/testdata/run/op_exit_op_set_exit_code_worker.js (renamed from cli/tests/testdata/run/op_exit_op_set_exit_code_worker.js)0
-rw-r--r--tests/testdata/run/permission_args.out (renamed from cli/tests/testdata/run/permission_args.out)0
-rw-r--r--tests/testdata/run/permission_request_long.ts (renamed from cli/tests/testdata/run/permission_request_long.ts)0
-rw-r--r--tests/testdata/run/permission_test.ts (renamed from cli/tests/testdata/run/permission_test.ts)0
-rw-r--r--tests/testdata/run/permissions_cache.ts (renamed from cli/tests/testdata/run/permissions_cache.ts)0
-rw-r--r--tests/testdata/run/permissions_prompt_allow_all.ts (renamed from cli/tests/testdata/run/permissions_prompt_allow_all.ts)0
-rw-r--r--tests/testdata/run/permissions_prompt_allow_all_2.ts (renamed from cli/tests/testdata/run/permissions_prompt_allow_all_2.ts)0
-rw-r--r--tests/testdata/run/private_field_presence.ts (renamed from cli/tests/testdata/run/private_field_presence.ts)0
-rw-r--r--tests/testdata/run/private_field_presence.ts.out (renamed from cli/tests/testdata/run/private_field_presence.ts.out)0
-rw-r--r--tests/testdata/run/proto_exploit.js (renamed from cli/tests/testdata/run/proto_exploit.js)0
-rw-r--r--tests/testdata/run/proto_exploit.js.out (renamed from cli/tests/testdata/run/proto_exploit.js.out)0
-rw-r--r--tests/testdata/run/queue_microtask_error.ts (renamed from cli/tests/testdata/run/queue_microtask_error.ts)0
-rw-r--r--tests/testdata/run/queue_microtask_error.ts.out (renamed from cli/tests/testdata/run/queue_microtask_error.ts.out)0
-rw-r--r--tests/testdata/run/queue_microtask_error_handled.ts (renamed from cli/tests/testdata/run/queue_microtask_error_handled.ts)0
-rw-r--r--tests/testdata/run/queue_microtask_error_handled.ts.out (renamed from cli/tests/testdata/run/queue_microtask_error_handled.ts.out)0
-rw-r--r--tests/testdata/run/reference_types.ts (renamed from cli/tests/testdata/run/reference_types.ts)0
-rw-r--r--tests/testdata/run/reference_types.ts.out (renamed from cli/tests/testdata/run/reference_types.ts.out)0
-rw-r--r--tests/testdata/run/reference_types_error.js (renamed from cli/tests/testdata/run/reference_types_error.js)0
-rw-r--r--tests/testdata/run/reference_types_error.js.out (renamed from cli/tests/testdata/run/reference_types_error.js.out)0
-rw-r--r--tests/testdata/run/reference_types_remote.ts (renamed from cli/tests/testdata/run/reference_types_remote.ts)0
-rw-r--r--tests/testdata/run/reference_types_remote.ts.out (renamed from cli/tests/testdata/run/reference_types_remote.ts.out)0
-rw-r--r--tests/testdata/run/rejection_handled.out (renamed from cli/tests/testdata/run/rejection_handled.out)0
-rw-r--r--tests/testdata/run/rejection_handled.ts (renamed from cli/tests/testdata/run/rejection_handled.ts)0
-rw-r--r--tests/testdata/run/remote_type_error/main.ts (renamed from cli/tests/testdata/run/remote_type_error/main.ts)0
-rw-r--r--tests/testdata/run/remote_type_error/remote.ts (renamed from cli/tests/testdata/run/remote_type_error/remote.ts)0
-rw-r--r--tests/testdata/run/replace_self.js (renamed from cli/tests/testdata/run/replace_self.js)0
-rw-r--r--tests/testdata/run/replace_self.js.out (renamed from cli/tests/testdata/run/replace_self.js.out)0
-rw-r--r--tests/testdata/run/report_error.ts (renamed from cli/tests/testdata/run/report_error.ts)0
-rw-r--r--tests/testdata/run/report_error.ts.out (renamed from cli/tests/testdata/run/report_error.ts.out)0
-rw-r--r--tests/testdata/run/report_error_end_of_program.ts (renamed from cli/tests/testdata/run/report_error_end_of_program.ts)0
-rw-r--r--tests/testdata/run/report_error_end_of_program.ts.out (renamed from cli/tests/testdata/run/report_error_end_of_program.ts.out)0
-rw-r--r--tests/testdata/run/report_error_handled.ts (renamed from cli/tests/testdata/run/report_error_handled.ts)0
-rw-r--r--tests/testdata/run/report_error_handled.ts.out (renamed from cli/tests/testdata/run/report_error_handled.ts.out)0
-rw-r--r--tests/testdata/run/resolve_dns.ts (renamed from cli/tests/testdata/run/resolve_dns.ts)0
-rw-r--r--tests/testdata/run/resolve_dns.ts.out (renamed from cli/tests/testdata/run/resolve_dns.ts.out)0
-rw-r--r--tests/testdata/run/resolve_dns.zone.in (renamed from cli/tests/testdata/run/resolve_dns.zone.in)0
-rw-r--r--tests/testdata/run/runtime_decorators.ts (renamed from cli/tests/testdata/run/runtime_decorators.ts)0
-rw-r--r--tests/testdata/run/runtime_decorators.ts.out (renamed from cli/tests/testdata/run/runtime_decorators.ts.out)0
-rw-r--r--tests/testdata/run/seed_random.js (renamed from cli/tests/testdata/run/seed_random.js)0
-rw-r--r--tests/testdata/run/seed_random.js.out (renamed from cli/tests/testdata/run/seed_random.js.out)0
-rw-r--r--tests/testdata/run/set_exit_code_0.ts (renamed from cli/tests/testdata/run/set_exit_code_0.ts)0
-rw-r--r--tests/testdata/run/set_exit_code_1.ts (renamed from cli/tests/testdata/run/set_exit_code_1.ts)0
-rw-r--r--tests/testdata/run/set_exit_code_2.ts (renamed from cli/tests/testdata/run/set_exit_code_2.ts)0
-rw-r--r--tests/testdata/run/set_timeout_error.ts (renamed from cli/tests/testdata/run/set_timeout_error.ts)0
-rw-r--r--tests/testdata/run/set_timeout_error.ts.out (renamed from cli/tests/testdata/run/set_timeout_error.ts.out)0
-rw-r--r--tests/testdata/run/set_timeout_error_handled.ts (renamed from cli/tests/testdata/run/set_timeout_error_handled.ts)0
-rw-r--r--tests/testdata/run/set_timeout_error_handled.ts.out (renamed from cli/tests/testdata/run/set_timeout_error_handled.ts.out)0
-rw-r--r--tests/testdata/run/shebang.ts (renamed from cli/tests/testdata/run/shebang.ts)0
-rw-r--r--tests/testdata/run/shebang.ts.out (renamed from cli/tests/testdata/run/shebang.ts.out)0
-rw-r--r--tests/testdata/run/shebang2.ts (renamed from cli/tests/testdata/run/shebang2.ts)0
-rw-r--r--tests/testdata/run/single_compile_with_reload.ts (renamed from cli/tests/testdata/run/single_compile_with_reload.ts)0
-rw-r--r--tests/testdata/run/single_compile_with_reload.ts.out (renamed from cli/tests/testdata/run/single_compile_with_reload.ts.out)0
-rw-r--r--tests/testdata/run/single_compile_with_reload_dyn.ts (renamed from cli/tests/testdata/run/single_compile_with_reload_dyn.ts)0
-rw-r--r--tests/testdata/run/single_compile_with_reload_worker.ts (renamed from cli/tests/testdata/run/single_compile_with_reload_worker.ts)0
-rw-r--r--tests/testdata/run/spawn_stdout_inherit.ts (renamed from cli/tests/testdata/run/spawn_stdout_inherit.ts)0
-rw-r--r--tests/testdata/run/spawn_stdout_inherit.ts.out (renamed from cli/tests/testdata/run/spawn_stdout_inherit.ts.out)0
-rw-r--r--tests/testdata/run/stdin_read_all.out (renamed from cli/tests/testdata/run/stdin_read_all.out)0
-rw-r--r--tests/testdata/run/stdin_read_all.ts (renamed from cli/tests/testdata/run/stdin_read_all.ts)0
-rw-r--r--tests/testdata/run/stdio_streams_are_locked_in_permission_prompt/worker.js (renamed from cli/tests/testdata/run/stdio_streams_are_locked_in_permission_prompt/worker.js)0
-rw-r--r--tests/testdata/run/stdout_write_all.out (renamed from cli/tests/testdata/run/stdout_write_all.out)0
-rw-r--r--tests/testdata/run/stdout_write_all.ts (renamed from cli/tests/testdata/run/stdout_write_all.ts)0
-rw-r--r--tests/testdata/run/stdout_write_sync_async.out (renamed from cli/tests/testdata/run/stdout_write_sync_async.out)0
-rw-r--r--tests/testdata/run/stdout_write_sync_async.ts (renamed from cli/tests/testdata/run/stdout_write_sync_async.ts)0
-rw-r--r--tests/testdata/run/swc_syntax_error.ts (renamed from cli/tests/testdata/run/swc_syntax_error.ts)0
-rw-r--r--tests/testdata/run/swc_syntax_error.ts.out (renamed from cli/tests/testdata/run/swc_syntax_error.ts.out)0
-rw-r--r--tests/testdata/run/test_and_bench_in_run.js (renamed from cli/tests/testdata/run/test_and_bench_in_run.js)0
-rw-r--r--tests/testdata/run/textproto.ts173
-rw-r--r--tests/testdata/run/tls.out (renamed from cli/tests/testdata/run/tls.out)0
-rw-r--r--tests/testdata/run/tls_connecttls.js66
-rw-r--r--tests/testdata/run/tls_starttls.js65
-rw-r--r--tests/testdata/run/top_level_await/circular.js (renamed from cli/tests/testdata/run/top_level_await/circular.js)0
-rw-r--r--tests/testdata/run/top_level_await/circular.out (renamed from cli/tests/testdata/run/top_level_await/circular.out)0
-rw-r--r--tests/testdata/run/top_level_await/loop.js (renamed from cli/tests/testdata/run/top_level_await/loop.js)0
-rw-r--r--tests/testdata/run/top_level_await/loop.out (renamed from cli/tests/testdata/run/top_level_await/loop.out)0
-rw-r--r--tests/testdata/run/top_level_await/nested.out (renamed from cli/tests/testdata/run/top_level_await/nested.out)0
-rw-r--r--tests/testdata/run/top_level_await/nested/a.js (renamed from cli/tests/testdata/run/top_level_await/nested/a.js)0
-rw-r--r--tests/testdata/run/top_level_await/nested/b.js (renamed from cli/tests/testdata/run/top_level_await/nested/b.js)0
-rw-r--r--tests/testdata/run/top_level_await/nested/main.js (renamed from cli/tests/testdata/run/top_level_await/nested/main.js)0
-rw-r--r--tests/testdata/run/top_level_await/order.js (renamed from cli/tests/testdata/run/top_level_await/order.js)0
-rw-r--r--tests/testdata/run/top_level_await/order.out (renamed from cli/tests/testdata/run/top_level_await/order.out)0
-rw-r--r--tests/testdata/run/top_level_await/tla/a.js (renamed from cli/tests/testdata/run/top_level_await/tla/a.js)0
-rw-r--r--tests/testdata/run/top_level_await/tla/b.js (renamed from cli/tests/testdata/run/top_level_await/tla/b.js)0
-rw-r--r--tests/testdata/run/top_level_await/tla/c.js (renamed from cli/tests/testdata/run/top_level_await/tla/c.js)0
-rw-r--r--tests/testdata/run/top_level_await/tla/d.js (renamed from cli/tests/testdata/run/top_level_await/tla/d.js)0
-rw-r--r--tests/testdata/run/top_level_await/tla/order.js (renamed from cli/tests/testdata/run/top_level_await/tla/order.js)0
-rw-r--r--tests/testdata/run/top_level_await/tla/parent.js (renamed from cli/tests/testdata/run/top_level_await/tla/parent.js)0
-rw-r--r--tests/testdata/run/top_level_await/tla2/a.js (renamed from cli/tests/testdata/run/top_level_await/tla2/a.js)0
-rw-r--r--tests/testdata/run/top_level_await/tla2/b.js (renamed from cli/tests/testdata/run/top_level_await/tla2/b.js)0
-rw-r--r--tests/testdata/run/top_level_await/tla3/b.js (renamed from cli/tests/testdata/run/top_level_await/tla3/b.js)0
-rw-r--r--tests/testdata/run/top_level_await/tla3/timeout_loop.js (renamed from cli/tests/testdata/run/top_level_await/tla3/timeout_loop.js)0
-rw-r--r--tests/testdata/run/top_level_await/top_level_await.js (renamed from cli/tests/testdata/run/top_level_await/top_level_await.js)0
-rw-r--r--tests/testdata/run/top_level_await/top_level_await.out (renamed from cli/tests/testdata/run/top_level_await/top_level_await.out)0
-rw-r--r--tests/testdata/run/top_level_await/top_level_await.ts (renamed from cli/tests/testdata/run/top_level_await/top_level_await.ts)0
-rw-r--r--tests/testdata/run/top_level_await/top_level_for_await.js (renamed from cli/tests/testdata/run/top_level_await/top_level_for_await.js)0
-rw-r--r--tests/testdata/run/top_level_await/top_level_for_await.out (renamed from cli/tests/testdata/run/top_level_await/top_level_for_await.out)0
-rw-r--r--tests/testdata/run/top_level_await/top_level_for_await.ts (renamed from cli/tests/testdata/run/top_level_await/top_level_for_await.ts)0
-rw-r--r--tests/testdata/run/top_level_await/unresolved.js (renamed from cli/tests/testdata/run/top_level_await/unresolved.js)0
-rw-r--r--tests/testdata/run/top_level_await/unresolved.out (renamed from cli/tests/testdata/run/top_level_await/unresolved.out)0
-rw-r--r--tests/testdata/run/ts_import_from_js/deps.js (renamed from cli/tests/testdata/run/ts_import_from_js/deps.js)0
-rw-r--r--tests/testdata/run/ts_import_from_js/main.js (renamed from cli/tests/testdata/run/ts_import_from_js/main.js)0
-rw-r--r--tests/testdata/run/ts_import_from_js/main.out (renamed from cli/tests/testdata/run/ts_import_from_js/main.out)0
-rw-r--r--tests/testdata/run/ts_type_imports.ts (renamed from cli/tests/testdata/run/ts_type_imports.ts)0
-rw-r--r--tests/testdata/run/ts_type_imports.ts.out (renamed from cli/tests/testdata/run/ts_type_imports.ts.out)0
-rw-r--r--tests/testdata/run/ts_type_imports_foo.ts (renamed from cli/tests/testdata/run/ts_type_imports_foo.ts)0
-rw-r--r--tests/testdata/run/ts_type_only_import.d.ts (renamed from cli/tests/testdata/run/ts_type_only_import.d.ts)0
-rw-r--r--tests/testdata/run/ts_type_only_import.ts (renamed from cli/tests/testdata/run/ts_type_only_import.ts)0
-rw-r--r--tests/testdata/run/ts_type_only_import.ts.out (renamed from cli/tests/testdata/run/ts_type_only_import.ts.out)0
-rw-r--r--tests/testdata/run/tsx_imports/Component.tsx (renamed from cli/tests/testdata/run/tsx_imports/Component.tsx)0
-rw-r--r--tests/testdata/run/tsx_imports/tsx_imports.ts (renamed from cli/tests/testdata/run/tsx_imports/tsx_imports.ts)0
-rw-r--r--tests/testdata/run/tsx_imports/tsx_imports.ts.out (renamed from cli/tests/testdata/run/tsx_imports/tsx_imports.ts.out)0
-rw-r--r--tests/testdata/run/type_definitions.ts (renamed from cli/tests/testdata/run/type_definitions.ts)0
-rw-r--r--tests/testdata/run/type_definitions.ts.out (renamed from cli/tests/testdata/run/type_definitions.ts.out)0
-rw-r--r--tests/testdata/run/type_definitions_for_export.ts (renamed from cli/tests/testdata/run/type_definitions_for_export.ts)0
-rw-r--r--tests/testdata/run/type_definitions_for_export.ts.out (renamed from cli/tests/testdata/run/type_definitions_for_export.ts.out)0
-rw-r--r--tests/testdata/run/type_directives_01.ts (renamed from cli/tests/testdata/run/type_directives_01.ts)0
-rw-r--r--tests/testdata/run/type_directives_01.ts.out (renamed from cli/tests/testdata/run/type_directives_01.ts.out)0
-rw-r--r--tests/testdata/run/type_directives_02.ts (renamed from cli/tests/testdata/run/type_directives_02.ts)0
-rw-r--r--tests/testdata/run/type_directives_02.ts.out (renamed from cli/tests/testdata/run/type_directives_02.ts.out)0
-rw-r--r--tests/testdata/run/type_directives_js_main.js (renamed from cli/tests/testdata/run/type_directives_js_main.js)0
-rw-r--r--tests/testdata/run/type_directives_redirect.ts (renamed from cli/tests/testdata/run/type_directives_redirect.ts)0
-rw-r--r--tests/testdata/run/type_directives_redirect.ts.out (renamed from cli/tests/testdata/run/type_directives_redirect.ts.out)0
-rw-r--r--tests/testdata/run/type_headers_deno_types.ts (renamed from cli/tests/testdata/run/type_headers_deno_types.ts)0
-rw-r--r--tests/testdata/run/type_headers_deno_types.ts.out (renamed from cli/tests/testdata/run/type_headers_deno_types.ts.out)0
-rw-r--r--tests/testdata/run/unbuffered_stderr.ts (renamed from cli/tests/testdata/run/unbuffered_stderr.ts)0
-rw-r--r--tests/testdata/run/unbuffered_stderr.ts.out (renamed from cli/tests/testdata/run/unbuffered_stderr.ts.out)0
-rw-r--r--tests/testdata/run/unbuffered_stdout.ts (renamed from cli/tests/testdata/run/unbuffered_stdout.ts)0
-rw-r--r--tests/testdata/run/unbuffered_stdout.ts.out (renamed from cli/tests/testdata/run/unbuffered_stdout.ts.out)0
-rw-r--r--tests/testdata/run/unhandled_rejection.ts (renamed from cli/tests/testdata/run/unhandled_rejection.ts)0
-rw-r--r--tests/testdata/run/unhandled_rejection.ts.out (renamed from cli/tests/testdata/run/unhandled_rejection.ts.out)0
-rw-r--r--tests/testdata/run/unhandled_rejection_dynamic_import/import.ts (renamed from cli/tests/testdata/run/unhandled_rejection_dynamic_import/import.ts)0
-rw-r--r--tests/testdata/run/unhandled_rejection_dynamic_import/main.ts (renamed from cli/tests/testdata/run/unhandled_rejection_dynamic_import/main.ts)0
-rw-r--r--tests/testdata/run/unhandled_rejection_dynamic_import/main.ts.out (renamed from cli/tests/testdata/run/unhandled_rejection_dynamic_import/main.ts.out)0
-rw-r--r--tests/testdata/run/unhandled_rejection_dynamic_import2/import.ts (renamed from cli/tests/testdata/run/unhandled_rejection_dynamic_import2/import.ts)0
-rw-r--r--tests/testdata/run/unhandled_rejection_dynamic_import2/main.ts (renamed from cli/tests/testdata/run/unhandled_rejection_dynamic_import2/main.ts)0
-rw-r--r--tests/testdata/run/unhandled_rejection_dynamic_import2/main.ts.out (renamed from cli/tests/testdata/run/unhandled_rejection_dynamic_import2/main.ts.out)0
-rw-r--r--tests/testdata/run/unhandled_rejection_sync_error.ts (renamed from cli/tests/testdata/run/unhandled_rejection_sync_error.ts)0
-rw-r--r--tests/testdata/run/unhandled_rejection_sync_error.ts.out (renamed from cli/tests/testdata/run/unhandled_rejection_sync_error.ts.out)0
-rw-r--r--tests/testdata/run/unsafe_proto/main.js (renamed from cli/tests/testdata/run/unsafe_proto/main.js)0
-rw-r--r--tests/testdata/run/unsafe_proto/main.out (renamed from cli/tests/testdata/run/unsafe_proto/main.out)0
-rw-r--r--tests/testdata/run/unsafe_proto/main_with_unsafe_proto_flag.out (renamed from cli/tests/testdata/run/unsafe_proto/main_with_unsafe_proto_flag.out)0
-rw-r--r--tests/testdata/run/unsafe_proto/worker.js (renamed from cli/tests/testdata/run/unsafe_proto/worker.js)0
-rw-r--r--tests/testdata/run/unstable.js (renamed from cli/tests/testdata/run/unstable.js)0
-rw-r--r--tests/testdata/run/unstable.ts (renamed from cli/tests/testdata/run/unstable.ts)0
-rw-r--r--tests/testdata/run/unstable_broadcast_channel.disabled.out (renamed from cli/tests/testdata/run/unstable_broadcast_channel.disabled.out)0
-rw-r--r--tests/testdata/run/unstable_broadcast_channel.enabled.out (renamed from cli/tests/testdata/run/unstable_broadcast_channel.enabled.out)0
-rw-r--r--tests/testdata/run/unstable_broadcast_channel.js (renamed from cli/tests/testdata/run/unstable_broadcast_channel.js)0
-rw-r--r--tests/testdata/run/unstable_cron.disabled.out (renamed from cli/tests/testdata/run/unstable_cron.disabled.out)0
-rw-r--r--tests/testdata/run/unstable_cron.enabled.out (renamed from cli/tests/testdata/run/unstable_cron.enabled.out)0
-rw-r--r--tests/testdata/run/unstable_cron.js (renamed from cli/tests/testdata/run/unstable_cron.js)0
-rw-r--r--tests/testdata/run/unstable_disabled_js.out (renamed from cli/tests/testdata/run/unstable_disabled_js.out)0
-rw-r--r--tests/testdata/run/unstable_enabled.out (renamed from cli/tests/testdata/run/unstable_enabled.out)0
-rw-r--r--tests/testdata/run/unstable_enabled_js.out (renamed from cli/tests/testdata/run/unstable_enabled_js.out)0
-rw-r--r--tests/testdata/run/unstable_ffi.disabled.out (renamed from cli/tests/testdata/run/unstable_ffi.disabled.out)0
-rw-r--r--tests/testdata/run/unstable_ffi.enabled.out (renamed from cli/tests/testdata/run/unstable_ffi.enabled.out)0
-rw-r--r--tests/testdata/run/unstable_ffi.js (renamed from cli/tests/testdata/run/unstable_ffi.js)0
-rw-r--r--tests/testdata/run/unstable_fs.disabled.out (renamed from cli/tests/testdata/run/unstable_fs.disabled.out)0
-rw-r--r--tests/testdata/run/unstable_fs.enabled.out (renamed from cli/tests/testdata/run/unstable_fs.enabled.out)0
-rw-r--r--tests/testdata/run/unstable_fs.js (renamed from cli/tests/testdata/run/unstable_fs.js)0
-rw-r--r--tests/testdata/run/unstable_http.disabled.out (renamed from cli/tests/testdata/run/unstable_http.disabled.out)0
-rw-r--r--tests/testdata/run/unstable_http.enabled.out (renamed from cli/tests/testdata/run/unstable_http.enabled.out)0
-rw-r--r--tests/testdata/run/unstable_http.js (renamed from cli/tests/testdata/run/unstable_http.js)0
-rw-r--r--tests/testdata/run/unstable_kv.disabled.out (renamed from cli/tests/testdata/run/unstable_kv.disabled.out)0
-rw-r--r--tests/testdata/run/unstable_kv.enabled.out (renamed from cli/tests/testdata/run/unstable_kv.enabled.out)0
-rw-r--r--tests/testdata/run/unstable_kv.js (renamed from cli/tests/testdata/run/unstable_kv.js)0
-rw-r--r--tests/testdata/run/unstable_net.disabled.out (renamed from cli/tests/testdata/run/unstable_net.disabled.out)0
-rw-r--r--tests/testdata/run/unstable_net.enabled.out (renamed from cli/tests/testdata/run/unstable_net.enabled.out)0
-rw-r--r--tests/testdata/run/unstable_net.js (renamed from cli/tests/testdata/run/unstable_net.js)0
-rw-r--r--tests/testdata/run/unstable_temporal_api/main.out (renamed from cli/tests/testdata/run/unstable_temporal_api/main.out)0
-rw-r--r--tests/testdata/run/unstable_temporal_api/main.ts (renamed from cli/tests/testdata/run/unstable_temporal_api/main.ts)0
-rw-r--r--tests/testdata/run/unstable_temporal_api/missing_flag.js (renamed from cli/tests/testdata/run/unstable_temporal_api/missing_flag.js)0
-rw-r--r--tests/testdata/run/unstable_temporal_api/missing_flag.out (renamed from cli/tests/testdata/run/unstable_temporal_api/missing_flag.out)0
-rw-r--r--tests/testdata/run/unstable_webgpu.disabled.out (renamed from cli/tests/testdata/run/unstable_webgpu.disabled.out)0
-rw-r--r--tests/testdata/run/unstable_webgpu.enabled.out (renamed from cli/tests/testdata/run/unstable_webgpu.enabled.out)0
-rw-r--r--tests/testdata/run/unstable_webgpu.js (renamed from cli/tests/testdata/run/unstable_webgpu.js)0
-rw-r--r--tests/testdata/run/unstable_worker.ts (renamed from cli/tests/testdata/run/unstable_worker.ts)0
-rw-r--r--tests/testdata/run/unstable_worker.ts.out (renamed from cli/tests/testdata/run/unstable_worker.ts.out)0
-rw-r--r--tests/testdata/run/unstable_worker_options.disabled.out (renamed from cli/tests/testdata/run/unstable_worker_options.disabled.out)0
-rw-r--r--tests/testdata/run/unstable_worker_options.enabled.out (renamed from cli/tests/testdata/run/unstable_worker_options.enabled.out)0
-rw-r--r--tests/testdata/run/unstable_worker_options.js (renamed from cli/tests/testdata/run/unstable_worker_options.js)0
-rw-r--r--tests/testdata/run/unsupported_dynamic_import_scheme.out (renamed from cli/tests/testdata/run/unsupported_dynamic_import_scheme.out)0
-rw-r--r--tests/testdata/run/v8_flags.js (renamed from cli/tests/testdata/run/v8_flags.js)0
-rw-r--r--tests/testdata/run/v8_flags.js.out (renamed from cli/tests/testdata/run/v8_flags.js.out)0
-rw-r--r--tests/testdata/run/v8_flags_unrecognized.out (renamed from cli/tests/testdata/run/v8_flags_unrecognized.out)0
-rw-r--r--tests/testdata/run/v8_help.out (renamed from cli/tests/testdata/run/v8_help.out)0
-rw-r--r--tests/testdata/run/warn_on_deprecated_api/main.js (renamed from cli/tests/testdata/run/warn_on_deprecated_api/main.js)0
-rw-r--r--tests/testdata/run/warn_on_deprecated_api/main.out (renamed from cli/tests/testdata/run/warn_on_deprecated_api/main.out)0
-rw-r--r--tests/testdata/run/warn_on_deprecated_api/main.verbose.out (renamed from cli/tests/testdata/run/warn_on_deprecated_api/main.verbose.out)0
-rw-r--r--tests/testdata/run/warn_on_deprecated_api/main_disabled_env.out (renamed from cli/tests/testdata/run/warn_on_deprecated_api/main_disabled_env.out)0
-rw-r--r--tests/testdata/run/warn_on_deprecated_api/main_disabled_flag.out (renamed from cli/tests/testdata/run/warn_on_deprecated_api/main_disabled_flag.out)0
-rw-r--r--tests/testdata/run/warn_on_deprecated_api/mod.ts (renamed from cli/tests/testdata/run/warn_on_deprecated_api/mod.ts)0
-rw-r--r--tests/testdata/run/wasm.ts (renamed from cli/tests/testdata/run/wasm.ts)0
-rw-r--r--tests/testdata/run/wasm.ts.out (renamed from cli/tests/testdata/run/wasm.ts.out)0
-rw-r--r--tests/testdata/run/wasm_async.js (renamed from cli/tests/testdata/run/wasm_async.js)0
-rw-r--r--tests/testdata/run/wasm_async.out (renamed from cli/tests/testdata/run/wasm_async.out)0
-rw-r--r--tests/testdata/run/wasm_shared.out (renamed from cli/tests/testdata/run/wasm_shared.out)0
-rw-r--r--tests/testdata/run/wasm_shared.ts (renamed from cli/tests/testdata/run/wasm_shared.ts)0
-rw-r--r--tests/testdata/run/wasm_streaming_panic_test.js (renamed from cli/tests/testdata/run/wasm_streaming_panic_test.js)0
-rw-r--r--tests/testdata/run/wasm_streaming_panic_test.js.out (renamed from cli/tests/testdata/run/wasm_streaming_panic_test.js.out)0
-rw-r--r--tests/testdata/run/wasm_unreachable.js (renamed from cli/tests/testdata/run/wasm_unreachable.js)0
-rw-r--r--tests/testdata/run/wasm_unreachable.out (renamed from cli/tests/testdata/run/wasm_unreachable.out)0
-rw-r--r--tests/testdata/run/wasm_url.js (renamed from cli/tests/testdata/run/wasm_url.js)0
-rw-r--r--tests/testdata/run/wasm_url.out (renamed from cli/tests/testdata/run/wasm_url.out)0
-rw-r--r--tests/testdata/run/weakref.ts (renamed from cli/tests/testdata/run/weakref.ts)0
-rw-r--r--tests/testdata/run/weakref.ts.out (renamed from cli/tests/testdata/run/weakref.ts.out)0
-rw-r--r--tests/testdata/run/websocket_server_idletimeout.ts25
-rw-r--r--tests/testdata/run/websocket_server_multi_field_connection_header_test.ts (renamed from cli/tests/testdata/run/websocket_server_multi_field_connection_header_test.ts)0
-rw-r--r--tests/testdata/run/websocketstream_ping_test.ts (renamed from cli/tests/testdata/run/websocketstream_ping_test.ts)0
-rw-r--r--tests/testdata/run/webstorage/config_a.jsonc (renamed from cli/tests/testdata/run/webstorage/config_a.jsonc)0
-rw-r--r--tests/testdata/run/webstorage/config_b.jsonc (renamed from cli/tests/testdata/run/webstorage/config_b.jsonc)0
-rw-r--r--tests/testdata/run/webstorage/fixture.ts (renamed from cli/tests/testdata/run/webstorage/fixture.ts)0
-rw-r--r--tests/testdata/run/webstorage/logger.ts (renamed from cli/tests/testdata/run/webstorage/logger.ts)0
-rw-r--r--tests/testdata/run/webstorage/serialization.ts (renamed from cli/tests/testdata/run/webstorage/serialization.ts)0
-rw-r--r--tests/testdata/run/webstorage/serialization.ts.out (renamed from cli/tests/testdata/run/webstorage/serialization.ts.out)0
-rw-r--r--tests/testdata/run/webstorage/setter.ts (renamed from cli/tests/testdata/run/webstorage/setter.ts)0
-rw-r--r--tests/testdata/run/with_config/auto_discovery_log.out (renamed from cli/tests/testdata/run/with_config/auto_discovery_log.out)0
-rw-r--r--tests/testdata/run/with_config/deno.jsonc (renamed from cli/tests/testdata/run/with_config/deno.jsonc)0
-rw-r--r--tests/testdata/run/with_config/frontend_work.ts (renamed from cli/tests/testdata/run/with_config/frontend_work.ts)0
-rw-r--r--tests/testdata/run/with_config/no_auto_discovery.out (renamed from cli/tests/testdata/run/with_config/no_auto_discovery.out)0
-rw-r--r--tests/testdata/run/with_config/server_side_work.ts (renamed from cli/tests/testdata/run/with_config/server_side_work.ts)0
-rw-r--r--tests/testdata/run/with_package_json/no_deno_json/main.out (renamed from cli/tests/testdata/run/with_package_json/no_deno_json/main.out)0
-rw-r--r--tests/testdata/run/with_package_json/no_deno_json/main.ts (renamed from cli/tests/testdata/run/with_package_json/no_deno_json/main.ts)0
-rw-r--r--tests/testdata/run/with_package_json/no_deno_json/no_package_json_imports.out (renamed from cli/tests/testdata/run/with_package_json/no_deno_json/no_package_json_imports.out)0
-rw-r--r--tests/testdata/run/with_package_json/no_deno_json/no_package_json_imports.ts (renamed from cli/tests/testdata/run/with_package_json/no_deno_json/no_package_json_imports.ts)0
-rw-r--r--tests/testdata/run/with_package_json/no_deno_json/noconfig.out (renamed from cli/tests/testdata/run/with_package_json/no_deno_json/noconfig.out)0
-rw-r--r--tests/testdata/run/with_package_json/no_deno_json/noconfig.ts (renamed from cli/tests/testdata/run/with_package_json/no_deno_json/noconfig.ts)0
-rw-r--r--tests/testdata/run/with_package_json/no_deno_json/package.json (renamed from cli/tests/testdata/run/with_package_json/no_deno_json/package.json)0
-rw-r--r--tests/testdata/run/with_package_json/no_deno_json/sub_dir/main.js (renamed from cli/tests/testdata/run/with_package_json/no_deno_json/sub_dir/main.js)0
-rw-r--r--tests/testdata/run/with_package_json/no_deno_json/sub_dir/main.out (renamed from cli/tests/testdata/run/with_package_json/no_deno_json/sub_dir/main.out)0
-rw-r--r--tests/testdata/run/with_package_json/npm_binary/main.out (renamed from cli/tests/testdata/run/with_package_json/npm_binary/main.out)0
-rw-r--r--tests/testdata/run/with_package_json/npm_binary/package.json (renamed from cli/tests/testdata/run/with_package_json/npm_binary/package.json)0
-rw-r--r--tests/testdata/run/with_package_json/with_stop/main.out (renamed from cli/tests/testdata/run/with_package_json/with_stop/main.out)0
-rw-r--r--tests/testdata/run/with_package_json/with_stop/package.json (renamed from cli/tests/testdata/run/with_package_json/with_stop/package.json)0
-rw-r--r--tests/testdata/run/with_package_json/with_stop/some/nested/deno.json (renamed from cli/tests/testdata/run/with_package_json/with_stop/some/nested/deno.json)0
-rw-r--r--tests/testdata/run/with_package_json/with_stop/some/nested/dir/main.ts (renamed from cli/tests/testdata/run/with_package_json/with_stop/some/nested/dir/main.ts)0
-rw-r--r--tests/testdata/run/worker_close_in_wasm_reactions.js (renamed from cli/tests/testdata/run/worker_close_in_wasm_reactions.js)0
-rw-r--r--tests/testdata/run/worker_close_in_wasm_reactions.js.out (renamed from cli/tests/testdata/run/worker_close_in_wasm_reactions.js.out)0
-rw-r--r--tests/testdata/run/worker_close_nested.js (renamed from cli/tests/testdata/run/worker_close_nested.js)0
-rw-r--r--tests/testdata/run/worker_close_nested.js.out (renamed from cli/tests/testdata/run/worker_close_nested.js.out)0
-rw-r--r--tests/testdata/run/worker_close_race.js (renamed from cli/tests/testdata/run/worker_close_race.js)0
-rw-r--r--tests/testdata/run/worker_close_race.js.out (renamed from cli/tests/testdata/run/worker_close_race.js.out)0
-rw-r--r--tests/testdata/run/worker_drop_handle_race.js (renamed from cli/tests/testdata/run/worker_drop_handle_race.js)0
-rw-r--r--tests/testdata/run/worker_drop_handle_race.js.out (renamed from cli/tests/testdata/run/worker_drop_handle_race.js.out)0
-rw-r--r--tests/testdata/run/worker_drop_handle_race_terminate.js (renamed from cli/tests/testdata/run/worker_drop_handle_race_terminate.js)0
-rw-r--r--tests/testdata/run/worker_drop_handle_race_terminate.js.out (renamed from cli/tests/testdata/run/worker_drop_handle_race_terminate.js.out)0
-rw-r--r--tests/testdata/run/worker_event_handler_test.js (renamed from cli/tests/testdata/run/worker_event_handler_test.js)0
-rw-r--r--tests/testdata/run/worker_event_handler_test.js.out (renamed from cli/tests/testdata/run/worker_event_handler_test.js.out)0
-rw-r--r--tests/testdata/run/worker_message_before_close.js (renamed from cli/tests/testdata/run/worker_message_before_close.js)0
-rw-r--r--tests/testdata/run/worker_message_before_close.js.out (renamed from cli/tests/testdata/run/worker_message_before_close.js.out)0
-rw-r--r--tests/testdata/run/workspaces/basic/bar/deno.json (renamed from cli/tests/testdata/run/workspaces/basic/bar/deno.json)0
-rw-r--r--tests/testdata/run/workspaces/basic/bar/fizz/buzz.ts (renamed from cli/tests/testdata/run/workspaces/basic/bar/fizz/buzz.ts)0
-rw-r--r--tests/testdata/run/workspaces/basic/bar/mod.ts (renamed from cli/tests/testdata/run/workspaces/basic/bar/mod.ts)0
-rw-r--r--tests/testdata/run/workspaces/basic/bar/some_mod/hello.ts (renamed from cli/tests/testdata/run/workspaces/basic/bar/some_mod/hello.ts)0
-rw-r--r--tests/testdata/run/workspaces/basic/deno.json (renamed from cli/tests/testdata/run/workspaces/basic/deno.json)0
-rw-r--r--tests/testdata/run/workspaces/basic/foo/bar/hello.ts (renamed from cli/tests/testdata/run/workspaces/basic/foo/bar/hello.ts)0
-rw-r--r--tests/testdata/run/workspaces/basic/foo/deno.json (renamed from cli/tests/testdata/run/workspaces/basic/foo/deno.json)0
-rw-r--r--tests/testdata/run/workspaces/basic/foo/fizz/buzz.ts (renamed from cli/tests/testdata/run/workspaces/basic/foo/fizz/buzz.ts)0
-rw-r--r--tests/testdata/run/workspaces/basic/foo/mod.ts (renamed from cli/tests/testdata/run/workspaces/basic/foo/mod.ts)0
-rw-r--r--tests/testdata/run/workspaces/basic/main.out (renamed from cli/tests/testdata/run/workspaces/basic/main.out)0
-rw-r--r--tests/testdata/run/workspaces/basic/main.ts (renamed from cli/tests/testdata/run/workspaces/basic/main.ts)0
-rw-r--r--tests/testdata/run/workspaces/member_outside_root_dir/deno.json (renamed from cli/tests/testdata/run/workspaces/member_outside_root_dir/deno.json)0
-rw-r--r--tests/testdata/run/workspaces/member_outside_root_dir/foo/bar/hello.ts (renamed from cli/tests/testdata/run/workspaces/member_outside_root_dir/foo/bar/hello.ts)0
-rw-r--r--tests/testdata/run/workspaces/member_outside_root_dir/foo/deno.json (renamed from cli/tests/testdata/run/workspaces/member_outside_root_dir/foo/deno.json)0
-rw-r--r--tests/testdata/run/workspaces/member_outside_root_dir/foo/fizz/buzz.ts (renamed from cli/tests/testdata/run/workspaces/member_outside_root_dir/foo/fizz/buzz.ts)0
-rw-r--r--tests/testdata/run/workspaces/member_outside_root_dir/foo/mod.ts (renamed from cli/tests/testdata/run/workspaces/member_outside_root_dir/foo/mod.ts)0
-rw-r--r--tests/testdata/run/workspaces/member_outside_root_dir/main.out (renamed from cli/tests/testdata/run/workspaces/member_outside_root_dir/main.out)0
-rw-r--r--tests/testdata/run/workspaces/member_outside_root_dir/main.ts (renamed from cli/tests/testdata/run/workspaces/member_outside_root_dir/main.ts)0
-rw-r--r--tests/testdata/run/workspaces/nested_member/bar/deno.json (renamed from cli/tests/testdata/run/workspaces/nested_member/bar/deno.json)0
-rw-r--r--tests/testdata/run/workspaces/nested_member/bar/fizz/buzz.ts (renamed from cli/tests/testdata/run/workspaces/nested_member/bar/fizz/buzz.ts)0
-rw-r--r--tests/testdata/run/workspaces/nested_member/bar/mod.ts (renamed from cli/tests/testdata/run/workspaces/nested_member/bar/mod.ts)0
-rw-r--r--tests/testdata/run/workspaces/nested_member/bar/some_mod/hello.ts (renamed from cli/tests/testdata/run/workspaces/nested_member/bar/some_mod/hello.ts)0
-rw-r--r--tests/testdata/run/workspaces/nested_member/deno.json (renamed from cli/tests/testdata/run/workspaces/nested_member/deno.json)0
-rw-r--r--tests/testdata/run/workspaces/nested_member/foo/bar/deno.json (renamed from cli/tests/testdata/run/workspaces/nested_member/foo/bar/deno.json)0
-rw-r--r--tests/testdata/run/workspaces/nested_member/foo/bar/hello.ts (renamed from cli/tests/testdata/run/workspaces/nested_member/foo/bar/hello.ts)0
-rw-r--r--tests/testdata/run/workspaces/nested_member/foo/deno.json (renamed from cli/tests/testdata/run/workspaces/nested_member/foo/deno.json)0
-rw-r--r--tests/testdata/run/workspaces/nested_member/foo/fizz/buzz.ts (renamed from cli/tests/testdata/run/workspaces/nested_member/foo/fizz/buzz.ts)0
-rw-r--r--tests/testdata/run/workspaces/nested_member/foo/mod.ts (renamed from cli/tests/testdata/run/workspaces/nested_member/foo/mod.ts)0
-rw-r--r--tests/testdata/run/workspaces/nested_member/main.out (renamed from cli/tests/testdata/run/workspaces/nested_member/main.out)0
-rw-r--r--tests/testdata/run/workspaces/nested_member/main.ts (renamed from cli/tests/testdata/run/workspaces/nested_member/main.ts)0
-rw-r--r--tests/testdata/runtime/esm_imports_a.js (renamed from cli/tests/testdata/runtime/esm_imports_a.js)0
-rw-r--r--tests/testdata/runtime/esm_imports_b.js (renamed from cli/tests/testdata/runtime/esm_imports_b.js)0
-rw-r--r--tests/testdata/spawn_kill_permissions.ts (renamed from cli/tests/testdata/spawn_kill_permissions.ts)0
-rw-r--r--tests/testdata/subdir/CAPITALS/main.js (renamed from cli/tests/testdata/subdir/CAPITALS/main.js)0
-rw-r--r--tests/testdata/subdir/amd_like.js (renamed from cli/tests/testdata/subdir/amd_like.js)0
-rw-r--r--tests/testdata/subdir/auto_print_hello.ts (renamed from cli/tests/testdata/subdir/auto_print_hello.ts)0
-rw-r--r--tests/testdata/subdir/circular1.ts (renamed from cli/tests/testdata/subdir/circular1.ts)0
-rw-r--r--tests/testdata/subdir/circular2.ts (renamed from cli/tests/testdata/subdir/circular2.ts)0
-rw-r--r--tests/testdata/subdir/comment.ts (renamed from cli/tests/testdata/subdir/comment.ts)0
-rw-r--r--tests/testdata/subdir/config.json (renamed from cli/tests/testdata/subdir/config.json)0
-rw-r--r--tests/testdata/subdir/emittable.d.ts (renamed from cli/tests/testdata/subdir/emittable.d.ts)0
-rw-r--r--tests/testdata/subdir/evil_remote_import.js (renamed from cli/tests/testdata/subdir/evil_remote_import.js)0
-rw-r--r--tests/testdata/subdir/export_types.ts (renamed from cli/tests/testdata/subdir/export_types.ts)0
-rw-r--r--tests/testdata/subdir/foo_types.d.ts (renamed from cli/tests/testdata/subdir/foo_types.d.ts)0
-rw-r--r--tests/testdata/subdir/form_urlencoded.txt (renamed from cli/tests/testdata/subdir/form_urlencoded.txt)0
-rw-r--r--tests/testdata/subdir/import.mts (renamed from cli/tests/testdata/subdir/import.mts)0
-rw-r--r--tests/testdata/subdir/indirect_import_error.js (renamed from cli/tests/testdata/subdir/indirect_import_error.js)0
-rw-r--r--tests/testdata/subdir/indirect_throws.js (renamed from cli/tests/testdata/subdir/indirect_throws.js)0
-rw-r--r--tests/testdata/subdir/json_1.json (renamed from cli/tests/testdata/subdir/json_1.json)0
-rw-r--r--tests/testdata/subdir/json_2.json (renamed from cli/tests/testdata/subdir/json_2.json)0
-rw-r--r--tests/testdata/subdir/json_3.json (renamed from cli/tests/testdata/subdir/json_3.json)0
-rw-r--r--tests/testdata/subdir/jsx_import_source_no_pragma.tsx (renamed from cli/tests/testdata/subdir/jsx_import_source_no_pragma.tsx)0
-rw-r--r--tests/testdata/subdir/main.ts (renamed from cli/tests/testdata/subdir/main.ts)0
-rw-r--r--tests/testdata/subdir/mismatch_ext.ts (renamed from cli/tests/testdata/subdir/mismatch_ext.ts)0
-rw-r--r--tests/testdata/subdir/mod.mjs (renamed from cli/tests/testdata/subdir/mod.mjs)0
-rw-r--r--tests/testdata/subdir/mod1.ts (renamed from cli/tests/testdata/subdir/mod1.ts)0
-rw-r--r--tests/testdata/subdir/mod2.ts (renamed from cli/tests/testdata/subdir/mod2.ts)0
-rw-r--r--tests/testdata/subdir/mod3.js (renamed from cli/tests/testdata/subdir/mod3.js)0
-rw-r--r--tests/testdata/subdir/mod4.js (renamed from cli/tests/testdata/subdir/mod4.js)0
-rw-r--r--tests/testdata/subdir/mod5.mjs (renamed from cli/tests/testdata/subdir/mod5.mjs)0
-rw-r--r--tests/testdata/subdir/mod6.js (renamed from cli/tests/testdata/subdir/mod6.js)0
-rw-r--r--tests/testdata/subdir/mod7.js (renamed from cli/tests/testdata/subdir/mod7.js)0
-rw-r--r--tests/testdata/subdir/mod8.js (renamed from cli/tests/testdata/subdir/mod8.js)0
-rw-r--r--tests/testdata/subdir/more_decorators.ts (renamed from cli/tests/testdata/subdir/more_decorators.ts)0
-rw-r--r--tests/testdata/subdir/mt_application_ecmascript.j2.js (renamed from cli/tests/testdata/subdir/mt_application_ecmascript.j2.js)0
-rw-r--r--tests/testdata/subdir/mt_application_ecmascript_jsx.j2.jsx (renamed from cli/tests/testdata/subdir/mt_application_ecmascript_jsx.j2.jsx)0
-rw-r--r--tests/testdata/subdir/mt_application_x_javascript.j4.js (renamed from cli/tests/testdata/subdir/mt_application_x_javascript.j4.js)0
-rw-r--r--tests/testdata/subdir/mt_application_x_javascript_jsx.j4.jsx (renamed from cli/tests/testdata/subdir/mt_application_x_javascript_jsx.j4.jsx)0
-rw-r--r--tests/testdata/subdir/mt_application_x_typescript.t4.ts (renamed from cli/tests/testdata/subdir/mt_application_x_typescript.t4.ts)0
-rw-r--r--tests/testdata/subdir/mt_application_x_typescript_tsx.t4.tsx (renamed from cli/tests/testdata/subdir/mt_application_x_typescript_tsx.t4.tsx)0
-rw-r--r--tests/testdata/subdir/mt_javascript.js (renamed from cli/tests/testdata/subdir/mt_javascript.js)0
-rw-r--r--tests/testdata/subdir/mt_javascript_jsx.jsx (renamed from cli/tests/testdata/subdir/mt_javascript_jsx.jsx)0
-rw-r--r--tests/testdata/subdir/mt_text_ecmascript.j3.js (renamed from cli/tests/testdata/subdir/mt_text_ecmascript.j3.js)0
-rw-r--r--tests/testdata/subdir/mt_text_ecmascript_jsx.j3.jsx (renamed from cli/tests/testdata/subdir/mt_text_ecmascript_jsx.j3.jsx)0
-rw-r--r--tests/testdata/subdir/mt_text_javascript.j1.js (renamed from cli/tests/testdata/subdir/mt_text_javascript.j1.js)0
-rw-r--r--tests/testdata/subdir/mt_text_javascript_jsx.j1.jsx (renamed from cli/tests/testdata/subdir/mt_text_javascript_jsx.j1.jsx)0
-rw-r--r--tests/testdata/subdir/mt_text_typescript.t1.ts (renamed from cli/tests/testdata/subdir/mt_text_typescript.t1.ts)0
-rw-r--r--tests/testdata/subdir/mt_text_typescript_tsx.t1.tsx (renamed from cli/tests/testdata/subdir/mt_text_typescript_tsx.t1.tsx)0
-rw-r--r--tests/testdata/subdir/mt_video_mp2t.t3.ts (renamed from cli/tests/testdata/subdir/mt_video_mp2t.t3.ts)0
-rw-r--r--tests/testdata/subdir/mt_video_mp2t_tsx.t3.tsx (renamed from cli/tests/testdata/subdir/mt_video_mp2t_tsx.t3.tsx)0
-rw-r--r--tests/testdata/subdir/mt_video_vdn.t2.ts (renamed from cli/tests/testdata/subdir/mt_video_vdn.t2.ts)0
-rw-r--r--tests/testdata/subdir/mt_video_vdn_tsx.t2.tsx (renamed from cli/tests/testdata/subdir/mt_video_vdn_tsx.t2.tsx)0
-rw-r--r--tests/testdata/subdir/no_ext (renamed from cli/tests/testdata/subdir/no_ext)0
-rw-r--r--tests/testdata/subdir/no_js_ext (renamed from cli/tests/testdata/subdir/no_js_ext)0
-rw-r--r--tests/testdata/subdir/polyfill.ts (renamed from cli/tests/testdata/subdir/polyfill.ts)0
-rw-r--r--tests/testdata/subdir/print_hello.ts (renamed from cli/tests/testdata/subdir/print_hello.ts)0
-rw-r--r--tests/testdata/subdir/redirects/a.ts (renamed from cli/tests/testdata/subdir/redirects/a.ts)0
-rw-r--r--tests/testdata/subdir/redirects/b.ts (renamed from cli/tests/testdata/subdir/redirects/b.ts)0
-rw-r--r--tests/testdata/subdir/redirects/redirect1.js (renamed from cli/tests/testdata/subdir/redirects/redirect1.js)0
-rw-r--r--tests/testdata/subdir/redirects/redirect1.ts (renamed from cli/tests/testdata/subdir/redirects/redirect1.ts)0
-rw-r--r--tests/testdata/subdir/redirects/redirect2.js (renamed from cli/tests/testdata/subdir/redirects/redirect2.js)0
-rw-r--r--tests/testdata/subdir/redirects/redirect3.js (renamed from cli/tests/testdata/subdir/redirects/redirect3.js)0
-rw-r--r--tests/testdata/subdir/redirects/redirect4.ts (renamed from cli/tests/testdata/subdir/redirects/redirect4.ts)0
-rw-r--r--tests/testdata/subdir/shebang_file.js (renamed from cli/tests/testdata/subdir/shebang_file.js)0
-rw-r--r--tests/testdata/subdir/single_module.ts (renamed from cli/tests/testdata/subdir/single_module.ts)0
-rw-r--r--tests/testdata/subdir/subdir2/dynamic_import.ts (renamed from cli/tests/testdata/subdir/subdir2/dynamic_import.ts)0
-rw-r--r--tests/testdata/subdir/subdir2/mod2.ts (renamed from cli/tests/testdata/subdir/subdir2/mod2.ts)0
-rw-r--r--tests/testdata/subdir/test_worker_basic.js (renamed from cli/tests/testdata/subdir/test_worker_basic.js)0
-rw-r--r--tests/testdata/subdir/throws.js (renamed from cli/tests/testdata/subdir/throws.js)0
-rw-r--r--tests/testdata/subdir/tla.ts (renamed from cli/tests/testdata/subdir/tla.ts)0
-rw-r--r--tests/testdata/subdir/type_and_code.ts (renamed from cli/tests/testdata/subdir/type_and_code.ts)0
-rw-r--r--tests/testdata/subdir/type_error.ts (renamed from cli/tests/testdata/subdir/type_error.ts)0
-rw-r--r--tests/testdata/subdir/type_reference.d.ts (renamed from cli/tests/testdata/subdir/type_reference.d.ts)0
-rw-r--r--tests/testdata/subdir/type_reference.js (renamed from cli/tests/testdata/subdir/type_reference.js)0
-rw-r--r--tests/testdata/subdir/types.d.mts (renamed from cli/tests/testdata/subdir/types.d.mts)0
-rw-r--r--tests/testdata/subdir/unknown_ext.deno (renamed from cli/tests/testdata/subdir/unknown_ext.deno)0
l---------tests/testdata/symlink_to_subdir (renamed from cli/tests/testdata/symlink_to_subdir)0
-rw-r--r--tests/testdata/task/both/deno.json (renamed from cli/tests/testdata/task/both/deno.json)0
-rw-r--r--tests/testdata/task/both/deno_selected.out (renamed from cli/tests/testdata/task/both/deno_selected.out)0
-rw-r--r--tests/testdata/task/both/echo.out (renamed from cli/tests/testdata/task/both/echo.out)0
-rw-r--r--tests/testdata/task/both/no_args.out (renamed from cli/tests/testdata/task/both/no_args.out)0
-rw-r--r--tests/testdata/task/both/package.json (renamed from cli/tests/testdata/task/both/package.json)0
-rw-r--r--tests/testdata/task/both/package_json_selected.out (renamed from cli/tests/testdata/task/both/package_json_selected.out)0
-rw-r--r--tests/testdata/task/both/prefers_deno.out (renamed from cli/tests/testdata/task/both/prefers_deno.out)0
-rw-r--r--tests/testdata/task/deno_json/deno.json (renamed from cli/tests/testdata/task/deno_json/deno.json)0
-rw-r--r--tests/testdata/task/deno_json/task_additional_args.out (renamed from cli/tests/testdata/task/deno_json/task_additional_args.out)0
-rw-r--r--tests/testdata/task/deno_json/task_additional_args_nested_strings.out (renamed from cli/tests/testdata/task/deno_json/task_additional_args_nested_strings.out)0
-rw-r--r--tests/testdata/task/deno_json/task_additional_args_no_logic.out (renamed from cli/tests/testdata/task/deno_json/task_additional_args_no_logic.out)0
-rw-r--r--tests/testdata/task/deno_json/task_additional_args_no_shell_expansion.out (renamed from cli/tests/testdata/task/deno_json/task_additional_args_no_shell_expansion.out)0
-rw-r--r--tests/testdata/task/deno_json/task_boolean_logic.out (renamed from cli/tests/testdata/task/deno_json/task_boolean_logic.out)0
-rw-r--r--tests/testdata/task/deno_json/task_cwd.out (renamed from cli/tests/testdata/task/deno_json/task_cwd.out)0
-rw-r--r--tests/testdata/task/deno_json/task_deno_exe_no_env.out (renamed from cli/tests/testdata/task/deno_json/task_deno_exe_no_env.out)0
-rw-r--r--tests/testdata/task/deno_json/task_exit_code_5.out (renamed from cli/tests/testdata/task/deno_json/task_exit_code_5.out)0
-rw-r--r--tests/testdata/task/deno_json/task_init_cwd.out (renamed from cli/tests/testdata/task/deno_json/task_init_cwd.out)0
-rw-r--r--tests/testdata/task/deno_json/task_init_cwd_already_set.out (renamed from cli/tests/testdata/task/deno_json/task_init_cwd_already_set.out)0
-rw-r--r--tests/testdata/task/deno_json/task_no_args.out (renamed from cli/tests/testdata/task/deno_json/task_no_args.out)0
-rw-r--r--tests/testdata/task/deno_json/task_non_existent.out (renamed from cli/tests/testdata/task/deno_json/task_non_existent.out)0
-rw-r--r--tests/testdata/task/deno_json/task_piped_stdin.out (renamed from cli/tests/testdata/task/deno_json/task_piped_stdin.out)0
-rw-r--r--tests/testdata/task/deno_json_pre_post/bin.out (renamed from cli/tests/testdata/task/deno_json_pre_post/bin.out)0
-rw-r--r--tests/testdata/task/deno_json_pre_post/deno.json (renamed from cli/tests/testdata/task/deno_json_pre_post/deno.json)0
-rw-r--r--tests/testdata/task/deno_json_pre_post/echo.out (renamed from cli/tests/testdata/task/deno_json_pre_post/echo.out)0
-rw-r--r--tests/testdata/task/npx/non_existent.out (renamed from cli/tests/testdata/task/npx/non_existent.out)0
-rw-r--r--tests/testdata/task/npx/on_own.out (renamed from cli/tests/testdata/task/npx/on_own.out)0
-rw-r--r--tests/testdata/task/npx/package.json (renamed from cli/tests/testdata/task/npx/package.json)0
-rw-r--r--tests/testdata/task/package_json/bin.out (renamed from cli/tests/testdata/task/package_json/bin.out)0
-rw-r--r--tests/testdata/task/package_json/echo.out (renamed from cli/tests/testdata/task/package_json/echo.out)0
-rw-r--r--tests/testdata/task/package_json/no_args.out (renamed from cli/tests/testdata/task/package_json/no_args.out)0
-rw-r--r--tests/testdata/task/package_json/package.json (renamed from cli/tests/testdata/task/package_json/package.json)0
-rw-r--r--tests/testdata/task/package_json_node_modules_dir_false/bin.out (renamed from cli/tests/testdata/task/package_json_node_modules_dir_false/bin.out)0
-rw-r--r--tests/testdata/task/package_json_node_modules_dir_false/deno.json (renamed from cli/tests/testdata/task/package_json_node_modules_dir_false/deno.json)0
-rw-r--r--tests/testdata/task/package_json_node_modules_dir_false/package.json (renamed from cli/tests/testdata/task/package_json_node_modules_dir_false/package.json)0
-rw-r--r--tests/testdata/task/package_json_post/bin.out (renamed from cli/tests/testdata/task/package_json_post/bin.out)0
-rw-r--r--tests/testdata/task/package_json_post/echo.out (renamed from cli/tests/testdata/task/package_json_post/echo.out)0
-rw-r--r--tests/testdata/task/package_json_post/package.json (renamed from cli/tests/testdata/task/package_json_post/package.json)0
-rw-r--r--tests/testdata/task/package_json_post_only/bin.out (renamed from cli/tests/testdata/task/package_json_post_only/bin.out)0
-rw-r--r--tests/testdata/task/package_json_post_only/echo.out (renamed from cli/tests/testdata/task/package_json_post_only/echo.out)0
-rw-r--r--tests/testdata/task/package_json_post_only/package.json (renamed from cli/tests/testdata/task/package_json_post_only/package.json)0
-rw-r--r--tests/testdata/task/package_json_pre/bin.out (renamed from cli/tests/testdata/task/package_json_pre/bin.out)0
-rw-r--r--tests/testdata/task/package_json_pre/echo.out (renamed from cli/tests/testdata/task/package_json_pre/echo.out)0
-rw-r--r--tests/testdata/task/package_json_pre/package.json (renamed from cli/tests/testdata/task/package_json_pre/package.json)0
-rw-r--r--tests/testdata/task/package_json_pre_only/bin.out (renamed from cli/tests/testdata/task/package_json_pre_only/bin.out)0
-rw-r--r--tests/testdata/task/package_json_pre_only/echo.out (renamed from cli/tests/testdata/task/package_json_pre_only/echo.out)0
-rw-r--r--tests/testdata/task/package_json_pre_only/package.json (renamed from cli/tests/testdata/task/package_json_pre_only/package.json)0
-rw-r--r--tests/testdata/task/package_json_pre_post/bin.out (renamed from cli/tests/testdata/task/package_json_pre_post/bin.out)0
-rw-r--r--tests/testdata/task/package_json_pre_post/echo.out (renamed from cli/tests/testdata/task/package_json_pre_post/echo.out)0
-rw-r--r--tests/testdata/task/package_json_pre_post/package.json (renamed from cli/tests/testdata/task/package_json_pre_post/package.json)0
-rw-r--r--tests/testdata/test/aggregate_error.out (renamed from cli/tests/testdata/test/aggregate_error.out)0
-rw-r--r--tests/testdata/test/aggregate_error.ts (renamed from cli/tests/testdata/test/aggregate_error.ts)0
-rw-r--r--tests/testdata/test/allow_all.out (renamed from cli/tests/testdata/test/allow_all.out)0
-rw-r--r--tests/testdata/test/allow_all.ts43
-rw-r--r--tests/testdata/test/allow_none.out (renamed from cli/tests/testdata/test/allow_none.out)0
-rw-r--r--tests/testdata/test/allow_none.ts23
-rw-r--r--tests/testdata/test/before_unload_prevent_default.out (renamed from cli/tests/testdata/test/before_unload_prevent_default.out)0
-rw-r--r--tests/testdata/test/before_unload_prevent_default.ts (renamed from cli/tests/testdata/test/before_unload_prevent_default.ts)0
-rw-r--r--tests/testdata/test/captured_output.ts (renamed from cli/tests/testdata/test/captured_output.ts)0
-rw-r--r--tests/testdata/test/captured_output.worker.js (renamed from cli/tests/testdata/test/captured_output.worker.js)0
-rw-r--r--tests/testdata/test/check_local_by_default.out (renamed from cli/tests/testdata/test/check_local_by_default.out)0
-rw-r--r--tests/testdata/test/check_local_by_default.ts (renamed from cli/tests/testdata/test/check_local_by_default.ts)0
-rw-r--r--tests/testdata/test/check_local_by_default2.out (renamed from cli/tests/testdata/test/check_local_by_default2.out)0
-rw-r--r--tests/testdata/test/check_local_by_default2.ts (renamed from cli/tests/testdata/test/check_local_by_default2.ts)0
-rw-r--r--tests/testdata/test/clear_timeout.out (renamed from cli/tests/testdata/test/clear_timeout.out)0
-rw-r--r--tests/testdata/test/clear_timeout.ts (renamed from cli/tests/testdata/test/clear_timeout.ts)0
-rw-r--r--tests/testdata/test/collect.deprecated.out (renamed from cli/tests/testdata/test/collect.deprecated.out)0
-rw-r--r--tests/testdata/test/collect.out (renamed from cli/tests/testdata/test/collect.out)0
-rw-r--r--tests/testdata/test/collect/deno.deprecated.jsonc (renamed from cli/tests/testdata/test/collect/deno.deprecated.jsonc)0
-rw-r--r--tests/testdata/test/collect/deno.jsonc (renamed from cli/tests/testdata/test/collect/deno.jsonc)0
-rw-r--r--tests/testdata/test/collect/deno.malformed.jsonc (renamed from cli/tests/testdata/test/collect/deno.malformed.jsonc)0
-rw-r--r--tests/testdata/test/collect/deno2.jsonc (renamed from cli/tests/testdata/test/collect/deno2.jsonc)0
-rw-r--r--tests/testdata/test/collect/ignore/test.ts (renamed from cli/tests/testdata/test/collect/ignore/test.ts)0
-rw-r--r--tests/testdata/test/collect/include.ts (renamed from cli/tests/testdata/test/collect/include.ts)0
-rw-r--r--tests/testdata/test/collect/include/2_test.ts (renamed from cli/tests/testdata/test/collect/include/2_test.ts)0
-rw-r--r--tests/testdata/test/collect/include/test.ts (renamed from cli/tests/testdata/test/collect/include/test.ts)0
-rw-r--r--tests/testdata/test/collect/test.ts (renamed from cli/tests/testdata/test/collect/test.ts)0
-rw-r--r--tests/testdata/test/collect2.out (renamed from cli/tests/testdata/test/collect2.out)0
-rw-r--r--tests/testdata/test/collect_with_malformed_config.out (renamed from cli/tests/testdata/test/collect_with_malformed_config.out)0
-rw-r--r--tests/testdata/test/deno.glob.json (renamed from cli/tests/testdata/test/deno.glob.json)0
-rw-r--r--tests/testdata/test/deno_custom_jsx.json (renamed from cli/tests/testdata/test/deno_custom_jsx.json)0
-rw-r--r--tests/testdata/test/doc.out (renamed from cli/tests/testdata/test/doc.out)0
-rw-r--r--tests/testdata/test/doc.ts (renamed from cli/tests/testdata/test/doc.ts)0
-rw-r--r--tests/testdata/test/doc_only.out (renamed from cli/tests/testdata/test/doc_only.out)0
-rw-r--r--tests/testdata/test/doc_only/mod.ts (renamed from cli/tests/testdata/test/doc_only/mod.ts)0
-rw-r--r--tests/testdata/test/exit_sanitizer.out (renamed from cli/tests/testdata/test/exit_sanitizer.out)0
-rw-r--r--tests/testdata/test/exit_sanitizer.ts (renamed from cli/tests/testdata/test/exit_sanitizer.ts)0
-rw-r--r--tests/testdata/test/fail.out (renamed from cli/tests/testdata/test/fail.out)0
-rw-r--r--tests/testdata/test/fail.ts (renamed from cli/tests/testdata/test/fail.ts)0
-rw-r--r--tests/testdata/test/fail_fast.out (renamed from cli/tests/testdata/test/fail_fast.out)0
-rw-r--r--tests/testdata/test/fail_fast.ts (renamed from cli/tests/testdata/test/fail_fast.ts)0
-rw-r--r--tests/testdata/test/fail_fast_other.ts (renamed from cli/tests/testdata/test/fail_fast_other.ts)0
-rw-r--r--tests/testdata/test/fail_fast_with_val.out (renamed from cli/tests/testdata/test/fail_fast_with_val.out)0
-rw-r--r--tests/testdata/test/fail_fast_with_val.ts (renamed from cli/tests/testdata/test/fail_fast_with_val.ts)0
-rw-r--r--tests/testdata/test/file_protocol.out (renamed from cli/tests/testdata/test/file_protocol.out)0
-rw-r--r--tests/testdata/test/file_protocol.ts (renamed from cli/tests/testdata/test/file_protocol.ts)0
-rw-r--r--tests/testdata/test/filter.out (renamed from cli/tests/testdata/test/filter.out)0
-rw-r--r--tests/testdata/test/filter/a_test.ts (renamed from cli/tests/testdata/test/filter/a_test.ts)0
-rw-r--r--tests/testdata/test/filter/b_test.ts (renamed from cli/tests/testdata/test/filter/b_test.ts)0
-rw-r--r--tests/testdata/test/filter/c_test.ts (renamed from cli/tests/testdata/test/filter/c_test.ts)0
-rw-r--r--tests/testdata/test/filtered_out_only.out (renamed from cli/tests/testdata/test/filtered_out_only.out)0
-rw-r--r--tests/testdata/test/filtered_out_only.ts (renamed from cli/tests/testdata/test/filtered_out_only.ts)0
-rw-r--r--tests/testdata/test/finally_timeout.out (renamed from cli/tests/testdata/test/finally_timeout.out)0
-rw-r--r--tests/testdata/test/finally_timeout.ts (renamed from cli/tests/testdata/test/finally_timeout.ts)0
-rw-r--r--tests/testdata/test/glob/data/tes.ts (renamed from cli/tests/testdata/test/glob/data/tes.ts)0
-rw-r--r--tests/testdata/test/glob/data/test1.js (renamed from cli/tests/testdata/test/glob/data/test1.js)0
-rw-r--r--tests/testdata/test/glob/data/test1.ts (renamed from cli/tests/testdata/test/glob/data/test1.ts)0
-rw-r--r--tests/testdata/test/glob/data/test12.ts (renamed from cli/tests/testdata/test/glob/data/test12.ts)0
-rw-r--r--tests/testdata/test/glob/nested/fizz/bar.ts (renamed from cli/tests/testdata/test/glob/nested/fizz/bar.ts)0
-rw-r--r--tests/testdata/test/glob/nested/fizz/bazz.ts (renamed from cli/tests/testdata/test/glob/nested/fizz/bazz.ts)0
-rw-r--r--tests/testdata/test/glob/nested/fizz/fizz.ts (renamed from cli/tests/testdata/test/glob/nested/fizz/fizz.ts)0
-rw-r--r--tests/testdata/test/glob/nested/fizz/foo.ts (renamed from cli/tests/testdata/test/glob/nested/fizz/foo.ts)0
-rw-r--r--tests/testdata/test/glob/nested/foo/bar.ts (renamed from cli/tests/testdata/test/glob/nested/foo/bar.ts)0
-rw-r--r--tests/testdata/test/glob/nested/foo/bazz.ts (renamed from cli/tests/testdata/test/glob/nested/foo/bazz.ts)0
-rw-r--r--tests/testdata/test/glob/nested/foo/fizz.ts (renamed from cli/tests/testdata/test/glob/nested/foo/fizz.ts)0
-rw-r--r--tests/testdata/test/glob/nested/foo/foo.ts (renamed from cli/tests/testdata/test/glob/nested/foo/foo.ts)0
-rw-r--r--tests/testdata/test/glob/pages/[id].ts (renamed from cli/tests/testdata/test/glob/pages/[id].ts)0
-rw-r--r--tests/testdata/test/hello_world.out (renamed from cli/tests/testdata/test/hello_world.out)0
-rw-r--r--tests/testdata/test/hello_world.ts (renamed from cli/tests/testdata/test/hello_world.ts)0
-rw-r--r--tests/testdata/test/hide_empty_suites.out (renamed from cli/tests/testdata/test/hide_empty_suites.out)0
-rw-r--r--tests/testdata/test/ignore.out (renamed from cli/tests/testdata/test/ignore.out)0
-rw-r--r--tests/testdata/test/ignore.ts (renamed from cli/tests/testdata/test/ignore.ts)0
-rw-r--r--tests/testdata/test/ignore_permissions.out (renamed from cli/tests/testdata/test/ignore_permissions.out)0
-rw-r--r--tests/testdata/test/ignore_permissions.ts (renamed from cli/tests/testdata/test/ignore_permissions.ts)0
-rw-r--r--tests/testdata/test/interval.out (renamed from cli/tests/testdata/test/interval.out)0
-rw-r--r--tests/testdata/test/interval.ts (renamed from cli/tests/testdata/test/interval.ts)0
-rw-r--r--tests/testdata/test/load_unload.out (renamed from cli/tests/testdata/test/load_unload.out)0
-rw-r--r--tests/testdata/test/load_unload.ts (renamed from cli/tests/testdata/test/load_unload.ts)0
-rw-r--r--tests/testdata/test/markdown.md (renamed from cli/tests/testdata/test/markdown.md)0
-rw-r--r--tests/testdata/test/markdown.out (renamed from cli/tests/testdata/test/markdown.out)0
-rw-r--r--tests/testdata/test/markdown_full_block_names.md (renamed from cli/tests/testdata/test/markdown_full_block_names.md)0
-rw-r--r--tests/testdata/test/markdown_full_block_names.out (renamed from cli/tests/testdata/test/markdown_full_block_names.out)0
-rw-r--r--tests/testdata/test/markdown_windows.md (renamed from cli/tests/testdata/test/markdown_windows.md)0
-rw-r--r--tests/testdata/test/markdown_windows.out (renamed from cli/tests/testdata/test/markdown_windows.out)0
-rw-r--r--tests/testdata/test/markdown_with_comment.md (renamed from cli/tests/testdata/test/markdown_with_comment.md)0
-rw-r--r--tests/testdata/test/markdown_with_comment.out (renamed from cli/tests/testdata/test/markdown_with_comment.out)0
-rw-r--r--tests/testdata/test/meta.out (renamed from cli/tests/testdata/test/meta.out)0
-rw-r--r--tests/testdata/test/meta.ts (renamed from cli/tests/testdata/test/meta.ts)0
-rw-r--r--tests/testdata/test/no_check.out (renamed from cli/tests/testdata/test/no_check.out)0
-rw-r--r--tests/testdata/test/no_check.ts (renamed from cli/tests/testdata/test/no_check.ts)0
-rw-r--r--tests/testdata/test/no_color.ts (renamed from cli/tests/testdata/test/no_color.ts)0
-rw-r--r--tests/testdata/test/no_prompt_by_default.out (renamed from cli/tests/testdata/test/no_prompt_by_default.out)0
-rw-r--r--tests/testdata/test/no_prompt_by_default.ts (renamed from cli/tests/testdata/test/no_prompt_by_default.ts)0
-rw-r--r--tests/testdata/test/no_prompt_with_denied_perms.out (renamed from cli/tests/testdata/test/no_prompt_with_denied_perms.out)0
-rw-r--r--tests/testdata/test/no_prompt_with_denied_perms.ts (renamed from cli/tests/testdata/test/no_prompt_with_denied_perms.ts)0
-rw-r--r--tests/testdata/test/no_run.out (renamed from cli/tests/testdata/test/no_run.out)0
-rw-r--r--tests/testdata/test/no_run.ts (renamed from cli/tests/testdata/test/no_run.ts)0
-rw-r--r--tests/testdata/test/non_error_thrown.out (renamed from cli/tests/testdata/test/non_error_thrown.out)0
-rw-r--r--tests/testdata/test/non_error_thrown.ts (renamed from cli/tests/testdata/test/non_error_thrown.ts)0
-rw-r--r--tests/testdata/test/only.out (renamed from cli/tests/testdata/test/only.out)0
-rw-r--r--tests/testdata/test/only.ts (renamed from cli/tests/testdata/test/only.ts)0
-rw-r--r--tests/testdata/test/ops_sanitizer_closed_inside_started_before.out19
-rw-r--r--tests/testdata/test/ops_sanitizer_closed_inside_started_before.ts (renamed from cli/tests/testdata/test/ops_sanitizer_closed_inside_started_before.ts)0
-rw-r--r--tests/testdata/test/ops_sanitizer_missing_details.out (renamed from cli/tests/testdata/test/ops_sanitizer_missing_details.out)0
-rw-r--r--tests/testdata/test/ops_sanitizer_missing_details.ts10
-rw-r--r--tests/testdata/test/ops_sanitizer_multiple_timeout_tests.out (renamed from cli/tests/testdata/test/ops_sanitizer_multiple_timeout_tests.out)0
-rw-r--r--tests/testdata/test/ops_sanitizer_multiple_timeout_tests.ts (renamed from cli/tests/testdata/test/ops_sanitizer_multiple_timeout_tests.ts)0
-rw-r--r--tests/testdata/test/ops_sanitizer_multiple_timeout_tests_no_trace.out (renamed from cli/tests/testdata/test/ops_sanitizer_multiple_timeout_tests_no_trace.out)0
-rw-r--r--tests/testdata/test/ops_sanitizer_nexttick.out (renamed from cli/tests/testdata/test/ops_sanitizer_nexttick.out)0
-rw-r--r--tests/testdata/test/ops_sanitizer_nexttick.ts (renamed from cli/tests/testdata/test/ops_sanitizer_nexttick.ts)0
-rw-r--r--tests/testdata/test/ops_sanitizer_step_leak.out10
-rw-r--r--tests/testdata/test/ops_sanitizer_step_leak.ts (renamed from cli/tests/testdata/test/ops_sanitizer_step_leak.ts)0
-rw-r--r--tests/testdata/test/ops_sanitizer_timeout_failure.out (renamed from cli/tests/testdata/test/ops_sanitizer_timeout_failure.out)0
-rw-r--r--tests/testdata/test/ops_sanitizer_timeout_failure.ts (renamed from cli/tests/testdata/test/ops_sanitizer_timeout_failure.ts)0
-rw-r--r--tests/testdata/test/ops_sanitizer_unstable.out (renamed from cli/tests/testdata/test/ops_sanitizer_unstable.out)0
-rw-r--r--tests/testdata/test/ops_sanitizer_unstable.ts (renamed from cli/tests/testdata/test/ops_sanitizer_unstable.ts)0
-rw-r--r--tests/testdata/test/overloads.out (renamed from cli/tests/testdata/test/overloads.out)0
-rw-r--r--tests/testdata/test/overloads.ts (renamed from cli/tests/testdata/test/overloads.ts)0
-rw-r--r--tests/testdata/test/parallel_output.out (renamed from cli/tests/testdata/test/parallel_output.out)0
-rw-r--r--tests/testdata/test/parallel_output.ts (renamed from cli/tests/testdata/test/parallel_output.ts)0
-rw-r--r--tests/testdata/test/pass.junit.out (renamed from cli/tests/testdata/test/pass.junit.out)0
-rw-r--r--tests/testdata/test/pass.out (renamed from cli/tests/testdata/test/pass.out)0
-rw-r--r--tests/testdata/test/pass.ts (renamed from cli/tests/testdata/test/pass.ts)0
-rw-r--r--tests/testdata/test/quiet.out (renamed from cli/tests/testdata/test/quiet.out)0
-rw-r--r--tests/testdata/test/quiet.ts (renamed from cli/tests/testdata/test/quiet.ts)0
-rw-r--r--tests/testdata/test/recursive_permissions_pledge.js (renamed from cli/tests/testdata/test/recursive_permissions_pledge.js)0
-rw-r--r--tests/testdata/test/relative_pattern_dot_slash/deno.json (renamed from cli/tests/testdata/test/relative_pattern_dot_slash/deno.json)0
-rw-r--r--tests/testdata/test/relative_pattern_dot_slash/output.out (renamed from cli/tests/testdata/test/relative_pattern_dot_slash/output.out)0
-rw-r--r--tests/testdata/test/relative_pattern_dot_slash/test/add.mjs (renamed from cli/tests/testdata/test/relative_pattern_dot_slash/test/add.mjs)0
-rw-r--r--tests/testdata/test/relative_pattern_dot_slash/test/add.test.mjs (renamed from cli/tests/testdata/test/relative_pattern_dot_slash/test/add.test.mjs)0
-rw-r--r--tests/testdata/test/replace_timers.js (renamed from cli/tests/testdata/test/replace_timers.js)0
-rw-r--r--tests/testdata/test/replace_timers.js.out (renamed from cli/tests/testdata/test/replace_timers.js.out)0
-rw-r--r--tests/testdata/test/report_error.out (renamed from cli/tests/testdata/test/report_error.out)0
-rw-r--r--tests/testdata/test/report_error.ts (renamed from cli/tests/testdata/test/report_error.ts)0
-rw-r--r--tests/testdata/test/resource_sanitizer.out (renamed from cli/tests/testdata/test/resource_sanitizer.out)0
-rw-r--r--tests/testdata/test/resource_sanitizer.ts (renamed from cli/tests/testdata/test/resource_sanitizer.ts)0
-rw-r--r--tests/testdata/test/short-pass-jobs-flag-warning.out (renamed from cli/tests/testdata/test/short-pass-jobs-flag-warning.out)0
-rw-r--r--tests/testdata/test/short-pass.out (renamed from cli/tests/testdata/test/short-pass.out)0
-rw-r--r--tests/testdata/test/short-pass.ts (renamed from cli/tests/testdata/test/short-pass.ts)0
-rw-r--r--tests/testdata/test/shuffle.out (renamed from cli/tests/testdata/test/shuffle.out)0
-rw-r--r--tests/testdata/test/shuffle/bar_test.ts (renamed from cli/tests/testdata/test/shuffle/bar_test.ts)0
-rw-r--r--tests/testdata/test/shuffle/baz_test.ts (renamed from cli/tests/testdata/test/shuffle/baz_test.ts)0
-rw-r--r--tests/testdata/test/shuffle/foo_test.ts (renamed from cli/tests/testdata/test/shuffle/foo_test.ts)0
-rw-r--r--tests/testdata/test/sigint_with_hanging_test.out (renamed from cli/tests/testdata/test/sigint_with_hanging_test.out)0
-rw-r--r--tests/testdata/test/sigint_with_hanging_test.ts (renamed from cli/tests/testdata/test/sigint_with_hanging_test.ts)0
-rw-r--r--tests/testdata/test/steps/failing_steps.dot.out (renamed from cli/tests/testdata/test/steps/failing_steps.dot.out)0
-rw-r--r--tests/testdata/test/steps/failing_steps.out (renamed from cli/tests/testdata/test/steps/failing_steps.out)0
-rw-r--r--tests/testdata/test/steps/failing_steps.tap.out (renamed from cli/tests/testdata/test/steps/failing_steps.tap.out)0
-rw-r--r--tests/testdata/test/steps/failing_steps.ts (renamed from cli/tests/testdata/test/steps/failing_steps.ts)0
-rw-r--r--tests/testdata/test/steps/ignored_steps.dot.out (renamed from cli/tests/testdata/test/steps/ignored_steps.dot.out)0
-rw-r--r--tests/testdata/test/steps/ignored_steps.out (renamed from cli/tests/testdata/test/steps/ignored_steps.out)0
-rw-r--r--tests/testdata/test/steps/ignored_steps.tap.out (renamed from cli/tests/testdata/test/steps/ignored_steps.tap.out)0
-rw-r--r--tests/testdata/test/steps/ignored_steps.ts (renamed from cli/tests/testdata/test/steps/ignored_steps.ts)0
-rw-r--r--tests/testdata/test/steps/invalid_usage.out (renamed from cli/tests/testdata/test/steps/invalid_usage.out)0
-rw-r--r--tests/testdata/test/steps/invalid_usage.ts (renamed from cli/tests/testdata/test/steps/invalid_usage.ts)0
-rw-r--r--tests/testdata/test/steps/output_within.out (renamed from cli/tests/testdata/test/steps/output_within.out)0
-rw-r--r--tests/testdata/test/steps/output_within.ts (renamed from cli/tests/testdata/test/steps/output_within.ts)0
-rw-r--r--tests/testdata/test/steps/passing_steps.dot.out (renamed from cli/tests/testdata/test/steps/passing_steps.dot.out)0
-rw-r--r--tests/testdata/test/steps/passing_steps.out (renamed from cli/tests/testdata/test/steps/passing_steps.out)0
-rw-r--r--tests/testdata/test/steps/passing_steps.tap.out (renamed from cli/tests/testdata/test/steps/passing_steps.tap.out)0
-rw-r--r--tests/testdata/test/steps/passing_steps.ts (renamed from cli/tests/testdata/test/steps/passing_steps.ts)0
-rw-r--r--tests/testdata/test/text.md (renamed from cli/tests/testdata/test/text.md)0
-rw-r--r--tests/testdata/test/text.out (renamed from cli/tests/testdata/test/text.out)0
-rw-r--r--tests/testdata/test/trace_ops_caught_error/main.out (renamed from cli/tests/testdata/test/trace_ops_caught_error/main.out)0
-rw-r--r--tests/testdata/test/trace_ops_caught_error/main.ts (renamed from cli/tests/testdata/test/trace_ops_caught_error/main.ts)0
-rw-r--r--tests/testdata/test/uncaught_errors.out (renamed from cli/tests/testdata/test/uncaught_errors.out)0
-rw-r--r--tests/testdata/test/uncaught_errors_1.ts (renamed from cli/tests/testdata/test/uncaught_errors_1.ts)0
-rw-r--r--tests/testdata/test/uncaught_errors_2.ts (renamed from cli/tests/testdata/test/uncaught_errors_2.ts)0
-rw-r--r--tests/testdata/test/uncaught_errors_3.ts (renamed from cli/tests/testdata/test/uncaught_errors_3.ts)0
-rw-r--r--tests/testdata/test/unhandled_rejection.out (renamed from cli/tests/testdata/test/unhandled_rejection.out)0
-rw-r--r--tests/testdata/test/unhandled_rejection.ts (renamed from cli/tests/testdata/test/unhandled_rejection.ts)0
-rw-r--r--tests/testdata/test/unresolved_promise.out (renamed from cli/tests/testdata/test/unresolved_promise.out)0
-rw-r--r--tests/testdata/test/unresolved_promise.ts (renamed from cli/tests/testdata/test/unresolved_promise.ts)0
-rw-r--r--tests/testdata/tls/README.md (renamed from cli/tests/testdata/tls/README.md)0
-rw-r--r--tests/testdata/tls/RootCA.crt (renamed from cli/tests/testdata/tls/RootCA.crt)0
-rw-r--r--tests/testdata/tls/RootCA.key (renamed from cli/tests/testdata/tls/RootCA.key)0
-rw-r--r--tests/testdata/tls/RootCA.pem (renamed from cli/tests/testdata/tls/RootCA.pem)0
-rw-r--r--tests/testdata/tls/domains.txt (renamed from cli/tests/testdata/tls/domains.txt)0
-rw-r--r--tests/testdata/tls/invalid.crt (renamed from cli/tests/testdata/tls/invalid.crt)0
-rw-r--r--tests/testdata/tls/invalid.key (renamed from cli/tests/testdata/tls/invalid.key)0
-rw-r--r--tests/testdata/tls/localhost.crt (renamed from cli/tests/testdata/tls/localhost.crt)0
-rw-r--r--tests/testdata/tls/localhost.key (renamed from cli/tests/testdata/tls/localhost.key)0
-rw-r--r--tests/testdata/tsc/a.js (renamed from cli/tests/testdata/tsc/a.js)0
-rw-r--r--tests/testdata/tsc/d.ts (renamed from cli/tests/testdata/tsc/d.ts)0
-rw-r--r--tests/testdata/tsc/node_modules/b.js (renamed from cli/tests/testdata/tsc/node_modules/b.js)0
-rw-r--r--tests/testdata/tsc/node_modules/c.js (renamed from cli/tests/testdata/tsc/node_modules/c.js)0
-rw-r--r--tests/testdata/tsc/test.js (renamed from cli/tests/testdata/tsc/test.js)0
-rw-r--r--tests/testdata/tsc2/file_exportc.ts (renamed from cli/tests/testdata/tsc2/file_exportc.ts)0
-rw-r--r--tests/testdata/tsc2/file_libref.ts (renamed from cli/tests/testdata/tsc2/file_libref.ts)0
-rw-r--r--tests/testdata/tsc2/file_main.ts (renamed from cli/tests/testdata/tsc2/file_main.ts)0
-rw-r--r--tests/testdata/tsc2/file_reexports.ts (renamed from cli/tests/testdata/tsc2/file_reexports.ts)0
-rw-r--r--tests/testdata/tsc2/https_deno.land-x-a.ts (renamed from cli/tests/testdata/tsc2/https_deno.land-x-a.ts)0
-rw-r--r--tests/testdata/tsc2/https_deno.land-x-b.ts (renamed from cli/tests/testdata/tsc2/https_deno.land-x-b.ts)0
-rw-r--r--tests/testdata/tsc2/https_deno.land-x-c.d.ts (renamed from cli/tests/testdata/tsc2/https_deno.land-x-c.d.ts)0
-rw-r--r--tests/testdata/tsc2/https_deno.land-x-c.js (renamed from cli/tests/testdata/tsc2/https_deno.land-x-c.js)0
-rw-r--r--tests/testdata/tsc2/https_deno.land-x-mod.ts (renamed from cli/tests/testdata/tsc2/https_deno.land-x-mod.ts)0
-rw-r--r--tests/testdata/type_definitions/bar.d.ts (renamed from cli/tests/testdata/type_definitions/bar.d.ts)0
-rw-r--r--tests/testdata/type_definitions/bar.js (renamed from cli/tests/testdata/type_definitions/bar.js)0
-rw-r--r--tests/testdata/type_definitions/fizz.d.ts (renamed from cli/tests/testdata/type_definitions/fizz.d.ts)0
-rw-r--r--tests/testdata/type_definitions/fizz.js (renamed from cli/tests/testdata/type_definitions/fizz.js)0
-rw-r--r--tests/testdata/type_definitions/foo.d.ts (renamed from cli/tests/testdata/type_definitions/foo.d.ts)0
-rw-r--r--tests/testdata/type_definitions/foo.js (renamed from cli/tests/testdata/type_definitions/foo.js)0
-rw-r--r--tests/testdata/type_definitions/qat.ts (renamed from cli/tests/testdata/type_definitions/qat.ts)0
-rw-r--r--tests/testdata/types/types.out (renamed from cli/tests/testdata/types/types.out)0
-rw-r--r--tests/testdata/vendor/dynamic.ts (renamed from cli/tests/testdata/vendor/dynamic.ts)0
-rw-r--r--tests/testdata/vendor/dynamic_non_analyzable.ts (renamed from cli/tests/testdata/vendor/dynamic_non_analyzable.ts)0
-rw-r--r--tests/testdata/vendor/dynamic_non_existent.ts (renamed from cli/tests/testdata/vendor/dynamic_non_existent.ts)0
-rw-r--r--tests/testdata/vendor/dynamic_non_existent.ts.out (renamed from cli/tests/testdata/vendor/dynamic_non_existent.ts.out)0
-rw-r--r--tests/testdata/vendor/logger.ts (renamed from cli/tests/testdata/vendor/logger.ts)0
-rw-r--r--tests/testdata/vendor/mod.ts (renamed from cli/tests/testdata/vendor/mod.ts)0
-rw-r--r--tests/testdata/vendor/npm_and_node_specifier.ts (renamed from cli/tests/testdata/vendor/npm_and_node_specifier.ts)0
-rw-r--r--tests/testdata/vendor/query_reexport.ts (renamed from cli/tests/testdata/vendor/query_reexport.ts)0
-rw-r--r--tests/testdata/webcrypto/id_rsaEncryption.pem (renamed from cli/tests/testdata/webcrypto/id_rsaEncryption.pem)0
-rw-r--r--tests/testdata/webcrypto/id_rsassaPss.pem (renamed from cli/tests/testdata/webcrypto/id_rsassaPss.pem)0
-rw-r--r--tests/testdata/webcrypto/id_rsassaPss_default.pem (renamed from cli/tests/testdata/webcrypto/id_rsassaPss_default.pem)0
-rw-r--r--tests/testdata/webcrypto/id_rsassaPss_saltLen_30.pem (renamed from cli/tests/testdata/webcrypto/id_rsassaPss_saltLen_30.pem)0
-rw-r--r--tests/testdata/webgpu/computepass_shader.wgsl (renamed from cli/tests/testdata/webgpu/computepass_shader.wgsl)0
-rw-r--r--tests/testdata/webgpu/hellotriangle.out (renamed from cli/tests/testdata/webgpu/hellotriangle.out)bin204800 -> 204800 bytes
-rw-r--r--tests/testdata/webgpu/hellotriangle_shader.wgsl (renamed from cli/tests/testdata/webgpu/hellotriangle_shader.wgsl)0
-rw-r--r--tests/testdata/welcome.ts (renamed from cli/tests/testdata/welcome.ts)0
-rw-r--r--tests/testdata/workers/async_error.ts (renamed from cli/tests/testdata/workers/async_error.ts)0
-rw-r--r--tests/testdata/workers/bench_large_message.ts (renamed from cli/tests/testdata/workers/bench_large_message.ts)0
-rw-r--r--tests/testdata/workers/bench_round_robin.ts (renamed from cli/tests/testdata/workers/bench_round_robin.ts)0
-rw-r--r--tests/testdata/workers/bench_startup.ts (renamed from cli/tests/testdata/workers/bench_startup.ts)0
-rw-r--r--tests/testdata/workers/bench_worker.ts (renamed from cli/tests/testdata/workers/bench_worker.ts)0
-rw-r--r--tests/testdata/workers/broadcast_channel.ts (renamed from cli/tests/testdata/workers/broadcast_channel.ts)0
-rw-r--r--tests/testdata/workers/busy_worker.js (renamed from cli/tests/testdata/workers/busy_worker.js)0
-rw-r--r--tests/testdata/workers/close_in_wasm_reactions.js (renamed from cli/tests/testdata/workers/close_in_wasm_reactions.js)0
-rw-r--r--tests/testdata/workers/close_nested_child.js (renamed from cli/tests/testdata/workers/close_nested_child.js)0
-rw-r--r--tests/testdata/workers/close_nested_parent.js (renamed from cli/tests/testdata/workers/close_nested_parent.js)0
-rw-r--r--tests/testdata/workers/close_race_worker.js (renamed from cli/tests/testdata/workers/close_race_worker.js)0
-rw-r--r--tests/testdata/workers/custom_inspect/main.out (renamed from cli/tests/testdata/workers/custom_inspect/main.out)0
-rw-r--r--tests/testdata/workers/custom_inspect/main.ts (renamed from cli/tests/testdata/workers/custom_inspect/main.ts)0
-rw-r--r--tests/testdata/workers/custom_inspect/worker.ts (renamed from cli/tests/testdata/workers/custom_inspect/worker.ts)0
-rw-r--r--tests/testdata/workers/deno_worker.ts16
-rw-r--r--tests/testdata/workers/drop_handle_race.js (renamed from cli/tests/testdata/workers/drop_handle_race.js)0
-rw-r--r--tests/testdata/workers/dynamic_remote.ts (renamed from cli/tests/testdata/workers/dynamic_remote.ts)0
-rw-r--r--tests/testdata/workers/env_read_check_worker.js (renamed from cli/tests/testdata/workers/env_read_check_worker.js)0
-rw-r--r--tests/testdata/workers/error.ts (renamed from cli/tests/testdata/workers/error.ts)0
-rw-r--r--tests/testdata/workers/error_event.ts (renamed from cli/tests/testdata/workers/error_event.ts)0
-rw-r--r--tests/testdata/workers/error_event.ts.out (renamed from cli/tests/testdata/workers/error_event.ts.out)0
-rw-r--r--tests/testdata/workers/error_worker_permissions_local.ts (renamed from cli/tests/testdata/workers/error_worker_permissions_local.ts)0
-rw-r--r--tests/testdata/workers/error_worker_permissions_local.ts.out (renamed from cli/tests/testdata/workers/error_worker_permissions_local.ts.out)0
-rw-r--r--tests/testdata/workers/error_worker_permissions_remote.ts (renamed from cli/tests/testdata/workers/error_worker_permissions_remote.ts)0
-rw-r--r--tests/testdata/workers/error_worker_permissions_remote.ts.out (renamed from cli/tests/testdata/workers/error_worker_permissions_remote.ts.out)0
-rw-r--r--tests/testdata/workers/event_worker.js (renamed from cli/tests/testdata/workers/event_worker.js)0
-rw-r--r--tests/testdata/workers/event_worker_scope.js (renamed from cli/tests/testdata/workers/event_worker_scope.js)0
-rw-r--r--tests/testdata/workers/fetching_worker.js (renamed from cli/tests/testdata/workers/fetching_worker.js)0
-rw-r--r--tests/testdata/workers/http_worker.js (renamed from cli/tests/testdata/workers/http_worker.js)0
-rw-r--r--tests/testdata/workers/image_data_worker.ts (renamed from cli/tests/testdata/workers/image_data_worker.ts)0
-rw-r--r--tests/testdata/workers/immediately_close_worker.js (renamed from cli/tests/testdata/workers/immediately_close_worker.js)0
-rw-r--r--tests/testdata/workers/message_before_close.js (renamed from cli/tests/testdata/workers/message_before_close.js)0
-rw-r--r--tests/testdata/workers/message_handler_error.ts (renamed from cli/tests/testdata/workers/message_handler_error.ts)0
-rw-r--r--tests/testdata/workers/message_port.ts (renamed from cli/tests/testdata/workers/message_port.ts)0
-rw-r--r--tests/testdata/workers/nested_worker.js (renamed from cli/tests/testdata/workers/nested_worker.js)0
-rw-r--r--tests/testdata/workers/no_permissions_worker.js (renamed from cli/tests/testdata/workers/no_permissions_worker.js)0
-rw-r--r--tests/testdata/workers/non_deno_worker.js (renamed from cli/tests/testdata/workers/non_deno_worker.js)0
-rw-r--r--tests/testdata/workers/nonexistent_worker.out (renamed from cli/tests/testdata/workers/nonexistent_worker.out)0
-rw-r--r--tests/testdata/workers/nonexistent_worker.ts (renamed from cli/tests/testdata/workers/nonexistent_worker.ts)0
-rw-r--r--tests/testdata/workers/parent_read_check_worker.js (renamed from cli/tests/testdata/workers/parent_read_check_worker.js)0
-rw-r--r--tests/testdata/workers/permission_echo.js (renamed from cli/tests/testdata/workers/permission_echo.js)0
-rw-r--r--tests/testdata/workers/permissions_blob_local.ts (renamed from cli/tests/testdata/workers/permissions_blob_local.ts)0
-rw-r--r--tests/testdata/workers/permissions_blob_local.ts.out (renamed from cli/tests/testdata/workers/permissions_blob_local.ts.out)0
-rw-r--r--tests/testdata/workers/permissions_blob_remote.ts (renamed from cli/tests/testdata/workers/permissions_blob_remote.ts)0
-rw-r--r--tests/testdata/workers/permissions_blob_remote.ts.out (renamed from cli/tests/testdata/workers/permissions_blob_remote.ts.out)0
-rw-r--r--tests/testdata/workers/permissions_data_local.ts (renamed from cli/tests/testdata/workers/permissions_data_local.ts)0
-rw-r--r--tests/testdata/workers/permissions_data_local.ts.out (renamed from cli/tests/testdata/workers/permissions_data_local.ts.out)0
-rw-r--r--tests/testdata/workers/permissions_data_remote.ts (renamed from cli/tests/testdata/workers/permissions_data_remote.ts)0
-rw-r--r--tests/testdata/workers/permissions_data_remote.ts.out (renamed from cli/tests/testdata/workers/permissions_data_remote.ts.out)0
-rw-r--r--tests/testdata/workers/permissions_dynamic_remote.ts (renamed from cli/tests/testdata/workers/permissions_dynamic_remote.ts)0
-rw-r--r--tests/testdata/workers/permissions_dynamic_remote.ts.out (renamed from cli/tests/testdata/workers/permissions_dynamic_remote.ts.out)0
-rw-r--r--tests/testdata/workers/permissions_remote_remote.ts (renamed from cli/tests/testdata/workers/permissions_remote_remote.ts)0
-rw-r--r--tests/testdata/workers/permissions_remote_remote.ts.out (renamed from cli/tests/testdata/workers/permissions_remote_remote.ts.out)0
-rw-r--r--tests/testdata/workers/post_undefined.ts (renamed from cli/tests/testdata/workers/post_undefined.ts)0
-rw-r--r--tests/testdata/workers/racy_worker.js (renamed from cli/tests/testdata/workers/racy_worker.js)0
-rw-r--r--tests/testdata/workers/read_check_granular_worker.js (renamed from cli/tests/testdata/workers/read_check_granular_worker.js)0
-rw-r--r--tests/testdata/workers/read_check_worker.js (renamed from cli/tests/testdata/workers/read_check_worker.js)0
-rw-r--r--tests/testdata/workers/shared_array_buffer.ts (renamed from cli/tests/testdata/workers/shared_array_buffer.ts)0
-rw-r--r--tests/testdata/workers/sibling_worker.js (renamed from cli/tests/testdata/workers/sibling_worker.js)0
-rw-r--r--tests/testdata/workers/static_remote.ts (renamed from cli/tests/testdata/workers/static_remote.ts)0
-rw-r--r--tests/testdata/workers/terminate_tla_crash.js (renamed from cli/tests/testdata/workers/terminate_tla_crash.js)0
-rw-r--r--tests/testdata/workers/terminate_tla_crash.js.out (renamed from cli/tests/testdata/workers/terminate_tla_crash.js.out)0
-rw-r--r--tests/testdata/workers/test_worker.js (renamed from cli/tests/testdata/workers/test_worker.js)0
-rw-r--r--tests/testdata/workers/test_worker.ts (renamed from cli/tests/testdata/workers/test_worker.ts)0
-rw-r--r--tests/testdata/workers/throwing_worker.js (renamed from cli/tests/testdata/workers/throwing_worker.js)0
-rw-r--r--tests/testdata/workers/worker_async_error.ts (renamed from cli/tests/testdata/workers/worker_async_error.ts)0
-rw-r--r--tests/testdata/workers/worker_async_error.ts.out (renamed from cli/tests/testdata/workers/worker_async_error.ts.out)0
-rw-r--r--tests/testdata/workers/worker_crypto.js (renamed from cli/tests/testdata/workers/worker_crypto.js)0
-rw-r--r--tests/testdata/workers/worker_doest_stall_event_loop.ts (renamed from cli/tests/testdata/workers/worker_doest_stall_event_loop.ts)0
-rw-r--r--tests/testdata/workers/worker_doest_stall_event_loop.ts.out (renamed from cli/tests/testdata/workers/worker_doest_stall_event_loop.ts.out)0
-rw-r--r--tests/testdata/workers/worker_error.ts (renamed from cli/tests/testdata/workers/worker_error.ts)0
-rw-r--r--tests/testdata/workers/worker_error.ts.out (renamed from cli/tests/testdata/workers/worker_error.ts.out)0
-rw-r--r--tests/testdata/workers/worker_event_handlers.js (renamed from cli/tests/testdata/workers/worker_event_handlers.js)0
-rw-r--r--tests/testdata/workers/worker_globals.ts (renamed from cli/tests/testdata/workers/worker_globals.ts)0
-rw-r--r--tests/testdata/workers/worker_large_message.js (renamed from cli/tests/testdata/workers/worker_large_message.js)0
-rw-r--r--tests/testdata/workers/worker_location.ts (renamed from cli/tests/testdata/workers/worker_location.ts)0
-rw-r--r--tests/testdata/workers/worker_message_handler_error.ts (renamed from cli/tests/testdata/workers/worker_message_handler_error.ts)0
-rw-r--r--tests/testdata/workers/worker_message_handler_error.ts.out (renamed from cli/tests/testdata/workers/worker_message_handler_error.ts.out)0
-rw-r--r--tests/testdata/workers/worker_navigator.ts (renamed from cli/tests/testdata/workers/worker_navigator.ts)0
-rw-r--r--tests/testdata/workers/worker_nested_error.ts (renamed from cli/tests/testdata/workers/worker_nested_error.ts)0
-rw-r--r--tests/testdata/workers/worker_nested_error.ts.out (renamed from cli/tests/testdata/workers/worker_nested_error.ts.out)0
-rw-r--r--tests/testdata/workers/worker_structured_cloning.ts (renamed from cli/tests/testdata/workers/worker_structured_cloning.ts)0
-rw-r--r--tests/testdata/workers/worker_types.ts (renamed from cli/tests/testdata/workers/worker_types.ts)0
-rw-r--r--tests/testdata/workers/worker_unstable.ts (renamed from cli/tests/testdata/workers/worker_unstable.ts)0
-rw-r--r--tests/testdata/workers/worker_with_top_level_await.ts (renamed from cli/tests/testdata/workers/worker_with_top_level_await.ts)0
-rw-r--r--tests/unit/README.md (renamed from cli/tests/unit/README.md)0
-rw-r--r--tests/unit/abort_controller_test.ts (renamed from cli/tests/unit/abort_controller_test.ts)0
-rw-r--r--tests/unit/blob_test.ts (renamed from cli/tests/unit/blob_test.ts)0
-rw-r--r--tests/unit/body_test.ts (renamed from cli/tests/unit/body_test.ts)0
-rw-r--r--tests/unit/broadcast_channel_test.ts (renamed from cli/tests/unit/broadcast_channel_test.ts)0
-rw-r--r--tests/unit/buffer_test.ts (renamed from cli/tests/unit/buffer_test.ts)0
-rw-r--r--tests/unit/build_test.ts (renamed from cli/tests/unit/build_test.ts)0
-rw-r--r--tests/unit/cache_api_test.ts (renamed from cli/tests/unit/cache_api_test.ts)0
-rw-r--r--tests/unit/chmod_test.ts (renamed from cli/tests/unit/chmod_test.ts)0
-rw-r--r--tests/unit/chown_test.ts (renamed from cli/tests/unit/chown_test.ts)0
-rw-r--r--tests/unit/command_test.ts (renamed from cli/tests/unit/command_test.ts)0
-rw-r--r--tests/unit/console_test.ts (renamed from cli/tests/unit/console_test.ts)0
-rw-r--r--tests/unit/copy_file_test.ts (renamed from cli/tests/unit/copy_file_test.ts)0
-rw-r--r--tests/unit/cron_test.ts (renamed from cli/tests/unit/cron_test.ts)0
-rw-r--r--tests/unit/custom_event_test.ts (renamed from cli/tests/unit/custom_event_test.ts)0
-rw-r--r--tests/unit/dir_test.ts (renamed from cli/tests/unit/dir_test.ts)0
-rw-r--r--tests/unit/dom_exception_test.ts (renamed from cli/tests/unit/dom_exception_test.ts)0
-rw-r--r--tests/unit/error_stack_test.ts (renamed from cli/tests/unit/error_stack_test.ts)0
-rw-r--r--tests/unit/error_test.ts (renamed from cli/tests/unit/error_test.ts)0
-rw-r--r--tests/unit/esnext_test.ts (renamed from cli/tests/unit/esnext_test.ts)0
-rw-r--r--tests/unit/event_target_test.ts (renamed from cli/tests/unit/event_target_test.ts)0
-rw-r--r--tests/unit/event_test.ts (renamed from cli/tests/unit/event_test.ts)0
-rw-r--r--tests/unit/fetch_test.ts2071
-rw-r--r--tests/unit/ffi_test.ts (renamed from cli/tests/unit/ffi_test.ts)0
-rw-r--r--tests/unit/file_test.ts (renamed from cli/tests/unit/file_test.ts)0
-rw-r--r--tests/unit/filereader_test.ts (renamed from cli/tests/unit/filereader_test.ts)0
-rw-r--r--tests/unit/files_test.ts1095
-rw-r--r--tests/unit/flock_test.ts197
-rw-r--r--tests/unit/fs_events_test.ts (renamed from cli/tests/unit/fs_events_test.ts)0
-rw-r--r--tests/unit/get_random_values_test.ts (renamed from cli/tests/unit/get_random_values_test.ts)0
-rw-r--r--tests/unit/globals_test.ts (renamed from cli/tests/unit/globals_test.ts)0
-rw-r--r--tests/unit/headers_test.ts (renamed from cli/tests/unit/headers_test.ts)0
-rw-r--r--tests/unit/http_test.ts2801
-rw-r--r--tests/unit/image_bitmap_test.ts (renamed from cli/tests/unit/image_bitmap_test.ts)0
-rw-r--r--tests/unit/image_data_test.ts (renamed from cli/tests/unit/image_data_test.ts)0
-rw-r--r--tests/unit/internals_test.ts (renamed from cli/tests/unit/internals_test.ts)0
-rw-r--r--tests/unit/intl_test.ts (renamed from cli/tests/unit/intl_test.ts)0
-rw-r--r--tests/unit/io_test.ts (renamed from cli/tests/unit/io_test.ts)0
-rw-r--r--tests/unit/jupyter_test.ts (renamed from cli/tests/unit/jupyter_test.ts)0
-rw-r--r--tests/unit/kv_queue_test.ts (renamed from cli/tests/unit/kv_queue_test.ts)0
-rw-r--r--tests/unit/kv_queue_test_no_db_close.ts (renamed from cli/tests/unit/kv_queue_test_no_db_close.ts)0
-rw-r--r--tests/unit/kv_queue_undelivered_test.ts (renamed from cli/tests/unit/kv_queue_undelivered_test.ts)0
-rw-r--r--tests/unit/kv_test.ts (renamed from cli/tests/unit/kv_test.ts)0
-rw-r--r--tests/unit/link_test.ts (renamed from cli/tests/unit/link_test.ts)0
-rw-r--r--tests/unit/make_temp_test.ts (renamed from cli/tests/unit/make_temp_test.ts)0
-rw-r--r--tests/unit/message_channel_test.ts (renamed from cli/tests/unit/message_channel_test.ts)0
-rw-r--r--tests/unit/mkdir_test.ts (renamed from cli/tests/unit/mkdir_test.ts)0
-rw-r--r--tests/unit/navigator_test.ts (renamed from cli/tests/unit/navigator_test.ts)0
-rw-r--r--tests/unit/net_test.ts1274
-rw-r--r--tests/unit/network_interfaces_test.ts (renamed from cli/tests/unit/network_interfaces_test.ts)0
-rw-r--r--tests/unit/ops_test.ts (renamed from cli/tests/unit/ops_test.ts)0
-rw-r--r--tests/unit/os_test.ts (renamed from cli/tests/unit/os_test.ts)0
-rw-r--r--tests/unit/path_from_url_test.ts (renamed from cli/tests/unit/path_from_url_test.ts)0
-rw-r--r--tests/unit/performance_test.ts (renamed from cli/tests/unit/performance_test.ts)0
-rw-r--r--tests/unit/permissions_test.ts (renamed from cli/tests/unit/permissions_test.ts)0
-rw-r--r--tests/unit/process_test.ts (renamed from cli/tests/unit/process_test.ts)0
-rw-r--r--tests/unit/progressevent_test.ts (renamed from cli/tests/unit/progressevent_test.ts)0
-rw-r--r--tests/unit/promise_hooks_test.ts (renamed from cli/tests/unit/promise_hooks_test.ts)0
-rw-r--r--tests/unit/read_dir_test.ts113
-rw-r--r--tests/unit/read_file_test.ts182
-rw-r--r--tests/unit/read_link_test.ts (renamed from cli/tests/unit/read_link_test.ts)0
-rw-r--r--tests/unit/read_text_file_test.ts208
-rw-r--r--tests/unit/real_path_test.ts114
-rw-r--r--tests/unit/ref_unref_test.ts (renamed from cli/tests/unit/ref_unref_test.ts)0
-rw-r--r--tests/unit/remove_test.ts (renamed from cli/tests/unit/remove_test.ts)0
-rw-r--r--tests/unit/rename_test.ts (renamed from cli/tests/unit/rename_test.ts)0
-rw-r--r--tests/unit/request_test.ts (renamed from cli/tests/unit/request_test.ts)0
-rw-r--r--tests/unit/resources_test.ts55
-rw-r--r--tests/unit/response_test.ts (renamed from cli/tests/unit/response_test.ts)0
-rw-r--r--tests/unit/serve_test.ts3932
-rw-r--r--tests/unit/signal_test.ts (renamed from cli/tests/unit/signal_test.ts)0
-rw-r--r--tests/unit/stat_test.ts342
-rw-r--r--tests/unit/stdio_test.ts (renamed from cli/tests/unit/stdio_test.ts)0
-rw-r--r--tests/unit/streams_test.ts (renamed from cli/tests/unit/streams_test.ts)0
-rw-r--r--tests/unit/structured_clone_test.ts (renamed from cli/tests/unit/structured_clone_test.ts)0
-rw-r--r--tests/unit/symbol_test.ts (renamed from cli/tests/unit/symbol_test.ts)0
-rw-r--r--tests/unit/symlink_test.ts (renamed from cli/tests/unit/symlink_test.ts)0
-rw-r--r--tests/unit/sync_test.ts (renamed from cli/tests/unit/sync_test.ts)0
-rw-r--r--tests/unit/test_util.ts (renamed from cli/tests/unit/test_util.ts)0
-rw-r--r--tests/unit/testing_test.ts (renamed from cli/tests/unit/testing_test.ts)0
-rw-r--r--tests/unit/text_encoding_test.ts (renamed from cli/tests/unit/text_encoding_test.ts)0
-rw-r--r--tests/unit/timers_test.ts (renamed from cli/tests/unit/timers_test.ts)0
-rw-r--r--tests/unit/tls_test.ts1546
-rw-r--r--tests/unit/truncate_test.ts (renamed from cli/tests/unit/truncate_test.ts)0
-rw-r--r--tests/unit/tty_color_test.ts (renamed from cli/tests/unit/tty_color_test.ts)0
-rw-r--r--tests/unit/tty_test.ts32
-rw-r--r--tests/unit/umask_test.ts (renamed from cli/tests/unit/umask_test.ts)0
-rw-r--r--tests/unit/url_search_params_test.ts (renamed from cli/tests/unit/url_search_params_test.ts)0
-rw-r--r--tests/unit/url_test.ts (renamed from cli/tests/unit/url_test.ts)0
-rw-r--r--tests/unit/urlpattern_test.ts (renamed from cli/tests/unit/urlpattern_test.ts)0
-rw-r--r--tests/unit/utime_test.ts (renamed from cli/tests/unit/utime_test.ts)0
-rw-r--r--tests/unit/version_test.ts (renamed from cli/tests/unit/version_test.ts)0
-rw-r--r--tests/unit/wasm_test.ts (renamed from cli/tests/unit/wasm_test.ts)0
-rw-r--r--tests/unit/webcrypto_test.ts2047
-rw-r--r--tests/unit/webgpu_test.ts267
-rw-r--r--tests/unit/websocket_test.ts738
-rw-r--r--tests/unit/websocketstream_test.ts.disabled (renamed from cli/tests/unit/websocketstream_test.ts.disabled)0
-rw-r--r--tests/unit/webstorage_test.ts (renamed from cli/tests/unit/webstorage_test.ts)0
-rw-r--r--tests/unit/worker_permissions_test.ts (renamed from cli/tests/unit/worker_permissions_test.ts)0
-rw-r--r--tests/unit/worker_test.ts (renamed from cli/tests/unit/worker_test.ts)0
-rw-r--r--tests/unit/write_file_test.ts (renamed from cli/tests/unit/write_file_test.ts)0
-rw-r--r--tests/unit/write_text_file_test.ts (renamed from cli/tests/unit/write_text_file_test.ts)0
-rw-r--r--tests/unit_node/_fs/_fs_access_test.ts (renamed from cli/tests/unit_node/_fs/_fs_access_test.ts)0
-rw-r--r--tests/unit_node/_fs/_fs_appendFile_test.ts (renamed from cli/tests/unit_node/_fs/_fs_appendFile_test.ts)0
-rw-r--r--tests/unit_node/_fs/_fs_chmod_test.ts (renamed from cli/tests/unit_node/_fs/_fs_chmod_test.ts)0
-rw-r--r--tests/unit_node/_fs/_fs_chown_test.ts (renamed from cli/tests/unit_node/_fs/_fs_chown_test.ts)0
-rw-r--r--tests/unit_node/_fs/_fs_close_test.ts (renamed from cli/tests/unit_node/_fs/_fs_close_test.ts)0
-rw-r--r--tests/unit_node/_fs/_fs_copy_test.ts (renamed from cli/tests/unit_node/_fs/_fs_copy_test.ts)0
-rw-r--r--tests/unit_node/_fs/_fs_dir_test.ts (renamed from cli/tests/unit_node/_fs/_fs_dir_test.ts)0
-rw-r--r--tests/unit_node/_fs/_fs_dirent_test.ts (renamed from cli/tests/unit_node/_fs/_fs_dirent_test.ts)0
-rw-r--r--tests/unit_node/_fs/_fs_exists_test.ts (renamed from cli/tests/unit_node/_fs/_fs_exists_test.ts)0
-rw-r--r--tests/unit_node/_fs/_fs_fdatasync_test.ts (renamed from cli/tests/unit_node/_fs/_fs_fdatasync_test.ts)0
-rw-r--r--tests/unit_node/_fs/_fs_fstat_test.ts (renamed from cli/tests/unit_node/_fs/_fs_fstat_test.ts)0
-rw-r--r--tests/unit_node/_fs/_fs_fsync_test.ts (renamed from cli/tests/unit_node/_fs/_fs_fsync_test.ts)0
-rw-r--r--tests/unit_node/_fs/_fs_ftruncate_test.ts (renamed from cli/tests/unit_node/_fs/_fs_ftruncate_test.ts)0
-rw-r--r--tests/unit_node/_fs/_fs_futimes_test.ts (renamed from cli/tests/unit_node/_fs/_fs_futimes_test.ts)0
-rw-r--r--tests/unit_node/_fs/_fs_handle_test.ts (renamed from cli/tests/unit_node/_fs/_fs_handle_test.ts)0
-rw-r--r--tests/unit_node/_fs/_fs_link_test.ts (renamed from cli/tests/unit_node/_fs/_fs_link_test.ts)0
-rw-r--r--tests/unit_node/_fs/_fs_lstat_test.ts (renamed from cli/tests/unit_node/_fs/_fs_lstat_test.ts)0
-rw-r--r--tests/unit_node/_fs/_fs_mkdir_test.ts (renamed from cli/tests/unit_node/_fs/_fs_mkdir_test.ts)0
-rw-r--r--tests/unit_node/_fs/_fs_mkdtemp_test.ts (renamed from cli/tests/unit_node/_fs/_fs_mkdtemp_test.ts)0
-rw-r--r--tests/unit_node/_fs/_fs_open_test.ts (renamed from cli/tests/unit_node/_fs/_fs_open_test.ts)0
-rw-r--r--tests/unit_node/_fs/_fs_opendir_test.ts (renamed from cli/tests/unit_node/_fs/_fs_opendir_test.ts)0
-rw-r--r--tests/unit_node/_fs/_fs_readFile_test.ts (renamed from cli/tests/unit_node/_fs/_fs_readFile_test.ts)0
-rw-r--r--tests/unit_node/_fs/_fs_read_test.ts (renamed from cli/tests/unit_node/_fs/_fs_read_test.ts)0
-rw-r--r--tests/unit_node/_fs/_fs_readdir_test.ts (renamed from cli/tests/unit_node/_fs/_fs_readdir_test.ts)0
-rw-r--r--tests/unit_node/_fs/_fs_readlink_test.ts (renamed from cli/tests/unit_node/_fs/_fs_readlink_test.ts)0
-rw-r--r--tests/unit_node/_fs/_fs_realpath_test.ts (renamed from cli/tests/unit_node/_fs/_fs_realpath_test.ts)0
-rw-r--r--tests/unit_node/_fs/_fs_rename_test.ts (renamed from cli/tests/unit_node/_fs/_fs_rename_test.ts)0
-rw-r--r--tests/unit_node/_fs/_fs_rm_test.ts (renamed from cli/tests/unit_node/_fs/_fs_rm_test.ts)0
-rw-r--r--tests/unit_node/_fs/_fs_rmdir_test.ts (renamed from cli/tests/unit_node/_fs/_fs_rmdir_test.ts)0
-rw-r--r--tests/unit_node/_fs/_fs_stat_test.ts (renamed from cli/tests/unit_node/_fs/_fs_stat_test.ts)0
-rw-r--r--tests/unit_node/_fs/_fs_symlink_test.ts (renamed from cli/tests/unit_node/_fs/_fs_symlink_test.ts)0
-rw-r--r--tests/unit_node/_fs/_fs_truncate_test.ts (renamed from cli/tests/unit_node/_fs/_fs_truncate_test.ts)0
-rw-r--r--tests/unit_node/_fs/_fs_unlink_test.ts (renamed from cli/tests/unit_node/_fs/_fs_unlink_test.ts)0
-rw-r--r--tests/unit_node/_fs/_fs_utimes_test.ts (renamed from cli/tests/unit_node/_fs/_fs_utimes_test.ts)0
-rw-r--r--tests/unit_node/_fs/_fs_watch_test.ts (renamed from cli/tests/unit_node/_fs/_fs_watch_test.ts)0
-rw-r--r--tests/unit_node/_fs/_fs_writeFile_test.ts (renamed from cli/tests/unit_node/_fs/_fs_writeFile_test.ts)0
-rw-r--r--tests/unit_node/_fs/_fs_write_test.ts (renamed from cli/tests/unit_node/_fs/_fs_write_test.ts)0
-rw-r--r--tests/unit_node/_fs/testdata/hello.txt (renamed from cli/tests/unit_node/_fs/testdata/hello.txt)0
-rw-r--r--tests/unit_node/_test_utils.ts (renamed from cli/tests/unit_node/_test_utils.ts)0
-rw-r--r--tests/unit_node/assertion_error_test.ts (renamed from cli/tests/unit_node/assertion_error_test.ts)0
-rw-r--r--tests/unit_node/async_hooks_test.ts (renamed from cli/tests/unit_node/async_hooks_test.ts)0
-rw-r--r--tests/unit_node/buffer_test.ts (renamed from cli/tests/unit_node/buffer_test.ts)0
-rw-r--r--tests/unit_node/child_process_test.ts (renamed from cli/tests/unit_node/child_process_test.ts)0
-rw-r--r--tests/unit_node/console_test.ts (renamed from cli/tests/unit_node/console_test.ts)0
-rw-r--r--tests/unit_node/crypto/crypto_cipher_gcm_test.ts (renamed from cli/tests/unit_node/crypto/crypto_cipher_gcm_test.ts)0
-rw-r--r--tests/unit_node/crypto/crypto_cipher_test.ts (renamed from cli/tests/unit_node/crypto/crypto_cipher_test.ts)0
-rw-r--r--tests/unit_node/crypto/crypto_hash_test.ts (renamed from cli/tests/unit_node/crypto/crypto_hash_test.ts)0
-rw-r--r--tests/unit_node/crypto/crypto_key_test.ts (renamed from cli/tests/unit_node/crypto/crypto_key_test.ts)0
-rw-r--r--tests/unit_node/crypto/crypto_sign_test.ts (renamed from cli/tests/unit_node/crypto/crypto_sign_test.ts)0
-rw-r--r--tests/unit_node/crypto/ec_private_secp256r1.pem (renamed from cli/tests/unit_node/crypto/ec_private_secp256r1.pem)0
-rw-r--r--tests/unit_node/crypto/gcmEncryptExtIV128.json (renamed from cli/tests/unit_node/crypto/gcmEncryptExtIV128.json)0
-rw-r--r--tests/unit_node/crypto/gcmEncryptExtIV256.json (renamed from cli/tests/unit_node/crypto/gcmEncryptExtIV256.json)0
-rw-r--r--tests/unit_node/dgram_test.ts (renamed from cli/tests/unit_node/dgram_test.ts)0
-rw-r--r--tests/unit_node/events_test.ts (renamed from cli/tests/unit_node/events_test.ts)0
-rw-r--r--tests/unit_node/fs_test.ts116
-rw-r--r--tests/unit_node/http2_test.ts (renamed from cli/tests/unit_node/http2_test.ts)0
-rw-r--r--tests/unit_node/http_test.ts940
-rw-r--r--tests/unit_node/internal/_randomBytes_test.ts (renamed from cli/tests/unit_node/internal/_randomBytes_test.ts)0
-rw-r--r--tests/unit_node/internal/_randomFill_test.ts (renamed from cli/tests/unit_node/internal/_randomFill_test.ts)0
-rw-r--r--tests/unit_node/internal/_randomInt_test.ts (renamed from cli/tests/unit_node/internal/_randomInt_test.ts)0
-rw-r--r--tests/unit_node/internal/pbkdf2_test.ts (renamed from cli/tests/unit_node/internal/pbkdf2_test.ts)0
-rw-r--r--tests/unit_node/internal/scrypt_test.ts (renamed from cli/tests/unit_node/internal/scrypt_test.ts)0
-rw-r--r--tests/unit_node/module_test.ts72
-rw-r--r--tests/unit_node/net_test.ts (renamed from cli/tests/unit_node/net_test.ts)0
-rw-r--r--tests/unit_node/os_test.ts (renamed from cli/tests/unit_node/os_test.ts)0
-rw-r--r--tests/unit_node/path_test.ts (renamed from cli/tests/unit_node/path_test.ts)0
-rw-r--r--tests/unit_node/perf_hooks_test.ts (renamed from cli/tests/unit_node/perf_hooks_test.ts)0
-rw-r--r--tests/unit_node/process_test.ts (renamed from cli/tests/unit_node/process_test.ts)0
-rw-r--r--tests/unit_node/querystring_test.ts (renamed from cli/tests/unit_node/querystring_test.ts)0
-rw-r--r--tests/unit_node/readline_test.ts (renamed from cli/tests/unit_node/readline_test.ts)0
-rw-r--r--tests/unit_node/repl_test.ts (renamed from cli/tests/unit_node/repl_test.ts)0
-rw-r--r--tests/unit_node/stream_test.ts (renamed from cli/tests/unit_node/stream_test.ts)0
-rw-r--r--tests/unit_node/string_decoder_test.ts (renamed from cli/tests/unit_node/string_decoder_test.ts)0
-rw-r--r--tests/unit_node/testdata/add_global_property.js (renamed from cli/tests/unit_node/testdata/add_global_property.js)0
-rw-r--r--tests/unit_node/testdata/add_global_property_run_main.js (renamed from cli/tests/unit_node/testdata/add_global_property_run_main.js)0
-rw-r--r--tests/unit_node/testdata/binary_stdio.js (renamed from cli/tests/unit_node/testdata/binary_stdio.js)0
-rw-r--r--tests/unit_node/testdata/child_process_stdio.js (renamed from cli/tests/unit_node/testdata/child_process_stdio.js)0
-rw-r--r--tests/unit_node/testdata/child_process_stdio_012.js (renamed from cli/tests/unit_node/testdata/child_process_stdio_012.js)0
-rw-r--r--tests/unit_node/testdata/child_process_unref.js (renamed from cli/tests/unit_node/testdata/child_process_unref.js)0
-rw-r--r--tests/unit_node/testdata/exec_file_text_error.js (renamed from cli/tests/unit_node/testdata/exec_file_text_error.js)0
-rw-r--r--tests/unit_node/testdata/exec_file_text_output.js (renamed from cli/tests/unit_node/testdata/exec_file_text_output.js)0
-rw-r--r--tests/unit_node/testdata/infinite_loop.js (renamed from cli/tests/unit_node/testdata/infinite_loop.js)0
-rw-r--r--tests/unit_node/testdata/lorem_ipsum.txt (renamed from cli/tests/unit_node/testdata/lorem_ipsum.txt)0
-rw-r--r--tests/unit_node/testdata/node_modules/foo/index.js (renamed from cli/tests/unit_node/testdata/node_modules/foo/index.js)0
-rw-r--r--tests/unit_node/testdata/node_modules/foo/package.json (renamed from cli/tests/unit_node/testdata/node_modules/foo/package.json)0
-rw-r--r--tests/unit_node/testdata/process_exit.ts (renamed from cli/tests/unit_node/testdata/process_exit.ts)0
-rw-r--r--tests/unit_node/testdata/process_exit2.ts (renamed from cli/tests/unit_node/testdata/process_exit2.ts)0
-rw-r--r--tests/unit_node/testdata/process_really_exit.ts (renamed from cli/tests/unit_node/testdata/process_really_exit.ts)0
-rw-r--r--tests/unit_node/testdata/process_stdin.ts (renamed from cli/tests/unit_node/testdata/process_stdin.ts)0
-rw-r--r--tests/unit_node/testdata/process_stdin_dummy.txt (renamed from cli/tests/unit_node/testdata/process_stdin_dummy.txt)0
-rw-r--r--tests/unit_node/testdata/rsa_private.pem (renamed from cli/tests/unit_node/testdata/rsa_private.pem)0
-rw-r--r--tests/unit_node/testdata/rsa_private_pkcs1.pem (renamed from cli/tests/unit_node/testdata/rsa_private_pkcs1.pem)0
-rw-r--r--tests/unit_node/testdata/rsa_public.pem (renamed from cli/tests/unit_node/testdata/rsa_public.pem)0
-rw-r--r--tests/unit_node/testdata/worker_module/index.js (renamed from cli/tests/unit_node/testdata/worker_module/index.js)0
-rw-r--r--tests/unit_node/testdata/worker_module/other_file.js (renamed from cli/tests/unit_node/testdata/worker_module/other_file.js)0
-rw-r--r--tests/unit_node/testdata/worker_module/package.json (renamed from cli/tests/unit_node/testdata/worker_module/package.json)0
-rw-r--r--tests/unit_node/testdata/worker_threads.mjs (renamed from cli/tests/unit_node/testdata/worker_threads.mjs)0
-rw-r--r--tests/unit_node/timers_test.ts (renamed from cli/tests/unit_node/timers_test.ts)0
-rw-r--r--tests/unit_node/tls_test.ts (renamed from cli/tests/unit_node/tls_test.ts)0
-rw-r--r--tests/unit_node/tty_test.ts (renamed from cli/tests/unit_node/tty_test.ts)0
-rw-r--r--tests/unit_node/util_test.ts (renamed from cli/tests/unit_node/util_test.ts)0
-rw-r--r--tests/unit_node/v8_test.ts (renamed from cli/tests/unit_node/v8_test.ts)0
-rw-r--r--tests/unit_node/vm_test.ts (renamed from cli/tests/unit_node/vm_test.ts)0
-rw-r--r--tests/unit_node/worker_threads_test.ts (renamed from cli/tests/unit_node/worker_threads_test.ts)0
-rw-r--r--tests/unit_node/zlib_test.ts (renamed from cli/tests/unit_node/zlib_test.ts)0
-rw-r--r--tools/copyright_checker.js6
-rwxr-xr-xtools/lint.js22
-rw-r--r--tools/node_compat/TODO.md2
-rwxr-xr-xtools/node_compat/setup.ts8
3500 files changed, 20689 insertions, 20696 deletions
diff --git a/.dprint.json b/.dprint.json
index 2bc038e93..64e78ae13 100644
--- a/.dprint.json
+++ b/.dprint.json
@@ -27,21 +27,21 @@
"cli/tsc/dts/lib.es*.d.ts",
"cli/tsc/dts/typescript.d.ts",
"cli/tests/node_compat/test",
- "cli/tests/testdata/file_extensions/ts_with_js_extension.js",
- "cli/tests/testdata/fmt/badly_formatted.json",
- "cli/tests/testdata/fmt/badly_formatted.md",
- "cli/tests/testdata/fmt/badly_formatted.ipynb",
- "cli/tests/testdata/byte_order_mark.ts",
- "cli/tests/testdata/encoding",
- "cli/tests/testdata/fmt/",
- "cli/tests/testdata/lint/glob/",
- "cli/tests/testdata/test/glob/",
- "cli/tests/testdata/import_attributes/json_with_shebang.json",
- "cli/tests/testdata/run/error_syntax_empty_trailing_line.mjs",
- "cli/tests/testdata/run/inline_js_source_map*",
- "cli/tests/testdata/malformed_config/",
- "cli/tests/testdata/npm/registry/",
- "cli/tests/testdata/test/markdown_windows.md",
+ "tests/testdata/file_extensions/ts_with_js_extension.js",
+ "tests/testdata/fmt/badly_formatted.json",
+ "tests/testdata/fmt/badly_formatted.md",
+ "tests/testdata/fmt/badly_formatted.ipynb",
+ "tests/testdata/byte_order_mark.ts",
+ "tests/testdata/encoding",
+ "tests/testdata/fmt/",
+ "tests/testdata/lint/glob/",
+ "tests/testdata/test/glob/",
+ "tests/testdata/import_attributes/json_with_shebang.json",
+ "tests/testdata/run/error_syntax_empty_trailing_line.mjs",
+ "tests/testdata/run/inline_js_source_map*",
+ "tests/testdata/malformed_config/",
+ "tests/testdata/npm/registry/",
+ "tests/testdata/test/markdown_windows.md",
"cli/tsc/*typescript.js",
"gh-pages",
"target",
diff --git a/.gitattributes b/.gitattributes
index 1ae3e6d8e..1491e6e35 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -2,11 +2,11 @@
* text=auto eol=lf
*.png -text
-/cli/tests/testdata/encoding/* -text
+/tests/testdata/encoding/* -text
# Tell git which symlinks point to files, and which ones point to directories.
# This is relevant for Windows only, and requires git >= 2.19.2 to work.
-/cli/tests/testdata/symlink_to_subdir symlink=dir
+/tests/testdata/symlink_to_subdir symlink=dir
# Tell github these are vendored files.
# Doesn't include them in the language statistics.
@@ -14,4 +14,4 @@
/cli/dts/* linguist-vendored
# Keep Windows line endings in cross-platform doc check test file
-/cli/tests/testdata/test/markdown_windows.md eol=crlf
+/tests/testdata/test/markdown_windows.md eol=crlf
diff --git a/Cargo.toml b/Cargo.toml
index a43e1c178..868f78514 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -6,7 +6,6 @@ members = [
"bench_util",
"cli",
"cli/napi/sym",
- "cli/tests",
"ext/broadcast_channel",
"ext/cache",
"ext/canvas",
@@ -32,6 +31,7 @@ members = [
"test_ffi",
"test_napi",
"test_util",
+ "tests",
]
exclude = ["test_util/std/hash/_wasm"]
diff --git a/cli/Cargo.toml b/cli/Cargo.toml
index 25adbe57f..6ec311db6 100644
--- a/cli/Cargo.toml
+++ b/cli/Cargo.toml
@@ -19,7 +19,7 @@ doc = false
[[test]]
name = "integration"
-path = "tests/integration_tests_runner.rs"
+path = "../tests/integration_tests_runner.rs"
harness = false
[[bench]]
diff --git a/cli/bench/main.rs b/cli/bench/main.rs
index 415f66989..4f5946414 100644
--- a/cli/bench/main.rs
+++ b/cli/bench/main.rs
@@ -37,7 +37,7 @@ const EXEC_TIME_BENCHMARKS: &[(&str, &[&str], Option<i32>)] = &[
// invalidating that cache.
(
"cold_hello",
- &["run", "--reload", "cli/tests/testdata/run/002_hello.ts"],
+ &["run", "--reload", "tests/testdata/run/002_hello.ts"],
None,
),
(
@@ -45,23 +45,19 @@ const EXEC_TIME_BENCHMARKS: &[(&str, &[&str], Option<i32>)] = &[
&[
"run",
"--reload",
- "cli/tests/testdata/run/003_relative_import.ts",
+ "tests/testdata/run/003_relative_import.ts",
],
None,
),
- (
- "hello",
- &["run", "cli/tests/testdata/run/002_hello.ts"],
- None,
- ),
+ ("hello", &["run", "tests/testdata/run/002_hello.ts"], None),
(
"relative_import",
- &["run", "cli/tests/testdata/run/003_relative_import.ts"],
+ &["run", "tests/testdata/run/003_relative_import.ts"],
None,
),
(
"error_001",
- &["run", "cli/tests/testdata/run/error_001.ts"],
+ &["run", "tests/testdata/run/error_001.ts"],
Some(1),
),
(
@@ -70,7 +66,7 @@ const EXEC_TIME_BENCHMARKS: &[(&str, &[&str], Option<i32>)] = &[
"run",
"--reload",
"--no-check",
- "cli/tests/testdata/run/002_hello.ts",
+ "tests/testdata/run/002_hello.ts",
],
None,
),
@@ -79,7 +75,7 @@ const EXEC_TIME_BENCHMARKS: &[(&str, &[&str], Option<i32>)] = &[
&[
"run",
"--allow-read",
- "cli/tests/testdata/workers/bench_startup.ts",
+ "tests/testdata/workers/bench_startup.ts",
],
None,
),
@@ -88,7 +84,7 @@ const EXEC_TIME_BENCHMARKS: &[(&str, &[&str], Option<i32>)] = &[
&[
"run",
"--allow-read",
- "cli/tests/testdata/workers/bench_round_robin.ts",
+ "tests/testdata/workers/bench_round_robin.ts",
],
None,
),
@@ -97,31 +93,28 @@ const EXEC_TIME_BENCHMARKS: &[(&str, &[&str], Option<i32>)] = &[
&[
"run",
"--allow-read",
- "cli/tests/testdata/workers/bench_large_message.ts",
+ "tests/testdata/workers/bench_large_message.ts",
],
None,
),
(
"text_decoder",
- &["run", "cli/tests/testdata/benches/text_decoder_perf.js"],
+ &["run", "tests/testdata/benches/text_decoder_perf.js"],
None,
),
(
"text_encoder",
- &["run", "cli/tests/testdata/benches/text_encoder_perf.js"],
+ &["run", "tests/testdata/benches/text_encoder_perf.js"],
None,
),
(
"text_encoder_into",
- &[
- "run",
- "cli/tests/testdata/benches/text_encoder_into_perf.js",
- ],
+ &["run", "tests/testdata/benches/text_encoder_into_perf.js"],
None,
),
(
"response_string",
- &["run", "cli/tests/testdata/benches/response_string_perf.js"],
+ &["run", "tests/testdata/benches/response_string_perf.js"],
None,
),
(
@@ -314,7 +307,7 @@ fn get_binary_sizes(target_dir: &Path) -> Result<HashMap<String, i64>> {
const BUNDLES: &[(&str, &str)] = &[
("file_server", "./test_util/std/http/file_server.ts"),
- ("welcome", "./cli/tests/testdata/welcome.ts"),
+ ("welcome", "./tests/testdata/welcome.ts"),
];
fn bundle_benchmark(deno_exe: &Path) -> Result<HashMap<String, i64>> {
let mut sizes = HashMap::<String, i64>::new();
diff --git a/cli/tests/config/deno.json b/cli/tests/config/deno.json
deleted file mode 100644
index fe518960f..000000000
--- a/cli/tests/config/deno.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "imports": {
- "@test_util/": "../../../test_util/"
- }
-}
diff --git a/cli/tests/integration/compile_tests.rs b/cli/tests/integration/compile_tests.rs
deleted file mode 100644
index cf3bf023d..000000000
--- a/cli/tests/integration/compile_tests.rs
+++ /dev/null
@@ -1,1180 +0,0 @@
-// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
-
-use test_util as util;
-use util::assert_contains;
-use util::assert_not_contains;
-use util::testdata_path;
-use util::TestContext;
-use util::TestContextBuilder;
-
-#[test]
-fn compile_basic() {
- let context = TestContextBuilder::new().build();
- let dir = context.temp_dir();
- let exe = if cfg!(windows) {
- dir.path().join("welcome.exe")
- } else {
- dir.path().join("welcome")
- };
- // try this twice to ensure it works with the cache
- for _ in 0..2 {
- let output = context
- .new_command()
- .args_vec([
- "compile",
- "--output",
- &exe.to_string_lossy(),
- "../../../cli/tests/testdata/welcome.ts",
- ])
- .run();
- output.assert_exit_code(0);
- output.skip_output_check();
- let output = context.new_command().name(&exe).run();
- output.assert_matches_text("Welcome to Deno!\n");
- }
-
- // now ensure this works when the deno_dir is readonly
- let readonly_dir = dir.path().join("readonly");
- readonly_dir.make_dir_readonly();
- let readonly_sub_dir = readonly_dir.join("sub");
-
- let output = context
- .new_command()
- // it should fail creating this, but still work
- .env("DENO_DIR", readonly_sub_dir)
- .name(exe)
- .run();
- output.assert_matches_text("Welcome to Deno!\n");
-}
-
-#[test]
-fn standalone_args() {
- let context = TestContextBuilder::new().build();
- let dir = context.temp_dir();
- let exe = if cfg!(windows) {
- dir.path().join("args.exe")
- } else {
- dir.path().join("args")
- };
- context
- .new_command()
- .args_vec([
- "compile",
- "--output",
- &exe.to_string_lossy(),
- "./compile/args.ts",
- "a",
- "b",
- ])
- .run()
- .skip_output_check()
- .assert_exit_code(0);
- context
- .new_command()
- .name(&exe)
- .args("foo --bar --unstable")
- .run()
- .assert_matches_text("a\nb\nfoo\n--bar\n--unstable\n")
- .assert_exit_code(0);
-}
-
-#[test]
-fn standalone_error() {
- let context = TestContextBuilder::new().build();
- let dir = context.temp_dir();
- let exe = if cfg!(windows) {
- dir.path().join("error.exe")
- } else {
- dir.path().join("error")
- };
- context
- .new_command()
- .args_vec([
- "compile",
- "--output",
- &exe.to_string_lossy(),
- "./compile/standalone_error.ts",
- ])
- .run()
- .skip_output_check()
- .assert_exit_code(0);
-
- let output = context.new_command().name(&exe).split_output().run();
- output.assert_exit_code(1);
- output.assert_stdout_matches_text("");
- let stderr = output.stderr();
- // On Windows, we cannot assert the file path (because '\').
- // Instead we just check for relevant output.
- assert_contains!(stderr, "error: Uncaught (in promise) Error: boom!");
- assert_contains!(stderr, "throw new Error(\"boom!\");");
- assert_contains!(stderr, "\n at boom (file://");
- assert_contains!(stderr, "standalone_error.ts:2:9");
- assert_contains!(stderr, "at foo (file://");
- assert_contains!(stderr, "standalone_error.ts:5:3");
- assert_contains!(stderr, "standalone_error.ts:7:1");
-}
-
-#[test]
-fn standalone_error_module_with_imports() {
- let context = TestContextBuilder::new().build();
- let dir = context.temp_dir();
- let exe = if cfg!(windows) {
- dir.path().join("error.exe")
- } else {
- dir.path().join("error")
- };
- context
- .new_command()
- .args_vec([
- "compile",
- "--output",
- &exe.to_string_lossy(),
- "./compile/standalone_error_module_with_imports_1.ts",
- ])
- .run()
- .skip_output_check()
- .assert_exit_code(0);
-
- let output = context
- .new_command()
- .name(&exe)
- .env("NO_COLOR", "1")
- .split_output()
- .run();
- output.assert_stdout_matches_text("hello\n");
- let stderr = output.stderr();
- // On Windows, we cannot assert the file path (because '\').
- // Instead we just check for relevant output.
- assert_contains!(stderr, "error: Uncaught (in promise) Error: boom!");
- assert_contains!(stderr, "throw new Error(\"boom!\");");
- assert_contains!(stderr, "\n at file://");
- assert_contains!(stderr, "standalone_error_module_with_imports_2.ts:2:7");
- output.assert_exit_code(1);
-}
-
-#[test]
-fn standalone_load_datauri() {
- let context = TestContextBuilder::new().build();
- let dir = context.temp_dir();
- let exe = if cfg!(windows) {
- dir.path().join("load_datauri.exe")
- } else {
- dir.path().join("load_datauri")
- };
- context
- .new_command()
- .args_vec([
- "compile",
- "--output",
- &exe.to_string_lossy(),
- "./compile/standalone_import_datauri.ts",
- ])
- .run()
- .skip_output_check()
- .assert_exit_code(0);
- context
- .new_command()
- .name(&exe)
- .run()
- .assert_matches_text("Hello Deno!\n")
- .assert_exit_code(0);
-}
-
-// https://github.com/denoland/deno/issues/13704
-#[test]
-fn standalone_follow_redirects() {
- let context = TestContextBuilder::new().build();
- let dir = context.temp_dir();
- let exe = if cfg!(windows) {
- dir.path().join("follow_redirects.exe")
- } else {
- dir.path().join("follow_redirects")
- };
- context
- .new_command()
- .args_vec([
- "compile",
- "--output",
- &exe.to_string_lossy(),
- "./compile/standalone_follow_redirects.ts",
- ])
- .run()
- .skip_output_check()
- .assert_exit_code(0);
- context
- .new_command()
- .name(&exe)
- .run()
- .assert_matches_text("Hello\n")
- .assert_exit_code(0);
-}
-
-#[test]
-fn compile_with_file_exists_error() {
- let context = TestContextBuilder::new().build();
- let dir = context.temp_dir();
- let output_path = if cfg!(windows) {
- dir.path().join(r"args\")
- } else {
- dir.path().join("args/")
- };
- let file_path = dir.path().join("args");
- file_path.write("");
- context
- .new_command()
- .args_vec([
- "compile",
- "--output",
- &output_path.to_string_lossy(),
- "./compile/args.ts",
- ])
- .run()
- .assert_matches_text(&format!(
- concat!(
- "[WILDCARD]error: Could not compile to file '{}' because its parent directory ",
- "is an existing file. You can use the `--output <file-path>` flag to ",
- "provide an alternative name.\n",
- ),
- file_path,
- ))
- .assert_exit_code(1);
-}
-
-#[test]
-fn compile_with_directory_exists_error() {
- let context = TestContextBuilder::new().build();
- let dir = context.temp_dir();
- let exe = if cfg!(windows) {
- dir.path().join("args.exe")
- } else {
- dir.path().join("args")
- };
- std::fs::create_dir(&exe).unwrap();
- context.new_command()
- .args_vec([
- "compile",
- "--output",
- &exe.to_string_lossy(),
- "./compile/args.ts"
- ]).run()
- .assert_matches_text(&format!(
- concat!(
- "[WILDCARD]error: Could not compile to file '{}' because a directory exists with ",
- "the same name. You can use the `--output <file-path>` flag to ",
- "provide an alternative name.\n"
- ),
- exe
- ))
- .assert_exit_code(1);
-}
-
-#[test]
-fn compile_with_conflict_file_exists_error() {
- let context = TestContextBuilder::new().build();
- let dir = context.temp_dir();
- let exe = if cfg!(windows) {
- dir.path().join("args.exe")
- } else {
- dir.path().join("args")
- };
- std::fs::write(&exe, b"SHOULD NOT BE OVERWRITTEN").unwrap();
- context.new_command()
- .args_vec([
- "compile",
- "--output",
- &exe.to_string_lossy(),
- "./compile/args.ts"
- ]).run()
- .assert_matches_text(&format!(
- concat!(
- "[WILDCARD]error: Could not compile to file '{}' because the file already exists ",
- "and cannot be overwritten. Please delete the existing file or ",
- "use the `--output <file-path>` flag to provide an alternative name.\n"
- ),
- exe
- ))
- .assert_exit_code(1);
- exe.assert_matches_text("SHOULD NOT BE OVERWRITTEN");
-}
-
-#[test]
-fn compile_and_overwrite_file() {
- let context = TestContextBuilder::new().build();
- let dir = context.temp_dir();
- let exe = if cfg!(windows) {
- dir.path().join("args.exe")
- } else {
- dir.path().join("args")
- };
-
- // do this twice
- for _ in 0..2 {
- context
- .new_command()
- .args_vec([
- "compile",
- "--output",
- &exe.to_string_lossy(),
- "./compile/args.ts",
- ])
- .run()
- .skip_output_check()
- .assert_exit_code(0);
- assert!(&exe.exists());
- }
-}
-
-#[test]
-fn standalone_runtime_flags() {
- let context = TestContextBuilder::new().build();
- let dir = context.temp_dir();
- let exe = if cfg!(windows) {
- dir.path().join("flags.exe")
- } else {
- dir.path().join("flags")
- };
- context
- .new_command()
- .args_vec([
- "compile",
- "--allow-read",
- "--seed",
- "1",
- "--output",
- &exe.to_string_lossy(),
- "./compile/standalone_runtime_flags.ts",
- ])
- .run()
- .skip_output_check()
- .assert_exit_code(0);
- context
- .new_command()
- .env("NO_COLOR", "1")
- .name(&exe)
- .split_output()
- .run()
- .assert_stdout_matches_text("0.147205063401058\n")
- .assert_stderr_matches_text(
- "[WILDCARD]PermissionDenied: Requires write access to[WILDCARD]",
- )
- .assert_exit_code(1);
-}
-
-#[test]
-fn standalone_ext_flag_ts() {
- let context = TestContextBuilder::new().build();
- let dir = context.temp_dir();
- let exe = if cfg!(windows) {
- dir.path().join("ext_flag_ts.exe")
- } else {
- dir.path().join("ext_flag_ts")
- };
- context
- .new_command()
- .args_vec([
- "compile",
- "--ext",
- "ts",
- "--output",
- &exe.to_string_lossy(),
- "./file_extensions/ts_without_extension",
- ])
- .run()
- .skip_output_check()
- .assert_exit_code(0);
- context
- .new_command()
- .env("NO_COLOR", "1")
- .name(&exe)
- .run()
- .assert_matches_text("executing typescript with no extension\n")
- .assert_exit_code(0);
-}
-
-#[test]
-fn standalone_ext_flag_js() {
- let context = TestContextBuilder::new().build();
- let dir = context.temp_dir();
- let exe = if cfg!(windows) {
- dir.path().join("ext_flag_js.exe")
- } else {
- dir.path().join("ext_flag_js")
- };
- context
- .new_command()
- .args_vec([
- "compile",
- "--ext",
- "js",
- "--output",
- &exe.to_string_lossy(),
- "./file_extensions/js_without_extension",
- ])
- .run()
- .skip_output_check()
- .assert_exit_code(0);
- context
- .new_command()
- .env("NO_COLOR", "1")
- .name(&exe)
- .run()
- .assert_matches_text("executing javascript with no extension\n");
-}
-
-#[test]
-fn standalone_import_map() {
- let context = TestContextBuilder::new().build();
- let dir = context.temp_dir();
- let exe = if cfg!(windows) {
- dir.path().join("import_map.exe")
- } else {
- dir.path().join("import_map")
- };
- context
- .new_command()
- .args_vec([
- "compile",
- "--allow-read",
- "--import-map",
- "compile/standalone_import_map.json",
- "--output",
- &exe.to_string_lossy(),
- "./compile/standalone_import_map.ts",
- ])
- .run()
- .skip_output_check()
- .assert_exit_code(0);
- context
- .new_command()
- .name(&exe)
- .run()
- .skip_output_check()
- .assert_exit_code(0);
-}
-
-#[test]
-fn standalone_import_map_config_file() {
- let context = TestContextBuilder::new().build();
- let dir = context.temp_dir();
- let exe = if cfg!(windows) {
- dir.path().join("import_map.exe")
- } else {
- dir.path().join("import_map")
- };
- context
- .new_command()
- .args_vec([
- "compile",
- "--allow-read",
- "--config",
- "compile/standalone_import_map_config.json",
- "--output",
- &exe.to_string_lossy(),
- "./compile/standalone_import_map.ts",
- ])
- .run()
- .skip_output_check()
- .assert_exit_code(0);
- context
- .new_command()
- .name(&exe)
- .run()
- .skip_output_check()
- .assert_exit_code(0);
-}
-
-#[test]
-// https://github.com/denoland/deno/issues/12670
-fn skip_rebundle() {
- let context = TestContextBuilder::new().build();
- let dir = context.temp_dir();
- let exe = if cfg!(windows) {
- dir.path().join("hello_world.exe")
- } else {
- dir.path().join("hello_world")
- };
- let output = context
- .new_command()
- .args_vec([
- "compile",
- "--output",
- &exe.to_string_lossy(),
- "./run/001_hello.js",
- ])
- .run();
-
- //no "Bundle testdata_path/run/001_hello.js" in output
- assert_not_contains!(output.combined_output(), "Bundle");
-
- context
- .new_command()
- .name(&exe)
- .run()
- .assert_matches_text("Hello World\n")
- .assert_exit_code(0);
-}
-
-#[test]
-fn check_local_by_default() {
- let context = TestContext::with_http_server();
- let dir = context.temp_dir();
- let exe = if cfg!(windows) {
- dir.path().join("welcome.exe")
- } else {
- dir.path().join("welcome")
- };
- context
- .new_command()
- .args_vec([
- "compile",
- "--output",
- &exe.to_string_lossy(),
- "./compile/check_local_by_default.ts",
- ])
- .run()
- .skip_output_check()
- .assert_exit_code(0);
-}
-
-#[test]
-fn check_local_by_default2() {
- let context = TestContext::with_http_server();
- let dir = context.temp_dir();
- let exe = if cfg!(windows) {
- dir.path().join("welcome.exe")
- } else {
- dir.path().join("welcome")
- };
- context
- .new_command()
- .args_vec([
- "compile",
- "--output",
- &exe.to_string_lossy(),
- "./compile/check_local_by_default2.ts"
- ])
- .run()
- .assert_matches_text(
- r#"[WILDCARD]error: TS2322 [ERROR]: Type '12' is not assignable to type '"b"'.[WILDCARD]"#,
- )
- .assert_exit_code(1);
-}
-
-#[test]
-fn workers_basic() {
- let context = TestContext::with_http_server();
- let dir = context.temp_dir();
- let exe = if cfg!(windows) {
- dir.path().join("basic.exe")
- } else {
- dir.path().join("basic")
- };
- context
- .new_command()
- .args_vec([
- "compile",
- "--no-check",
- "--output",
- &exe.to_string_lossy(),
- "./compile/workers/basic.ts",
- ])
- .run()
- .skip_output_check()
- .assert_exit_code(0);
-
- context
- .new_command()
- .name(&exe)
- .run()
- .assert_matches_file("./compile/workers/basic.out")
- .assert_exit_code(0);
-}
-
-#[test]
-fn workers_not_in_module_map() {
- let context = TestContext::with_http_server();
- let temp_dir = context.temp_dir();
- let exe = if cfg!(windows) {
- temp_dir.path().join("not_in_module_map.exe")
- } else {
- temp_dir.path().join("not_in_module_map")
- };
- let output = context
- .new_command()
- .args_vec([
- "compile",
- "--output",
- &exe.to_string_lossy(),
- "./compile/workers/not_in_module_map.ts",
- ])
- .run();
- output.assert_exit_code(0);
- output.skip_output_check();
-
- let output = context.new_command().name(exe).env("NO_COLOR", "").run();
- output.assert_exit_code(1);
- output.assert_matches_text(concat!(
- "error: Uncaught (in worker \"\") Module not found: [WILDCARD]",
- "error: Uncaught (in promise) Error: Unhandled error in child worker.\n[WILDCARD]"
- ));
-}
-
-#[test]
-fn workers_with_include_flag() {
- let context = TestContext::with_http_server();
- let dir = context.temp_dir();
- let exe = if cfg!(windows) {
- dir.path().join("workers_with_include_flag.exe")
- } else {
- dir.path().join("workers_with_include_flag")
- };
- context
- .new_command()
- .args_vec([
- "compile",
- "--output",
- &exe.to_string_lossy(),
- "--include",
- "./compile/workers/worker.ts",
- "./compile/workers/not_in_module_map.ts",
- ])
- .run()
- .skip_output_check()
- .assert_exit_code(0);
-
- context
- .new_command()
- .name(&exe)
- .env("NO_COLOR", "")
- .run()
- .assert_matches_text("Hello from worker!\nReceived 42\nClosing\n");
-}
-
-#[test]
-fn dynamic_import() {
- let context = TestContext::with_http_server();
- let dir = context.temp_dir();
- let exe = if cfg!(windows) {
- dir.path().join("dynamic_import.exe")
- } else {
- dir.path().join("dynamic_import")
- };
- context
- .new_command()
- .args_vec([
- "compile",
- "--output",
- &exe.to_string_lossy(),
- "./compile/dynamic_imports/main.ts",
- ])
- .run()
- .skip_output_check()
- .assert_exit_code(0);
-
- context
- .new_command()
- .name(&exe)
- .env("NO_COLOR", "")
- .run()
- .assert_matches_file("./compile/dynamic_imports/main.out")
- .assert_exit_code(0);
-}
-
-#[test]
-fn dynamic_import_unanalyzable() {
- let context = TestContext::with_http_server();
- let dir = context.temp_dir();
- let exe = if cfg!(windows) {
- dir.path().join("dynamic_import_unanalyzable.exe")
- } else {
- dir.path().join("dynamic_import_unanalyzable")
- };
- context
- .new_command()
- .args_vec([
- "compile",
- "--allow-read",
- "--include",
- "./compile/dynamic_imports/import1.ts",
- "--output",
- &exe.to_string_lossy(),
- "./compile/dynamic_imports/main_unanalyzable.ts",
- ])
- .run()
- .skip_output_check()
- .assert_exit_code(0);
-
- context
- .new_command()
- .current_dir(util::root_path().join("cli"))
- .name(&exe)
- .env("NO_COLOR", "")
- .run()
- .assert_matches_file("./compile/dynamic_imports/main.out")
- .assert_exit_code(0);
-}
-
-#[test]
-fn compile_npm_specifiers() {
- let context = TestContextBuilder::for_npm().use_temp_cwd().build();
-
- let temp_dir = context.temp_dir();
- temp_dir.write(
- "main.ts",
- concat!(
- "import path from 'node:path';\n",
- "import { getValue, setValue } from 'npm:@denotest/esm-basic';\n",
- "import getValueDefault from 'npm:@denotest/esm-import-cjs-default';\n",
- "setValue(2);\n",
- "console.log(path.join('testing', 'this'));",
- "console.log(getValue());",
- "console.log(getValueDefault());",
- ),
- );
-
- let binary_path = if cfg!(windows) {
- temp_dir.path().join("binary.exe")
- } else {
- temp_dir.path().join("binary")
- };
-
- // try with and without --node-modules-dir
- let compile_commands = &[
- "compile --output binary main.ts",
- "compile --node-modules-dir --output binary main.ts",
- ];
-
- for compile_command in compile_commands {
- let output = context.new_command().args(compile_command).run();
- output.assert_exit_code(0);
- output.skip_output_check();
-
- let output = context.new_command().name(&binary_path).run();
- output.assert_matches_text(
- r#"Node esm importing node cjs
-===========================
-{
- default: [Function (anonymous)],
- named: [Function (anonymous)],
- MyClass: [class MyClass]
-}
-{ default: [Function (anonymous)], named: [Function (anonymous)] }
-[Module: null prototype] {
- MyClass: [class MyClass],
- __esModule: true,
- default: {
- default: [Function (anonymous)],
- named: [Function (anonymous)],
- MyClass: [class MyClass]
- },
- named: [Function (anonymous)]
-}
-[Module: null prototype] {
- __esModule: true,
- default: { default: [Function (anonymous)], named: [Function (anonymous)] },
- named: [Function (anonymous)]
-}
-===========================
-static method
-testing[WILDCARD]this
-2
-5
-"#,
- );
- }
-
- // try with a package.json
- temp_dir.remove_dir_all("node_modules");
- temp_dir.write(
- "main.ts",
- concat!(
- "import { getValue, setValue } from '@denotest/esm-basic';\n",
- "setValue(2);\n",
- "console.log(getValue());",
- ),
- );
- temp_dir.write(
- "package.json",
- r#"{ "dependencies": { "@denotest/esm-basic": "1" } }"#,
- );
-
- context
- .new_command()
- .args("compile --output binary main.ts")
- .run()
- .assert_exit_code(0)
- .skip_output_check();
-
- context
- .new_command()
- .name(&binary_path)
- .run()
- .assert_matches_text("2\n");
-
- // now try with byonm
- temp_dir.remove_dir_all("node_modules");
- temp_dir.write("deno.json", r#"{"unstable":["byonm"]}"#);
- context.run_npm("install");
-
- context
- .new_command()
- .args("compile --output binary main.ts")
- .run()
- .assert_exit_code(0)
- .assert_matches_text("Check file:///[WILDCARD]/main.ts\nCompile file:///[WILDCARD]/main.ts to binary[WILDCARD]\n");
-
- context
- .new_command()
- .name(&binary_path)
- .run()
- .assert_matches_text("2\n");
-}
-
-#[test]
-fn compile_npm_file_system() {
- run_npm_bin_compile_test(RunNpmBinCompileOptions {
- input_specifier: "compile/npm_fs/main.ts",
- compile_args: vec!["-A"],
- run_args: vec![],
- output_file: "compile/npm_fs/main.out",
- node_modules_dir: true,
- input_name: Some("binary"),
- expected_name: "binary",
- exit_code: 0,
- });
-}
-
-#[test]
-fn compile_npm_bin_esm() {
- run_npm_bin_compile_test(RunNpmBinCompileOptions {
- input_specifier: "npm:@denotest/bin/cli-esm",
- compile_args: vec![],
- run_args: vec!["this", "is", "a", "test"],
- output_file: "npm/deno_run_esm.out",
- node_modules_dir: false,
- input_name: None,
- expected_name: "cli-esm",
- exit_code: 0,
- });
-}
-
-#[test]
-fn compile_npm_bin_cjs() {
- run_npm_bin_compile_test(RunNpmBinCompileOptions {
- input_specifier: "npm:@denotest/bin/cli-cjs",
- compile_args: vec![],
- run_args: vec!["this", "is", "a", "test"],
- output_file: "npm/deno_run_cjs.out",
- node_modules_dir: false,
- input_name: None,
- expected_name: "cli-cjs",
- exit_code: 0,
- });
-}
-
-#[test]
-fn compile_npm_cowsay_main() {
- run_npm_bin_compile_test(RunNpmBinCompileOptions {
- input_specifier: "npm:cowsay@1.5.0",
- compile_args: vec!["--allow-read"],
- run_args: vec!["Hello"],
- output_file: "npm/deno_run_cowsay.out",
- node_modules_dir: false,
- input_name: None,
- expected_name: "cowsay",
- exit_code: 0,
- });
-}
-
-#[test]
-fn compile_npm_vfs_implicit_read_permissions() {
- run_npm_bin_compile_test(RunNpmBinCompileOptions {
- input_specifier: "compile/vfs_implicit_read_permission/main.ts",
- compile_args: vec![],
- run_args: vec![],
- output_file: "compile/vfs_implicit_read_permission/main.out",
- node_modules_dir: false,
- input_name: Some("binary"),
- expected_name: "binary",
- exit_code: 0,
- });
-}
-
-#[test]
-fn compile_npm_no_permissions() {
- run_npm_bin_compile_test(RunNpmBinCompileOptions {
- input_specifier: "npm:cowsay@1.5.0",
- compile_args: vec![],
- run_args: vec!["Hello"],
- output_file: "npm/deno_run_cowsay_no_permissions.out",
- node_modules_dir: false,
- input_name: None,
- expected_name: "cowsay",
- exit_code: 1,
- });
-}
-
-#[test]
-fn compile_npm_cowsay_explicit() {
- run_npm_bin_compile_test(RunNpmBinCompileOptions {
- input_specifier: "npm:cowsay@1.5.0/cowsay",
- compile_args: vec!["--allow-read"],
- run_args: vec!["Hello"],
- output_file: "npm/deno_run_cowsay.out",
- node_modules_dir: false,
- input_name: None,
- expected_name: "cowsay",
- exit_code: 0,
- });
-}
-
-#[test]
-fn compile_npm_cowthink() {
- run_npm_bin_compile_test(RunNpmBinCompileOptions {
- input_specifier: "npm:cowsay@1.5.0/cowthink",
- compile_args: vec!["--allow-read"],
- run_args: vec!["Hello"],
- output_file: "npm/deno_run_cowthink.out",
- node_modules_dir: false,
- input_name: None,
- expected_name: "cowthink",
- exit_code: 0,
- });
-}
-
-struct RunNpmBinCompileOptions<'a> {
- input_specifier: &'a str,
- node_modules_dir: bool,
- output_file: &'a str,
- input_name: Option<&'a str>,
- expected_name: &'a str,
- run_args: Vec<&'a str>,
- compile_args: Vec<&'a str>,
- exit_code: i32,
-}
-
-fn run_npm_bin_compile_test(opts: RunNpmBinCompileOptions) {
- let context = TestContextBuilder::for_npm().use_temp_cwd().build();
-
- let temp_dir = context.temp_dir();
- let main_specifier = if opts.input_specifier.starts_with("npm:") {
- opts.input_specifier.to_string()
- } else {
- testdata_path().join(opts.input_specifier).to_string()
- };
-
- let mut args = vec!["compile".to_string()];
-
- args.extend(opts.compile_args.iter().map(|s| s.to_string()));
-
- if opts.node_modules_dir {
- args.push("--node-modules-dir".to_string());
- }
-
- if let Some(bin_name) = opts.input_name {
- args.push("--output".to_string());
- args.push(bin_name.to_string());
- }
-
- args.push(main_specifier);
-
- // compile
- let output = context.new_command().args_vec(args).run();
- output.assert_exit_code(0);
- output.skip_output_check();
-
- // delete the npm folder in the DENO_DIR to ensure it's not using it
- context.deno_dir().remove_dir_all("./npm");
-
- // run
- let binary_path = if cfg!(windows) {
- temp_dir.path().join(format!("{}.exe", opts.expected_name))
- } else {
- temp_dir.path().join(opts.expected_name)
- };
- let output = context
- .new_command()
- .name(binary_path)
- .args_vec(opts.run_args)
- .run();
- output.assert_matches_file(opts.output_file);
- output.assert_exit_code(opts.exit_code);
-}
-
-#[test]
-fn compile_node_modules_symlink_outside() {
- let context = TestContextBuilder::for_npm()
- .use_copy_temp_dir("compile/node_modules_symlink_outside")
- .cwd("compile/node_modules_symlink_outside")
- .build();
-
- let temp_dir = context.temp_dir();
- let project_dir = temp_dir
- .path()
- .join("compile")
- .join("node_modules_symlink_outside");
- temp_dir.create_dir_all(project_dir.join("node_modules"));
- temp_dir.create_dir_all(project_dir.join("some_folder"));
- temp_dir.write(project_dir.join("test.txt"), "5");
-
- // create a symlink in the node_modules directory that points to a folder in the cwd
- temp_dir.symlink_dir(
- project_dir.join("some_folder"),
- project_dir.join("node_modules").join("some_folder"),
- );
- // compile folder
- let output = context
- .new_command()
- .args("compile --allow-read --node-modules-dir --output bin main.ts")
- .run();
- output.assert_exit_code(0);
- output.assert_matches_file(
- "compile/node_modules_symlink_outside/main_compile_folder.out",
- );
- assert!(project_dir.join("node_modules/some_folder").exists());
-
- // Cleanup and remove the folder. The folder test is done separately from
- // the file symlink test because different systems would traverse
- // the directory items in different order.
- temp_dir.remove_dir_all(project_dir.join("node_modules/some_folder"));
-
- // create a symlink in the node_modules directory that points to a file in the cwd
- temp_dir.symlink_file(
- project_dir.join("test.txt"),
- project_dir.join("node_modules").join("test.txt"),
- );
- assert!(project_dir.join("node_modules/test.txt").exists());
-
- // compile
- let output = context
- .new_command()
- .args("compile --allow-read --node-modules-dir --output bin main.ts")
- .run();
- output.assert_exit_code(0);
- output.assert_matches_file(
- "compile/node_modules_symlink_outside/main_compile_file.out",
- );
-
- // run
- let binary_path =
- project_dir.join(if cfg!(windows) { "bin.exe" } else { "bin" });
- let output = context.new_command().name(binary_path).run();
- output.assert_matches_file("compile/node_modules_symlink_outside/main.out");
-}
-
-#[test]
-fn compile_node_modules_symlink_non_existent() {
- let context = TestContextBuilder::for_npm().use_temp_cwd().build();
- let temp_dir = context.temp_dir().path();
- temp_dir.join("main.ts").write(
- r#"import { getValue, setValue } from "npm:@denotest/esm-basic";
-setValue(4);
-console.log(getValue());"#,
- );
- let node_modules_dir = temp_dir.join("node_modules");
- node_modules_dir.create_dir_all();
- // create a symlink that points to a non_existent file
- node_modules_dir.symlink_dir("non_existent", "folder");
- // compile folder
- let output = context
- .new_command()
- .args("compile --allow-read --node-modules-dir --output bin main.ts")
- .run();
- output.assert_exit_code(0);
- output.assert_matches_text(
- r#"Download http://localhost:4545/npm/registry/@denotest/esm-basic
-Download http://localhost:4545/npm/registry/@denotest/esm-basic/1.0.0.tgz
-Initialize @denotest/esm-basic@1.0.0
-Check file:///[WILDCARD]/main.ts
-Compile file:///[WILDCARD]/main.ts to [WILDCARD]
-Warning Failed resolving symlink. Ignoring.
- Path: [WILDCARD]
- Message: [WILDCARD])
-"#,
- );
-
- // run
- let binary_path =
- temp_dir.join(if cfg!(windows) { "bin.exe" } else { "bin" });
- let output = context.new_command().name(binary_path).run();
- output.assert_matches_text("4\n");
-}
-
-#[test]
-fn dynamic_imports_tmp_lit() {
- let context = TestContextBuilder::new().build();
- let dir = context.temp_dir();
- let exe = if cfg!(windows) {
- dir.path().join("app.exe")
- } else {
- dir.path().join("app")
- };
- let output = context
- .new_command()
- .args_vec([
- "compile",
- "--output",
- &exe.to_string_lossy(),
- "./compile/dynamic_imports_tmp_lit/main.js",
- ])
- .run();
- output.assert_exit_code(0);
- output.skip_output_check();
- let output = context.new_command().name(&exe).run();
- output.assert_matches_text("a\nb\n{ data: 5 }\n{ data: 1 }\n");
-}
-
-#[test]
-fn granular_unstable_features() {
- let context = TestContextBuilder::new().build();
- let dir = context.temp_dir();
- let exe = if cfg!(windows) {
- dir.path().join("app.exe")
- } else {
- dir.path().join("app")
- };
- let output = context
- .new_command()
- .args_vec([
- "compile",
- "--output",
- &exe.to_string_lossy(),
- "--unstable-kv",
- "./compile/unstable_features.ts",
- ])
- .run();
- output.assert_exit_code(0);
- output.skip_output_check();
- let output = context.new_command().name(&exe).run();
- output.assert_exit_code(0);
- output.assert_matches_text("Kv {}\n");
-}
-
-#[test]
-fn dynamic_import_bad_data_uri() {
- let context = TestContextBuilder::new().build();
- let dir = context.temp_dir();
- let exe = if cfg!(windows) {
- dir.path().join("app.exe")
- } else {
- dir.path().join("app")
- };
- let file = dir.path().join("bad_data_uri.ts");
- file.write("await import('data:application/')");
- let output = context
- .new_command()
- .args_vec([
- "compile",
- "--output",
- &exe.to_string_lossy(),
- &file.to_string_lossy(),
- ])
- .run();
- output.assert_exit_code(0);
- output.skip_output_check();
- let output = context.new_command().name(&exe).run();
- output.assert_exit_code(1);
- output.assert_matches_text(
- "[WILDCARD]TypeError: Unable to decode data url.[WILDCARD]",
- );
-}
diff --git a/cli/tests/integration/js_unit_tests.rs b/cli/tests/integration/js_unit_tests.rs
deleted file mode 100644
index 0e3a1a118..000000000
--- a/cli/tests/integration/js_unit_tests.rs
+++ /dev/null
@@ -1,201 +0,0 @@
-// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
-use std::io::BufRead;
-use std::io::BufReader;
-use std::time::Duration;
-use std::time::Instant;
-use test_util as util;
-
-util::unit_test_factory!(
- js_unit_test,
- "../tests/unit",
- "*.ts",
- [
- abort_controller_test,
- blob_test,
- body_test,
- broadcast_channel_test,
- buffer_test,
- build_test,
- cache_api_test,
- chmod_test,
- chown_test,
- command_test,
- console_test,
- copy_file_test,
- custom_event_test,
- cron_test,
- dir_test,
- dom_exception_test,
- error_stack_test,
- error_test,
- esnext_test,
- event_target_test,
- event_test,
- fetch_test,
- ffi_test,
- file_test,
- filereader_test,
- files_test,
- flock_test,
- fs_events_test,
- get_random_values_test,
- globals_test,
- headers_test,
- http_test,
- image_bitmap_test,
- image_data_test,
- internals_test,
- intl_test,
- io_test,
- jupyter_test,
- kv_test,
- kv_queue_test_no_db_close,
- kv_queue_test,
- kv_queue_undelivered_test,
- link_test,
- make_temp_test,
- message_channel_test,
- mkdir_test,
- navigator_test,
- net_test,
- network_interfaces_test,
- os_test,
- ops_test,
- path_from_url_test,
- performance_test,
- permissions_test,
- process_test,
- progressevent_test,
- promise_hooks_test,
- read_dir_test,
- read_file_test,
- read_link_test,
- read_text_file_test,
- real_path_test,
- ref_unref_test,
- remove_test,
- rename_test,
- request_test,
- resources_test,
- response_test,
- serve_test,
- signal_test,
- stat_test,
- stdio_test,
- streams_test,
- structured_clone_test,
- symbol_test,
- symlink_test,
- sync_test,
- test_util,
- testing_test,
- text_encoding_test,
- timers_test,
- tls_test,
- truncate_test,
- tty_color_test,
- tty_test,
- umask_test,
- url_search_params_test,
- url_test,
- urlpattern_test,
- utime_test,
- version_test,
- wasm_test,
- webcrypto_test,
- webgpu_test,
- websocket_test,
- webstorage_test,
- worker_permissions_test,
- worker_test,
- write_file_test,
- write_text_file_test,
- ]
-);
-
-fn js_unit_test(test: String) {
- let _g = util::http_server();
-
- let deno = util::deno_cmd()
- .current_dir(util::root_path())
- .arg("test")
- .arg("--config")
- .arg("cli/tests/config/deno.json")
- .arg("--no-lock")
- .arg("--unstable")
- .arg("--location=http://127.0.0.1:4545/")
- .arg("--no-prompt");
-
- // TODO(mmastrac): it would be better to just load a test CA for all tests
- let deno = if test == "websocket_test" {
- deno.arg("--unsafely-ignore-certificate-errors")
- } else {
- deno
- };
-
- let mut deno = deno
- .arg("-A")
- .arg(util::tests_path().join("unit").join(format!("{test}.ts")))
- .piped_output()
- .spawn()
- .expect("failed to spawn script");
-
- let now = Instant::now();
- let stdout = deno.stdout.take().unwrap();
- let test_name = test.clone();
- let stdout = std::thread::spawn(move || {
- let reader = BufReader::new(stdout);
- for line in reader.lines() {
- if let Ok(line) = line {
- println!("[{test_name} {:0>6.2}] {line}", now.elapsed().as_secs_f32());
- } else {
- break;
- }
- }
- });
-
- let now = Instant::now();
- let stderr = deno.stderr.take().unwrap();
- let test_name = test.clone();
- let stderr = std::thread::spawn(move || {
- let reader = BufReader::new(stderr);
- for line in reader.lines() {
- if let Ok(line) = line {
- eprintln!("[{test_name} {:0>6.2}] {line}", now.elapsed().as_secs_f32());
- } else {
- break;
- }
- }
- });
-
- const PER_TEST_TIMEOUT: Duration = Duration::from_secs(3 * 60);
-
- let now = Instant::now();
- let status = loop {
- if now.elapsed() > PER_TEST_TIMEOUT {
- // Last-ditch kill
- _ = deno.kill();
- panic!("Test {test} failed to complete in time");
- }
- if let Some(status) = deno
- .try_wait()
- .expect("failed to wait for the child process")
- {
- break status;
- }
- std::thread::sleep(Duration::from_millis(100));
- };
-
- #[cfg(unix)]
- assert_eq!(
- std::os::unix::process::ExitStatusExt::signal(&status),
- None,
- "Deno should not have died with a signal"
- );
- assert_eq!(Some(0), status.code(), "Deno should have exited cleanly");
-
- stdout.join().unwrap();
- stderr.join().unwrap();
-
- assert!(status.success());
-}
diff --git a/cli/tests/integration/node_compat_tests.rs b/cli/tests/integration/node_compat_tests.rs
deleted file mode 100644
index 0ed84594b..000000000
--- a/cli/tests/integration/node_compat_tests.rs
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
-
-use test_util as util;
-use util::env_vars_for_npm_tests;
-
-#[test]
-fn node_compat_tests() {
- let mut deno = util::deno_cmd()
- .current_dir(util::root_path())
- .arg("test")
- .arg("--config")
- .arg("cli/tests/config/deno.json")
- .arg("--no-lock")
- .arg("--unstable")
- .arg("-A")
- .arg(util::tests_path().join("node_compat"))
- .spawn()
- .expect("failed to spawn script");
-
- let status = deno.wait().expect("failed to wait for the child process");
- assert_eq!(Some(0), status.code());
- assert!(status.success());
-}
-
-itest!(node_test_module {
- args: "test node/test.js",
- output: "node/test.out",
- envs: env_vars_for_npm_tests(),
- exit_code: 1,
- http_server: true,
-});
diff --git a/cli/tests/integration/node_unit_tests.rs b/cli/tests/integration/node_unit_tests.rs
deleted file mode 100644
index 5afaf48c5..000000000
--- a/cli/tests/integration/node_unit_tests.rs
+++ /dev/null
@@ -1,207 +0,0 @@
-// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
-use std::io::BufRead;
-use std::io::BufReader;
-use std::time::Duration;
-use std::time::Instant;
-use test_util as util;
-use util::env_vars_for_npm_tests;
-
-util::unit_test_factory!(
- node_unit_test,
- "../tests/unit_node",
- "**/*_test.ts",
- [
- _fs_access_test = _fs / _fs_access_test,
- _fs_appendFile_test = _fs / _fs_appendFile_test,
- _fs_chmod_test = _fs / _fs_chmod_test,
- _fs_chown_test = _fs / _fs_chown_test,
- _fs_close_test = _fs / _fs_close_test,
- _fs_copy_test = _fs / _fs_copy_test,
- _fs_dir_test = _fs / _fs_dir_test,
- _fs_dirent_test = _fs / _fs_dirent_test,
- _fs_open_test = _fs / _fs_open_test,
- _fs_read_test = _fs / _fs_read_test,
- _fs_exists_test = _fs / _fs_exists_test,
- _fs_fdatasync_test = _fs / _fs_fdatasync_test,
- _fs_fstat_test = _fs / _fs_fstat_test,
- _fs_fsync_test = _fs / _fs_fsync_test,
- _fs_ftruncate_test = _fs / _fs_ftruncate_test,
- _fs_futimes_test = _fs / _fs_futimes_test,
- _fs_handle_test = _fs / _fs_handle_test,
- _fs_link_test = _fs / _fs_link_test,
- _fs_lstat_test = _fs / _fs_lstat_test,
- _fs_mkdir_test = _fs / _fs_mkdir_test,
- _fs_mkdtemp_test = _fs / _fs_mkdtemp_test,
- _fs_opendir_test = _fs / _fs_opendir_test,
- _fs_readFile_test = _fs / _fs_readFile_test,
- _fs_readdir_test = _fs / _fs_readdir_test,
- _fs_readlink_test = _fs / _fs_readlink_test,
- _fs_realpath_test = _fs / _fs_realpath_test,
- _fs_rename_test = _fs / _fs_rename_test,
- _fs_rm_test = _fs / _fs_rm_test,
- _fs_rmdir_test = _fs / _fs_rmdir_test,
- _fs_stat_test = _fs / _fs_stat_test,
- _fs_symlink_test = _fs / _fs_symlink_test,
- _fs_truncate_test = _fs / _fs_truncate_test,
- _fs_unlink_test = _fs / _fs_unlink_test,
- _fs_utimes_test = _fs / _fs_utimes_test,
- _fs_watch_test = _fs / _fs_watch_test,
- _fs_writeFile_test = _fs / _fs_writeFile_test,
- _fs_write_test = _fs / _fs_write_test,
- async_hooks_test,
- assertion_error_test,
- buffer_test,
- child_process_test,
- console_test,
- crypto_cipher_test = crypto / crypto_cipher_test,
- crypto_cipher_gcm_test = crypto / crypto_cipher_gcm_test,
- crypto_hash_test = crypto / crypto_hash_test,
- crypto_key_test = crypto / crypto_key_test,
- crypto_sign_test = crypto / crypto_sign_test,
- events_test,
- dgram_test,
- fs_test,
- http_test,
- http2_test,
- _randomBytes_test = internal / _randomBytes_test,
- _randomFill_test = internal / _randomFill_test,
- _randomInt_test = internal / _randomInt_test,
- pbkdf2_test = internal / pbkdf2_test,
- scrypt_test = internal / scrypt_test,
- module_test,
- net_test,
- os_test,
- path_test,
- perf_hooks_test,
- process_test,
- querystring_test,
- readline_test,
- repl_test,
- stream_test,
- string_decoder_test,
- timers_test,
- tls_test,
- tty_test,
- util_test,
- v8_test,
- vm_test,
- worker_threads_test,
- zlib_test
- ]
-);
-
-fn node_unit_test(test: String) {
- let _g = util::http_server();
-
- let mut deno = util::deno_cmd()
- .current_dir(util::root_path())
- .arg("test")
- .arg("--config")
- .arg("cli/tests/config/deno.json")
- .arg("--no-lock")
- .arg("--unstable")
- // TODO(kt3k): This option is required to pass tls_test.ts,
- // but this shouldn't be necessary. tls.connect currently doesn't
- // pass hostname option correctly and it causes cert errors.
- .arg("--unsafely-ignore-certificate-errors")
- .arg("-A");
- // Parallel tests for crypto
- if test.starts_with("crypto/") {
- deno = deno.arg("--parallel");
- }
- let mut deno = deno
- .arg(
- util::tests_path()
- .join("unit_node")
- .join(format!("{test}.ts")),
- )
- .envs(env_vars_for_npm_tests())
- .piped_output()
- .spawn()
- .expect("failed to spawn script");
-
- let now = Instant::now();
- let stdout = deno.stdout.take().unwrap();
- let test_name = test.clone();
- let stdout = std::thread::spawn(move || {
- let reader = BufReader::new(stdout);
- for line in reader.lines() {
- if let Ok(line) = line {
- println!("[{test_name} {:0>6.2}] {line}", now.elapsed().as_secs_f32());
- } else {
- break;
- }
- }
- });
-
- let now = Instant::now();
- let stderr = deno.stderr.take().unwrap();
- let test_name = test.clone();
- let stderr = std::thread::spawn(move || {
- let reader = BufReader::new(stderr);
- for line in reader.lines() {
- if let Ok(line) = line {
- eprintln!("[{test_name} {:0>6.2}] {line}", now.elapsed().as_secs_f32());
- } else {
- break;
- }
- }
- });
-
- const PER_TEST_TIMEOUT: Duration = Duration::from_secs(5 * 60);
-
- let now = Instant::now();
- let status = loop {
- if now.elapsed() > PER_TEST_TIMEOUT {
- // Last-ditch kill
- _ = deno.kill();
- panic!("Test {test} failed to complete in time");
- }
- if let Some(status) = deno
- .try_wait()
- .expect("failed to wait for the child process")
- {
- break status;
- }
- std::thread::sleep(Duration::from_millis(100));
- };
-
- #[cfg(unix)]
- assert_eq!(
- std::os::unix::process::ExitStatusExt::signal(&status),
- None,
- "Deno should not have died with a signal"
- );
- assert_eq!(Some(0), status.code(), "Deno should have exited cleanly");
-
- stdout.join().unwrap();
- stderr.join().unwrap();
-
- assert!(status.success());
-}
-
-// Regression test for https://github.com/denoland/deno/issues/16928
-itest!(unhandled_rejection_web {
- args: "run -A node/unhandled_rejection_web.ts",
- output: "node/unhandled_rejection_web.ts.out",
- envs: env_vars_for_npm_tests(),
- http_server: true,
-});
-
-// Ensure that Web `onunhandledrejection` is fired before
-// Node's `process.on('unhandledRejection')`.
-itest!(unhandled_rejection_web_process {
- args: "run -A node/unhandled_rejection_web_process.ts",
- output: "node/unhandled_rejection_web_process.ts.out",
- envs: env_vars_for_npm_tests(),
- http_server: true,
-});
-
-// Ensure that Web `onrejectionhandled` is fired before
-// Node's `process.on('rejectionHandled')`.
-itest!(rejection_handled_web_process {
- args: "run -A --quiet node/rejection_handled_web_process.ts",
- output: "node/rejection_handled_web_process.ts.out",
- envs: env_vars_for_npm_tests(),
- http_server: true,
-});
diff --git a/cli/tests/node_compat/deno.json b/cli/tests/node_compat/deno.json
deleted file mode 100644
index fe518960f..000000000
--- a/cli/tests/node_compat/deno.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "imports": {
- "@test_util/": "../../../test_util/"
- }
-}
diff --git a/cli/tests/node_compat/test/fixtures/child-process-spawn-node.js b/cli/tests/node_compat/test/fixtures/child-process-spawn-node.js
deleted file mode 100644
index 589da4dab..000000000
--- a/cli/tests/node_compat/test/fixtures/child-process-spawn-node.js
+++ /dev/null
@@ -1,14 +0,0 @@
-const assert = require('assert');
-// TODO(kt3k): Uncomment this when util.debuglog is added
-// const debug = require('util').debuglog('test');
-const debug = console.log;
-
-function onmessage(m) {
- debug('CHILD got message:', m);
- assert.ok(m.hello);
- process.removeListener('message', onmessage);
-}
-
-process.on('message', onmessage);
-// TODO(kt3k): Uncomment the below when the ipc features are ready
-// process.send({ foo: 'bar' });
diff --git a/cli/tests/testdata/bench/allow_all.ts b/cli/tests/testdata/bench/allow_all.ts
deleted file mode 100644
index beb4a450e..000000000
--- a/cli/tests/testdata/bench/allow_all.ts
+++ /dev/null
@@ -1,43 +0,0 @@
-import { assertEquals } from "../../../../test_util/std/assert/mod.ts";
-
-const permissions: Deno.PermissionName[] = [
- "read",
- "write",
- "net",
- "env",
- "run",
- "ffi",
- "hrtime",
-];
-
-for (const name of permissions) {
- Deno.bench({
- name: `${name} false`,
- permissions: {
- [name]: false,
- },
- async fn() {
- for await (const n of permissions) {
- const status = await Deno.permissions.query({ name: n });
- assertEquals(status.state, "prompt");
- }
- },
- });
-
- Deno.bench({
- name: `${name} true`,
- permissions: {
- [name]: true,
- },
- async fn() {
- for await (const n of permissions) {
- const status = await Deno.permissions.query({ name: n });
- if (n === name) {
- assertEquals(status.state, "granted");
- } else {
- assertEquals(status.state, "prompt");
- }
- }
- },
- });
-}
diff --git a/cli/tests/testdata/bench/allow_none.ts b/cli/tests/testdata/bench/allow_none.ts
deleted file mode 100644
index e723ed868..000000000
--- a/cli/tests/testdata/bench/allow_none.ts
+++ /dev/null
@@ -1,23 +0,0 @@
-import { unreachable } from "../../../../test_util/std/assert/mod.ts";
-
-const permissions: Deno.PermissionName[] = [
- "read",
- "write",
- "net",
- "env",
- "run",
- "ffi",
- "hrtime",
-];
-
-for (const name of permissions) {
- Deno.bench({
- name,
- permissions: {
- [name]: true,
- },
- fn() {
- unreachable();
- },
- });
-}
diff --git a/cli/tests/testdata/cat.ts b/cli/tests/testdata/cat.ts
deleted file mode 100644
index c2a500b3e..000000000
--- a/cli/tests/testdata/cat.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import { copy } from "../../../test_util/std/streams/copy.ts";
-async function main() {
- for (let i = 1; i < Deno.args.length; i++) {
- const filename = Deno.args[i];
- const file = await Deno.open(filename);
- await copy(file, Deno.stdout);
- }
-}
-
-main();
diff --git a/cli/tests/testdata/cert/listen_tls_alpn_fail.ts b/cli/tests/testdata/cert/listen_tls_alpn_fail.ts
deleted file mode 100644
index e321c9bd3..000000000
--- a/cli/tests/testdata/cert/listen_tls_alpn_fail.ts
+++ /dev/null
@@ -1,20 +0,0 @@
-import { assertRejects } from "../../../../test_util/std/assert/mod.ts";
-
-const listener = Deno.listenTls({
- port: Number(Deno.args[0]),
- cert: Deno.readTextFileSync("./tls/localhost.crt"),
- key: Deno.readTextFileSync("./tls/localhost.key"),
- alpnProtocols: ["h2", "http/1.1", "foobar"],
-});
-
-console.log("READY");
-
-const conn = await listener.accept() as Deno.TlsConn;
-await assertRejects(
- () => conn.handshake(),
- Deno.errors.InvalidData,
- "peer doesn't support any known protocol",
-);
-conn.close();
-
-listener.close();
diff --git a/cli/tests/testdata/compile/dynamic_imports/main_unanalyzable.ts b/cli/tests/testdata/compile/dynamic_imports/main_unanalyzable.ts
deleted file mode 100644
index ee8ff2c4b..000000000
--- a/cli/tests/testdata/compile/dynamic_imports/main_unanalyzable.ts
+++ /dev/null
@@ -1,18 +0,0 @@
-import { join } from "../../../../../test_util/std/path/mod.ts";
-
-console.log("Starting the main module");
-
-// We load the dynamic import path from the file system, to make sure any
-// improvements in static analysis can't defeat the purpose of this test, which
-// is to make sure the `--include` flag works to add non-analyzed imports to the
-// module graph.
-const IMPORT_PATH_FILE_PATH = join(
- Deno.cwd(),
- "tests/testdata/compile/dynamic_imports/import_path",
-);
-
-setTimeout(async () => {
- console.log("Dynamic importing");
- const importPath = (await Deno.readTextFile(IMPORT_PATH_FILE_PATH)).trim();
- import(importPath).then(() => console.log("Dynamic import done."));
-}, 0);
diff --git a/cli/tests/testdata/compile/standalone_follow_redirects_2.js b/cli/tests/testdata/compile/standalone_follow_redirects_2.js
deleted file mode 100644
index 00ebc0f5c..000000000
--- a/cli/tests/testdata/compile/standalone_follow_redirects_2.js
+++ /dev/null
@@ -1,5 +0,0 @@
-// unversioned import redirects with dependencies.
-import {
- assertNotEquals as _a,
- assertStrictEquals as _b,
-} from "../../../../test_util/std/assert/mod.ts";
diff --git a/cli/tests/testdata/coverage/no_snaps_included/no_snaps_included_test.ts b/cli/tests/testdata/coverage/no_snaps_included/no_snaps_included_test.ts
deleted file mode 100644
index e1f99ed9b..000000000
--- a/cli/tests/testdata/coverage/no_snaps_included/no_snaps_included_test.ts
+++ /dev/null
@@ -1,11 +0,0 @@
-import { assertSnapshot } from "../../../../../test_util/std/testing/snapshot.ts";
-import { truth } from "./no_snaps_included.ts";
-
-Deno.test("the truth", () => {
- truth();
-});
-
-// Create snapshot in .snap file, but it shouldn't be in the coverage output
-Deno.test("snapshot excluded from coverage", async (context) => {
- await assertSnapshot(context, {});
-});
diff --git a/cli/tests/testdata/coverage/no_tests_included/foo.test.js b/cli/tests/testdata/coverage/no_tests_included/foo.test.js
deleted file mode 100644
index f555c2d0a..000000000
--- a/cli/tests/testdata/coverage/no_tests_included/foo.test.js
+++ /dev/null
@@ -1,6 +0,0 @@
-import { addNumbers } from "./foo.ts";
-import { assertEquals } from "../../../../../test_util/std/assert/mod.ts";
-
-Deno.test("addNumbers works", () => {
- assertEquals(addNumbers(1, 2), 3);
-});
diff --git a/cli/tests/testdata/coverage/no_tests_included/foo.test.mts b/cli/tests/testdata/coverage/no_tests_included/foo.test.mts
deleted file mode 100644
index f555c2d0a..000000000
--- a/cli/tests/testdata/coverage/no_tests_included/foo.test.mts
+++ /dev/null
@@ -1,6 +0,0 @@
-import { addNumbers } from "./foo.ts";
-import { assertEquals } from "../../../../../test_util/std/assert/mod.ts";
-
-Deno.test("addNumbers works", () => {
- assertEquals(addNumbers(1, 2), 3);
-});
diff --git a/cli/tests/testdata/coverage/no_tests_included/foo.test.ts b/cli/tests/testdata/coverage/no_tests_included/foo.test.ts
deleted file mode 100644
index f555c2d0a..000000000
--- a/cli/tests/testdata/coverage/no_tests_included/foo.test.ts
+++ /dev/null
@@ -1,6 +0,0 @@
-import { addNumbers } from "./foo.ts";
-import { assertEquals } from "../../../../../test_util/std/assert/mod.ts";
-
-Deno.test("addNumbers works", () => {
- assertEquals(addNumbers(1, 2), 3);
-});
diff --git a/cli/tests/testdata/coverage/no_transpiled_lines/index.ts b/cli/tests/testdata/coverage/no_transpiled_lines/index.ts
deleted file mode 100644
index 7e4f22163..000000000
--- a/cli/tests/testdata/coverage/no_transpiled_lines/index.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-export { assertStrictEquals } from "../../../../../test_util/std/assert/mod.ts";
-
-export * from "./interface.ts";
diff --git a/cli/tests/testdata/echo_server.ts b/cli/tests/testdata/echo_server.ts
deleted file mode 100644
index 658b07374..000000000
--- a/cli/tests/testdata/echo_server.ts
+++ /dev/null
@@ -1,12 +0,0 @@
-import { copy } from "../../../test_util/std/streams/copy.ts";
-const addr = Deno.args[0] || "0.0.0.0:4544";
-const [hostname, port] = addr.split(":");
-const listener = Deno.listen({ hostname, port: Number(port) });
-console.log("listening on", addr);
-listener.accept().then(
- async (conn) => {
- console.log("received bytes:", await copy(conn, conn));
- conn.close();
- listener.close();
- },
-);
diff --git a/cli/tests/testdata/run/045_proxy_test.ts b/cli/tests/testdata/run/045_proxy_test.ts
deleted file mode 100644
index 60bde5066..000000000
--- a/cli/tests/testdata/run/045_proxy_test.ts
+++ /dev/null
@@ -1,121 +0,0 @@
-// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
-import { Server } from "../../../../test_util/std/http/server.ts";
-import { assertEquals } from "../../../../test_util/std/assert/mod.ts";
-
-const addr = Deno.args[1] || "localhost:4555";
-
-async function proxyServer() {
- const [hostname, p] = addr.split(":");
- const port = parseInt(p ?? 4555);
- const server = new Server({ hostname, port, handler });
- console.log(`Proxy server listening on http://${addr}/`);
- await server.listenAndServe();
-}
-
-async function handler(req: Request): Promise<Response> {
- console.log(`Proxy request to: ${req.url}`);
- const headers = new Headers(req.headers);
- const proxyAuthorization = headers.get("proxy-authorization");
- if (proxyAuthorization) {
- console.log(`proxy-authorization: ${proxyAuthorization}`);
- headers.delete("proxy-authorization");
- }
- const resp = await fetch(req.url, {
- method: req.method,
- headers: headers,
- });
- return new Response(new Uint8Array(await resp.arrayBuffer()), {
- status: resp.status,
- headers: resp.headers,
- });
-}
-
-async function testFetch() {
- const { code } = await new Deno.Command(Deno.execPath(), {
- args: [
- "run",
- "--quiet",
- "--reload",
- "--allow-net",
- "run/045_proxy_client.ts",
- ],
- env: {
- HTTP_PROXY: `http://${addr}`,
- },
- }).output();
-
- assertEquals(code, 0);
-}
-
-async function testModuleDownload() {
- const { code } = await new Deno.Command(Deno.execPath(), {
- args: [
- "cache",
- "--reload",
- "--quiet",
- "http://localhost:4545/run/045_mod.ts",
- ],
- env: {
- HTTP_PROXY: `http://${addr}`,
- },
- }).output();
-
- assertEquals(code, 0);
-}
-
-async function testFetchNoProxy() {
- const { code } = await new Deno.Command(Deno.execPath(), {
- args: [
- "run",
- "--quiet",
- "--reload",
- "--allow-net",
- "run/045_proxy_client.ts",
- ],
- env: {
- HTTP_PROXY: "http://not.exising.proxy.server",
- NO_PROXY: "localhost",
- },
- }).output();
-
- assertEquals(code, 0);
-}
-
-async function testModuleDownloadNoProxy() {
- const { code } = await new Deno.Command(Deno.execPath(), {
- args: [
- "cache",
- "--reload",
- "--quiet",
- "http://localhost:4545/run/045_mod.ts",
- ],
- env: {
- HTTP_PROXY: "http://not.exising.proxy.server",
- NO_PROXY: "localhost",
- },
- }).output();
-
- assertEquals(code, 0);
-}
-
-async function testFetchProgrammaticProxy() {
- const { code } = await new Deno.Command(Deno.execPath(), {
- args: [
- "run",
- "--quiet",
- "--reload",
- "--allow-net=localhost:4545,localhost:4555",
- "--unstable",
- "run/045_programmatic_proxy_client.ts",
- ],
- }).output();
- assertEquals(code, 0);
-}
-
-proxyServer();
-await testFetch();
-await testModuleDownload();
-await testFetchNoProxy();
-await testModuleDownloadNoProxy();
-await testFetchProgrammaticProxy();
-Deno.exit(0);
diff --git a/cli/tests/testdata/run/import_meta/main.ts b/cli/tests/testdata/run/import_meta/main.ts
deleted file mode 100644
index fb859e250..000000000
--- a/cli/tests/testdata/run/import_meta/main.ts
+++ /dev/null
@@ -1,52 +0,0 @@
-import { assertThrows } from "../../../../../test_util/std/assert/mod.ts";
-import "http://localhost:4545/run/import_meta/other.ts";
-import "./other.ts";
-
-console.log(
- "main",
- import.meta.url,
- import.meta.main,
- import.meta.filename,
- import.meta.dirname,
-);
-
-console.log("Resolving ./foo.js", import.meta.resolve("./foo.js"));
-console.log("Resolving bare from import map", import.meta.resolve("bare"));
-console.log(
- "Resolving https://example.com/rewrite from import map",
- import.meta.resolve("https://example.com/rewrite"),
-);
-console.log(
- "Resolving without a value from import map",
- import.meta.resolve(),
-);
-console.log(
- "Resolving 1 from import map",
- import.meta.resolve(1),
-);
-console.log(
- "Resolving null from import map",
- import.meta.resolve(null),
-);
-console.log(
- "Resolving object from import map",
- import.meta.resolve({}),
-);
-assertThrows(() => {
- import.meta.resolve("too", "many", "arguments");
-}, TypeError);
-assertThrows(() => {
- import.meta.resolve("://malformed/url?asdf");
-}, TypeError);
-console.log(
- "Resolving npm:cowsay",
- import.meta.resolve("npm:cowsay"),
-);
-console.log(
- "Resolving npm:cowsay@1",
- import.meta.resolve("npm:cowsay@1"),
-);
-console.log(
- "Resolving npm:preact from import map",
- import.meta.resolve("npm:preact"),
-);
diff --git a/cli/tests/testdata/run/node_prefix_missing/main.ts.out_feature_enabled b/cli/tests/testdata/run/node_prefix_missing/main.ts.out_feature_enabled
deleted file mode 100644
index 0d8c1e93a..000000000
--- a/cli/tests/testdata/run/node_prefix_missing/main.ts.out_feature_enabled
+++ /dev/null
@@ -1,2 +0,0 @@
-[WILDCARD]Warning: Resolving "fs" as "node:fs" at file:///[WILDCARD]/cli/tests/testdata/run/node_prefix_missing/main.ts:1:16. If you want to use a built-in Node module, add a "node:" prefix.
-[Function: writeFile]
diff --git a/cli/tests/testdata/run/onload/imported.ts b/cli/tests/testdata/run/onload/imported.ts
deleted file mode 100644
index 971ddaea3..000000000
--- a/cli/tests/testdata/run/onload/imported.ts
+++ /dev/null
@@ -1,13 +0,0 @@
-// deno-lint-ignore-file no-window-prefix
-import { assert } from "../../../../../test_util/std/assert/mod.ts";
-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)`);
-};
-
-window.addEventListener("load", handler);
-window.addEventListener("beforeunload", handler);
-window.addEventListener("unload", handler);
-console.log("log from imported script");
diff --git a/cli/tests/testdata/run/onload/main.ts b/cli/tests/testdata/run/onload/main.ts
deleted file mode 100644
index 191c4d872..000000000
--- a/cli/tests/testdata/run/onload/main.ts
+++ /dev/null
@@ -1,34 +0,0 @@
-// deno-lint-ignore-file no-window-prefix no-prototype-builtins
-import { assert } from "../../../../../test_util/std/assert/mod.ts";
-import "./imported.ts";
-
-assert(window.hasOwnProperty("onload"));
-assert(window.onload === null);
-
-const eventHandler = (e: Event) => {
- assert(e.type === "beforeunload" ? e.cancelable : !e.cancelable);
- console.log(`got ${e.type} event in event handler (main)`);
-};
-
-window.addEventListener("load", eventHandler);
-
-window.addEventListener("beforeunload", eventHandler);
-
-window.addEventListener("unload", eventHandler);
-
-window.onload = (e: Event) => {
- assert(!e.cancelable);
- console.log(`got ${e.type} event in onload function`);
-};
-
-window.onbeforeunload = (e: BeforeUnloadEvent) => {
- assert(e.cancelable);
- console.log(`got ${e.type} event in onbeforeunload function`);
-};
-
-window.onunload = (e: Event) => {
- assert(!e.cancelable);
- console.log(`got ${e.type} event in onunload function`);
-};
-
-console.log("log from main");
diff --git a/cli/tests/testdata/run/onload/nest_imported.ts b/cli/tests/testdata/run/onload/nest_imported.ts
deleted file mode 100644
index e89699854..000000000
--- a/cli/tests/testdata/run/onload/nest_imported.ts
+++ /dev/null
@@ -1,12 +0,0 @@
-// deno-lint-ignore-file no-window-prefix
-import { assert } from "../../../../../test_util/std/assert/mod.ts";
-
-const handler = (e: Event) => {
- assert(e.type === "beforeunload" ? e.cancelable : !e.cancelable);
- console.log(`got ${e.type} event in event handler (nest_imported)`);
-};
-
-window.addEventListener("load", handler);
-window.addEventListener("beforeunload", handler);
-window.addEventListener("unload", handler);
-console.log("log from nest_imported script");
diff --git a/cli/tests/testdata/run/textproto.ts b/cli/tests/testdata/run/textproto.ts
deleted file mode 100644
index 44dd6fbc1..000000000
--- a/cli/tests/testdata/run/textproto.ts
+++ /dev/null
@@ -1,173 +0,0 @@
-// 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 "../../../../test_util/std/io/buf_reader.ts";
-import { concat } from "../../../../test_util/std/bytes/concat.ts";
-
-// 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/cli/tests/testdata/run/tls_connecttls.js b/cli/tests/testdata/run/tls_connecttls.js
deleted file mode 100644
index 8c6c285f3..000000000
--- a/cli/tests/testdata/run/tls_connecttls.js
+++ /dev/null
@@ -1,66 +0,0 @@
-import { assert, assertEquals } from "../../../../test_util/std/assert/mod.ts";
-import { BufReader, BufWriter } from "../../../../test_util/std/io/mod.ts";
-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("./tls/localhost.crt"),
- key: Deno.readTextFileSync("./tls/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,
-});
-assert(conn.rid > 0);
-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/cli/tests/testdata/run/tls_starttls.js b/cli/tests/testdata/run/tls_starttls.js
deleted file mode 100644
index 3e406ff5f..000000000
--- a/cli/tests/testdata/run/tls_starttls.js
+++ /dev/null
@@ -1,65 +0,0 @@
-import { assert, assertEquals } from "../../../../test_util/std/assert/mod.ts";
-import { BufReader } from "../../../../test_util/std/io/buf_reader.ts";
-import { BufWriter } from "../../../../test_util/std/io/buf_writer.ts";
-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("./tls/localhost.crt"),
- key: Deno.readTextFileSync("./tls/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 });
-assert(conn.rid > 0);
-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/cli/tests/testdata/run/websocket_server_idletimeout.ts b/cli/tests/testdata/run/websocket_server_idletimeout.ts
deleted file mode 100644
index fa267c41b..000000000
--- a/cli/tests/testdata/run/websocket_server_idletimeout.ts
+++ /dev/null
@@ -1,25 +0,0 @@
-import { assertEquals } from "../../../../test_util/std/assert/mod.ts";
-
-const errorDeferred = Promise.withResolvers<void>();
-const closeDeferred = Promise.withResolvers<void>();
-
-const listener = Deno.listen({ port: 4509 });
-console.log("READY");
-const httpConn = Deno.serveHttp(await listener.accept());
-const { request, respondWith } = (await httpConn.nextRequest())!;
-const { response, socket } = Deno.upgradeWebSocket(request, {
- idleTimeout: 1,
-});
-socket.onerror = (e) => {
- assertEquals((e as ErrorEvent).message, "No response from ping frame.");
- errorDeferred.resolve();
-};
-socket.onclose = (e) => {
- assertEquals(e.reason, "No response from ping frame.");
- closeDeferred.resolve();
-};
-await respondWith(response);
-
-await errorDeferred.promise;
-await closeDeferred.promise;
-listener.close();
diff --git a/cli/tests/testdata/test/allow_all.ts b/cli/tests/testdata/test/allow_all.ts
deleted file mode 100644
index 50cd407e4..000000000
--- a/cli/tests/testdata/test/allow_all.ts
+++ /dev/null
@@ -1,43 +0,0 @@
-import { assertEquals } from "../../../../test_util/std/assert/mod.ts";
-
-const permissions: Deno.PermissionName[] = [
- "read",
- "write",
- "net",
- "env",
- "run",
- "ffi",
- "hrtime",
-];
-
-for (const name of permissions) {
- Deno.test({
- name: `${name} false`,
- permissions: {
- [name]: false,
- },
- async fn() {
- for await (const n of permissions) {
- const status = await Deno.permissions.query({ name: n });
- assertEquals(status.state, "prompt");
- }
- },
- });
-
- Deno.test({
- name: `${name} true`,
- permissions: {
- [name]: true,
- },
- async fn() {
- for await (const n of permissions) {
- const status = await Deno.permissions.query({ name: n });
- if (n === name) {
- assertEquals(status.state, "granted");
- } else {
- assertEquals(status.state, "prompt");
- }
- }
- },
- });
-}
diff --git a/cli/tests/testdata/test/allow_none.ts b/cli/tests/testdata/test/allow_none.ts
deleted file mode 100644
index eb760242a..000000000
--- a/cli/tests/testdata/test/allow_none.ts
+++ /dev/null
@@ -1,23 +0,0 @@
-import { unreachable } from "../../../../test_util/std/assert/mod.ts";
-
-const permissions: Deno.PermissionName[] = [
- "read",
- "write",
- "net",
- "env",
- "run",
- "ffi",
- "hrtime",
-];
-
-for (const name of permissions) {
- Deno.test({
- name,
- permissions: {
- [name]: true,
- },
- fn() {
- unreachable();
- },
- });
-}
diff --git a/cli/tests/testdata/test/ops_sanitizer_closed_inside_started_before.out b/cli/tests/testdata/test/ops_sanitizer_closed_inside_started_before.out
deleted file mode 100644
index 37fb0a319..000000000
--- a/cli/tests/testdata/test/ops_sanitizer_closed_inside_started_before.out
+++ /dev/null
@@ -1,19 +0,0 @@
-Check [WILDCARD]test/ops_sanitizer_closed_inside_started_before.ts
-running 1 test from ./test/ops_sanitizer_closed_inside_started_before.ts
-test 1 ... FAILED [WILDCARD]
-
- ERRORS
-
-test 1 => ./test/ops_sanitizer_closed_inside_started_before.ts:[WILDCARD]
-error: Leaking async ops:
- - 1 async operation to sleep for a duration was started before this test, but was completed during the test. Async operations should not complete in a test if they were not started in that test. This is often caused by not cancelling a `setTimeout` or `setInterval` call. The operation was started here:
- at [WILDCARD]
- at [WILDCARD]/cli/tests/testdata/test/ops_sanitizer_closed_inside_started_before.ts:[WILDCARD]
-
- FAILURES
-
-test 1 => ./test/ops_sanitizer_closed_inside_started_before.ts:[WILDCARD]
-
-FAILED | 0 passed | 1 failed [WILDCARD]
-
-error: Test failed
diff --git a/cli/tests/testdata/test/ops_sanitizer_missing_details.ts b/cli/tests/testdata/test/ops_sanitizer_missing_details.ts
deleted file mode 100644
index e3b07d77a..000000000
--- a/cli/tests/testdata/test/ops_sanitizer_missing_details.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-// https://github.com/denoland/deno/issues/13729
-// https://github.com/denoland/deno/issues/13938
-import { writeAll } from "../../../../test_util/std/streams/write_all.ts";
-
-Deno.test("test 1", { permissions: { write: true, read: true } }, async () => {
- const tmpFile = await Deno.makeTempFile();
- const file = await Deno.open(tmpFile, { write: true });
- const buf = new Uint8Array(new Array(1_000_000).fill(1));
- writeAll(file, buf);
-});
diff --git a/cli/tests/testdata/test/ops_sanitizer_step_leak.out b/cli/tests/testdata/test/ops_sanitizer_step_leak.out
deleted file mode 100644
index 296c5e573..000000000
--- a/cli/tests/testdata/test/ops_sanitizer_step_leak.out
+++ /dev/null
@@ -1,10 +0,0 @@
-Check [WILDCARD]/cli/tests/testdata/test/ops_sanitizer_step_leak.ts
-running 1 test from ./cli/tests/testdata/test/ops_sanitizer_step_leak.ts
-timeout ...
- step ... ok [WILDCARD]
-------- output -------
-done
------ output end -----
-timeout ... ok [WILDCARD]
-
-ok | 1 passed (1 step) | 0 failed [WILDCARD] \ No newline at end of file
diff --git a/cli/tests/testdata/workers/deno_worker.ts b/cli/tests/testdata/workers/deno_worker.ts
deleted file mode 100644
index eccdab5b0..000000000
--- a/cli/tests/testdata/workers/deno_worker.ts
+++ /dev/null
@@ -1,16 +0,0 @@
-import { assert } from "../../../../test_util/std/assert/mod.ts";
-
-onmessage = function (e) {
- if (typeof self.Deno === "undefined") {
- throw new Error("Deno namespace not available in worker");
- }
-
- assert(!Object.isFrozen(self.Deno));
-
- const desc = Object.getOwnPropertyDescriptor(self, "Deno");
- assert(desc);
- assert(desc.configurable);
- assert(!desc.writable);
-
- postMessage(e.data);
-};
diff --git a/cli/tests/unit/fetch_test.ts b/cli/tests/unit/fetch_test.ts
deleted file mode 100644
index 84e94de0d..000000000
--- a/cli/tests/unit/fetch_test.ts
+++ /dev/null
@@ -1,2071 +0,0 @@
-// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
-import {
- assert,
- assertEquals,
- assertRejects,
- assertThrows,
- delay,
- fail,
- unimplemented,
-} from "./test_util.ts";
-import { Buffer } from "@test_util/std/io/buffer.ts";
-
-const listenPort = 4506;
-
-Deno.test(
- { permissions: { net: true } },
- async function fetchRequiresOneArgument() {
- await assertRejects(
- fetch as unknown as () => Promise<void>,
- TypeError,
- );
- },
-);
-
-Deno.test({ permissions: { net: true } }, async function fetchProtocolError() {
- await assertRejects(
- async () => {
- await fetch("ftp://localhost:21/a/file");
- },
- TypeError,
- "not supported",
- );
-});
-
-function findClosedPortInRange(
- minPort: number,
- maxPort: number,
-): number | never {
- let port = minPort;
-
- // If we hit the return statement of this loop
- // that means that we did not throw an
- // AddrInUse error when we executed Deno.listen.
- while (port < maxPort) {
- try {
- const listener = Deno.listen({ port });
- listener.close();
- return port;
- } catch (_e) {
- port++;
- }
- }
-
- unimplemented(
- `No available ports between ${minPort} and ${maxPort} to test fetch`,
- );
-}
-
-Deno.test(
- // TODO(bartlomieju): reenable this test
- // https://github.com/denoland/deno/issues/18350
- { ignore: Deno.build.os === "windows", permissions: { net: true } },
- async function fetchConnectionError() {
- const port = findClosedPortInRange(4000, 9999);
- await assertRejects(
- async () => {
- await fetch(`http://localhost:${port}`);
- },
- TypeError,
- "error trying to connect",
- );
- },
-);
-
-Deno.test(
- { permissions: { net: true } },
- async function fetchDnsError() {
- await assertRejects(
- async () => {
- await fetch("http://nil/");
- },
- TypeError,
- "error trying to connect",
- );
- },
-);
-
-Deno.test(
- { permissions: { net: true } },
- async function fetchInvalidUriError() {
- await assertRejects(
- async () => {
- await fetch("http://<invalid>/");
- },
- TypeError,
- );
- },
-);
-
-Deno.test(
- { permissions: { net: true } },
- async function fetchMalformedUriError() {
- await assertRejects(
- async () => {
- const url = new URL("http://{{google/");
- await fetch(url);
- },
- TypeError,
- );
- },
-);
-
-Deno.test({ permissions: { net: true } }, async function fetchJsonSuccess() {
- const response = await fetch("http://localhost:4545/assets/fixture.json");
- const json = await response.json();
- assertEquals(json.name, "deno");
-});
-
-Deno.test({ permissions: { net: false } }, async function fetchPerm() {
- await assertRejects(async () => {
- await fetch("http://localhost:4545/assets/fixture.json");
- }, Deno.errors.PermissionDenied);
-});
-
-Deno.test({ permissions: { net: true } }, async function fetchUrl() {
- const response = await fetch("http://localhost:4545/assets/fixture.json");
- assertEquals(response.url, "http://localhost:4545/assets/fixture.json");
- const _json = await response.json();
-});
-
-Deno.test({ permissions: { net: true } }, async function fetchURL() {
- const response = await fetch(
- new URL("http://localhost:4545/assets/fixture.json"),
- );
- assertEquals(response.url, "http://localhost:4545/assets/fixture.json");
- const _json = await response.json();
-});
-
-Deno.test({ permissions: { net: true } }, async function fetchHeaders() {
- const response = await fetch("http://localhost:4545/assets/fixture.json");
- const headers = response.headers;
- assertEquals(headers.get("Content-Type"), "application/json");
- const _json = await response.json();
-});
-
-Deno.test({ permissions: { net: true } }, async function fetchBlob() {
- const response = await fetch("http://localhost:4545/assets/fixture.json");
- const headers = response.headers;
- const blob = await response.blob();
- assertEquals(blob.type, headers.get("Content-Type"));
- assertEquals(blob.size, Number(headers.get("Content-Length")));
-});
-
-Deno.test(
- { permissions: { net: true } },
- async function fetchBodyUsedReader() {
- const response = await fetch(
- "http://localhost:4545/assets/fixture.json",
- );
- assert(response.body !== null);
-
- const reader = response.body.getReader();
- // Getting a reader should lock the stream but does not consume the body
- // so bodyUsed should not be true
- assertEquals(response.bodyUsed, false);
- reader.releaseLock();
- await response.json();
- assertEquals(response.bodyUsed, true);
- },
-);
-
-Deno.test(
- { permissions: { net: true } },
- async function fetchBodyUsedCancelStream() {
- const response = await fetch(
- "http://localhost:4545/assets/fixture.json",
- );
- assert(response.body !== null);
-
- assertEquals(response.bodyUsed, false);
- const promise = response.body.cancel();
- assertEquals(response.bodyUsed, true);
- await promise;
- },
-);
-
-Deno.test({ permissions: { net: true } }, async function fetchAsyncIterator() {
- const response = await fetch("http://localhost:4545/assets/fixture.json");
- const headers = response.headers;
-
- assert(response.body !== null);
- let total = 0;
- for await (const chunk of response.body) {
- assert(chunk instanceof Uint8Array);
- total += chunk.length;
- }
-
- assertEquals(total, Number(headers.get("Content-Length")));
-});
-
-Deno.test({ permissions: { net: true } }, async function fetchBodyReader() {
- const response = await fetch("http://localhost:4545/assets/fixture.json");
- const headers = response.headers;
- assert(response.body !== null);
- const reader = response.body.getReader();
- let total = 0;
- while (true) {
- const { done, value } = await reader.read();
- if (done) break;
- assert(value);
- assert(value instanceof Uint8Array);
- total += value.length;
- }
-
- assertEquals(total, Number(headers.get("Content-Length")));
-});
-
-Deno.test(
- { permissions: { net: true } },
- async function fetchBodyReaderBigBody() {
- const data = "a".repeat(10 << 10); // 10mb
- const response = await fetch("http://localhost:4545/echo_server", {
- method: "POST",
- body: data,
- });
- assert(response.body !== null);
- const reader = await response.body.getReader();
- let total = 0;
- while (true) {
- const { done, value } = await reader.read();
- if (done) break;
- assert(value);
- total += value.length;
- }
-
- assertEquals(total, data.length);
- },
-);
-
-Deno.test({ permissions: { net: true } }, async function responseClone() {
- const response = await fetch("http://localhost:4545/assets/fixture.json");
- const response1 = response.clone();
- assert(response !== response1);
- assertEquals(response.status, response1.status);
- assertEquals(response.statusText, response1.statusText);
- const u8a = new Uint8Array(await response.arrayBuffer());
- const u8a1 = new Uint8Array(await response1.arrayBuffer());
- for (let i = 0; i < u8a.byteLength; i++) {
- assertEquals(u8a[i], u8a1[i]);
- }
-});
-
-Deno.test(
- { permissions: { net: true } },
- async function fetchMultipartFormDataSuccess() {
- const response = await fetch(
- "http://localhost:4545/multipart_form_data.txt",
- );
- const formData = await response.formData();
- assert(formData.has("field_1"));
- assertEquals(formData.get("field_1")!.toString(), "value_1 \r\n");
- assert(formData.has("field_2"));
- const file = formData.get("field_2") as File;
- assertEquals(file.name, "file.js");
-
- assertEquals(await file.text(), `console.log("Hi")`);
- },
-);
-
-Deno.test(
- { permissions: { net: true } },
- async function fetchMultipartFormBadContentType() {
- const response = await fetch(
- "http://localhost:4545/multipart_form_bad_content_type",
- );
- assert(response.body !== null);
-
- await assertRejects(
- async () => {
- await response.formData();
- },
- TypeError,
- "Body can not be decoded as form data",
- );
- },
-);
-
-Deno.test(
- { permissions: { net: true } },
- async function fetchURLEncodedFormDataSuccess() {
- const response = await fetch(
- "http://localhost:4545/subdir/form_urlencoded.txt",
- );
- const formData = await response.formData();
- assert(formData.has("field_1"));
- assertEquals(formData.get("field_1")!.toString(), "Hi");
- assert(formData.has("field_2"));
- assertEquals(formData.get("field_2")!.toString(), "<Deno>");
- },
-);
-
-Deno.test(
- { permissions: { net: true } },
- async function fetchInitFormDataBinaryFileBody() {
- // Some random bytes
- // deno-fmt-ignore
- const binaryFile = new Uint8Array([108,2,0,0,145,22,162,61,157,227,166,77,138,75,180,56,119,188,177,183]);
- const response = await fetch("http://localhost:4545/echo_multipart_file", {
- method: "POST",
- body: binaryFile,
- });
- const resultForm = await response.formData();
- const resultFile = resultForm.get("file") as File;
-
- assertEquals(resultFile.type, "application/octet-stream");
- assertEquals(resultFile.name, "file.bin");
- assertEquals(new Uint8Array(await resultFile.arrayBuffer()), binaryFile);
- },
-);
-
-Deno.test(
- { permissions: { net: true } },
- async function fetchInitFormDataMultipleFilesBody() {
- const files = [
- {
- // deno-fmt-ignore
- content: new Uint8Array([137,80,78,71,13,10,26,10, 137, 1, 25]),
- type: "image/png",
- name: "image",
- fileName: "some-image.png",
- },
- {
- // deno-fmt-ignore
- content: new Uint8Array([108,2,0,0,145,22,162,61,157,227,166,77,138,75,180,56,119,188,177,183]),
- name: "file",
- fileName: "file.bin",
- expectedType: "application/octet-stream",
- },
- {
- content: new TextEncoder().encode("deno land"),
- type: "text/plain",
- name: "text",
- fileName: "deno.txt",
- },
- ];
- const form = new FormData();
- form.append("field", "value");
- for (const file of files) {
- form.append(
- file.name,
- new Blob([file.content], { type: file.type }),
- file.fileName,
- );
- }
- const response = await fetch("http://localhost:4545/echo_server", {
- method: "POST",
- body: form,
- });
- const resultForm = await response.formData();
- assertEquals(form.get("field"), resultForm.get("field"));
- for (const file of files) {
- const inputFile = form.get(file.name) as File;
- const resultFile = resultForm.get(file.name) as File;
- assertEquals(inputFile.size, resultFile.size);
- assertEquals(inputFile.name, resultFile.name);
- assertEquals(file.expectedType || file.type, resultFile.type);
- assertEquals(
- new Uint8Array(await resultFile.arrayBuffer()),
- file.content,
- );
- }
- },
-);
-
-Deno.test(
- {
- permissions: { net: true },
- },
- async function fetchWithRedirection() {
- const response = await fetch("http://localhost:4546/assets/hello.txt");
- assertEquals(response.status, 200);
- assertEquals(response.statusText, "OK");
- assertEquals(response.url, "http://localhost:4545/assets/hello.txt");
- const body = await response.text();
- assert(body.includes("Hello world!"));
- },
-);
-
-Deno.test(
- {
- permissions: { net: true },
- },
- async function fetchWithRelativeRedirection() {
- const response = await fetch(
- "http://localhost:4545/run/001_hello.js",
- );
- assertEquals(response.status, 200);
- assertEquals(response.statusText, "OK");
- const body = await response.text();
- assert(body.includes("Hello"));
- },
-);
-
-Deno.test(
- {
- permissions: { net: true },
- },
- async function fetchWithRelativeRedirectionUrl() {
- const cases = [
- ["end", "http://localhost:4550/a/b/end"],
- ["/end", "http://localhost:4550/end"],
- ];
- for (const [loc, redUrl] of cases) {
- const response = await fetch("http://localhost:4550/a/b/c", {
- headers: new Headers([["x-location", loc]]),
- });
- assertEquals(response.url, redUrl);
- assertEquals(response.redirected, true);
- assertEquals(response.status, 404);
- assertEquals(await response.text(), "");
- }
- },
-);
-
-Deno.test(
- {
- permissions: { net: true },
- },
- async function fetchWithInfRedirection() {
- await assertRejects(
- () => fetch("http://localhost:4549"),
- TypeError,
- "redirect",
- );
- },
-);
-
-Deno.test(
- { permissions: { net: true } },
- async function fetchInitStringBody() {
- const data = "Hello World";
- const response = await fetch("http://localhost:4545/echo_server", {
- method: "POST",
- body: data,
- });
- const text = await response.text();
- assertEquals(text, data);
- assert(response.headers.get("content-type")!.startsWith("text/plain"));
- },
-);
-
-Deno.test(
- { permissions: { net: true } },
- async function fetchRequestInitStringBody() {
- const data = "Hello World";
- const req = new Request("http://localhost:4545/echo_server", {
- method: "POST",
- body: data,
- });
- const response = await fetch(req);
- const text = await response.text();
- assertEquals(text, data);
- },
-);
-
-Deno.test(
- { permissions: { net: true } },
- async function fetchSeparateInit() {
- // related to: https://github.com/denoland/deno/issues/10396
- const req = new Request("http://localhost:4545/run/001_hello.js");
- const init = {
- method: "GET",
- };
- req.headers.set("foo", "bar");
- const res = await fetch(req, init);
- assertEquals(res.status, 200);
- await res.text();
- },
-);
-
-Deno.test(
- { permissions: { net: true } },
- async function fetchInitTypedArrayBody() {
- const data = "Hello World";
- const response = await fetch("http://localhost:4545/echo_server", {
- method: "POST",
- body: new TextEncoder().encode(data),
- });
- const text = await response.text();
- assertEquals(text, data);
- },
-);
-
-Deno.test(
- { permissions: { net: true } },
- async function fetchInitArrayBufferBody() {
- const data = "Hello World";
- const response = await fetch("http://localhost:4545/echo_server", {
- method: "POST",
- body: new TextEncoder().encode(data).buffer,
- });
- const text = await response.text();
- assertEquals(text, data);
- },
-);
-
-Deno.test(
- { permissions: { net: true } },
- async function fetchInitURLSearchParamsBody() {
- const data = "param1=value1&param2=value2";
- const params = new URLSearchParams(data);
- const response = await fetch("http://localhost:4545/echo_server", {
- method: "POST",
- body: params,
- });
- const text = await response.text();
- assertEquals(text, data);
- assert(
- response.headers
- .get("content-type")!
- .startsWith("application/x-www-form-urlencoded"),
- );
- },
-);
-
-Deno.test({ permissions: { net: true } }, async function fetchInitBlobBody() {
- const data = "const a = 1 🦕";
- const blob = new Blob([data], {
- type: "text/javascript",
- });
- const response = await fetch("http://localhost:4545/echo_server", {
- method: "POST",
- body: blob,
- });
- const text = await response.text();
- assertEquals(text, data);
- assert(response.headers.get("content-type")!.startsWith("text/javascript"));
-});
-
-Deno.test(
- { permissions: { net: true } },
- async function fetchInitFormDataBody() {
- const form = new FormData();
- form.append("field", "value");
- const response = await fetch("http://localhost:4545/echo_server", {
- method: "POST",
- body: form,
- });
- const resultForm = await response.formData();
- assertEquals(form.get("field"), resultForm.get("field"));
- },
-);
-
-Deno.test(
- { permissions: { net: true } },
- async function fetchInitFormDataBlobFilenameBody() {
- const form = new FormData();
- form.append("field", "value");
- form.append(
- "file",
- new Blob([new TextEncoder().encode("deno")]),
- "file name",
- );
- const response = await fetch("http://localhost:4545/echo_server", {
- method: "POST",
- body: form,
- });
- const resultForm = await response.formData();
- assertEquals(form.get("field"), resultForm.get("field"));
- const file = resultForm.get("file");
- assert(file instanceof File);
- assertEquals(file.name, "file name");
- },
-);
-
-Deno.test(
- { permissions: { net: true } },
- async function fetchInitFormDataFileFilenameBody() {
- const form = new FormData();
- form.append("field", "value");
- form.append(
- "file",
- new File([new Blob([new TextEncoder().encode("deno")])], "file name"),
- );
- const response = await fetch("http://localhost:4545/echo_server", {
- method: "POST",
- body: form,
- });
- const resultForm = await response.formData();
- assertEquals(form.get("field"), resultForm.get("field"));
- const file = resultForm.get("file");
- assert(file instanceof File);
- assertEquals(file.name, "file name");
- },
-);
-
-Deno.test(
- { permissions: { net: true } },
- async function fetchInitFormDataTextFileBody() {
- const fileContent = "deno land";
- const form = new FormData();
- form.append("field", "value");
- form.append(
- "file",
- new Blob([new TextEncoder().encode(fileContent)], {
- type: "text/plain",
- }),
- "deno.txt",
- );
- const response = await fetch("http://localhost:4545/echo_server", {
- method: "POST",
- body: form,
- });
- const resultForm = await response.formData();
- assertEquals(form.get("field"), resultForm.get("field"));
-
- const file = form.get("file") as File;
- const resultFile = resultForm.get("file") as File;
-
- assertEquals(file.size, resultFile.size);
- assertEquals(file.name, resultFile.name);
- assertEquals(file.type, resultFile.type);
- assertEquals(await file.text(), await resultFile.text());
- },
-);
-
-Deno.test({ permissions: { net: true } }, async function fetchUserAgent() {
- const data = "Hello World";
- const response = await fetch("http://localhost:4545/echo_server", {
- method: "POST",
- body: new TextEncoder().encode(data),
- });
- assertEquals(response.headers.get("user-agent"), `Deno/${Deno.version.deno}`);
- await response.text();
-});
-
-function bufferServer(addr: string): Promise<Buffer> {
- const [hostname, port] = addr.split(":");
- const listener = Deno.listen({
- hostname,
- port: Number(port),
- }) as Deno.Listener;
- return listener.accept().then(async (conn: Deno.Conn) => {
- const buf = new Buffer();
- const p1 = buf.readFrom(conn);
- const p2 = conn.write(
- new TextEncoder().encode(
- "HTTP/1.0 404 Not Found\r\nContent-Length: 2\r\n\r\nNF",
- ),
- );
- // Wait for both an EOF on the read side of the socket and for the write to
- // complete before closing it. Due to keep-alive, the EOF won't be sent
- // until the Connection close (HTTP/1.0) response, so readFrom() can't
- // proceed write. Conversely, if readFrom() is async, waiting for the
- // write() to complete is not a guarantee that we've read the incoming
- // request.
- await Promise.all([p1, p2]);
- conn.close();
- listener.close();
- return buf;
- });
-}
-
-Deno.test(
- {
- permissions: { net: true },
- },
- async function fetchRequest() {
- const addr = `127.0.0.1:${listenPort}`;
- const bufPromise = bufferServer(addr);
- const response = await fetch(`http://${addr}/blah`, {
- method: "POST",
- headers: [
- ["Hello", "World"],
- ["Foo", "Bar"],
- ],
- });
- await response.arrayBuffer();
- assertEquals(response.status, 404);
- assertEquals(response.headers.get("Content-Length"), "2");
-
- const actual = new TextDecoder().decode((await bufPromise).bytes());
- const expected = [
- "POST /blah HTTP/1.1\r\n",
- "content-length: 0\r\n",
- "hello: World\r\n",
- "foo: Bar\r\n",
- "accept: */*\r\n",
- "accept-language: *\r\n",
- `user-agent: Deno/${Deno.version.deno}\r\n`,
- "accept-encoding: gzip, br\r\n",
- `host: ${addr}\r\n\r\n`,
- ].join("");
- assertEquals(actual, expected);
- },
-);
-
-Deno.test(
- {
- permissions: { net: true },
- },
- async function fetchRequestAcceptHeaders() {
- const addr = `127.0.0.1:${listenPort}`;
- const bufPromise = bufferServer(addr);
- const response = await fetch(`http://${addr}/blah`, {
- method: "POST",
- headers: [
- ["Accept", "text/html"],
- ["Accept-Language", "en-US"],
- ],
- });
- await response.arrayBuffer();
- assertEquals(response.status, 404);
- assertEquals(response.headers.get("Content-Length"), "2");
-
- const actual = new TextDecoder().decode((await bufPromise).bytes());
- const expected = [
- "POST /blah HTTP/1.1\r\n",
- "content-length: 0\r\n",
- "accept: text/html\r\n",
- "accept-language: en-US\r\n",
- `user-agent: Deno/${Deno.version.deno}\r\n`,
- "accept-encoding: gzip, br\r\n",
- `host: ${addr}\r\n\r\n`,
- ].join("");
- assertEquals(actual, expected);
- },
-);
-
-Deno.test(
- {
- permissions: { net: true },
- },
- async function fetchPostBodyString() {
- const addr = `127.0.0.1:${listenPort}`;
- const bufPromise = bufferServer(addr);
- const body = "hello world";
- const response = await fetch(`http://${addr}/blah`, {
- method: "POST",
- headers: [
- ["Hello", "World"],
- ["Foo", "Bar"],
- ],
- body,
- });
- await response.arrayBuffer();
- assertEquals(response.status, 404);
- assertEquals(response.headers.get("Content-Length"), "2");
-
- const actual = new TextDecoder().decode((await bufPromise).bytes());
- const expected = [
- "POST /blah HTTP/1.1\r\n",
- "hello: World\r\n",
- "foo: Bar\r\n",
- "content-type: text/plain;charset=UTF-8\r\n",
- "accept: */*\r\n",
- "accept-language: *\r\n",
- `user-agent: Deno/${Deno.version.deno}\r\n`,
- "accept-encoding: gzip, br\r\n",
- `host: ${addr}\r\n`,
- `content-length: ${body.length}\r\n\r\n`,
- body,
- ].join("");
- assertEquals(actual, expected);
- },
-);
-
-Deno.test(
- {
- permissions: { net: true },
- },
- async function fetchPostBodyTypedArray() {
- const addr = `127.0.0.1:${listenPort}`;
- const bufPromise = bufferServer(addr);
- const bodyStr = "hello world";
- const body = new TextEncoder().encode(bodyStr);
- const response = await fetch(`http://${addr}/blah`, {
- method: "POST",
- headers: [
- ["Hello", "World"],
- ["Foo", "Bar"],
- ],
- body,
- });
- await response.arrayBuffer();
- assertEquals(response.status, 404);
- assertEquals(response.headers.get("Content-Length"), "2");
-
- const actual = new TextDecoder().decode((await bufPromise).bytes());
- const expected = [
- "POST /blah HTTP/1.1\r\n",
- "hello: World\r\n",
- "foo: Bar\r\n",
- "accept: */*\r\n",
- "accept-language: *\r\n",
- `user-agent: Deno/${Deno.version.deno}\r\n`,
- "accept-encoding: gzip, br\r\n",
- `host: ${addr}\r\n`,
- `content-length: ${body.byteLength}\r\n\r\n`,
- bodyStr,
- ].join("");
- assertEquals(actual, expected);
- },
-);
-
-Deno.test(
- {
- permissions: { net: true },
- },
- async function fetchUserSetContentLength() {
- const addr = `127.0.0.1:${listenPort}`;
- const bufPromise = bufferServer(addr);
- const response = await fetch(`http://${addr}/blah`, {
- method: "POST",
- headers: [
- ["Content-Length", "10"],
- ],
- });
- await response.arrayBuffer();
- assertEquals(response.status, 404);
- assertEquals(response.headers.get("Content-Length"), "2");
-
- const actual = new TextDecoder().decode((await bufPromise).bytes());
- const expected = [
- "POST /blah HTTP/1.1\r\n",
- "content-length: 0\r\n",
- "accept: */*\r\n",
- "accept-language: *\r\n",
- `user-agent: Deno/${Deno.version.deno}\r\n`,
- "accept-encoding: gzip, br\r\n",
- `host: ${addr}\r\n\r\n`,
- ].join("");
- assertEquals(actual, expected);
- },
-);
-
-Deno.test(
- {
- permissions: { net: true },
- },
- async function fetchUserSetTransferEncoding() {
- const addr = `127.0.0.1:${listenPort}`;
- const bufPromise = bufferServer(addr);
- const response = await fetch(`http://${addr}/blah`, {
- method: "POST",
- headers: [
- ["Transfer-Encoding", "chunked"],
- ],
- });
- await response.arrayBuffer();
- assertEquals(response.status, 404);
- assertEquals(response.headers.get("Content-Length"), "2");
-
- const actual = new TextDecoder().decode((await bufPromise).bytes());
- const expected = [
- "POST /blah HTTP/1.1\r\n",
- "content-length: 0\r\n",
- `host: ${addr}\r\n`,
- "accept: */*\r\n",
- "accept-language: *\r\n",
- `user-agent: Deno/${Deno.version.deno}\r\n`,
- "accept-encoding: gzip, br\r\n\r\n",
- ].join("");
- assertEquals(actual, expected);
- },
-);
-
-Deno.test(
- {
- permissions: { net: true },
- },
- async function fetchWithNonAsciiRedirection() {
- const response = await fetch("http://localhost:4545/non_ascii_redirect", {
- redirect: "manual",
- });
- assertEquals(response.status, 301);
- assertEquals(response.headers.get("location"), "/redirect®");
- await response.text();
- },
-);
-
-Deno.test(
- {
- permissions: { net: true },
- },
- async function fetchWithManualRedirection() {
- const response = await fetch("http://localhost:4546/", {
- redirect: "manual",
- }); // will redirect to http://localhost:4545/
- assertEquals(response.status, 301);
- assertEquals(response.url, "http://localhost:4546/");
- assertEquals(response.type, "basic");
- assertEquals(response.headers.get("Location"), "http://localhost:4545/");
- await response.body!.cancel();
- },
-);
-
-Deno.test(
- {
- permissions: { net: true },
- },
- async function fetchWithErrorRedirection() {
- await assertRejects(
- () =>
- fetch("http://localhost:4546/", {
- redirect: "error",
- }),
- TypeError,
- "redirect",
- );
- },
-);
-
-Deno.test(function responseRedirect() {
- const redir = Response.redirect("http://example.com/newLocation", 301);
- assertEquals(redir.status, 301);
- assertEquals(redir.statusText, "");
- assertEquals(redir.url, "");
- assertEquals(
- redir.headers.get("Location"),
- "http://example.com/newLocation",
- );
- assertEquals(redir.type, "default");
-});
-
-Deno.test(function responseRedirectTakeURLObjectAsParameter() {
- const redir = Response.redirect(new URL("https://example.com/"));
- assertEquals(
- redir.headers.get("Location"),
- "https://example.com/",
- );
-});
-
-Deno.test(async function responseWithoutBody() {
- const response = new Response();
- assertEquals(await response.arrayBuffer(), new ArrayBuffer(0));
- const blob = await response.blob();
- assertEquals(blob.size, 0);
- assertEquals(await blob.arrayBuffer(), new ArrayBuffer(0));
- assertEquals(await response.text(), "");
- await assertRejects(async () => {
- await response.json();
- });
-});
-
-Deno.test({ permissions: { net: true } }, async function fetchBodyReadTwice() {
- const response = await fetch("http://localhost:4545/assets/fixture.json");
-
- // Read body
- const _json = await response.json();
- assert(_json);
-
- // All calls after the body was consumed, should fail
- const methods = ["json", "text", "formData", "arrayBuffer"] as const;
- for (const method of methods) {
- try {
- await response[method]();
- fail(
- "Reading body multiple times should failed, the stream should've been locked.",
- );
- } catch {
- // pass
- }
- }
-});
-
-Deno.test(
- { permissions: { net: true } },
- async function fetchBodyReaderAfterRead() {
- const response = await fetch(
- "http://localhost:4545/assets/fixture.json",
- );
- assert(response.body !== null);
- const reader = await response.body.getReader();
- while (true) {
- const { done, value } = await reader.read();
- if (done) break;
- assert(value);
- }
-
- try {
- response.body.getReader();
- fail("The stream should've been locked.");
- } catch {
- // pass
- }
- },
-);
-
-Deno.test(
- { permissions: { net: true } },
- async function fetchBodyReaderWithCancelAndNewReader() {
- const data = "a".repeat(1 << 10);
- const response = await fetch("http://localhost:4545/echo_server", {
- method: "POST",
- body: data,
- });
- assert(response.body !== null);
- const firstReader = await response.body.getReader();
-
- // Acquire reader without reading & release
- await firstReader.releaseLock();
-
- const reader = await response.body.getReader();
-
- let total = 0;
- while (true) {
- const { done, value } = await reader.read();
- if (done) break;
- assert(value);
- total += value.length;
- }
-
- assertEquals(total, data.length);
- },
-);
-
-Deno.test(
- { permissions: { net: true } },
- async function fetchBodyReaderWithReadCancelAndNewReader() {
- const data = "a".repeat(1 << 10);
-
- const response = await fetch("http://localhost:4545/echo_server", {
- method: "POST",
- body: data,
- });
- assert(response.body !== null);
- const firstReader = await response.body.getReader();
-
- // Do one single read with first reader
- const { value: firstValue } = await firstReader.read();
- assert(firstValue);
- await firstReader.releaseLock();
-
- // Continue read with second reader
- const reader = await response.body.getReader();
- let total = firstValue.length || 0;
- while (true) {
- const { done, value } = await reader.read();
- if (done) break;
- assert(value);
- total += value.length;
- }
- assertEquals(total, data.length);
- },
-);
-
-Deno.test(
- { permissions: { net: true } },
- async function fetchResourceCloseAfterStreamCancel() {
- const res = await fetch("http://localhost:4545/assets/fixture.json");
- assert(res.body !== null);
-
- // After ReadableStream.cancel is called, resource handle must be closed
- // The test should not fail with: Test case is leaking resources
- await res.body.cancel();
- },
-);
-
-Deno.test(
- { permissions: { net: true } },
- async function fetchNullBodyStatus() {
- const nullBodyStatus = [101, 204, 205, 304];
-
- for (const status of nullBodyStatus) {
- const headers = new Headers([["x-status", String(status)]]);
- const res = await fetch("http://localhost:4545/echo_server", {
- body: "deno",
- method: "POST",
- headers,
- });
- assertEquals(res.body, null);
- assertEquals(res.status, status);
- }
- },
-);
-
-Deno.test(
- { permissions: { net: true } },
- async function fetchResponseContentLength() {
- const body = new Uint8Array(2 ** 16);
- const headers = new Headers([["content-type", "application/octet-stream"]]);
- const res = await fetch("http://localhost:4545/echo_server", {
- body: body,
- method: "POST",
- headers,
- });
- assertEquals(Number(res.headers.get("content-length")), body.byteLength);
-
- const blob = await res.blob();
- // Make sure Body content-type is correctly set
- assertEquals(blob.type, "application/octet-stream");
- assertEquals(blob.size, body.byteLength);
- },
-);
-
-Deno.test(function fetchResponseConstructorNullBody() {
- const nullBodyStatus = [204, 205, 304];
-
- for (const status of nullBodyStatus) {
- try {
- new Response("deno", { status });
- fail("Response with null body status cannot have body");
- } catch (e) {
- assert(e instanceof TypeError);
- assertEquals(
- e.message,
- "Response with null body status cannot have body",
- );
- }
- }
-});
-
-Deno.test(function fetchResponseConstructorInvalidStatus() {
- const invalidStatus = [100, 600, 199, null, "", NaN];
-
- for (const status of invalidStatus) {
- try {
- // deno-lint-ignore ban-ts-comment
- // @ts-ignore
- new Response("deno", { status });
- fail(`Invalid status: ${status}`);
- } catch (e) {
- assert(e instanceof RangeError);
- assert(
- e.message.endsWith(
- "is not equal to 101 and outside the range [200, 599].",
- ),
- );
- }
- }
-});
-
-Deno.test(function fetchResponseEmptyConstructor() {
- const response = new Response();
- assertEquals(response.status, 200);
- assertEquals(response.body, null);
- assertEquals(response.type, "default");
- assertEquals(response.url, "");
- assertEquals(response.redirected, false);
- assertEquals(response.ok, true);
- assertEquals(response.bodyUsed, false);
- assertEquals([...response.headers], []);
-});
-
-Deno.test(
- { permissions: { net: true, read: true } },
- async function fetchCustomHttpClientParamCertificateSuccess(): Promise<
- void
- > {
- const caCert = Deno.readTextFileSync("cli/tests/testdata/tls/RootCA.pem");
- const client = Deno.createHttpClient({ caCerts: [caCert] });
- const response = await fetch("https://localhost:5545/assets/fixture.json", {
- client,
- });
- const json = await response.json();
- assertEquals(json.name, "deno");
- client.close();
- },
-);
-
-Deno.test(
- { permissions: { net: true, read: true } },
- function createHttpClientAcceptPoolIdleTimeout() {
- const client = Deno.createHttpClient({
- poolIdleTimeout: 1000,
- });
- client.close();
- },
-);
-
-Deno.test(
- { permissions: { net: true } },
- async function fetchCustomClientUserAgent(): Promise<
- void
- > {
- const data = "Hello World";
- const client = Deno.createHttpClient({});
- const response = await fetch("http://localhost:4545/echo_server", {
- client,
- method: "POST",
- body: new TextEncoder().encode(data),
- });
- assertEquals(
- response.headers.get("user-agent"),
- `Deno/${Deno.version.deno}`,
- );
- await response.text();
- client.close();
- },
-);
-
-Deno.test(
- {
- permissions: { net: true },
- },
- async function fetchPostBodyReadableStream() {
- const addr = `127.0.0.1:${listenPort}`;
- const bufPromise = bufferServer(addr);
- const stream = new TransformStream();
- const writer = stream.writable.getWriter();
- // transformer writes don't resolve until they are read, so awaiting these
- // will cause the transformer to hang, as the suspend the transformer, it
- // is also illogical to await for the reads, as that is the whole point of
- // streams is to have a "queue" which gets drained...
- writer.write(new TextEncoder().encode("hello "));
- writer.write(new TextEncoder().encode("world"));
- writer.close();
- const response = await fetch(`http://${addr}/blah`, {
- method: "POST",
- headers: [
- ["Hello", "World"],
- ["Foo", "Bar"],
- ],
- body: stream.readable,
- });
- await response.arrayBuffer();
- assertEquals(response.status, 404);
- assertEquals(response.headers.get("Content-Length"), "2");
-
- const actual = new TextDecoder().decode((await bufPromise).bytes());
- const expected = [
- "POST /blah HTTP/1.1\r\n",
- "hello: World\r\n",
- "foo: Bar\r\n",
- "accept: */*\r\n",
- "accept-language: *\r\n",
- `user-agent: Deno/${Deno.version.deno}\r\n`,
- "accept-encoding: gzip, br\r\n",
- `host: ${addr}\r\n`,
- `transfer-encoding: chunked\r\n\r\n`,
- "B\r\n",
- "hello world\r\n",
- "0\r\n\r\n",
- ].join("");
- assertEquals(actual, expected);
- },
-);
-
-Deno.test({}, function fetchWritableRespProps() {
- const original = new Response("https://deno.land", {
- status: 404,
- headers: { "x-deno": "foo" },
- });
- const new_ = new Response("https://deno.land", original);
- assertEquals(original.status, new_.status);
- assertEquals(new_.headers.get("x-deno"), "foo");
-});
-
-Deno.test(
- { permissions: { net: true } },
- async function fetchFilterOutCustomHostHeader(): Promise<
- void
- > {
- const addr = `127.0.0.1:${listenPort}`;
- const [hostname, port] = addr.split(":");
- const listener = Deno.listen({
- hostname,
- port: Number(port),
- }) as Deno.Listener;
-
- let httpConn: Deno.HttpConn;
- listener.accept().then(async (conn: Deno.Conn) => {
- httpConn = Deno.serveHttp(conn);
-
- await httpConn.nextRequest()
- .then(async (requestEvent: Deno.RequestEvent | null) => {
- const hostHeader = requestEvent?.request.headers.get("Host");
- const headersToReturn = hostHeader
- ? { "Host": hostHeader }
- : undefined;
-
- await requestEvent?.respondWith(
- new Response("", {
- status: 200,
- headers: headersToReturn,
- }),
- );
- });
- });
-
- const response = await fetch(`http://${addr}/`, {
- headers: { "Host": "example.com" },
- });
- await response.text();
- listener.close();
- httpConn!.close();
-
- assertEquals(response.headers.get("Host"), addr);
- },
-);
-
-Deno.test(
- { permissions: { net: true } },
- async function fetchNoServerReadableStreamBody() {
- const completed = Promise.withResolvers<void>();
- const failed = Promise.withResolvers<void>();
- const body = new ReadableStream({
- start(controller) {
- controller.enqueue(new Uint8Array([1]));
- setTimeout(async () => {
- // This is technically a race. If the fetch has failed by this point, the enqueue will
- // throw. If not, it will succeed. Windows appears to take a while to time out the fetch,
- // so we will just wait for that here before we attempt to enqueue so it's consistent
- // across platforms.
- await failed.promise;
- assertThrows(() => controller.enqueue(new Uint8Array([2])));
- completed.resolve();
- }, 1000);
- },
- });
- const nonExistentHostname = "http://localhost:47582";
- await assertRejects(async () => {
- await fetch(nonExistentHostname, { body, method: "POST" });
- }, TypeError);
- failed.resolve();
- await completed.promise;
- },
-);
-
-Deno.test(
- { permissions: { net: true } },
- async function fetchHeadRespBody() {
- const res = await fetch("http://localhost:4545/echo_server", {
- method: "HEAD",
- });
- assertEquals(res.body, null);
- },
-);
-
-Deno.test(
- { permissions: { read: true, net: true } },
- async function fetchClientCertWrongPrivateKey(): Promise<void> {
- await assertRejects(async () => {
- const client = Deno.createHttpClient({
- certChain: "bad data",
- privateKey: await Deno.readTextFile(
- "cli/tests/testdata/tls/localhost.key",
- ),
- });
- await fetch("https://localhost:5552/assets/fixture.json", {
- client,
- });
- }, Deno.errors.InvalidData);
- },
-);
-
-Deno.test(
- { permissions: { read: true, net: true } },
- async function fetchClientCertBadPrivateKey(): Promise<void> {
- await assertRejects(async () => {
- const client = Deno.createHttpClient({
- certChain: await Deno.readTextFile(
- "cli/tests/testdata/tls/localhost.crt",
- ),
- privateKey: "bad data",
- });
- await fetch("https://localhost:5552/assets/fixture.json", {
- client,
- });
- }, Deno.errors.InvalidData);
- },
-);
-
-Deno.test(
- { permissions: { read: true, net: true } },
- async function fetchClientCertNotPrivateKey(): Promise<void> {
- await assertRejects(async () => {
- const client = Deno.createHttpClient({
- certChain: await Deno.readTextFile(
- "cli/tests/testdata/tls/localhost.crt",
- ),
- privateKey: "",
- });
- await fetch("https://localhost:5552/assets/fixture.json", {
- client,
- });
- }, Deno.errors.InvalidData);
- },
-);
-
-Deno.test(
- { permissions: { read: true, net: true } },
- async function fetchCustomClientPrivateKey(): Promise<
- void
- > {
- const data = "Hello World";
- const caCert = await Deno.readTextFile("cli/tests/testdata/tls/RootCA.crt");
- const client = Deno.createHttpClient({
- certChain: await Deno.readTextFile(
- "cli/tests/testdata/tls/localhost.crt",
- ),
- privateKey: await Deno.readTextFile(
- "cli/tests/testdata/tls/localhost.key",
- ),
- caCerts: [caCert],
- });
- const response = await fetch("https://localhost:5552/echo_server", {
- client,
- method: "POST",
- body: new TextEncoder().encode(data),
- });
- assertEquals(
- response.headers.get("user-agent"),
- `Deno/${Deno.version.deno}`,
- );
- await response.text();
- client.close();
- },
-);
-
-Deno.test(
- { permissions: { net: true } },
- async function fetchAbortWhileUploadStreaming(): Promise<void> {
- const abortController = new AbortController();
- try {
- await fetch(
- "http://localhost:5552/echo_server",
- {
- method: "POST",
- body: new ReadableStream({
- pull(controller) {
- abortController.abort();
- controller.enqueue(new Uint8Array([1, 2, 3, 4]));
- },
- }),
- signal: abortController.signal,
- },
- );
- fail("Fetch didn't reject.");
- } catch (error) {
- assert(error instanceof DOMException);
- assertEquals(error.name, "AbortError");
- assertEquals(error.message, "The signal has been aborted");
- }
- },
-);
-
-Deno.test(
- { permissions: { net: true } },
- async function fetchAbortWhileUploadStreamingWithReason(): Promise<void> {
- const abortController = new AbortController();
- const abortReason = new Error();
- try {
- await fetch(
- "http://localhost:5552/echo_server",
- {
- method: "POST",
- body: new ReadableStream({
- pull(controller) {
- abortController.abort(abortReason);
- controller.enqueue(new Uint8Array([1, 2, 3, 4]));
- },
- }),
- signal: abortController.signal,
- },
- );
- fail("Fetch didn't reject.");
- } catch (error) {
- assertEquals(error, abortReason);
- }
- },
-);
-
-Deno.test(
- { permissions: { net: true } },
- async function fetchAbortWhileUploadStreamingWithPrimitiveReason(): Promise<
- void
- > {
- const abortController = new AbortController();
- try {
- await fetch(
- "http://localhost:5552/echo_server",
- {
- method: "POST",
- body: new ReadableStream({
- pull(controller) {
- abortController.abort("Abort reason");
- controller.enqueue(new Uint8Array([1, 2, 3, 4]));
- },
- }),
- signal: abortController.signal,
- },
- );
- fail("Fetch didn't reject.");
- } catch (error) {
- assertEquals(error, "Abort reason");
- }
- },
-);
-
-Deno.test(
- { permissions: { net: true } },
- async function fetchHeaderValueShouldNotPanic() {
- for (let i = 0; i < 0x21; i++) {
- if (i === 0x09 || i === 0x0A || i === 0x0D || i === 0x20) {
- continue; // these header value will be normalized, will not cause an error.
- }
- // ensure there will be an error instead of panic.
- await assertRejects(() =>
- fetch("http://localhost:4545/echo_server", {
- method: "HEAD",
- headers: { "val": String.fromCharCode(i) },
- }), TypeError);
- }
- await assertRejects(() =>
- fetch("http://localhost:4545/echo_server", {
- method: "HEAD",
- headers: { "val": String.fromCharCode(127) },
- }), TypeError);
- },
-);
-
-Deno.test(
- { permissions: { net: true } },
- async function fetchHeaderNameShouldNotPanic() {
- const validTokens =
- "!#$%&'*+-.0123456789ABCDEFGHIJKLMNOPQRSTUWVXYZ^_`abcdefghijklmnopqrstuvwxyz|~"
- .split("");
- for (let i = 0; i <= 255; i++) {
- const token = String.fromCharCode(i);
- if (validTokens.includes(token)) {
- continue;
- }
- // ensure there will be an error instead of panic.
- await assertRejects(() =>
- fetch("http://localhost:4545/echo_server", {
- method: "HEAD",
- headers: { [token]: "value" },
- }), TypeError);
- }
- await assertRejects(() =>
- fetch("http://localhost:4545/echo_server", {
- method: "HEAD",
- headers: { "": "value" },
- }), TypeError);
- },
-);
-
-Deno.test(
- { permissions: { net: true, read: true } },
- async function fetchSupportsHttpsOverIpAddress() {
- const caCert = await Deno.readTextFile("cli/tests/testdata/tls/RootCA.pem");
- const client = Deno.createHttpClient({ caCerts: [caCert] });
- const res = await fetch("https://localhost:5546/http_version", { client });
- assert(res.ok);
- assertEquals(await res.text(), "HTTP/1.1");
- client.close();
- },
-);
-
-Deno.test(
- { permissions: { net: true, read: true } },
- async function fetchSupportsHttp1Only() {
- const caCert = await Deno.readTextFile("cli/tests/testdata/tls/RootCA.pem");
- const client = Deno.createHttpClient({ caCerts: [caCert] });
- const res = await fetch("https://localhost:5546/http_version", { client });
- assert(res.ok);
- assertEquals(await res.text(), "HTTP/1.1");
- client.close();
- },
-);
-
-Deno.test(
- { permissions: { net: true, read: true } },
- async function fetchSupportsHttp2() {
- const caCert = await Deno.readTextFile("cli/tests/testdata/tls/RootCA.pem");
- const client = Deno.createHttpClient({ caCerts: [caCert] });
- const res = await fetch("https://localhost:5547/http_version", { client });
- assert(res.ok);
- assertEquals(await res.text(), "HTTP/2.0");
- client.close();
- },
-);
-
-Deno.test(
- { permissions: { net: true, read: true } },
- async function fetchForceHttp1OnHttp2Server() {
- const client = Deno.createHttpClient({ http2: false, http1: true });
- await assertRejects(
- () => fetch("http://localhost:5549/http_version", { client }),
- TypeError,
- );
- client.close();
- },
-);
-
-Deno.test(
- { permissions: { net: true, read: true } },
- async function fetchForceHttp2OnHttp1Server() {
- const client = Deno.createHttpClient({ http2: true, http1: false });
- await assertRejects(
- () => fetch("http://localhost:5548/http_version", { client }),
- TypeError,
- );
- client.close();
- },
-);
-
-Deno.test(
- { permissions: { net: true, read: true } },
- async function fetchPrefersHttp2() {
- const caCert = await Deno.readTextFile("cli/tests/testdata/tls/RootCA.pem");
- const client = Deno.createHttpClient({ caCerts: [caCert] });
- const res = await fetch("https://localhost:5545/http_version", { client });
- assert(res.ok);
- assertEquals(await res.text(), "HTTP/2.0");
- client.close();
- },
-);
-
-Deno.test(
- { permissions: { net: true, read: true } },
- async function createHttpClientAllowHost() {
- const client = Deno.createHttpClient({
- allowHost: true,
- });
- const res = await fetch("http://localhost:4545/echo_server", {
- headers: {
- "host": "example.com",
- },
- client,
- });
- assert(res.ok);
- assertEquals(res.headers.get("host"), "example.com");
- await res.body?.cancel();
- client.close();
- },
-);
-
-Deno.test(
- { permissions: { net: true } },
- async function createHttpClientExplicitResourceManagement() {
- using client = Deno.createHttpClient({});
- const response = await fetch("http://localhost:4545/assets/fixture.json", {
- client,
- });
- const json = await response.json();
- assertEquals(json.name, "deno");
- },
-);
-
-Deno.test(
- { permissions: { net: true } },
- async function createHttpClientExplicitResourceManagementDoubleClose() {
- using client = Deno.createHttpClient({});
- const response = await fetch("http://localhost:4545/assets/fixture.json", {
- client,
- });
- const json = await response.json();
- assertEquals(json.name, "deno");
- // Close the client even though we declared it with `using` to confirm that
- // the cleanup done as per `Symbol.dispose` will not throw any errors.
- client.close();
- },
-);
-
-Deno.test({ permissions: { read: false } }, async function fetchFilePerm() {
- await assertRejects(async () => {
- await fetch(import.meta.resolve("../testdata/subdir/json_1.json"));
- }, Deno.errors.PermissionDenied);
-});
-
-Deno.test(
- { permissions: { read: false } },
- async function fetchFilePermDoesNotExist() {
- await assertRejects(async () => {
- await fetch(import.meta.resolve("./bad.json"));
- }, Deno.errors.PermissionDenied);
- },
-);
-
-Deno.test(
- { permissions: { read: true } },
- async function fetchFileBadMethod() {
- await assertRejects(
- async () => {
- await fetch(
- import.meta.resolve("../testdata/subdir/json_1.json"),
- {
- method: "POST",
- },
- );
- },
- TypeError,
- "Fetching files only supports the GET method. Received POST.",
- );
- },
-);
-
-Deno.test(
- { permissions: { read: true } },
- async function fetchFileDoesNotExist() {
- await assertRejects(
- async () => {
- await fetch(import.meta.resolve("./bad.json"));
- },
- TypeError,
- );
- },
-);
-
-Deno.test(
- { permissions: { read: true } },
- async function fetchFile() {
- const res = await fetch(
- import.meta.resolve("../testdata/subdir/json_1.json"),
- );
- assert(res.ok);
- const fixture = await Deno.readTextFile(
- "cli/tests/testdata/subdir/json_1.json",
- );
- assertEquals(await res.text(), fixture);
- },
-);
-
-Deno.test(
- { permissions: { net: true } },
- async function fetchContentLengthPost() {
- const response = await fetch("http://localhost:4545/content_length", {
- method: "POST",
- });
- const length = await response.text();
- assertEquals(length, 'Some("0")');
- },
-);
-
-Deno.test(
- { permissions: { net: true } },
- async function fetchContentLengthPut() {
- const response = await fetch("http://localhost:4545/content_length", {
- method: "PUT",
- });
- const length = await response.text();
- assertEquals(length, 'Some("0")');
- },
-);
-
-Deno.test(
- { permissions: { net: true } },
- async function fetchContentLengthPatch() {
- const response = await fetch("http://localhost:4545/content_length", {
- method: "PATCH",
- });
- const length = await response.text();
- assertEquals(length, "None");
- },
-);
-
-Deno.test(
- { permissions: { net: true } },
- async function fetchContentLengthPostWithStringBody() {
- const response = await fetch("http://localhost:4545/content_length", {
- method: "POST",
- body: "Hey!",
- });
- const length = await response.text();
- assertEquals(length, 'Some("4")');
- },
-);
-
-Deno.test(
- { permissions: { net: true } },
- async function fetchContentLengthPostWithBufferBody() {
- const response = await fetch("http://localhost:4545/content_length", {
- method: "POST",
- body: new TextEncoder().encode("Hey!"),
- });
- const length = await response.text();
- assertEquals(length, 'Some("4")');
- },
-);
-
-Deno.test(async function staticResponseJson() {
- const data = { hello: "world" };
- const resp = Response.json(data);
- assertEquals(resp.status, 200);
- assertEquals(resp.headers.get("content-type"), "application/json");
- const res = await resp.json();
- assertEquals(res, data);
-});
-
-function invalidServer(addr: string, body: Uint8Array): Deno.Listener {
- const [hostname, port] = addr.split(":");
- const listener = Deno.listen({
- hostname,
- port: Number(port),
- }) as Deno.Listener;
-
- (async () => {
- for await (const conn of listener) {
- const p1 = conn.read(new Uint8Array(2 ** 14));
- const p2 = conn.write(body);
-
- await Promise.all([p1, p2]);
- conn.close();
- }
- })();
-
- return listener;
-}
-
-Deno.test(
- { permissions: { net: true } },
- async function fetchWithInvalidContentLengthAndTransferEncoding(): Promise<
- void
- > {
- const addr = `127.0.0.1:${listenPort}`;
- const data = "a".repeat(10 << 10);
-
- const body = new TextEncoder().encode(
- `HTTP/1.1 200 OK\r\nContent-Length: ${
- Math.round(data.length * 2)
- }\r\nTransfer-Encoding: chunked\r\n\r\n${
- data.length.toString(16)
- }\r\n${data}\r\n0\r\n\r\n`,
- );
-
- // if transfer-encoding is sent, content-length is ignored
- // even if it has an invalid value (content-length > totalLength)
- const listener = invalidServer(addr, body);
- const response = await fetch(`http://${addr}/`);
-
- const res = await response.arrayBuffer();
- const buf = new TextEncoder().encode(data);
- assertEquals(res.byteLength, buf.byteLength);
- assertEquals(new Uint8Array(res), buf);
-
- listener.close();
- },
-);
-
-Deno.test(
- // TODO(bartlomieju): reenable this test
- // https://github.com/denoland/deno/issues/18350
- { ignore: Deno.build.os === "windows", permissions: { net: true } },
- async function fetchWithInvalidContentLength(): Promise<
- void
- > {
- const addr = `127.0.0.1:${listenPort}`;
- const data = "a".repeat(10 << 10);
-
- const body = new TextEncoder().encode(
- `HTTP/1.1 200 OK\r\nContent-Length: ${
- Math.round(data.length / 2)
- }\r\nContent-Length: ${data.length}\r\n\r\n${data}`,
- );
-
- // It should fail if multiple content-length headers with different values are sent
- const listener = invalidServer(addr, body);
- await assertRejects(
- async () => {
- await fetch(`http://${addr}/`);
- },
- TypeError,
- "invalid content-length parsed",
- );
-
- listener.close();
- },
-);
-
-Deno.test(
- { permissions: { net: true } },
- async function fetchWithInvalidContentLength2(): Promise<
- void
- > {
- const addr = `127.0.0.1:${listenPort}`;
- const data = "a".repeat(10 << 10);
-
- const contentLength = data.length / 2;
- const body = new TextEncoder().encode(
- `HTTP/1.1 200 OK\r\nContent-Length: ${contentLength}\r\n\r\n${data}`,
- );
-
- const listener = invalidServer(addr, body);
- const response = await fetch(`http://${addr}/`);
-
- // If content-length < totalLength, a maximum of content-length bytes
- // should be returned.
- const res = await response.arrayBuffer();
- const buf = new TextEncoder().encode(data);
- assertEquals(res.byteLength, contentLength);
- assertEquals(new Uint8Array(res), buf.subarray(contentLength));
-
- listener.close();
- },
-);
-
-Deno.test(
- { permissions: { net: true } },
- async function fetchWithInvalidContentLength3(): Promise<
- void
- > {
- const addr = `127.0.0.1:${listenPort}`;
- const data = "a".repeat(10 << 10);
-
- const contentLength = data.length * 2;
- const body = new TextEncoder().encode(
- `HTTP/1.1 200 OK\r\nContent-Length: ${contentLength}\r\n\r\n${data}`,
- );
-
- const listener = invalidServer(addr, body);
- const response = await fetch(`http://${addr}/`);
- // If content-length > totalLength, a maximum of content-length bytes
- // should be returned.
- await assertRejects(
- async () => {
- await response.arrayBuffer();
- },
- Error,
- "end of file before message length reached",
- );
-
- listener.close();
- },
-);
-
-Deno.test(
- { permissions: { net: true } },
- async function fetchBlobUrl(): Promise<void> {
- const blob = new Blob(["ok"], { type: "text/plain" });
- const url = URL.createObjectURL(blob);
- assert(url.startsWith("blob:"), `URL was ${url}`);
- const res = await fetch(url);
- assertEquals(res.url, url);
- assertEquals(res.status, 200);
- assertEquals(res.headers.get("content-length"), "2");
- assertEquals(res.headers.get("content-type"), "text/plain");
- assertEquals(await res.text(), "ok");
- },
-);
-
-Deno.test(
- { permissions: { net: true } },
- async function fetchResponseStreamIsLockedWhileReading() {
- const response = await fetch("http://localhost:4545/echo_server", {
- body: new Uint8Array(5000),
- method: "POST",
- });
-
- assertEquals(response.body!.locked, false);
- const promise = response.arrayBuffer();
- assertEquals(response.body!.locked, true);
-
- await promise;
- },
-);
-
-Deno.test(
- { permissions: { net: true } },
- async function fetchConstructorClones() {
- const req = new Request("https://example.com", {
- method: "POST",
- body: "foo",
- });
- assertEquals(await req.text(), "foo");
- await assertRejects(() => req.text());
-
- const req2 = new Request(req, { method: "PUT", body: "bar" }); // should not have any impact on req
- await assertRejects(() => req.text());
- assertEquals(await req2.text(), "bar");
-
- assertEquals(req.method, "POST");
- assertEquals(req2.method, "PUT");
-
- assertEquals(req.headers.get("x-foo"), null);
- assertEquals(req2.headers.get("x-foo"), null);
- req2.headers.set("x-foo", "bar"); // should not have any impact on req
- assertEquals(req.headers.get("x-foo"), null);
- assertEquals(req2.headers.get("x-foo"), "bar");
- },
-);
-
-Deno.test(
- // TODO(bartlomieju): reenable this test
- // https://github.com/denoland/deno/issues/18350
- { ignore: Deno.build.os === "windows", permissions: { net: true } },
- async function fetchRequestBodyErrorCatchable() {
- const listener = Deno.listen({ hostname: "127.0.0.1", port: listenPort });
- const server = (async () => {
- const conn = await listener.accept();
- listener.close();
- const buf = new Uint8Array(256);
- const n = await conn.read(buf);
- const data = new TextDecoder().decode(buf.subarray(0, n!)); // this is the request headers + first body chunk
- assert(data.startsWith("POST / HTTP/1.1\r\n"));
- assert(data.endsWith("1\r\na\r\n"));
- const n2 = await conn.read(buf);
- assertEquals(n2, 6); // this is the second body chunk
- const n3 = await conn.read(buf);
- assertEquals(n3, null); // the connection now abruptly closes because the client has errored
- conn.close();
- })();
-
- const stream = new ReadableStream({
- async start(controller) {
- controller.enqueue(new TextEncoder().encode("a"));
- await delay(1000);
- controller.enqueue(new TextEncoder().encode("b"));
- await delay(1000);
- controller.error(new Error("foo"));
- },
- });
-
- const err = await assertRejects(() =>
- fetch(`http://localhost:${listenPort}/`, {
- body: stream,
- method: "POST",
- })
- );
-
- assert(err instanceof TypeError, `err was not a TypeError ${err}`);
- assert(err.cause, `err.cause was null ${err}`);
- assert(
- err.cause instanceof Error,
- `err.cause was not an Error ${err.cause}`,
- );
- assertEquals(err.cause.message, "foo");
-
- await server;
- },
-);
-
-Deno.test(
- { permissions: { net: true } },
- async function fetchRequestBodyEmptyStream() {
- const body = new ReadableStream({
- start(controller) {
- controller.enqueue(new Uint8Array([]));
- controller.close();
- },
- });
-
- await assertRejects(
- async () => {
- const controller = new AbortController();
- const promise = fetch("http://localhost:4545/echo_server", {
- body,
- method: "POST",
- signal: controller.signal,
- });
- try {
- controller.abort();
- } catch (e) {
- console.log(e);
- fail("abort should not throw");
- }
- await promise;
- },
- DOMException,
- "The signal has been aborted",
- );
- },
-);
-
-Deno.test("Request with subarray TypedArray body", async () => {
- const body = new Uint8Array([1, 2, 3, 4, 5]).subarray(1);
- const req = new Request("https://example.com", { method: "POST", body });
- const actual = new Uint8Array(await req.arrayBuffer());
- const expected = new Uint8Array([2, 3, 4, 5]);
- assertEquals(actual, expected);
-});
-
-Deno.test("Response with subarray TypedArray body", async () => {
- const body = new Uint8Array([1, 2, 3, 4, 5]).subarray(1);
- const req = new Response(body);
- const actual = new Uint8Array(await req.arrayBuffer());
- const expected = new Uint8Array([2, 3, 4, 5]);
- assertEquals(actual, expected);
-});
diff --git a/cli/tests/unit/files_test.ts b/cli/tests/unit/files_test.ts
deleted file mode 100644
index 2501ea643..000000000
--- a/cli/tests/unit/files_test.ts
+++ /dev/null
@@ -1,1095 +0,0 @@
-// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
-
-// deno-lint-ignore-file no-deprecated-deno-api
-
-import {
- assert,
- assertEquals,
- assertRejects,
- assertThrows,
-} from "./test_util.ts";
-import { copy } from "@test_util/std/streams/copy.ts";
-
-Deno.test(function filesStdioFileDescriptors() {
- assertEquals(Deno.stdin.rid, 0);
- assertEquals(Deno.stdout.rid, 1);
- assertEquals(Deno.stderr.rid, 2);
-});
-
-Deno.test({ permissions: { read: true } }, async function filesCopyToStdout() {
- const filename = "cli/tests/testdata/assets/fixture.json";
- using file = await Deno.open(filename);
- assert(file instanceof Deno.File);
- assert(file instanceof Deno.FsFile);
- assert(file.rid > 2);
- const bytesWritten = await copy(file, Deno.stdout);
- const fileSize = Deno.statSync(filename).size;
- assertEquals(bytesWritten, fileSize);
-});
-
-Deno.test({ permissions: { read: true } }, async function filesIter() {
- const filename = "cli/tests/testdata/assets/hello.txt";
- using file = await Deno.open(filename);
-
- let totalSize = 0;
- for await (const buf of Deno.iter(file)) {
- totalSize += buf.byteLength;
- }
-
- assertEquals(totalSize, 12);
-});
-
-Deno.test(
- { permissions: { read: true } },
- async function filesIterCustomBufSize() {
- const filename = "cli/tests/testdata/assets/hello.txt";
- using file = await Deno.open(filename);
-
- let totalSize = 0;
- let iterations = 0;
- for await (const buf of Deno.iter(file, { bufSize: 6 })) {
- totalSize += buf.byteLength;
- iterations += 1;
- }
-
- assertEquals(totalSize, 12);
- assertEquals(iterations, 2);
- },
-);
-
-Deno.test({ permissions: { read: true } }, function filesIterSync() {
- const filename = "cli/tests/testdata/assets/hello.txt";
- using file = Deno.openSync(filename);
-
- let totalSize = 0;
- for (const buf of Deno.iterSync(file)) {
- totalSize += buf.byteLength;
- }
-
- assertEquals(totalSize, 12);
-});
-
-Deno.test(
- { permissions: { read: true } },
- function filesIterSyncCustomBufSize() {
- const filename = "cli/tests/testdata/assets/hello.txt";
- using file = Deno.openSync(filename);
-
- let totalSize = 0;
- let iterations = 0;
- for (const buf of Deno.iterSync(file, { bufSize: 6 })) {
- totalSize += buf.byteLength;
- iterations += 1;
- }
-
- assertEquals(totalSize, 12);
- assertEquals(iterations, 2);
- },
-);
-
-Deno.test(async function readerIter() {
- // ref: https://github.com/denoland/deno/issues/2330
- const encoder = new TextEncoder();
-
- class TestReader implements Deno.Reader {
- #offset = 0;
- #buf: Uint8Array;
-
- constructor(s: string) {
- this.#buf = new Uint8Array(encoder.encode(s));
- }
-
- read(p: Uint8Array): Promise<number | null> {
- const n = Math.min(p.byteLength, this.#buf.byteLength - this.#offset);
- p.set(this.#buf.slice(this.#offset, this.#offset + n));
- this.#offset += n;
-
- if (n === 0) {
- return Promise.resolve(null);
- }
-
- return Promise.resolve(n);
- }
- }
-
- const reader = new TestReader("hello world!");
-
- let totalSize = 0;
- for await (const buf of Deno.iter(reader)) {
- totalSize += buf.byteLength;
- }
-
- assertEquals(totalSize, 12);
-});
-
-Deno.test(async function readerIterSync() {
- // ref: https://github.com/denoland/deno/issues/2330
- const encoder = new TextEncoder();
-
- class TestReader implements Deno.ReaderSync {
- #offset = 0;
- #buf: Uint8Array;
-
- constructor(s: string) {
- this.#buf = new Uint8Array(encoder.encode(s));
- }
-
- readSync(p: Uint8Array): number | null {
- const n = Math.min(p.byteLength, this.#buf.byteLength - this.#offset);
- p.set(this.#buf.slice(this.#offset, this.#offset + n));
- this.#offset += n;
-
- if (n === 0) {
- return null;
- }
-
- return n;
- }
- }
-
- const reader = new TestReader("hello world!");
-
- let totalSize = 0;
- for await (const buf of Deno.iterSync(reader)) {
- totalSize += buf.byteLength;
- }
-
- assertEquals(totalSize, 12);
-});
-
-Deno.test(
- {
- permissions: { read: true, write: true },
- },
- function openSyncMode() {
- const path = Deno.makeTempDirSync() + "/test_openSync.txt";
- using _file = Deno.openSync(path, {
- write: true,
- createNew: true,
- mode: 0o626,
- });
- const pathInfo = Deno.statSync(path);
- if (Deno.build.os !== "windows") {
- assertEquals(pathInfo.mode! & 0o777, 0o626 & ~Deno.umask());
- }
- },
-);
-
-Deno.test(
- {
- permissions: { read: true, write: true },
- },
- async function openMode() {
- const path = (await Deno.makeTempDir()) + "/test_open.txt";
- using _file = await Deno.open(path, {
- write: true,
- createNew: true,
- mode: 0o626,
- });
- const pathInfo = Deno.statSync(path);
- if (Deno.build.os !== "windows") {
- assertEquals(pathInfo.mode! & 0o777, 0o626 & ~Deno.umask());
- }
- },
-);
-
-Deno.test(
- {
- permissions: { read: true, write: true },
- },
- function openSyncUrl() {
- const tempDir = Deno.makeTempDirSync();
- const fileUrl = new URL(
- `file://${
- Deno.build.os === "windows" ? "/" : ""
- }${tempDir}/test_open.txt`,
- );
- using _file = Deno.openSync(fileUrl, {
- write: true,
- createNew: true,
- mode: 0o626,
- });
- const pathInfo = Deno.statSync(fileUrl);
- if (Deno.build.os !== "windows") {
- assertEquals(pathInfo.mode! & 0o777, 0o626 & ~Deno.umask());
- }
-
- Deno.removeSync(tempDir, { recursive: true });
- },
-);
-
-Deno.test(
- {
- permissions: { read: true, write: true },
- },
- async function openUrl() {
- const tempDir = await Deno.makeTempDir();
- const fileUrl = new URL(
- `file://${
- Deno.build.os === "windows" ? "/" : ""
- }${tempDir}/test_open.txt`,
- );
- using _file = await Deno.open(fileUrl, {
- write: true,
- createNew: true,
- mode: 0o626,
- });
- const pathInfo = Deno.statSync(fileUrl);
- if (Deno.build.os !== "windows") {
- assertEquals(pathInfo.mode! & 0o777, 0o626 & ~Deno.umask());
- }
-
- Deno.removeSync(tempDir, { recursive: true });
- },
-);
-
-Deno.test(
- { permissions: { write: false } },
- async function writePermFailure() {
- const filename = "tests/hello.txt";
- const openOptions: Deno.OpenOptions[] = [{ write: true }, { append: true }];
- for (const options of openOptions) {
- await assertRejects(async () => {
- await Deno.open(filename, options);
- }, Deno.errors.PermissionDenied);
- }
- },
-);
-
-Deno.test(async function openOptions() {
- const filename = "cli/tests/testdata/assets/fixture.json";
- await assertRejects(
- async () => {
- await Deno.open(filename, { write: false });
- },
- Error,
- "OpenOptions requires at least one option to be true",
- );
-
- await assertRejects(
- async () => {
- await Deno.open(filename, { truncate: true, write: false });
- },
- Error,
- "'truncate' option requires 'write' option",
- );
-
- await assertRejects(
- async () => {
- await Deno.open(filename, { create: true, write: false });
- },
- Error,
- "'create' or 'createNew' options require 'write' or 'append' option",
- );
-
- await assertRejects(
- async () => {
- await Deno.open(filename, { createNew: true, append: false });
- },
- Error,
- "'create' or 'createNew' options require 'write' or 'append' option",
- );
-});
-
-Deno.test({ permissions: { read: false } }, async function readPermFailure() {
- await assertRejects(async () => {
- await Deno.open("package.json", { read: true });
- }, Deno.errors.PermissionDenied);
-});
-
-Deno.test(
- { permissions: { write: true } },
- async function writeNullBufferFailure() {
- const tempDir = Deno.makeTempDirSync();
- const filename = tempDir + "hello.txt";
- const w = {
- write: true,
- truncate: true,
- create: true,
- };
- using file = await Deno.open(filename, w);
-
- // writing null should throw an error
- await assertRejects(
- async () => {
- // deno-lint-ignore no-explicit-any
- await file.write(null as any);
- },
- ); // TODO(bartlomieju): Check error kind when dispatch_minimal pipes errors properly
- await Deno.remove(tempDir, { recursive: true });
- },
-);
-
-Deno.test(
- { permissions: { write: true, read: true } },
- async function readNullBufferFailure() {
- const tempDir = Deno.makeTempDirSync();
- const filename = tempDir + "hello.txt";
- using file = await Deno.open(filename, {
- read: true,
- write: true,
- truncate: true,
- create: true,
- });
-
- // reading into an empty buffer should return 0 immediately
- const bytesRead = await file.read(new Uint8Array(0));
- assert(bytesRead === 0);
-
- // reading file into null buffer should throw an error
- await assertRejects(async () => {
- // deno-lint-ignore no-explicit-any
- await file.read(null as any);
- }, TypeError);
- // TODO(bartlomieju): Check error kind when dispatch_minimal pipes errors properly
-
- await Deno.remove(tempDir, { recursive: true });
- },
-);
-
-Deno.test(
- { permissions: { write: false, read: false } },
- async function readWritePermFailure() {
- const filename = "tests/hello.txt";
- await assertRejects(async () => {
- await Deno.open(filename, { read: true });
- }, Deno.errors.PermissionDenied);
- },
-);
-
-Deno.test(
- { permissions: { write: true, read: true } },
- async function openNotFound() {
- await assertRejects(
- async () => {
- await Deno.open("bad_file_name");
- },
- Deno.errors.NotFound,
- `open 'bad_file_name'`,
- );
- },
-);
-
-Deno.test(
- { permissions: { write: true, read: true } },
- function openSyncNotFound() {
- assertThrows(
- () => {
- Deno.openSync("bad_file_name");
- },
- Deno.errors.NotFound,
- `open 'bad_file_name'`,
- );
- },
-);
-
-Deno.test(
- { permissions: { read: true, write: true } },
- async function createFile() {
- const tempDir = await Deno.makeTempDir();
- const filename = tempDir + "/test.txt";
- const f = await Deno.create(filename);
- let fileInfo = Deno.statSync(filename);
- assert(fileInfo.isFile);
- assert(fileInfo.size === 0);
- const enc = new TextEncoder();
- const data = enc.encode("Hello");
- await f.write(data);
- fileInfo = Deno.statSync(filename);
- assert(fileInfo.size === 5);
- f.close();
-
- // TODO(bartlomieju): test different modes
- await Deno.remove(tempDir, { recursive: true });
- },
-);
-
-Deno.test(
- { permissions: { read: true, write: true } },
- async function createFileWithUrl() {
- const tempDir = await Deno.makeTempDir();
- const fileUrl = new URL(
- `file://${Deno.build.os === "windows" ? "/" : ""}${tempDir}/test.txt`,
- );
- const f = await Deno.create(fileUrl);
- let fileInfo = Deno.statSync(fileUrl);
- assert(fileInfo.isFile);
- assert(fileInfo.size === 0);
- const enc = new TextEncoder();
- const data = enc.encode("Hello");
- await f.write(data);
- fileInfo = Deno.statSync(fileUrl);
- assert(fileInfo.size === 5);
- f.close();
-
- await Deno.remove(tempDir, { recursive: true });
- },
-);
-
-Deno.test(
- { permissions: { read: true, write: true } },
- async function createSyncFile() {
- const tempDir = await Deno.makeTempDir();
- const filename = tempDir + "/test.txt";
- const f = Deno.createSync(filename);
- let fileInfo = Deno.statSync(filename);
- assert(fileInfo.isFile);
- assert(fileInfo.size === 0);
- const enc = new TextEncoder();
- const data = enc.encode("Hello");
- await f.write(data);
- fileInfo = Deno.statSync(filename);
- assert(fileInfo.size === 5);
- f.close();
-
- // TODO(bartlomieju): test different modes
- await Deno.remove(tempDir, { recursive: true });
- },
-);
-
-Deno.test(
- { permissions: { read: true, write: true } },
- async function createSyncFileWithUrl() {
- const tempDir = await Deno.makeTempDir();
- const fileUrl = new URL(
- `file://${Deno.build.os === "windows" ? "/" : ""}${tempDir}/test.txt`,
- );
- const f = Deno.createSync(fileUrl);
- let fileInfo = Deno.statSync(fileUrl);
- assert(fileInfo.isFile);
- assert(fileInfo.size === 0);
- const enc = new TextEncoder();
- const data = enc.encode("Hello");
- await f.write(data);
- fileInfo = Deno.statSync(fileUrl);
- assert(fileInfo.size === 5);
- f.close();
-
- await Deno.remove(tempDir, { recursive: true });
- },
-);
-
-Deno.test(
- { permissions: { read: true, write: true } },
- async function openModeWrite() {
- const tempDir = Deno.makeTempDirSync();
- const encoder = new TextEncoder();
- const filename = tempDir + "hello.txt";
- const data = encoder.encode("Hello world!\n");
- let file = await Deno.open(filename, {
- create: true,
- write: true,
- truncate: true,
- });
- // assert file was created
- let fileInfo = Deno.statSync(filename);
- assert(fileInfo.isFile);
- assertEquals(fileInfo.size, 0);
- // write some data
- await file.write(data);
- fileInfo = Deno.statSync(filename);
- assertEquals(fileInfo.size, 13);
- // assert we can't read from file
- let thrown = false;
- try {
- const buf = new Uint8Array(20);
- await file.read(buf);
- } catch (_e) {
- thrown = true;
- } finally {
- assert(thrown, "'w' mode shouldn't allow to read file");
- }
- file.close();
- // assert that existing file is truncated on open
- file = await Deno.open(filename, {
- write: true,
- truncate: true,
- });
- file.close();
- const fileSize = Deno.statSync(filename).size;
- assertEquals(fileSize, 0);
- await Deno.remove(tempDir, { recursive: true });
- },
-);
-
-Deno.test(
- { permissions: { read: true, write: true } },
- async function openModeWriteRead() {
- const tempDir = Deno.makeTempDirSync();
- const encoder = new TextEncoder();
- const filename = tempDir + "hello.txt";
- const data = encoder.encode("Hello world!\n");
-
- using file = await Deno.open(filename, {
- write: true,
- truncate: true,
- create: true,
- read: true,
- });
- const seekPosition = 0;
- // assert file was created
- let fileInfo = Deno.statSync(filename);
- assert(fileInfo.isFile);
- assertEquals(fileInfo.size, 0);
- // write some data
- await file.write(data);
- fileInfo = Deno.statSync(filename);
- assertEquals(fileInfo.size, 13);
-
- const buf = new Uint8Array(20);
- // seeking from beginning of a file
- const cursorPosition = await file.seek(seekPosition, Deno.SeekMode.Start);
- assertEquals(seekPosition, cursorPosition);
- const result = await file.read(buf);
- assertEquals(result, 13);
-
- await Deno.remove(tempDir, { recursive: true });
- },
-);
-
-Deno.test({ permissions: { read: true } }, async function seekStart() {
- const filename = "cli/tests/testdata/assets/hello.txt";
- using file = await Deno.open(filename);
- const seekPosition = 6;
- // Deliberately move 1 step forward
- await file.read(new Uint8Array(1)); // "H"
- // Skipping "Hello "
- // seeking from beginning of a file plus seekPosition
- const cursorPosition = await file.seek(seekPosition, Deno.SeekMode.Start);
- assertEquals(seekPosition, cursorPosition);
- const buf = new Uint8Array(6);
- await file.read(buf);
- const decoded = new TextDecoder().decode(buf);
- assertEquals(decoded, "world!");
-});
-
-Deno.test({ permissions: { read: true } }, async function seekStartBigInt() {
- const filename = "cli/tests/testdata/assets/hello.txt";
- using file = await Deno.open(filename);
- const seekPosition = 6n;
- // Deliberately move 1 step forward
- await file.read(new Uint8Array(1)); // "H"
- // Skipping "Hello "
- // seeking from beginning of a file plus seekPosition
- const cursorPosition = await file.seek(seekPosition, Deno.SeekMode.Start);
- assertEquals(seekPosition, BigInt(cursorPosition));
- const buf = new Uint8Array(6);
- await file.read(buf);
- const decoded = new TextDecoder().decode(buf);
- assertEquals(decoded, "world!");
-});
-
-Deno.test({ permissions: { read: true } }, function seekSyncStart() {
- const filename = "cli/tests/testdata/assets/hello.txt";
- using file = Deno.openSync(filename);
- const seekPosition = 6;
- // Deliberately move 1 step forward
- file.readSync(new Uint8Array(1)); // "H"
- // Skipping "Hello "
- // seeking from beginning of a file plus seekPosition
- const cursorPosition = file.seekSync(seekPosition, Deno.SeekMode.Start);
- assertEquals(seekPosition, cursorPosition);
- const buf = new Uint8Array(6);
- file.readSync(buf);
- const decoded = new TextDecoder().decode(buf);
- assertEquals(decoded, "world!");
-});
-
-Deno.test({ permissions: { read: true } }, async function seekCurrent() {
- const filename = "cli/tests/testdata/assets/hello.txt";
- using file = await Deno.open(filename);
- // Deliberately move 1 step forward
- await file.read(new Uint8Array(1)); // "H"
- // Skipping "ello "
- const seekPosition = 5;
- // seekPosition is relative to current cursor position after read
- const cursorPosition = await file.seek(seekPosition, Deno.SeekMode.Current);
- assertEquals(seekPosition + 1, cursorPosition);
- const buf = new Uint8Array(6);
- await file.read(buf);
- const decoded = new TextDecoder().decode(buf);
- assertEquals(decoded, "world!");
-});
-
-Deno.test({ permissions: { read: true } }, function seekSyncCurrent() {
- const filename = "cli/tests/testdata/assets/hello.txt";
- using file = Deno.openSync(filename);
- // Deliberately move 1 step forward
- file.readSync(new Uint8Array(1)); // "H"
- // Skipping "ello "
- const seekPosition = 5;
- // seekPosition is relative to current cursor position after read
- const cursorPosition = file.seekSync(seekPosition, Deno.SeekMode.Current);
- assertEquals(seekPosition + 1, cursorPosition);
- const buf = new Uint8Array(6);
- file.readSync(buf);
- const decoded = new TextDecoder().decode(buf);
- assertEquals(decoded, "world!");
-});
-
-Deno.test({ permissions: { read: true } }, async function seekEnd() {
- const filename = "cli/tests/testdata/assets/hello.txt";
- using file = await Deno.open(filename);
- const seekPosition = -6;
- // seek from end of file that has 12 chars, 12 - 6 = 6
- const cursorPosition = await file.seek(seekPosition, Deno.SeekMode.End);
- assertEquals(6, cursorPosition);
- const buf = new Uint8Array(6);
- await file.read(buf);
- const decoded = new TextDecoder().decode(buf);
- assertEquals(decoded, "world!");
-});
-
-Deno.test({ permissions: { read: true } }, function seekSyncEnd() {
- const filename = "cli/tests/testdata/assets/hello.txt";
- using file = Deno.openSync(filename);
- const seekPosition = -6;
- // seek from end of file that has 12 chars, 12 - 6 = 6
- const cursorPosition = file.seekSync(seekPosition, Deno.SeekMode.End);
- assertEquals(6, cursorPosition);
- const buf = new Uint8Array(6);
- file.readSync(buf);
- const decoded = new TextDecoder().decode(buf);
- assertEquals(decoded, "world!");
-});
-
-Deno.test({ permissions: { read: true } }, async function seekMode() {
- const filename = "cli/tests/testdata/assets/hello.txt";
- using file = await Deno.open(filename);
- await assertRejects(
- async () => {
- await file.seek(1, -1 as unknown as Deno.SeekMode);
- },
- TypeError,
- "Invalid seek mode",
- );
-
- // We should still be able to read the file
- // since it is still open.
- const buf = new Uint8Array(1);
- await file.read(buf); // "H"
- assertEquals(new TextDecoder().decode(buf), "H");
-});
-
-Deno.test(
- { permissions: { read: true, write: true } },
- function fileTruncateSyncSuccess() {
- const filename = Deno.makeTempDirSync() + "/test_fileTruncateSync.txt";
- using file = Deno.openSync(filename, {
- create: true,
- read: true,
- write: true,
- });
-
- file.truncateSync(20);
- assertEquals(Deno.readFileSync(filename).byteLength, 20);
- file.truncateSync(5);
- assertEquals(Deno.readFileSync(filename).byteLength, 5);
- file.truncateSync(-5);
- assertEquals(Deno.readFileSync(filename).byteLength, 0);
-
- Deno.removeSync(filename);
- },
-);
-
-Deno.test(
- { permissions: { read: true, write: true } },
- async function fileTruncateSuccess() {
- const filename = Deno.makeTempDirSync() + "/test_fileTruncate.txt";
- using file = await Deno.open(filename, {
- create: true,
- read: true,
- write: true,
- });
-
- await file.truncate(20);
- assertEquals((await Deno.readFile(filename)).byteLength, 20);
- await file.truncate(5);
- assertEquals((await Deno.readFile(filename)).byteLength, 5);
- await file.truncate(-5);
- assertEquals((await Deno.readFile(filename)).byteLength, 0);
-
- await Deno.remove(filename);
- },
-);
-
-Deno.test({ permissions: { read: true } }, function fileStatSyncSuccess() {
- using file = Deno.openSync("README.md");
- const fileInfo = file.statSync();
- assert(fileInfo.isFile);
- assert(!fileInfo.isSymlink);
- assert(!fileInfo.isDirectory);
- assert(fileInfo.size);
- assert(fileInfo.atime);
- assert(fileInfo.mtime);
- // The `birthtime` field is not available on Linux before kernel version 4.11.
- assert(fileInfo.birthtime || Deno.build.os === "linux");
-});
-
-Deno.test(async function fileStatSuccess() {
- using file = await Deno.open("README.md");
- const fileInfo = await file.stat();
- assert(fileInfo.isFile);
- assert(!fileInfo.isSymlink);
- assert(!fileInfo.isDirectory);
- assert(fileInfo.size);
- assert(fileInfo.atime);
- assert(fileInfo.mtime);
- // The `birthtime` field is not available on Linux before kernel version 4.11.
- assert(fileInfo.birthtime || Deno.build.os === "linux");
-});
-
-Deno.test({ permissions: { read: true } }, async function readableStream() {
- const filename = "cli/tests/testdata/assets/hello.txt";
- const file = await Deno.open(filename);
- assert(file.readable instanceof ReadableStream);
- const chunks = [];
- for await (const chunk of file.readable) {
- chunks.push(chunk);
- }
- assertEquals(chunks.length, 1);
- assertEquals(chunks[0].byteLength, 12);
-});
-
-Deno.test(
- { permissions: { read: true } },
- async function readableStreamTextEncoderPipe() {
- const filename = "cli/tests/testdata/assets/hello.txt";
- const file = await Deno.open(filename);
- const readable = file.readable.pipeThrough(new TextDecoderStream());
- const chunks = [];
- for await (const chunk of readable) {
- chunks.push(chunk);
- }
- assertEquals(chunks.length, 1);
- assertEquals(chunks[0].length, 12);
- },
-);
-
-Deno.test(
- { permissions: { read: true, write: true } },
- async function writableStream() {
- const path = await Deno.makeTempFile();
- const file = await Deno.open(path, { write: true });
- assert(file.writable instanceof WritableStream);
- const readable = new ReadableStream({
- start(controller) {
- controller.enqueue(new TextEncoder().encode("hello "));
- controller.enqueue(new TextEncoder().encode("world!"));
- controller.close();
- },
- });
- await readable.pipeTo(file.writable);
- const res = await Deno.readTextFile(path);
- assertEquals(res, "hello world!");
- },
-);
-
-Deno.test(
- { permissions: { read: true, write: true } },
- async function readTextFileNonUtf8() {
- const path = await Deno.makeTempFile();
- using file = await Deno.open(path, { write: true });
- await file.write(new TextEncoder().encode("hello "));
- await file.write(new Uint8Array([0xC0]));
-
- const res = await Deno.readTextFile(path);
- const resSync = Deno.readTextFileSync(path);
- assertEquals(res, resSync);
- assertEquals(res, "hello \uFFFD");
- },
-);
-
-Deno.test(
- { permissions: { read: true } },
- async function fsFileExplicitResourceManagement() {
- let file2: Deno.FsFile;
-
- {
- using file = await Deno.open("cli/tests/testdata/assets/hello.txt");
- file2 = file;
-
- const stat = file.statSync();
- assert(stat.isFile);
- }
-
- assertThrows(() => file2.statSync(), Deno.errors.BadResource);
- },
-);
-
-Deno.test(
- { permissions: { read: true } },
- async function fsFileExplicitResourceManagementManualClose() {
- using file = await Deno.open("cli/tests/testdata/assets/hello.txt");
- file.close();
- assertThrows(() => file.statSync(), Deno.errors.BadResource); // definitely closed
- // calling [Symbol.dispose] after manual close is a no-op
- },
-);
-
-Deno.test(
- { permissions: { read: true, write: true } },
- function fsFileDatasyncSyncSuccess() {
- const filename = Deno.makeTempDirSync() + "/test_fdatasyncSync.txt";
- const file = Deno.openSync(filename, {
- read: true,
- write: true,
- create: true,
- });
- const data = new Uint8Array(64);
- file.writeSync(data);
- file.syncDataSync();
- assertEquals(Deno.readFileSync(filename), data);
- file.close();
- Deno.removeSync(filename);
- },
-);
-
-Deno.test(
- { permissions: { read: true, write: true } },
- async function fsFileDatasyncSuccess() {
- const filename = (await Deno.makeTempDir()) + "/test_fdatasync.txt";
- const file = await Deno.open(filename, {
- read: true,
- write: true,
- create: true,
- });
- const data = new Uint8Array(64);
- await file.write(data);
- await file.syncData();
- assertEquals(await Deno.readFile(filename), data);
- file.close();
- await Deno.remove(filename);
- },
-);
-
-Deno.test(
- { permissions: { read: true, write: true } },
- function fsFileSyncSyncSuccess() {
- const filename = Deno.makeTempDirSync() + "/test_fsyncSync.txt";
- const file = Deno.openSync(filename, {
- read: true,
- write: true,
- create: true,
- });
- const size = 64;
- file.truncateSync(size);
- file.syncSync();
- assertEquals(file.statSync().size, size);
- file.close();
- Deno.removeSync(filename);
- },
-);
-
-Deno.test(
- { permissions: { read: true, write: true } },
- async function fsFileSyncSuccess() {
- const filename = (await Deno.makeTempDir()) + "/test_fsync.txt";
- const file = await Deno.open(filename, {
- read: true,
- write: true,
- create: true,
- });
- const size = 64;
- await file.truncate(size);
- await file.sync();
- assertEquals((await file.stat()).size, size);
- file.close();
- await Deno.remove(filename);
- },
-);
-
-Deno.test(
- { permissions: { read: true, run: true, hrtime: true } },
- async function fsFileLockFileSync() {
- await runFlockTests({ sync: true });
- },
-);
-
-Deno.test(
- { permissions: { read: true, run: true, hrtime: true } },
- async function fsFileLockFileAsync() {
- await runFlockTests({ sync: false });
- },
-);
-
-async function runFlockTests(opts: { sync: boolean }) {
- assertEquals(
- await checkFirstBlocksSecond({
- firstExclusive: true,
- secondExclusive: false,
- sync: opts.sync,
- }),
- true,
- "exclusive blocks shared",
- );
- assertEquals(
- await checkFirstBlocksSecond({
- firstExclusive: false,
- secondExclusive: true,
- sync: opts.sync,
- }),
- true,
- "shared blocks exclusive",
- );
- assertEquals(
- await checkFirstBlocksSecond({
- firstExclusive: true,
- secondExclusive: true,
- sync: opts.sync,
- }),
- true,
- "exclusive blocks exclusive",
- );
- assertEquals(
- await checkFirstBlocksSecond({
- firstExclusive: false,
- secondExclusive: false,
- sync: opts.sync,
- // need to wait for both to enter the lock to prevent the case where the
- // first process enters and exits the lock before the second even enters
- waitBothEnteredLock: true,
- }),
- false,
- "shared does not block shared",
- );
-}
-
-async function checkFirstBlocksSecond(opts: {
- firstExclusive: boolean;
- secondExclusive: boolean;
- sync: boolean;
- waitBothEnteredLock?: boolean;
-}) {
- const firstProcess = runFlockTestProcess({
- exclusive: opts.firstExclusive,
- sync: opts.sync,
- });
- const secondProcess = runFlockTestProcess({
- exclusive: opts.secondExclusive,
- sync: opts.sync,
- });
- try {
- const sleep = (time: number) => new Promise((r) => setTimeout(r, time));
-
- await Promise.all([
- firstProcess.waitStartup(),
- secondProcess.waitStartup(),
- ]);
-
- await firstProcess.enterLock();
- await firstProcess.waitEnterLock();
-
- await secondProcess.enterLock();
- await sleep(100);
-
- if (!opts.waitBothEnteredLock) {
- await firstProcess.exitLock();
- }
-
- await secondProcess.waitEnterLock();
-
- if (opts.waitBothEnteredLock) {
- await firstProcess.exitLock();
- }
-
- await secondProcess.exitLock();
-
- // collect the final output
- const firstPsTimes = await firstProcess.getTimes();
- const secondPsTimes = await secondProcess.getTimes();
- return firstPsTimes.exitTime < secondPsTimes.enterTime;
- } finally {
- await firstProcess.close();
- await secondProcess.close();
- }
-}
-
-function runFlockTestProcess(opts: { exclusive: boolean; sync: boolean }) {
- const path = "cli/tests/testdata/assets/lock_target.txt";
- const scriptText = `
- const file = Deno.openSync("${path}");
-
- // ready signal
- Deno.stdout.writeSync(new Uint8Array(1));
- // wait for enter lock signal
- Deno.stdin.readSync(new Uint8Array(1));
-
- // entering signal
- Deno.stdout.writeSync(new Uint8Array(1));
- // lock and record the entry time
- ${
- opts.sync
- ? `file.lockSync(${opts.exclusive ? "true" : "false"});`
- : `await file.lock(${opts.exclusive ? "true" : "false"});`
- }
- const enterTime = new Date().getTime();
- // entered signal
- Deno.stdout.writeSync(new Uint8Array(1));
-
- // wait for exit lock signal
- Deno.stdin.readSync(new Uint8Array(1));
-
- // record the exit time and wait a little bit before releasing
- // the lock so that the enter time of the next process doesn't
- // occur at the same time as this exit time
- const exitTime = new Date().getTime();
- await new Promise(resolve => setTimeout(resolve, 100));
-
- // release the lock
- ${opts.sync ? "file.unlockSync();" : "await file.unlock();"}
-
- // exited signal
- Deno.stdout.writeSync(new Uint8Array(1));
-
- // output the enter and exit time
- console.log(JSON.stringify({ enterTime, exitTime }));
-`;
-
- const process = new Deno.Command(Deno.execPath(), {
- args: ["eval", "--unstable", scriptText],
- stdin: "piped",
- stdout: "piped",
- stderr: "null",
- }).spawn();
-
- const waitSignal = async () => {
- const reader = process.stdout.getReader({ mode: "byob" });
- await reader.read(new Uint8Array(1));
- reader.releaseLock();
- };
- const signal = async () => {
- const writer = process.stdin.getWriter();
- await writer.write(new Uint8Array(1));
- writer.releaseLock();
- };
-
- return {
- async waitStartup() {
- await waitSignal();
- },
- async enterLock() {
- await signal();
- await waitSignal(); // entering signal
- },
- async waitEnterLock() {
- await waitSignal();
- },
- async exitLock() {
- await signal();
- await waitSignal();
- },
- getTimes: async () => {
- const { stdout } = await process.output();
- const text = new TextDecoder().decode(stdout);
- return JSON.parse(text) as {
- enterTime: number;
- exitTime: number;
- };
- },
- close: async () => {
- await process.status;
- await process.stdin.close();
- },
- };
-}
diff --git a/cli/tests/unit/flock_test.ts b/cli/tests/unit/flock_test.ts
deleted file mode 100644
index 3189b4a56..000000000
--- a/cli/tests/unit/flock_test.ts
+++ /dev/null
@@ -1,197 +0,0 @@
-// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
-import { assertEquals } from "./test_util.ts";
-
-Deno.test(
- { permissions: { read: true, run: true, hrtime: true } },
- async function flockFileSync() {
- await runFlockTests({ sync: true });
- },
-);
-
-Deno.test(
- { permissions: { read: true, run: true, hrtime: true } },
- async function flockFileAsync() {
- await runFlockTests({ sync: false });
- },
-);
-
-async function runFlockTests(opts: { sync: boolean }) {
- assertEquals(
- await checkFirstBlocksSecond({
- firstExclusive: true,
- secondExclusive: false,
- sync: opts.sync,
- }),
- true,
- "exclusive blocks shared",
- );
- assertEquals(
- await checkFirstBlocksSecond({
- firstExclusive: false,
- secondExclusive: true,
- sync: opts.sync,
- }),
- true,
- "shared blocks exclusive",
- );
- assertEquals(
- await checkFirstBlocksSecond({
- firstExclusive: true,
- secondExclusive: true,
- sync: opts.sync,
- }),
- true,
- "exclusive blocks exclusive",
- );
- assertEquals(
- await checkFirstBlocksSecond({
- firstExclusive: false,
- secondExclusive: false,
- sync: opts.sync,
- // need to wait for both to enter the lock to prevent the case where the
- // first process enters and exits the lock before the second even enters
- waitBothEnteredLock: true,
- }),
- false,
- "shared does not block shared",
- );
-}
-
-async function checkFirstBlocksSecond(opts: {
- firstExclusive: boolean;
- secondExclusive: boolean;
- sync: boolean;
- waitBothEnteredLock?: boolean;
-}) {
- const firstProcess = runFlockTestProcess({
- exclusive: opts.firstExclusive,
- sync: opts.sync,
- });
- const secondProcess = runFlockTestProcess({
- exclusive: opts.secondExclusive,
- sync: opts.sync,
- });
- try {
- const sleep = (time: number) => new Promise((r) => setTimeout(r, time));
-
- await Promise.all([
- firstProcess.waitStartup(),
- secondProcess.waitStartup(),
- ]);
-
- await firstProcess.enterLock();
- await firstProcess.waitEnterLock();
-
- await secondProcess.enterLock();
- await sleep(100);
-
- if (!opts.waitBothEnteredLock) {
- await firstProcess.exitLock();
- }
-
- await secondProcess.waitEnterLock();
-
- if (opts.waitBothEnteredLock) {
- await firstProcess.exitLock();
- }
-
- await secondProcess.exitLock();
-
- // collect the final output
- const firstPsTimes = await firstProcess.getTimes();
- const secondPsTimes = await secondProcess.getTimes();
- return firstPsTimes.exitTime < secondPsTimes.enterTime;
- } finally {
- await firstProcess.close();
- await secondProcess.close();
- }
-}
-
-function runFlockTestProcess(opts: { exclusive: boolean; sync: boolean }) {
- const path = "cli/tests/testdata/assets/lock_target.txt";
- const scriptText = `
- const { rid } = Deno.openSync("${path}");
-
- // ready signal
- Deno.stdout.writeSync(new Uint8Array(1));
- // wait for enter lock signal
- Deno.stdin.readSync(new Uint8Array(1));
-
- // entering signal
- Deno.stdout.writeSync(new Uint8Array(1));
- // lock and record the entry time
- ${
- opts.sync
- ? `Deno.flockSync(rid, ${opts.exclusive ? "true" : "false"});`
- : `await Deno.flock(rid, ${opts.exclusive ? "true" : "false"});`
- }
- const enterTime = new Date().getTime();
- // entered signal
- Deno.stdout.writeSync(new Uint8Array(1));
-
- // wait for exit lock signal
- Deno.stdin.readSync(new Uint8Array(1));
-
- // record the exit time and wait a little bit before releasing
- // the lock so that the enter time of the next process doesn't
- // occur at the same time as this exit time
- const exitTime = new Date().getTime();
- await new Promise(resolve => setTimeout(resolve, 100));
-
- // release the lock
- ${opts.sync ? "Deno.funlockSync(rid);" : "await Deno.funlock(rid);"}
-
- // exited signal
- Deno.stdout.writeSync(new Uint8Array(1));
-
- // output the enter and exit time
- console.log(JSON.stringify({ enterTime, exitTime }));
-`;
-
- const process = new Deno.Command(Deno.execPath(), {
- args: ["eval", "--unstable", scriptText],
- stdin: "piped",
- stdout: "piped",
- stderr: "null",
- }).spawn();
-
- const waitSignal = async () => {
- const reader = process.stdout.getReader({ mode: "byob" });
- await reader.read(new Uint8Array(1));
- reader.releaseLock();
- };
- const signal = async () => {
- const writer = process.stdin.getWriter();
- await writer.write(new Uint8Array(1));
- writer.releaseLock();
- };
-
- return {
- async waitStartup() {
- await waitSignal();
- },
- async enterLock() {
- await signal();
- await waitSignal(); // entering signal
- },
- async waitEnterLock() {
- await waitSignal();
- },
- async exitLock() {
- await signal();
- await waitSignal();
- },
- getTimes: async () => {
- const { stdout } = await process.output();
- const text = new TextDecoder().decode(stdout);
- return JSON.parse(text) as {
- enterTime: number;
- exitTime: number;
- };
- },
- close: async () => {
- await process.status;
- await process.stdin.close();
- },
- };
-}
diff --git a/cli/tests/unit/http_test.ts b/cli/tests/unit/http_test.ts
deleted file mode 100644
index 66cc53113..000000000
--- a/cli/tests/unit/http_test.ts
+++ /dev/null
@@ -1,2801 +0,0 @@
-// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
-import { Buffer, BufReader, BufWriter } from "@test_util/std/io/mod.ts";
-import { TextProtoReader } from "../testdata/run/textproto.ts";
-import {
- assert,
- assertEquals,
- assertRejects,
- assertStrictEquals,
- assertThrows,
- delay,
- fail,
-} from "./test_util.ts";
-import { join } from "@test_util/std/path/mod.ts";
-
-const listenPort = 4507;
-const listenPort2 = 4508;
-
-const {
- buildCaseInsensitiveCommaValueFinder,
- // @ts-expect-error TypeScript (as of 3.7) does not support indexing namespaces by symbol
-} = Deno[Deno.internal];
-
-async function writeRequestAndReadResponse(conn: Deno.Conn): Promise<string> {
- const encoder = new TextEncoder();
- const decoder = new TextDecoder();
-
- const w = new BufWriter(conn);
- const r = new BufReader(conn);
- const body = `GET / HTTP/1.1\r\nHost: 127.0.0.1:${listenPort}\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);
- const headers = await tpr.readMimeHeader();
- assert(headers !== null);
-
- const chunkedReader = chunkedBodyReader(headers, r);
- const buf = new Uint8Array(5);
- const dest = new Buffer();
- let result: number | null;
- while ((result = await chunkedReader.read(buf)) !== null) {
- const len = Math.min(buf.byteLength, result);
- await dest.write(buf.subarray(0, len));
- }
- return decoder.decode(dest.bytes());
-}
-
-Deno.test({ permissions: { net: true } }, async function httpServerBasic() {
- let httpConn: Deno.HttpConn;
- const promise = (async () => {
- const listener = Deno.listen({ port: listenPort });
- const conn = await listener.accept();
- listener.close();
- httpConn = Deno.serveHttp(conn);
- const reqEvent = await httpConn.nextRequest();
- assert(reqEvent);
- const { request, respondWith } = reqEvent;
- assertEquals(new URL(request.url).href, `http://127.0.0.1:${listenPort}/`);
- assertEquals(await request.text(), "");
- await respondWith(
- new Response("Hello World", { headers: { "foo": "bar" } }),
- );
- })();
-
- const resp = await fetch(`http://127.0.0.1:${listenPort}/`, {
- headers: { "connection": "close" },
- });
- const clone = resp.clone();
- const text = await resp.text();
- assertEquals(text, "Hello World");
- assertEquals(resp.headers.get("foo"), "bar");
- const cloneText = await clone.text();
- assertEquals(cloneText, "Hello World");
- await promise;
-
- httpConn!.close();
-});
-
-// https://github.com/denoland/deno/issues/15107
-Deno.test(
- { permissions: { net: true } },
- async function httpLazyHeadersIssue15107() {
- let headers: Headers;
- const promise = (async () => {
- const listener = Deno.listen({ port: 2333 });
- const conn = await listener.accept();
- listener.close();
- const httpConn = Deno.serveHttp(conn);
- const e = await httpConn.nextRequest();
- assert(e);
- const { request } = e;
- request.text();
- headers = request.headers;
- httpConn!.close();
- })();
-
- const conn = await Deno.connect({ port: 2333 });
- // Send GET request with a body + content-length.
- const encoder = new TextEncoder();
- const body =
- `GET / HTTP/1.1\r\nHost: 127.0.0.1:2333\r\nContent-Length: 5\r\n\r\n12345`;
- const writeResult = await conn.write(encoder.encode(body));
- assertEquals(body.length, writeResult);
- await promise;
- conn.close();
- assertEquals(headers!.get("content-length"), "5");
- },
-);
-
-Deno.test(
- { permissions: { net: true } },
- async function httpReadHeadersAfterClose() {
- const promise = (async () => {
- const listener = Deno.listen({ port: 2334 });
- const conn = await listener.accept();
- listener.close();
- const httpConn = Deno.serveHttp(conn);
- const e = await httpConn.nextRequest();
- assert(e);
- const { request, respondWith } = e;
-
- await request.text(); // Read body
- await respondWith(new Response("Hello World")); // Closes request
-
- assertThrows(() => request.headers, TypeError, "request closed");
- httpConn!.close();
- })();
-
- const conn = await Deno.connect({ port: 2334 });
- // Send GET request with a body + content-length.
- const encoder = new TextEncoder();
- const body =
- `GET / HTTP/1.1\r\nHost: 127.0.0.1:2333\r\nContent-Length: 5\r\n\r\n12345`;
- const writeResult = await conn.write(encoder.encode(body));
- assertEquals(body.length, writeResult);
- await promise;
- conn.close();
- },
-);
-
-Deno.test(
- { permissions: { net: true } },
- async function httpServerGetRequestBody() {
- let httpConn: Deno.HttpConn;
- const promise = (async () => {
- const listener = Deno.listen({ port: listenPort });
- const conn = await listener.accept();
- listener.close();
- httpConn = Deno.serveHttp(conn);
- const e = await httpConn.nextRequest();
- assert(e);
- const { request, respondWith } = e;
- assertEquals(request.body, null);
- await respondWith(new Response("", { headers: {} }));
- })();
-
- const conn = await Deno.connect({ port: listenPort });
- // Send GET request with a body + content-length.
- const encoder = new TextEncoder();
- const body =
- `GET / HTTP/1.1\r\nHost: 127.0.0.1:${listenPort}\r\nContent-Length: 5\r\n\r\n12345`;
- const writeResult = await conn.write(encoder.encode(body));
- assertEquals(body.length, writeResult);
-
- const resp = new Uint8Array(200);
- const readResult = await conn.read(resp);
- assertEquals(readResult, 138);
-
- conn.close();
-
- await promise;
- httpConn!.close();
- },
-);
-
-Deno.test(
- { permissions: { net: true } },
- async function httpServerStreamResponse() {
- const stream = new TransformStream();
- const writer = stream.writable.getWriter();
- writer.write(new TextEncoder().encode("hello "));
- writer.write(new TextEncoder().encode("world"));
- writer.close();
-
- let httpConn: Deno.HttpConn;
- const listener = Deno.listen({ port: listenPort });
- const promise = (async () => {
- const conn = await listener.accept();
- httpConn = Deno.serveHttp(conn);
- const evt = await httpConn.nextRequest();
- assert(evt);
- const { request, respondWith } = evt;
- assert(!request.body);
- await respondWith(new Response(stream.readable));
- })();
-
- const resp = await fetch(`http://127.0.0.1:${listenPort}/`);
- const respBody = await resp.text();
- assertEquals("hello world", respBody);
- await promise;
- httpConn!.close();
- listener.close();
- },
-);
-
-Deno.test(
- { permissions: { net: true } },
- async function httpServerStreamRequest() {
- const stream = new TransformStream();
- const writer = stream.writable.getWriter();
- writer.write(new TextEncoder().encode("hello "));
- writer.write(new TextEncoder().encode("world"));
- writer.close();
-
- const listener = Deno.listen({ port: listenPort });
- const promise = (async () => {
- const conn = await listener.accept();
- const httpConn = Deno.serveHttp(conn);
- const evt = await httpConn.nextRequest();
- assert(evt);
- const { request, respondWith } = evt;
- const reqBody = await request.text();
- assertEquals("hello world", reqBody);
- await respondWith(new Response(""));
-
- // TODO(ry) If we don't call httpConn.nextRequest() here we get "error sending
- // request for url (https://localhost:${listenPort}/): connection closed before
- // message completed".
- assertEquals(await httpConn.nextRequest(), null);
-
- listener.close();
- })();
-
- const resp = await fetch(`http://127.0.0.1:${listenPort}/`, {
- body: stream.readable,
- method: "POST",
- headers: { "connection": "close" },
- });
-
- await resp.arrayBuffer();
- await promise;
- },
-);
-
-Deno.test(
- { permissions: { net: true } },
- async function httpServerStreamDuplex() {
- let httpConn: Deno.HttpConn;
- const listener = Deno.listen({ port: listenPort });
- const promise = (async () => {
- const conn = await listener.accept();
- httpConn = Deno.serveHttp(conn);
- const evt = await httpConn.nextRequest();
- assert(evt);
- const { request, respondWith } = evt;
- assert(request.body);
- await respondWith(new Response(request.body));
- })();
-
- const ts = new TransformStream();
- const writable = ts.writable.getWriter();
- const resp = await fetch(`http://127.0.0.1:${listenPort}/`, {
- method: "POST",
- body: ts.readable,
- });
- assert(resp.body);
- const reader = resp.body.getReader();
- await writable.write(new Uint8Array([1]));
- const chunk1 = await reader.read();
- assert(!chunk1.done);
- assertEquals(chunk1.value, new Uint8Array([1]));
- await writable.write(new Uint8Array([2]));
- const chunk2 = await reader.read();
- assert(!chunk2.done);
- assertEquals(chunk2.value, new Uint8Array([2]));
-
- await writable.close();
- const chunk3 = await reader.read();
- assert(chunk3.done);
- await promise;
- httpConn!.close();
- listener.close();
- },
-);
-
-Deno.test({ permissions: { net: true } }, async function httpServerClose() {
- const listener = Deno.listen({ port: listenPort });
- const client = await Deno.connect({ port: listenPort });
- const httpConn = Deno.serveHttp(await listener.accept());
- client.close();
- const evt = await httpConn.nextRequest();
- assertEquals(evt, null);
- // Note httpConn is automatically closed when "done" is reached.
- listener.close();
-});
-
-Deno.test(
- { permissions: { net: true } },
- async function httpServerInvalidMethod() {
- const listener = Deno.listen({ port: listenPort });
- const client = await Deno.connect({ port: listenPort });
- const httpConn = Deno.serveHttp(await listener.accept());
- await client.write(new Uint8Array([1, 2, 3]));
- await assertRejects(
- async () => {
- await httpConn.nextRequest();
- },
- Deno.errors.Http,
- "invalid HTTP method parsed",
- );
- // Note httpConn is automatically closed when it errors.
- client.close();
- listener.close();
- },
-);
-
-Deno.test(
- { permissions: { read: true, net: true } },
- async function httpServerWithTls() {
- const hostname = "localhost";
- const port = listenPort;
-
- const promise = (async () => {
- const listener = Deno.listenTls({
- hostname,
- port,
- cert: Deno.readTextFileSync("cli/tests/testdata/tls/localhost.crt"),
- key: Deno.readTextFileSync("cli/tests/testdata/tls/localhost.key"),
- });
- const conn = await listener.accept();
- const httpConn = Deno.serveHttp(conn);
- const evt = await httpConn.nextRequest();
- assert(evt);
- const { respondWith } = evt;
- await respondWith(new Response("Hello World"));
-
- // TODO(ry) If we don't call httpConn.nextRequest() here we get "error sending
- // request for url (https://localhost:${listenPort}/): connection closed before
- // message completed".
- assertEquals(await httpConn.nextRequest(), null);
-
- listener.close();
- })();
-
- const caCert = Deno.readTextFileSync("cli/tests/testdata/tls/RootCA.pem");
- const client = Deno.createHttpClient({ caCerts: [caCert] });
- const resp = await fetch(`https://${hostname}:${port}/`, {
- headers: { "connection": "close" },
- client,
- });
- client.close();
- const respBody = await resp.text();
- assertEquals("Hello World", respBody);
- await promise;
- },
-);
-
-Deno.test(
- { permissions: { net: true } },
- async function httpServerRegressionHang() {
- let httpConn: Deno.HttpConn;
- const listener = Deno.listen({ port: listenPort });
- const promise = (async () => {
- const conn = await listener.accept();
- httpConn = Deno.serveHttp(conn);
- const event = await httpConn.nextRequest();
- assert(event);
- const { request, respondWith } = event;
- const reqBody = await request.text();
- assertEquals("request", reqBody);
- await respondWith(new Response("response"));
- })();
-
- const resp = await fetch(`http://127.0.0.1:${listenPort}/`, {
- method: "POST",
- body: "request",
- });
- const respBody = await resp.text();
- assertEquals("response", respBody);
- await promise;
-
- httpConn!.close();
- listener.close();
- },
-);
-
-Deno.test(
- { permissions: { net: true } },
- async function httpServerCancelBodyOnResponseFailure() {
- const promise = (async () => {
- const listener = Deno.listen({ port: listenPort });
- const conn = await listener.accept();
- const httpConn = Deno.serveHttp(conn);
- const event = await httpConn.nextRequest();
- assert(event);
- const { respondWith } = event;
- let cancelReason: string;
- await assertRejects(
- async () => {
- let interval = 0;
- await respondWith(
- new Response(
- new ReadableStream({
- start(controller) {
- interval = setInterval(() => {
- const message = `data: ${Date.now()}\n\n`;
- controller.enqueue(new TextEncoder().encode(message));
- }, 200);
- },
- cancel(reason) {
- cancelReason = reason;
- clearInterval(interval);
- },
- }),
- ),
- );
- },
- Deno.errors.Http,
- cancelReason!,
- );
- assert(cancelReason!);
- httpConn!.close();
- listener.close();
- })();
-
- const resp = await fetch(`http://127.0.0.1:${listenPort}/`);
- await resp.body!.cancel();
- await promise;
- },
-);
-
-Deno.test(
- { permissions: { net: true } },
- async function httpServerNextRequestErrorExposedInResponse() {
- const promise = (async () => {
- const listener = Deno.listen({ port: listenPort });
- const conn = await listener.accept();
- const httpConn = Deno.serveHttp(conn);
- const event = await httpConn.nextRequest();
- assert(event);
- // Start polling for the next request before awaiting response.
- const nextRequestPromise = httpConn.nextRequest();
- const { respondWith } = event;
- await assertRejects(
- async () => {
- let interval = 0;
- await respondWith(
- new Response(
- new ReadableStream({
- start(controller) {
- interval = setInterval(() => {
- const message = `data: ${Date.now()}\n\n`;
- controller.enqueue(new TextEncoder().encode(message));
- }, 200);
- },
- cancel() {
- clearInterval(interval);
- },
- }),
- ),
- );
- },
- Deno.errors.Http,
- "connection closed",
- );
- // The error from `op_http_accept` reroutes to `respondWith()`.
- assertEquals(await nextRequestPromise, null);
- listener.close();
- })();
-
- const resp = await fetch(`http://127.0.0.1:${listenPort}/`);
- await resp.body!.cancel();
- await promise;
- },
-);
-
-Deno.test(
- { permissions: { net: true } },
- async function httpServerEmptyBlobResponse() {
- let httpConn: Deno.HttpConn;
- const listener = Deno.listen({ port: listenPort });
- const promise = (async () => {
- const conn = await listener.accept();
- httpConn = Deno.serveHttp(conn);
- const event = await httpConn.nextRequest();
- assert(event);
- const { respondWith } = event;
- await respondWith(new Response(new Blob([])));
- })();
-
- const resp = await fetch(`http://127.0.0.1:${listenPort}/`);
- const respBody = await resp.text();
- assertEquals("", respBody);
- await promise;
- httpConn!.close();
- listener.close();
- },
-);
-
-Deno.test(
- { permissions: { net: true } },
- async function httpServerNextRequestResolvesOnClose() {
- const httpConnList: Deno.HttpConn[] = [];
-
- async function serve(l: Deno.Listener) {
- for await (const conn of l) {
- (async () => {
- const c = Deno.serveHttp(conn);
- httpConnList.push(c);
- for await (const { respondWith } of c) {
- respondWith(new Response("hello"));
- }
- })();
- }
- }
-
- const l = Deno.listen({ port: listenPort });
- serve(l);
-
- await delay(300);
- const res = await fetch(`http://localhost:${listenPort}/`);
- const _text = await res.text();
-
- // Close connection and listener.
- httpConnList.forEach((conn) => conn.close());
- l.close();
-
- await delay(300);
- },
-);
-
-Deno.test(
- { permissions: { net: true } },
- // Issue: https://github.com/denoland/deno/issues/10870
- async function httpServerHang() {
- // Quick and dirty way to make a readable stream from a string. Alternatively,
- // `readableStreamFromReader(file)` could be used.
- function stream(s: string): ReadableStream<Uint8Array> {
- return new Response(s).body!;
- }
-
- const httpConns: Deno.HttpConn[] = [];
- const promise = (async () => {
- let count = 0;
- const listener = Deno.listen({ port: listenPort });
- for await (const conn of listener) {
- (async () => {
- const httpConn = Deno.serveHttp(conn);
- httpConns.push(httpConn);
- for await (const { respondWith } of httpConn) {
- respondWith(new Response(stream("hello")));
-
- count++;
- if (count >= 2) {
- listener.close();
- }
- }
- })();
- }
- })();
-
- const clientConn = await Deno.connect({ port: listenPort });
-
- const r1 = await writeRequestAndReadResponse(clientConn);
- assertEquals(r1, "hello");
-
- const r2 = await writeRequestAndReadResponse(clientConn);
- assertEquals(r2, "hello");
-
- clientConn.close();
- await promise;
- for (const conn of httpConns) {
- conn.close();
- }
- },
-);
-
-Deno.test(
- { permissions: { net: true } },
- // Issue: https://github.com/denoland/deno/issues/10930
- async function httpServerStreamingResponse() {
- // This test enqueues a single chunk for readable
- // stream and waits for client to read that chunk and signal
- // it before enqueueing subsequent chunk. Issue linked above
- // presented a situation where enqueued chunks were not
- // written to the HTTP connection until the next chunk was enqueued.
-
- let counter = 0;
-
- const deferreds = [
- Promise.withResolvers<void>(),
- Promise.withResolvers<void>(),
- Promise.withResolvers<void>(),
- ];
-
- async function writeRequest(conn: Deno.Conn) {
- const encoder = new TextEncoder();
- const decoder = new TextDecoder();
-
- const w = new BufWriter(conn);
- const r = new BufReader(conn);
- const body = `GET / HTTP/1.1\r\nHost: 127.0.0.1:${listenPort}\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);
- const headers = await tpr.readMimeHeader();
- assert(headers !== null);
-
- const chunkedReader = chunkedBodyReader(headers, r);
- const buf = new Uint8Array(5);
- const dest = new Buffer();
- let result: number | null;
- while ((result = await chunkedReader.read(buf)) !== null) {
- const len = Math.min(buf.byteLength, result);
- await dest.write(buf.subarray(0, len));
- // Resolve a deferred - this will make response stream to
- // enqueue next chunk.
- deferreds[counter - 1].resolve();
- }
- return decoder.decode(dest.bytes());
- }
-
- function periodicStream() {
- return new ReadableStream({
- start(controller) {
- controller.enqueue(`${counter}\n`);
- counter++;
- },
-
- async pull(controller) {
- if (counter >= 3) {
- return controller.close();
- }
-
- await deferreds[counter - 1].promise;
-
- controller.enqueue(`${counter}\n`);
- counter++;
- },
- }).pipeThrough(new TextEncoderStream());
- }
-
- let httpConn: Deno.HttpConn;
- const listener = Deno.listen({ port: listenPort });
- const finished = (async () => {
- const conn = await listener.accept();
- httpConn = Deno.serveHttp(conn);
- const requestEvent = await httpConn.nextRequest();
- const { respondWith } = requestEvent!;
- await respondWith(new Response(periodicStream()));
- })();
-
- // start a client
- const clientConn = await Deno.connect({ port: listenPort });
-
- const r1 = await writeRequest(clientConn);
- assertEquals(r1, "0\n1\n2\n");
-
- await finished;
- clientConn.close();
-
- httpConn!.close();
- listener.close();
- },
-);
-
-Deno.test(
- { permissions: { net: true } },
- async function httpRequestLatin1Headers() {
- let httpConn: Deno.HttpConn;
- const promise = (async () => {
- const listener = Deno.listen({ port: listenPort });
- const conn = await listener.accept();
- listener.close();
- httpConn = Deno.serveHttp(conn);
- const reqEvent = await httpConn.nextRequest();
- assert(reqEvent);
- const { request, respondWith } = reqEvent;
- assertEquals(request.headers.get("X-Header-Test"), "á");
- await respondWith(
- new Response("", { headers: { "X-Header-Test": "Æ" } }),
- );
- })();
-
- const clientConn = await Deno.connect({ port: listenPort });
- const requestText =
- `GET / HTTP/1.1\r\nHost: 127.0.0.1:${listenPort}\r\nX-Header-Test: á\r\n\r\n`;
- const requestBytes = new Uint8Array(requestText.length);
- for (let i = 0; i < requestText.length; i++) {
- requestBytes[i] = requestText.charCodeAt(i);
- }
- let written = 0;
- while (written < requestBytes.byteLength) {
- written += await clientConn.write(requestBytes.slice(written));
- }
-
- let responseText = "";
- const buf = new Uint8Array(1024);
- let read;
-
- while ((read = await clientConn.read(buf)) !== null) {
- httpConn!.close();
- for (let i = 0; i < read; i++) {
- responseText += String.fromCharCode(buf[i]);
- }
- }
-
- clientConn.close();
-
- assert(/\r\n[Xx]-[Hh]eader-[Tt]est: Æ\r\n/.test(responseText));
-
- await promise;
- },
-);
-
-Deno.test(
- { permissions: { net: true } },
- async function httpServerRequestWithoutPath() {
- let httpConn: Deno.HttpConn;
- const listener = Deno.listen({ port: listenPort });
- const promise = (async () => {
- const conn = await listener.accept();
- listener.close();
- httpConn = Deno.serveHttp(conn);
- const reqEvent = await httpConn.nextRequest();
- assert(reqEvent);
- const { request, respondWith } = reqEvent;
- assertEquals(
- new URL(request.url).href,
- `http://127.0.0.1:${listenPort}/`,
- );
- assertEquals(await request.text(), "");
- await respondWith(new Response());
- })();
-
- const clientConn = await Deno.connect({ port: listenPort });
-
- async function writeRequest(conn: Deno.Conn) {
- const encoder = new TextEncoder();
-
- const w = new BufWriter(conn);
- const r = new BufReader(conn);
- const body =
- `CONNECT 127.0.0.1:${listenPort} HTTP/1.1\r\nHost: 127.0.0.1:${listenPort}\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);
- const m = statusLine.match(/^(.+?) (.+?) (.+?)$/);
- assert(m !== null, "must be matched");
- const [_, _proto, status, _ok] = m;
- assertEquals(status, "200");
- const headers = await tpr.readMimeHeader();
- assert(headers !== null);
- }
-
- await writeRequest(clientConn);
- clientConn.close();
- await promise;
- httpConn!.close();
- },
-);
-
-Deno.test({ permissions: { net: true } }, async function httpServerWebSocket() {
- const promise = (async () => {
- const listener = Deno.listen({ port: listenPort });
- const conn = await listener.accept();
- listener.close();
- const httpConn = Deno.serveHttp(conn);
- const reqEvent = await httpConn.nextRequest();
- assert(reqEvent);
- const { request, respondWith } = reqEvent;
- const {
- response,
- socket,
- } = Deno.upgradeWebSocket(request);
- socket.onerror = () => fail();
- socket.onmessage = (m) => {
- socket.send(m.data);
- socket.close(1001);
- };
- const close = new Promise<void>((resolve) => {
- socket.onclose = () => resolve();
- });
- await respondWith(response);
- await close;
- })();
-
- const def = Promise.withResolvers<void>();
- const ws = new WebSocket(`ws://localhost:${listenPort}`);
- ws.onmessage = (m) => assertEquals(m.data, "foo");
- ws.onerror = () => fail();
- ws.onclose = () => def.resolve();
- ws.onopen = () => ws.send("foo");
- await def.promise;
- await promise;
-});
-
-Deno.test(function httpUpgradeWebSocket() {
- const request = new Request("https://deno.land/", {
- headers: {
- connection: "Upgrade",
- upgrade: "websocket",
- "sec-websocket-key": "dGhlIHNhbXBsZSBub25jZQ==",
- },
- });
- const { response } = Deno.upgradeWebSocket(request);
- assertEquals(response.status, 101);
- assertEquals(response.headers.get("connection"), "Upgrade");
- assertEquals(response.headers.get("upgrade"), "websocket");
- assertEquals(
- response.headers.get("sec-websocket-accept"),
- "s3pPLMBiTxaQ9kYGzzhZRbK+xOo=",
- );
-});
-
-Deno.test(function httpUpgradeWebSocketMultipleConnectionOptions() {
- const request = new Request("https://deno.land/", {
- headers: {
- connection: "keep-alive, upgrade",
- upgrade: "websocket",
- "sec-websocket-key": "dGhlIHNhbXBsZSBub25jZQ==",
- },
- });
- const { response } = Deno.upgradeWebSocket(request);
- assertEquals(response.status, 101);
-});
-
-Deno.test(function httpUpgradeWebSocketMultipleUpgradeOptions() {
- const request = new Request("https://deno.land/", {
- headers: {
- connection: "upgrade",
- upgrade: "websocket, foo",
- "sec-websocket-key": "dGhlIHNhbXBsZSBub25jZQ==",
- },
- });
- const { response } = Deno.upgradeWebSocket(request);
- assertEquals(response.status, 101);
-});
-
-Deno.test(function httpUpgradeWebSocketCaseInsensitiveUpgradeHeader() {
- const request = new Request("https://deno.land/", {
- headers: {
- connection: "upgrade",
- upgrade: "Websocket",
- "sec-websocket-key": "dGhlIHNhbXBsZSBub25jZQ==",
- },
- });
- const { response } = Deno.upgradeWebSocket(request);
- assertEquals(response.status, 101);
-});
-
-Deno.test(function httpUpgradeWebSocketInvalidUpgradeHeader() {
- assertThrows(
- () => {
- const request = new Request("https://deno.land/", {
- headers: {
- connection: "upgrade",
- upgrade: "invalid",
- "sec-websocket-key": "dGhlIHNhbXBsZSBub25jZQ==",
- },
- });
- Deno.upgradeWebSocket(request);
- },
- TypeError,
- "Invalid Header: 'upgrade' header must contain 'websocket'",
- );
-});
-
-Deno.test(function httpUpgradeWebSocketWithoutUpgradeHeader() {
- assertThrows(
- () => {
- const request = new Request("https://deno.land/", {
- headers: {
- connection: "upgrade",
- "sec-websocket-key": "dGhlIHNhbXBsZSBub25jZQ==",
- },
- });
- Deno.upgradeWebSocket(request);
- },
- TypeError,
- "Invalid Header: 'upgrade' header must contain 'websocket'",
- );
-});
-
-Deno.test(
- { permissions: { net: true } },
- async function httpCookieConcatenation() {
- let httpConn: Deno.HttpConn;
- const promise = (async () => {
- const listener = Deno.listen({ port: listenPort });
- const conn = await listener.accept();
- listener.close();
- httpConn = Deno.serveHttp(conn);
- const reqEvent = await httpConn.nextRequest();
- assert(reqEvent);
- const { request, respondWith } = reqEvent;
- assertEquals(
- new URL(request.url).href,
- `http://127.0.0.1:${listenPort}/`,
- );
- assertEquals(await request.text(), "");
- assertEquals(request.headers.get("cookie"), "foo=bar; bar=foo");
- await respondWith(new Response("ok"));
- })();
-
- const resp = await fetch(`http://127.0.0.1:${listenPort}/`, {
- headers: [
- ["connection", "close"],
- ["cookie", "foo=bar"],
- ["cookie", "bar=foo"],
- ],
- });
- const text = await resp.text();
- assertEquals(text, "ok");
- await promise;
- httpConn!.close();
- },
-);
-
-// https://github.com/denoland/deno/issues/11651
-Deno.test({ permissions: { net: true } }, async function httpServerPanic() {
- const listener = Deno.listen({ port: listenPort });
- const client = await Deno.connect({ port: listenPort });
- const conn = await listener.accept();
- const httpConn = Deno.serveHttp(conn);
-
- // This message is incomplete on purpose, we'll forcefully close client connection
- // after it's flushed to cause connection to error out on the server side.
- const encoder = new TextEncoder();
- await client.write(encoder.encode("GET / HTTP/1.1"));
-
- httpConn.nextRequest();
- await client.write(encoder.encode("\r\n\r\n"));
- httpConn!.close();
-
- client.close();
- listener.close();
-});
-
-Deno.test(
- { permissions: { net: true, write: true, read: true } },
- async function httpServerCorrectSizeResponse() {
- const tmpFile = await Deno.makeTempFile();
- using file = await Deno.open(tmpFile, { write: true, read: true });
- await file.write(new Uint8Array(70 * 1024).fill(1)); // 70kb sent in 64kb + 6kb chunks
-
- let httpConn: Deno.HttpConn;
- const listener = Deno.listen({ port: listenPort });
- const promise = (async () => {
- const conn = await listener.accept();
- httpConn = Deno.serveHttp(conn);
- const ev = await httpConn.nextRequest();
- const { respondWith } = ev!;
- const f = await Deno.open(tmpFile, { read: true });
- await respondWith(new Response(f.readable, { status: 200 }));
- })();
- const resp = await fetch(`http://127.0.0.1:${listenPort}/`);
- const body = await resp.arrayBuffer();
- assertEquals(body.byteLength, 70 * 1024);
- await promise;
- httpConn!.close();
- listener.close();
- },
-);
-
-Deno.test(
- { permissions: { net: true, write: true, read: true } },
- async function httpServerClosedStream() {
- const listener = Deno.listen({ port: listenPort });
-
- const client = await Deno.connect({ port: listenPort });
- await client.write(new TextEncoder().encode(
- `GET / HTTP/1.0\r\n\r\n`,
- ));
-
- const conn = await listener.accept();
- const httpConn = Deno.serveHttp(conn);
- const ev = await httpConn.nextRequest();
- const { respondWith } = ev!;
-
- const tmpFile = await Deno.makeTempFile();
- const file = await Deno.open(tmpFile, { write: true, read: true });
- await file.write(new TextEncoder().encode("hello"));
-
- const reader = await file.readable.getReader();
- while (true) {
- const { done, value } = await reader.read();
- if (done) break;
- assert(value);
- }
-
- let didThrow = false;
- try {
- await respondWith(new Response(file.readable));
- } catch {
- // pass
- didThrow = true;
- }
-
- assert(didThrow);
- httpConn!.close();
- listener.close();
- client.close();
- },
-);
-
-// https://github.com/denoland/deno/issues/11595
-Deno.test(
- { permissions: { net: true } },
- async function httpServerIncompleteMessage() {
- const listener = Deno.listen({ port: listenPort });
-
- const client = await Deno.connect({ port: listenPort });
- await client.write(new TextEncoder().encode(
- `GET / HTTP/1.0\r\n\r\n`,
- ));
-
- const conn = await listener.accept();
- const httpConn = Deno.serveHttp(conn);
- const ev = await httpConn.nextRequest();
- const { respondWith } = ev!;
-
- const errors: Error[] = [];
-
- const readable = new ReadableStream({
- async pull(controller) {
- client.close();
- await delay(1000);
- controller.enqueue(new TextEncoder().encode(
- "written to the writable side of a TransformStream",
- ));
- controller.close();
- },
- cancel(error) {
- errors.push(error);
- },
- });
-
- const res = new Response(readable);
-
- await respondWith(res).catch((error: Error) => errors.push(error));
-
- httpConn!.close();
- listener.close();
-
- assert(errors.length >= 1);
- for (const error of errors) {
- assertEquals(error.name, "Http");
- assert(error.message.includes("connection"));
- }
- },
-);
-
-// https://github.com/denoland/deno/issues/11743
-Deno.test(
- { permissions: { net: true } },
- async function httpServerDoesntLeakResources() {
- const listener = Deno.listen({ port: listenPort });
- const [conn, clientConn] = await Promise.all([
- listener.accept(),
- Deno.connect({ port: listenPort }),
- ]);
- const httpConn = Deno.serveHttp(conn);
-
- await Promise.all([
- httpConn.nextRequest(),
- clientConn.write(new TextEncoder().encode(
- `GET / HTTP/1.1\r\nHost: 127.0.0.1:${listenPort}\r\n\r\n`,
- )),
- ]);
-
- httpConn!.close();
- listener.close();
- clientConn.close();
- },
-);
-
-// https://github.com/denoland/deno/issues/11926
-// verify that the only new resource is "httpConnection", to make
-// sure "request" resource is closed even if its body was not read
-// by server handler
-Deno.test(
- { permissions: { net: true } },
- async function httpServerDoesntLeakResources2() {
- let listener: Deno.Listener;
- let httpConn: Deno.HttpConn;
-
- const promise = (async () => {
- listener = Deno.listen({ port: listenPort });
- for await (const conn of listener) {
- httpConn = Deno.serveHttp(conn);
- for await (const { request, respondWith } of httpConn) {
- assertEquals(
- new URL(request.url).href,
- `http://127.0.0.1:${listenPort}/`,
- );
- // not reading request body on purpose
- respondWith(new Response("ok"));
- }
- }
- })();
-
- const response = await fetch(`http://127.0.0.1:${listenPort}`, {
- method: "POST",
- body: "hello world",
- });
- await response.text();
-
- listener!.close();
- httpConn!.close();
- await promise;
- },
-);
-
-// https://github.com/denoland/deno/pull/12216
-Deno.test(
- { permissions: { net: true } },
- async function droppedConnSenderNoPanic() {
- async function server() {
- const listener = Deno.listen({ port: listenPort });
- const conn = await listener.accept();
- const http = Deno.serveHttp(conn);
- const evt = await http.nextRequest();
- http.close();
- try {
- await evt!.respondWith(new Response("boom"));
- } catch {
- // Ignore error.
- }
- listener.close();
- }
-
- async function client() {
- try {
- const resp = await fetch(`http://127.0.0.1:${listenPort}/`);
- await resp.body?.cancel();
- } catch {
- // Ignore error
- }
- }
-
- await Promise.all([server(), client()]);
- },
-);
-
-// https://github.com/denoland/deno/issues/12193
-Deno.test(
- { permissions: { net: true } },
- async function httpConnConcurrentNextRequestCalls() {
- const hostname = "localhost";
- const port = listenPort;
-
- let httpConn: Deno.HttpConn;
- const listener = Deno.listen({ hostname, port });
- async function server() {
- const tcpConn = await listener.accept();
- httpConn = Deno.serveHttp(tcpConn);
- const promises = new Array(10).fill(null).map(async (_, i) => {
- const event = await httpConn.nextRequest();
- assert(event);
- const { pathname } = new URL(event.request.url);
- assertStrictEquals(pathname, `/${i}`);
- const response = new Response(`Response #${i}`);
- await event.respondWith(response);
- });
- await Promise.all(promises);
- }
-
- async function client() {
- for (let i = 0; i < 10; i++) {
- const response = await fetch(`http://${hostname}:${port}/${i}`);
- const body = await response.text();
- assertStrictEquals(body, `Response #${i}`);
- }
- }
-
- await Promise.all([server(), delay(100).then(client)]);
- httpConn!.close();
- listener.close();
- },
-);
-
-// https://github.com/denoland/deno/pull/12704
-// https://github.com/denoland/deno/pull/12732
-Deno.test(
- { permissions: { net: true } },
- async function httpConnAutoCloseDelayedOnUpgrade() {
- const hostname = "localhost";
- const port = listenPort;
-
- async function server() {
- const listener = Deno.listen({ hostname, port });
- const tcpConn = await listener.accept();
- const httpConn = Deno.serveHttp(tcpConn);
-
- const event1 = await httpConn.nextRequest() as Deno.RequestEvent;
- const event2Promise = httpConn.nextRequest();
-
- const { socket, response } = Deno.upgradeWebSocket(event1.request);
- socket.onmessage = (event) => socket.send(event.data);
- const socketClosed = new Promise<void>((resolve) => {
- socket.onclose = () => resolve();
- });
- event1.respondWith(response);
-
- const event2 = await event2Promise;
- assertStrictEquals(event2, null);
-
- listener.close();
- await socketClosed;
- }
-
- async function client() {
- const socket = new WebSocket(`ws://${hostname}:${port}/`);
- socket.onopen = () => socket.send("bla bla");
- const closed = new Promise<void>((resolve) => {
- socket.onclose = () => resolve();
- });
- const { data } = await new Promise<MessageEvent<string>>((res) =>
- socket.onmessage = res
- );
- assertStrictEquals(data, "bla bla");
- socket.close();
- await closed;
- }
-
- await Promise.all([server(), client()]);
- },
-);
-
-// https://github.com/denoland/deno/issues/12741
-// https://github.com/denoland/deno/pull/12746
-// https://github.com/denoland/deno/pull/12798
-Deno.test(
- { permissions: { net: true, run: true } },
- async function httpServerDeleteRequestHasBody() {
- const hostname = "localhost";
- const port = listenPort;
-
- let httpConn: Deno.HttpConn;
- const listener = Deno.listen({ hostname, port });
- async function server() {
- const tcpConn = await listener.accept();
- httpConn = Deno.serveHttp(tcpConn);
- const event = await httpConn.nextRequest() as Deno.RequestEvent;
- assert(event.request.body);
- const response = new Response();
- await event.respondWith(response);
- }
-
- async function client() {
- const url = `http://${hostname}:${port}/`;
- const args = ["-X", "DELETE", url];
- const { success } = await new Deno.Command("curl", {
- args,
- stdout: "null",
- stderr: "null",
- }).output();
- assert(success);
- }
-
- await Promise.all([server(), client()]);
- httpConn!.close();
- listener.close();
- },
-);
-
-Deno.test(
- { permissions: { net: true } },
- async function httpServerRespondNonAsciiUint8Array() {
- let httpConn: Deno.HttpConn;
- const listener = Deno.listen({ port: listenPort });
- const promise = (async () => {
- const conn = await listener.accept();
- listener.close();
- httpConn = Deno.serveHttp(conn);
- const e = await httpConn.nextRequest();
- assert(e);
- const { request, respondWith } = e;
- assertEquals(request.body, null);
- await respondWith(
- new Response(new Uint8Array([128]), {}),
- );
- })();
-
- const resp = await fetch(`http://localhost:${listenPort}/`);
- assertEquals(resp.status, 200);
- const body = await resp.arrayBuffer();
- assertEquals(new Uint8Array(body), new Uint8Array([128]));
-
- await promise;
- httpConn!.close();
- },
-);
-
-function tmpUnixSocketPath(): string {
- const folder = Deno.makeTempDirSync();
- return join(folder, "socket");
-}
-
-// https://github.com/denoland/deno/pull/13628
-Deno.test(
- {
- ignore: Deno.build.os === "windows",
- permissions: { read: true, write: true },
- },
- async function httpServerOnUnixSocket() {
- const filePath = tmpUnixSocketPath();
-
- let httpConn: Deno.HttpConn;
- const promise = (async () => {
- const listener = Deno.listen({ path: filePath, transport: "unix" });
- const conn = await listener.accept();
- listener.close();
- httpConn = Deno.serveHttp(conn);
- const reqEvent = await httpConn.nextRequest();
- assert(reqEvent);
- const { request, respondWith } = reqEvent;
- const url = new URL(request.url);
- assertEquals(url.protocol, "http+unix:");
- assertEquals(decodeURIComponent(url.host), filePath);
- assertEquals(url.pathname, "/path/name");
- await respondWith(new Response("", { headers: {} }));
- })();
-
- // fetch() does not supports unix domain sockets yet https://github.com/denoland/deno/issues/8821
- const conn = await Deno.connect({ path: filePath, transport: "unix" });
- const encoder = new TextEncoder();
- // The Host header must be present and empty if it is not a Internet host name (RFC2616, Section 14.23)
- const body = `GET /path/name HTTP/1.1\r\nHost:\r\n\r\n`;
- const writeResult = await conn.write(encoder.encode(body));
- assertEquals(body.length, writeResult);
-
- const resp = new Uint8Array(200);
- const readResult = await conn.read(resp);
- assertEquals(readResult, 138);
-
- conn.close();
-
- await promise;
- httpConn!.close();
- },
-);
-
-/* Automatic Body Compression */
-
-const decoder = new TextDecoder();
-
-Deno.test({
- name: "http server compresses body - check headers",
- permissions: { net: true, run: true },
- async fn() {
- const hostname = "localhost";
- const port = listenPort;
- const listener = Deno.listen({ hostname, port });
-
- const data = { hello: "deno", now: "with", compressed: "body" };
-
- let httpConn: Deno.HttpConn;
- async function server() {
- const tcpConn = await listener.accept();
- httpConn = Deno.serveHttp(tcpConn);
- const e = await httpConn.nextRequest();
- assert(e);
- const { request, respondWith } = e;
- assertEquals(request.headers.get("Accept-Encoding"), "gzip, deflate, br");
- const response = new Response(JSON.stringify(data), {
- headers: { "content-type": "application/json" },
- });
- await respondWith(response);
- listener.close();
- }
-
- async function client() {
- const url = `http://${hostname}:${port}/`;
- const args = [
- "-i",
- "--request",
- "GET",
- "--url",
- url,
- "--header",
- "Accept-Encoding: gzip, deflate, br",
- ];
- const { success, stdout } = await new Deno.Command("curl", {
- args,
- stderr: "null",
- stdout: "piped",
- }).output();
- assert(success);
- const output = decoder.decode(stdout);
- assert(output.includes("vary: Accept-Encoding\r\n"));
- assert(output.includes("content-encoding: gzip\r\n"));
- }
-
- await Promise.all([server(), client()]);
- httpConn!.close();
- },
-});
-
-Deno.test({
- name: "http server compresses body - check body",
- permissions: { net: true, run: true },
- async fn() {
- const hostname = "localhost";
- const port = listenPort;
- const listener = Deno.listen({ hostname, port });
-
- const data = { hello: "deno", now: "with", compressed: "body" };
-
- let httpConn: Deno.HttpConn;
- async function server() {
- const tcpConn = await listener.accept();
- httpConn = Deno.serveHttp(tcpConn);
- const e = await httpConn.nextRequest();
- assert(e);
- const { request, respondWith } = e;
- assertEquals(request.headers.get("Accept-Encoding"), "gzip, deflate, br");
- const response = new Response(JSON.stringify(data), {
- headers: { "content-type": "application/json" },
- });
- await respondWith(response);
- listener.close();
- }
-
- async function client() {
- const url = `http://${hostname}:${port}/`;
- const args = [
- "--request",
- "GET",
- "--url",
- url,
- "--header",
- "Accept-Encoding: gzip, deflate, br",
- ];
- const proc = new Deno.Command("curl", {
- args,
- stderr: "null",
- stdout: "piped",
- }).spawn();
- const status = await proc.status;
- assert(status.success);
- const stdout = proc.stdout
- .pipeThrough(new DecompressionStream("gzip"))
- .pipeThrough(new TextDecoderStream());
- let body = "";
- for await (const chunk of stdout) {
- body += chunk;
- }
- assertEquals(JSON.parse(body), data);
- }
-
- await Promise.all([server(), client()]);
- httpConn!.close();
- },
-});
-
-Deno.test({
- name: "http server doesn't compress small body",
- permissions: { net: true, run: true },
- async fn() {
- const hostname = "localhost";
- const port = listenPort;
-
- let httpConn: Deno.HttpConn;
- async function server() {
- const listener = Deno.listen({ hostname, port });
- const tcpConn = await listener.accept();
- httpConn = Deno.serveHttp(tcpConn);
- const e = await httpConn.nextRequest();
- assert(e);
- const { request, respondWith } = e;
- assertEquals(request.headers.get("Accept-Encoding"), "gzip, deflate, br");
- const response = new Response(
- JSON.stringify({ hello: "deno" }),
- {
- headers: { "content-type": "application/json" },
- },
- );
- await respondWith(response);
- listener.close();
- }
-
- async function client() {
- const url = `http://${hostname}:${port}/`;
- const args = [
- "-i",
- "--request",
- "GET",
- "--url",
- url,
- "--header",
- "Accept-Encoding: gzip, deflate, br",
- ];
- const { success, stdout } = await new Deno.Command("curl", {
- args,
- stderr: "null",
- stdout: "piped",
- }).output();
- assert(success);
- const output = decoder.decode(stdout).toLocaleLowerCase();
- assert(output.includes("vary: accept-encoding\r\n"));
- assert(!output.includes("content-encoding: "));
- }
-
- await Promise.all([server(), client()]);
- httpConn!.close();
- },
-});
-
-Deno.test({
- name: "http server respects accept-encoding weights",
- permissions: { net: true, run: true },
- async fn() {
- const hostname = "localhost";
- const port = listenPort;
-
- let httpConn: Deno.HttpConn;
- async function server() {
- const listener = Deno.listen({ hostname, port });
- const tcpConn = await listener.accept();
- httpConn = Deno.serveHttp(tcpConn);
- const e = await httpConn.nextRequest();
- assert(e);
- const { request, respondWith } = e;
- assertEquals(
- request.headers.get("Accept-Encoding"),
- "gzip;q=0.8, br;q=1.0, *;q=0.1",
- );
- const response = new Response(
- JSON.stringify({ hello: "deno", now: "with", compressed: "body" }),
- {
- headers: { "content-type": "application/json" },
- },
- );
- await respondWith(response);
- listener.close();
- }
-
- async function client() {
- const url = `http://${hostname}:${port}/`;
- const args = [
- "-i",
- "--request",
- "GET",
- "--url",
- url,
- "--header",
- "Accept-Encoding: gzip;q=0.8, br;q=1.0, *;q=0.1",
- ];
- const { success, stdout } = await new Deno.Command("curl", {
- args,
- stderr: "null",
- stdout: "piped",
- }).output();
- assert(success);
- const output = decoder.decode(stdout);
- assert(output.includes("vary: Accept-Encoding\r\n"));
- assert(output.includes("content-encoding: br\r\n"));
- }
-
- await Promise.all([server(), client()]);
- httpConn!.close();
- },
-});
-
-Deno.test({
- name: "http server augments vary header",
- permissions: { net: true, run: true },
- async fn() {
- const hostname = "localhost";
- const port = listenPort;
-
- let httpConn: Deno.HttpConn;
- async function server() {
- const listener = Deno.listen({ hostname, port });
- const tcpConn = await listener.accept();
- httpConn = Deno.serveHttp(tcpConn);
- const e = await httpConn.nextRequest();
- assert(e);
- const { request, respondWith } = e;
- assertEquals(request.headers.get("Accept-Encoding"), "gzip, deflate, br");
- const response = new Response(
- JSON.stringify({ hello: "deno", now: "with", compressed: "body" }),
- {
- headers: { "content-type": "application/json", vary: "Accept" },
- },
- );
- await respondWith(response);
- listener.close();
- }
-
- async function client() {
- const url = `http://${hostname}:${port}/`;
- const args = [
- "-i",
- "--request",
- "GET",
- "--url",
- url,
- "--header",
- "Accept-Encoding: gzip, deflate, br",
- ];
- const { success, stdout } = await new Deno.Command("curl", {
- args,
- stderr: "null",
- stdout: "piped",
- }).output();
- assert(success);
- const output = decoder.decode(stdout);
- assert(output.includes("vary: Accept-Encoding, Accept\r\n"));
- assert(output.includes("content-encoding: gzip\r\n"));
- }
-
- await Promise.all([server(), client()]);
- httpConn!.close();
- },
-});
-
-Deno.test({
- name: "http server weakens etag header",
- permissions: { net: true, run: true },
- async fn() {
- const hostname = "localhost";
- const port = listenPort;
-
- let httpConn: Deno.HttpConn;
- async function server() {
- const listener = Deno.listen({ hostname, port });
- const tcpConn = await listener.accept();
- httpConn = Deno.serveHttp(tcpConn);
- const e = await httpConn.nextRequest();
- assert(e);
- const { request, respondWith } = e;
- assertEquals(request.headers.get("Accept-Encoding"), "gzip, deflate, br");
- const response = new Response(
- JSON.stringify({ hello: "deno", now: "with", compressed: "body" }),
- {
- headers: {
- "content-type": "application/json",
- etag: "33a64df551425fcc55e4d42a148795d9f25f89d4",
- },
- },
- );
- await respondWith(response);
- listener.close();
- }
-
- async function client() {
- const url = `http://${hostname}:${port}/`;
- const args = [
- "curl",
- "-i",
- "--request",
- "GET",
- "--url",
- url,
- "--header",
- "Accept-Encoding: gzip, deflate, br",
- ];
- const { success, stdout } = await new Deno.Command("curl", {
- args,
- stderr: "null",
- stdout: "piped",
- }).output();
- assert(success);
- const output = decoder.decode(stdout);
- assert(output.includes("vary: Accept-Encoding\r\n"));
- assert(
- output.includes("etag: W/33a64df551425fcc55e4d42a148795d9f25f89d4\r\n"),
- );
- assert(output.includes("content-encoding: gzip\r\n"));
- }
-
- await Promise.all([server(), client()]);
- httpConn!.close();
- },
-});
-
-Deno.test({
- name: "http server passes through weak etag header",
- permissions: { net: true, run: true },
- async fn() {
- const hostname = "localhost";
- const port = listenPort;
-
- let httpConn: Deno.HttpConn;
- async function server() {
- const listener = Deno.listen({ hostname, port });
- const tcpConn = await listener.accept();
- httpConn = Deno.serveHttp(tcpConn);
- const e = await httpConn.nextRequest();
- assert(e);
- const { request, respondWith } = e;
- assertEquals(request.headers.get("Accept-Encoding"), "gzip, deflate, br");
- const response = new Response(
- JSON.stringify({ hello: "deno", now: "with", compressed: "body" }),
- {
- headers: {
- "content-type": "application/json",
- etag: "W/33a64df551425fcc55e4d42a148795d9f25f89d4",
- },
- },
- );
- await respondWith(response);
- listener.close();
- }
-
- async function client() {
- const url = `http://${hostname}:${port}/`;
- const args = [
- "-i",
- "--request",
- "GET",
- "--url",
- url,
- "--header",
- "Accept-Encoding: gzip, deflate, br",
- ];
- const { success, stdout } = await new Deno.Command("curl", {
- args,
- stderr: "null",
- stdout: "piped",
- }).output();
- assert(success);
- const output = decoder.decode(stdout);
- assert(output.includes("vary: Accept-Encoding\r\n"));
- assert(
- output.includes("etag: W/33a64df551425fcc55e4d42a148795d9f25f89d4\r\n"),
- );
- assert(output.includes("content-encoding: gzip\r\n"));
- }
-
- await Promise.all([server(), client()]);
- httpConn!.close();
- },
-});
-
-Deno.test({
- name: "http server doesn't compress body when no-transform is set",
- permissions: { net: true, run: true },
- async fn() {
- const hostname = "localhost";
- const port = listenPort;
-
- let httpConn: Deno.HttpConn;
- async function server() {
- const listener = Deno.listen({ hostname, port });
- const tcpConn = await listener.accept();
- httpConn = Deno.serveHttp(tcpConn);
- const e = await httpConn.nextRequest();
- assert(e);
- const { request, respondWith } = e;
- assertEquals(request.headers.get("Accept-Encoding"), "gzip, deflate, br");
- const response = new Response(
- JSON.stringify({ hello: "deno", now: "with", compressed: "body" }),
- {
- headers: {
- "content-type": "application/json",
- "cache-control": "no-transform",
- },
- },
- );
- await respondWith(response);
- listener.close();
- }
-
- async function client() {
- const url = `http://${hostname}:${port}/`;
- const args = [
- "-i",
- "--request",
- "GET",
- "--url",
- url,
- "--header",
- "Accept-Encoding: gzip, deflate, br",
- ];
- const { success, stdout } = await new Deno.Command("curl", {
- args,
- stderr: "null",
- stdout: "piped",
- }).output();
- assert(success);
- const output = decoder.decode(stdout);
- assert(output.includes("vary: Accept-Encoding\r\n"));
- assert(!output.includes("content-encoding: "));
- }
-
- await Promise.all([server(), client()]);
- httpConn!.close();
- },
-});
-
-Deno.test({
- name: "http server doesn't compress body when content-range is set",
- permissions: { net: true, run: true },
- async fn() {
- const hostname = "localhost";
- const port = listenPort;
-
- let httpConn: Deno.HttpConn;
- async function server() {
- const listener = Deno.listen({ hostname, port });
- const tcpConn = await listener.accept();
- httpConn = Deno.serveHttp(tcpConn);
- const e = await httpConn.nextRequest();
- assert(e);
- const { request, respondWith } = e;
- assertEquals(request.headers.get("Accept-Encoding"), "gzip, deflate, br");
- const response = new Response(
- JSON.stringify({ hello: "deno", now: "with", compressed: "body" }),
- {
- headers: {
- "content-type": "application/json",
- "content-range": "bytes 200-100/67589",
- },
- },
- );
- await respondWith(response);
- listener.close();
- }
-
- async function client() {
- const url = `http://${hostname}:${port}/`;
- const args = [
- "-i",
- "--request",
- "GET",
- "--url",
- url,
- "--header",
- "Accept-Encoding: gzip, deflate, br",
- ];
- const { success, stdout } = await new Deno.Command("curl", {
- args,
- stderr: "null",
- stdout: "piped",
- }).output();
- assert(success);
- const output = decoder.decode(stdout);
- assert(output.includes("vary: Accept-Encoding\r\n"));
- assert(!output.includes("content-encoding: "));
- }
-
- await Promise.all([server(), client()]);
- httpConn!.close();
- },
-});
-
-Deno.test({
- name: "http server compresses streamed bodies - check headers",
- permissions: { net: true, run: true },
- async fn() {
- const hostname = "localhost";
- const port = listenPort;
-
- const encoder = new TextEncoder();
- const listener = Deno.listen({ hostname, port });
-
- const data = { hello: "deno", now: "with", compressed: "body" };
-
- let httpConn: Deno.HttpConn;
- async function server() {
- const tcpConn = await listener.accept();
- httpConn = Deno.serveHttp(tcpConn);
- const e = await httpConn.nextRequest();
- assert(e);
- const { request, respondWith } = e;
- assertEquals(request.headers.get("Accept-Encoding"), "gzip, deflate, br");
- const bodyInit = new ReadableStream({
- start(controller) {
- controller.enqueue(encoder.encode(JSON.stringify(data)));
- controller.close();
- },
- });
- const response = new Response(
- bodyInit,
- { headers: { "content-type": "application/json" } },
- );
- await respondWith(response);
- listener.close();
- }
-
- async function client() {
- const url = `http://${hostname}:${port}/`;
- const args = [
- "curl",
- "-i",
- "--request",
- "GET",
- "--url",
- url,
- "--header",
- "Accept-Encoding: gzip, deflate, br",
- ];
- const { success, stdout } = await new Deno.Command("curl", {
- args,
- stderr: "null",
- stdout: "piped",
- }).output();
- assert(success);
- const output = decoder.decode(stdout);
- assert(output.includes("vary: Accept-Encoding\r\n"));
- assert(output.includes("content-encoding: gzip\r\n"));
- }
-
- await Promise.all([server(), client()]);
- httpConn!.close();
- },
-});
-
-Deno.test({
- name: "http server compresses streamed bodies - check body",
- permissions: { net: true, run: true },
- async fn() {
- const hostname = "localhost";
- const port = listenPort;
-
- const encoder = new TextEncoder();
- const listener = Deno.listen({ hostname, port });
-
- const data = { hello: "deno", now: "with", compressed: "body" };
-
- let httpConn: Deno.HttpConn;
- async function server() {
- const tcpConn = await listener.accept();
- httpConn = Deno.serveHttp(tcpConn);
- const e = await httpConn.nextRequest();
- assert(e);
- const { request, respondWith } = e;
- assertEquals(request.headers.get("Accept-Encoding"), "gzip, deflate, br");
- const bodyInit = new ReadableStream({
- start(controller) {
- controller.enqueue(encoder.encode(JSON.stringify(data)));
- controller.close();
- },
- });
- const response = new Response(
- bodyInit,
- { headers: { "content-type": "application/json" } },
- );
- await respondWith(response);
- listener.close();
- }
-
- async function client() {
- const url = `http://${hostname}:${port}/`;
- const args = [
- "--request",
- "GET",
- "--url",
- url,
- "--header",
- "Accept-Encoding: gzip, deflate, br",
- ];
- const proc = new Deno.Command("curl", {
- args,
- stderr: "null",
- stdout: "piped",
- }).spawn();
- const status = await proc.status;
- assert(status.success);
- const stdout = proc.stdout
- .pipeThrough(new DecompressionStream("gzip"))
- .pipeThrough(new TextDecoderStream());
- let body = "";
- for await (const chunk of stdout) {
- body += chunk;
- }
- assertEquals(JSON.parse(body), data);
- }
-
- await Promise.all([server(), client()]);
- httpConn!.close();
- },
-});
-
-Deno.test({
- name: "http server updates content-length header if compression is applied",
- permissions: { net: true, run: true },
- async fn() {
- const hostname = "localhost";
- const port = listenPort;
- let contentLength: string;
-
- let httpConn: Deno.HttpConn;
- async function server() {
- const listener = Deno.listen({ hostname, port });
- const tcpConn = await listener.accept();
- httpConn = Deno.serveHttp(tcpConn);
- const e = await httpConn.nextRequest();
- assert(e);
- const { request, respondWith } = e;
- assertEquals(request.headers.get("Accept-Encoding"), "gzip, deflate, br");
- const body = JSON.stringify({
- hello: "deno",
- now: "with",
- compressed: "body",
- });
- contentLength = String(body.length);
- const response = new Response(
- body,
- {
- headers: {
- "content-type": "application/json",
- "content-length": contentLength,
- },
- },
- );
- await respondWith(response);
- listener.close();
- }
-
- async function client() {
- const url = `http://${hostname}:${port}/`;
- const args = [
- "-i",
- "--request",
- "GET",
- "--url",
- url,
- "--header",
- "Accept-Encoding: gzip, deflate, br",
- ];
- const { success, stdout } = await new Deno.Command("curl", {
- args,
- stderr: "null",
- stdout: "piped",
- }).output();
- assert(success);
- const output = decoder.decode(stdout);
- assert(output.includes("vary: Accept-Encoding\r\n"));
- assert(output.includes("content-encoding: gzip\r\n"));
- // Ensure the content-length header is updated (but don't check the exact length).
- assert(!output.includes(`content-length: ${contentLength}\r\n`));
- assert(output.includes("content-length: "));
- }
-
- await Promise.all([server(), client()]);
- httpConn!.close();
- },
-});
-
-Deno.test({
- name: "http server compresses when accept-encoding is deflate, gzip",
- permissions: { net: true, run: true },
- async fn() {
- const hostname = "localhost";
- const port = listenPort;
- let contentLength: string;
-
- let httpConn: Deno.HttpConn;
- async function server() {
- const listener = Deno.listen({ hostname, port });
- const tcpConn = await listener.accept();
- httpConn = Deno.serveHttp(tcpConn);
- const e = await httpConn.nextRequest();
- assert(e);
- const { request, respondWith } = e;
- assertEquals(request.headers.get("Accept-Encoding"), "deflate, gzip");
- const body = "x".repeat(10000);
- contentLength = String(body.length);
- const response = new Response(
- body,
- {
- headers: {
- "content-length": contentLength,
- },
- },
- );
- await respondWith(response);
- listener.close();
- }
-
- async function client() {
- const url = `http://${hostname}:${port}/`;
- const cmd = [
- "curl",
- "-i",
- "--request",
- "GET",
- "--url",
- url,
- // "--compressed", // Windows curl does not support --compressed
- "--header",
- "Accept-Encoding: deflate, gzip",
- ];
- // deno-lint-ignore no-deprecated-deno-api
- const proc = Deno.run({ cmd, stdout: "piped", stderr: "null" });
- const status = await proc.status();
- assert(status.success);
- const output = decoder.decode(await proc.output());
- assert(output.includes("vary: Accept-Encoding\r\n"));
- assert(output.includes("content-encoding: gzip\r\n"));
- // Ensure the content-length header is updated.
- assert(!output.includes(`content-length: ${contentLength}\r\n`));
- assert(output.includes("content-length: "));
- proc.close();
- }
-
- await Promise.all([server(), client()]);
- httpConn!.close();
- },
-});
-
-Deno.test({
- name: "http server custom content-encoding is left untouched",
- permissions: { net: true, run: true },
- async fn() {
- const hostname = "localhost";
- const port = listenPort;
- let contentLength: string;
-
- let httpConn: Deno.HttpConn;
- async function server() {
- const listener = Deno.listen({ hostname, port });
- const tcpConn = await listener.accept();
- httpConn = Deno.serveHttp(tcpConn);
- const e = await httpConn.nextRequest();
- assert(e);
- const { request, respondWith } = e;
- assertEquals(request.headers.get("Accept-Encoding"), "deflate, gzip");
- const body = new Uint8Array([3, 1, 4, 1]);
- contentLength = String(body.length);
- const response = new Response(
- body,
- {
- headers: {
- "content-length": contentLength,
- "content-encoding": "arbitrary",
- },
- },
- );
- await respondWith(response);
- listener.close();
- }
-
- async function client() {
- const url = `http://${hostname}:${port}/`;
- const cmd = [
- "curl",
- "-i",
- "--request",
- "GET",
- "--url",
- url,
- // "--compressed", // Windows curl does not support --compressed
- "--header",
- "Accept-Encoding: deflate, gzip",
- ];
- // deno-lint-ignore no-deprecated-deno-api
- const proc = Deno.run({ cmd, stdout: "piped", stderr: "null" });
- const status = await proc.status();
- assert(status.success);
- const output = decoder.decode(await proc.output());
- assert(output.includes("vary: Accept-Encoding\r\n"));
- assert(output.includes("content-encoding: arbitrary\r\n"));
- proc.close();
- }
-
- await Promise.all([server(), client()]);
- httpConn!.close();
- },
-});
-
-Deno.test(
- { permissions: { net: true } },
- async function httpServerReadLargeBodyWithContentLength() {
- const TLS_PACKET_SIZE = 16 * 1024 + 256;
- // We want the body to be read in multiple packets
- const body = "aa\n" + "deno.land large body\n".repeat(TLS_PACKET_SIZE) +
- "zz";
-
- let httpConn: Deno.HttpConn;
- const promise = (async () => {
- const listener = Deno.listen({ port: listenPort });
- const conn = await listener.accept();
- listener.close();
- httpConn = Deno.serveHttp(conn);
- const reqEvent = await httpConn.nextRequest();
- assert(reqEvent);
- const { request, respondWith } = reqEvent;
- assertEquals(await request.text(), body);
- await respondWith(new Response(body));
- })();
-
- const resp = await fetch(`http://127.0.0.1:${listenPort}/`, {
- method: "POST",
- headers: { "connection": "close" },
- body,
- });
- const text = await resp.text();
- assertEquals(text, body);
- await promise;
-
- httpConn!.close();
- },
-);
-
-Deno.test(
- { permissions: { net: true } },
- async function httpServerReadLargeBodyWithTransferChunked() {
- const TLS_PACKET_SIZE = 16 * 1024 + 256;
-
- // We want the body to be read in multiple packets
- const chunks = [
- "aa\n",
- "deno.land large body\n".repeat(TLS_PACKET_SIZE),
- "zz",
- ];
-
- const body = chunks.join("");
-
- const stream = new TransformStream();
- const writer = stream.writable.getWriter();
- for (const chunk of chunks) {
- writer.write(new TextEncoder().encode(chunk));
- }
- writer.close();
-
- let httpConn: Deno.HttpConn;
- const promise = (async () => {
- const listener = Deno.listen({ port: listenPort });
- const conn = await listener.accept();
- listener.close();
- httpConn = Deno.serveHttp(conn);
- const reqEvent = await httpConn.nextRequest();
- assert(reqEvent);
- const { request, respondWith } = reqEvent;
- assertEquals(await request.text(), body);
- await respondWith(new Response(body));
- })();
-
- const resp = await fetch(`http://127.0.0.1:${listenPort}/`, {
- method: "POST",
- headers: { "connection": "close" },
- body: stream.readable,
- });
- const text = await resp.text();
- assertEquals(text, body);
- await promise;
-
- httpConn!.close();
- },
-);
-
-Deno.test(
- {
- permissions: { net: true },
- },
- async function httpServerWithoutExclusiveAccessToTcp() {
- const port = listenPort;
- const listener = Deno.listen({ port });
-
- const [clientConn, serverConn] = await Promise.all([
- Deno.connect({ port }),
- listener.accept(),
- ]);
-
- const buf = new Uint8Array(128);
- const readPromise = serverConn.read(buf);
- assertThrows(() => Deno.serveHttp(serverConn), Deno.errors.BadResource);
-
- clientConn.close();
- listener.close();
- await readPromise;
- },
-);
-
-Deno.test(
- {
- permissions: { net: true, read: true },
- },
- async function httpServerWithoutExclusiveAccessToTls() {
- const hostname = "localhost";
- const port = listenPort;
- const listener = Deno.listenTls({
- hostname,
- port,
- cert: await Deno.readTextFile("cli/tests/testdata/tls/localhost.crt"),
- key: await Deno.readTextFile("cli/tests/testdata/tls/localhost.key"),
- });
-
- const caCerts = [
- await Deno.readTextFile("cli/tests/testdata/tls/RootCA.pem"),
- ];
- const [clientConn, serverConn] = await Promise.all([
- Deno.connectTls({ hostname, port, caCerts }),
- listener.accept(),
- ]);
- await Promise.all([clientConn.handshake(), serverConn.handshake()]);
-
- const buf = new Uint8Array(128);
- const readPromise = serverConn.read(buf);
- assertThrows(() => Deno.serveHttp(serverConn), Deno.errors.BadResource);
-
- clientConn.close();
- listener.close();
- await readPromise;
- },
-);
-
-Deno.test(
- {
- ignore: Deno.build.os === "windows",
- permissions: { read: true, write: true },
- },
- async function httpServerWithoutExclusiveAccessToUnixSocket() {
- const filePath = tmpUnixSocketPath();
- const listener = Deno.listen({ path: filePath, transport: "unix" });
-
- const [clientConn, serverConn] = await Promise.all([
- Deno.connect({ path: filePath, transport: "unix" }),
- listener.accept(),
- ]);
-
- const buf = new Uint8Array(128);
- const readPromise = serverConn.read(buf);
- assertThrows(() => Deno.serveHttp(serverConn), Deno.errors.BadResource);
-
- clientConn.close();
- listener.close();
- await readPromise;
- },
-);
-
-Deno.test(
- { permissions: { net: true } },
- async function httpServerRequestResponseClone() {
- const body = "deno".repeat(64 * 1024);
- let httpConn: Deno.HttpConn;
- const listener = Deno.listen({ port: listenPort });
- const promise = (async () => {
- const conn = await listener.accept();
- listener.close();
- httpConn = Deno.serveHttp(conn);
- const reqEvent = await httpConn.nextRequest();
- assert(reqEvent);
- const { request, respondWith } = reqEvent;
- const clone = request.clone();
- const reader = clone.body!.getReader();
-
- // get first chunk from branch2
- const clonedChunks = [];
- const { value, done } = await reader.read();
- assert(!done);
- clonedChunks.push(value);
-
- // consume request after first chunk single read
- // readAll should read correctly the rest of the body.
- // firstChunk should be in the stream internal buffer
- const body1 = await request.text();
-
- while (true) {
- const { value, done } = await reader.read();
- if (done) break;
- clonedChunks.push(value);
- }
- let offset = 0;
- const body2 = new Uint8Array(body.length);
- for (const chunk of clonedChunks) {
- body2.set(chunk, offset);
- offset += chunk.byteLength;
- }
-
- assertEquals(body1, body);
- assertEquals(body1, new TextDecoder().decode(body2));
- await respondWith(new Response(body));
- })();
-
- const response = await fetch(`http://localhost:${listenPort}`, {
- body,
- method: "POST",
- });
- const clone = response.clone();
- assertEquals(await response.text(), await clone.text());
-
- await promise;
- httpConn!.close();
- },
-);
-
-Deno.test({
- name: "http server compresses and flushes each chunk of a streamed resource",
- permissions: { net: true, run: true },
- async fn() {
- const hostname = "localhost";
- const port = listenPort;
- const port2 = listenPort2;
-
- const encoder = new TextEncoder();
- const listener = Deno.listen({ hostname, port });
- const listener2 = Deno.listen({ hostname, port: port2 });
-
- let httpConn: Deno.HttpConn;
- async function server() {
- const tcpConn = await listener.accept();
- httpConn = Deno.serveHttp(tcpConn);
- const e = await httpConn.nextRequest();
- assert(e);
- const { request, respondWith } = e;
- assertEquals(request.headers.get("Accept-Encoding"), "gzip, deflate, br");
- const resp = await fetch(`http://${hostname}:${port2}/`);
- await respondWith(resp);
- listener.close();
- }
-
- const ts = new TransformStream();
- const writer = ts.writable.getWriter();
- writer.write(encoder.encode("hello"));
-
- let httpConn2: Deno.HttpConn;
- async function server2() {
- const tcpConn = await listener2.accept();
- httpConn2 = Deno.serveHttp(tcpConn);
- const e = await httpConn2.nextRequest();
- assert(e);
- await e.respondWith(
- new Response(ts.readable, {
- headers: { "Content-Type": "text/plain" },
- }),
- );
- listener2.close();
- }
-
- async function client() {
- const url = `http://${hostname}:${port}/`;
- const args = [
- "--request",
- "GET",
- "--url",
- url,
- "--header",
- "Accept-Encoding: gzip, deflate, br",
- "--no-buffer",
- ];
- const proc = new Deno.Command("curl", {
- args,
- stderr: "null",
- stdout: "piped",
- }).spawn();
- const stdout = proc.stdout
- .pipeThrough(new DecompressionStream("gzip"))
- .pipeThrough(new TextDecoderStream());
- let body = "";
- for await (const chunk of stdout) {
- body += chunk;
- if (body === "hello") {
- writer.write(encoder.encode(" world"));
- writer.close();
- }
- }
- assertEquals(body, "hello world");
- const status = await proc.status;
- assert(status.success);
- }
-
- await Promise.all([server(), server2(), client()]);
- httpConn!.close();
- httpConn2!.close();
- },
-});
-
-Deno.test("case insensitive comma value finder", async (t) => {
- const cases = /** @type {[string, boolean][]} */ ([
- ["websocket", true],
- ["wEbSOcKET", true],
- [",wEbSOcKET", true],
- [",wEbSOcKET,", true],
- [", wEbSOcKET ,", true],
- ["test, wEbSOcKET ,", true],
- ["test ,\twEbSOcKET\t\t ,", true],
- ["test , wEbSOcKET", true],
- ["test, asdf,web,wEbSOcKET", true],
- ["test, asdf,web,wEbSOcKETs", false],
- ["test, asdf,awebsocket,wEbSOcKETs", false],
- ]);
-
- const findValue = buildCaseInsensitiveCommaValueFinder("websocket");
- for (const [input, expected] of cases) {
- await t.step(input.toString(), () => {
- const actual = findValue(input);
- assertEquals(actual, expected);
- });
- }
-});
-
-async function httpServerWithErrorBody(
- listener: Deno.Listener,
- compression: boolean,
-): Promise<Deno.HttpConn> {
- const conn = await listener.accept();
- listener.close();
- const httpConn = Deno.serveHttp(conn);
- const e = await httpConn.nextRequest();
- assert(e);
- const { respondWith } = e;
- const originalErr = new Error("boom");
- const rs = new ReadableStream({
- async start(controller) {
- controller.enqueue(new Uint8Array([65]));
- await delay(1000);
- controller.error(originalErr);
- },
- });
- const init = compression ? { headers: { "content-type": "text/plain" } } : {};
- const response = new Response(rs, init);
- const err = await assertRejects(() => respondWith(response));
- assert(err === originalErr);
- return httpConn;
-}
-
-for (const compression of [true, false]) {
- Deno.test({
- name: `http server errors stream if response body errors (http/1.1${
- compression ? " + compression" : ""
- })`,
- permissions: { net: true },
- async fn() {
- const hostname = "localhost";
- const port = listenPort;
-
- const listener = Deno.listen({ hostname, port });
- const server = httpServerWithErrorBody(listener, compression);
-
- const conn = await Deno.connect({ hostname, port });
- const msg = new TextEncoder().encode(
- `GET / HTTP/1.1\r\nHost: ${hostname}:${port}\r\n\r\n`,
- );
- const nwritten = await conn.write(msg);
- assertEquals(nwritten, msg.byteLength);
-
- const buf = new Uint8Array(1024);
- const nread = await conn.read(buf);
- assert(nread);
- const data = new TextDecoder().decode(buf.subarray(0, nread));
- assert(data.endsWith("1\r\nA\r\n"));
- const nread2 = await conn.read(buf); // connection should be closed now because the stream errored
- assertEquals(nread2, null);
- conn.close();
-
- const httpConn = await server;
- httpConn.close();
- },
- });
-
- Deno.test({
- name: `http server errors stream if response body errors (http/1.1 + fetch${
- compression ? " + compression" : ""
- })`,
- permissions: { net: true },
- async fn() {
- const hostname = "localhost";
- const port = listenPort;
-
- const listener = Deno.listen({ hostname, port });
- const server = httpServerWithErrorBody(listener, compression);
-
- const resp = await fetch(`http://${hostname}:${port}/`);
- assert(resp.body);
- const reader = resp.body.getReader();
- const result = await reader.read();
- assert(!result.done);
- assertEquals(result.value, new Uint8Array([65]));
- const err = await assertRejects(() => reader.read());
- assert(err instanceof TypeError);
- assert(err.message.includes("unexpected EOF"));
-
- const httpConn = await server;
- httpConn.close();
- },
- });
-
- Deno.test({
- name: `http server errors stream if response body errors (http/2 + fetch${
- compression ? " + compression" : ""
- }))`,
- permissions: { net: true, read: true },
- async fn() {
- const hostname = "localhost";
- const port = listenPort;
-
- const listener = Deno.listenTls({
- hostname,
- port,
- cert: await Deno.readTextFile("cli/tests/testdata/tls/localhost.crt"),
- key: await Deno.readTextFile("cli/tests/testdata/tls/localhost.key"),
- alpnProtocols: ["h2"],
- });
- const server = httpServerWithErrorBody(listener, compression);
-
- const caCert = Deno.readTextFileSync("cli/tests/testdata/tls/RootCA.pem");
- const client = Deno.createHttpClient({ caCerts: [caCert] });
- const resp = await fetch(`https://${hostname}:${port}/`, { client });
- client.close();
- assert(resp.body);
- const reader = resp.body.getReader();
- const result = await reader.read();
- assert(!result.done);
- assertEquals(result.value, new Uint8Array([65]));
- const err = await assertRejects(() => reader.read());
- assert(err instanceof TypeError);
- assert(err.message.includes("unexpected internal error encountered"));
-
- const httpConn = await server;
- httpConn.close();
- },
- });
-}
-
-Deno.test({
- name: "request signal is aborted when response errors",
- permissions: { net: true },
- async fn() {
- let httpConn: Deno.HttpConn;
- const promise = (async () => {
- const listener = Deno.listen({ port: listenPort });
- const conn = await listener.accept();
- listener.close();
- httpConn = Deno.serveHttp(conn);
- const ev = await httpConn.nextRequest();
- const { request, respondWith } = ev!;
-
- await delay(300);
- await assertRejects(() => respondWith(new Response("Hello World")));
- assert(request.signal.aborted);
- })();
-
- const abortController = new AbortController();
-
- fetch(`http://127.0.0.1:${listenPort}/`, {
- signal: abortController.signal,
- }).catch(() => {
- // ignore
- });
-
- await delay(100);
- abortController.abort();
- await promise;
- httpConn!.close();
- },
-});
-
-Deno.test(
- async function httpConnExplicitResourceManagement() {
- let promise;
-
- {
- const listen = Deno.listen({ port: listenPort });
- promise = fetch(`http://localhost:${listenPort}/`).catch(() => null);
- const serverConn = await listen.accept();
- listen.close();
-
- using _httpConn = Deno.serveHttp(serverConn);
- }
-
- const response = await promise;
- assertEquals(response, null);
- },
-);
-
-function chunkedBodyReader(h: Headers, r: BufReader): Deno.Reader {
- // Based on https://tools.ietf.org/html/rfc2616#section-19.4.6
- const tp = new TextProtoReader(r);
- let finished = false;
- const chunks: Array<{
- offset: number;
- data: Uint8Array;
- }> = [];
- async function read(buf: Uint8Array): Promise<number | null> {
- if (finished) return null;
- const [chunk] = chunks;
- if (chunk) {
- const chunkRemaining = chunk.data.byteLength - chunk.offset;
- const readLength = Math.min(chunkRemaining, buf.byteLength);
- for (let i = 0; i < readLength; i++) {
- buf[i] = chunk.data[chunk.offset + i];
- }
- chunk.offset += readLength;
- if (chunk.offset === chunk.data.byteLength) {
- chunks.shift();
- // Consume \r\n;
- if ((await tp.readLine()) === null) {
- throw new Deno.errors.UnexpectedEof();
- }
- }
- return readLength;
- }
- const line = await tp.readLine();
- if (line === null) throw new Deno.errors.UnexpectedEof();
- // TODO(bartlomieju): handle chunk extension
- const [chunkSizeString] = line.split(";");
- const chunkSize = parseInt(chunkSizeString, 16);
- if (Number.isNaN(chunkSize) || chunkSize < 0) {
- throw new Deno.errors.InvalidData("Invalid chunk size");
- }
- if (chunkSize > 0) {
- if (chunkSize > buf.byteLength) {
- let eof = await r.readFull(buf);
- if (eof === null) {
- throw new Deno.errors.UnexpectedEof();
- }
- const restChunk = new Uint8Array(chunkSize - buf.byteLength);
- eof = await r.readFull(restChunk);
- if (eof === null) {
- throw new Deno.errors.UnexpectedEof();
- } else {
- chunks.push({
- offset: 0,
- data: restChunk,
- });
- }
- return buf.byteLength;
- } else {
- const bufToFill = buf.subarray(0, chunkSize);
- const eof = await r.readFull(bufToFill);
- if (eof === null) {
- throw new Deno.errors.UnexpectedEof();
- }
- // Consume \r\n
- if ((await tp.readLine()) === null) {
- throw new Deno.errors.UnexpectedEof();
- }
- return chunkSize;
- }
- } else {
- assert(chunkSize === 0);
- // Consume \r\n
- if ((await r.readLine()) === null) {
- throw new Deno.errors.UnexpectedEof();
- }
- await readTrailers(h, r);
- finished = true;
- return null;
- }
- }
- return { read };
-}
-
-async function readTrailers(
- headers: Headers,
- r: BufReader,
-) {
- const trailers = parseTrailer(headers.get("trailer"));
- if (trailers == null) return;
- const trailerNames = [...trailers.keys()];
- const tp = new TextProtoReader(r);
- const result = await tp.readMimeHeader();
- if (result == null) {
- throw new Deno.errors.InvalidData("Missing trailer header.");
- }
- const undeclared = [...result.keys()].filter(
- (k) => !trailerNames.includes(k),
- );
- if (undeclared.length > 0) {
- throw new Deno.errors.InvalidData(
- `Undeclared trailers: ${Deno.inspect(undeclared)}.`,
- );
- }
- for (const [k, v] of result) {
- headers.append(k, v);
- }
- const missingTrailers = trailerNames.filter((k) => !result.has(k));
- if (missingTrailers.length > 0) {
- throw new Deno.errors.InvalidData(
- `Missing trailers: ${Deno.inspect(missingTrailers)}.`,
- );
- }
- headers.delete("trailer");
-}
-
-function parseTrailer(field: string | null): Headers | undefined {
- if (field == null) {
- return undefined;
- }
- const trailerNames = field.split(",").map((v) => v.trim().toLowerCase());
- if (trailerNames.length === 0) {
- throw new Deno.errors.InvalidData("Empty trailer header.");
- }
- const prohibited = trailerNames.filter((k) => isProhibitedForTrailer(k));
- if (prohibited.length > 0) {
- throw new Deno.errors.InvalidData(
- `Prohibited trailer names: ${Deno.inspect(prohibited)}.`,
- );
- }
- return new Headers(trailerNames.map((key) => [key, ""]));
-}
-
-function isProhibitedForTrailer(key: string): boolean {
- const s = new Set(["transfer-encoding", "content-length", "trailer"]);
- return s.has(key.toLowerCase());
-}
diff --git a/cli/tests/unit/net_test.ts b/cli/tests/unit/net_test.ts
deleted file mode 100644
index fa9790a76..000000000
--- a/cli/tests/unit/net_test.ts
+++ /dev/null
@@ -1,1274 +0,0 @@
-// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
-import {
- assert,
- assertEquals,
- assertNotEquals,
- assertRejects,
- assertThrows,
- delay,
- execCode,
- execCode2,
- tmpUnixSocketPath,
-} from "./test_util.ts";
-
-// Since these tests may run in parallel, ensure this port is unique to this file
-const listenPort = 4503;
-const listenPort2 = 4504;
-
-let isCI: boolean;
-try {
- isCI = Deno.env.get("CI") !== undefined;
-} catch {
- isCI = true;
-}
-
-Deno.test({ permissions: { net: true } }, function netTcpListenClose() {
- const listener = Deno.listen({ hostname: "127.0.0.1", port: listenPort });
- assert(listener.addr.transport === "tcp");
- assertEquals(listener.addr.hostname, "127.0.0.1");
- assertEquals(listener.addr.port, listenPort);
- assertNotEquals(listener.rid, 0);
- listener.close();
-});
-
-Deno.test(
- {
- permissions: { net: true },
- },
- function netUdpListenClose() {
- const socket = Deno.listenDatagram({
- hostname: "127.0.0.1",
- port: listenPort,
- transport: "udp",
- });
- assert(socket.addr.transport === "udp");
- assertEquals(socket.addr.hostname, "127.0.0.1");
- assertEquals(socket.addr.port, listenPort);
- socket.close();
- },
-);
-
-Deno.test(
- {
- ignore: Deno.build.os === "windows",
- permissions: { read: true, write: true },
- },
- function netUnixListenClose() {
- const filePath = tmpUnixSocketPath();
- const socket = Deno.listen({
- path: filePath,
- transport: "unix",
- });
- assert(socket.addr.transport === "unix");
- assertEquals(socket.addr.path, filePath);
- socket.close();
- },
-);
-
-Deno.test(
- {
- ignore: Deno.build.os === "windows",
- permissions: { read: true, write: true },
- },
- function netUnixPacketListenClose() {
- const filePath = tmpUnixSocketPath();
- const socket = Deno.listenDatagram({
- path: filePath,
- transport: "unixpacket",
- });
- assert(socket.addr.transport === "unixpacket");
- assertEquals(socket.addr.path, filePath);
- socket.close();
- },
-);
-
-Deno.test(
- {
- ignore: Deno.build.os === "windows",
- permissions: { read: true, write: false },
- },
- function netUnixListenWritePermission() {
- assertThrows(() => {
- const filePath = tmpUnixSocketPath();
- const socket = Deno.listen({
- path: filePath,
- transport: "unix",
- });
- assert(socket.addr.transport === "unix");
- assertEquals(socket.addr.path, filePath);
- socket.close();
- }, Deno.errors.PermissionDenied);
- },
-);
-
-Deno.test(
- {
- ignore: Deno.build.os === "windows",
- permissions: { read: true, write: false },
- },
- function netUnixPacketListenWritePermission() {
- assertThrows(() => {
- const filePath = tmpUnixSocketPath();
- const socket = Deno.listenDatagram({
- path: filePath,
- transport: "unixpacket",
- });
- assert(socket.addr.transport === "unixpacket");
- assertEquals(socket.addr.path, filePath);
- socket.close();
- }, Deno.errors.PermissionDenied);
- },
-);
-
-Deno.test(
- {
- permissions: { net: true },
- },
- async function netTcpCloseWhileAccept() {
- const listener = Deno.listen({ port: listenPort });
- const p = listener.accept();
- listener.close();
- // TODO(piscisaureus): the error type should be `Interrupted` here, which
- // gets thrown, but then ext/net catches it and rethrows `BadResource`.
- await assertRejects(
- () => p,
- Deno.errors.BadResource,
- "Listener has been closed",
- );
- },
-);
-
-Deno.test(
- {
- ignore: Deno.build.os === "windows",
- permissions: { read: true, write: true },
- },
- async function netUnixCloseWhileAccept() {
- const filePath = tmpUnixSocketPath();
- const listener = Deno.listen({
- path: filePath,
- transport: "unix",
- });
- const p = listener.accept();
- listener.close();
- await assertRejects(
- () => p,
- Deno.errors.BadResource,
- "Listener has been closed",
- );
- },
-);
-
-Deno.test(
- { permissions: { net: true } },
- async function netTcpConcurrentAccept() {
- const listener = Deno.listen({ port: 4510 });
- let acceptErrCount = 0;
- const checkErr = (e: Error) => {
- if (e.message === "Listener has been closed") {
- assertEquals(acceptErrCount, 1);
- } else if (e.message === "Another accept task is ongoing") {
- acceptErrCount++;
- } else {
- throw new Error("Unexpected error message");
- }
- };
- const p = listener.accept().catch(checkErr);
- const p1 = listener.accept().catch(checkErr);
- await Promise.race([p, p1]);
- listener.close();
- await Promise.all([p, p1]);
- assertEquals(acceptErrCount, 1);
- },
-);
-
-Deno.test(
- {
- ignore: Deno.build.os === "windows",
- permissions: { read: true, write: true },
- },
- async function netUnixConcurrentAccept() {
- const filePath = tmpUnixSocketPath();
- const listener = Deno.listen({ transport: "unix", path: filePath });
- let acceptErrCount = 0;
- const checkErr = (e: Error) => {
- if (e.message === "Listener has been closed") {
- assertEquals(acceptErrCount, 1);
- } else if (e instanceof Deno.errors.Busy) { // "Listener already in use"
- acceptErrCount++;
- } else {
- throw e;
- }
- };
- const p = listener.accept().catch(checkErr);
- const p1 = listener.accept().catch(checkErr);
- await Promise.race([p, p1]);
- listener.close();
- await Promise.all([p, p1]);
- assertEquals(acceptErrCount, 1);
- },
-);
-
-Deno.test({ permissions: { net: true } }, async function netTcpDialListen() {
- const listener = Deno.listen({ port: listenPort });
- listener.accept().then(
- async (conn) => {
- assert(conn.remoteAddr != null);
- assert(conn.localAddr.transport === "tcp");
- assertEquals(conn.localAddr.hostname, "127.0.0.1");
- assertEquals(conn.localAddr.port, listenPort);
- await conn.write(new Uint8Array([1, 2, 3]));
- conn.close();
- },
- );
-
- const conn = await Deno.connect({ hostname: "127.0.0.1", port: listenPort });
- assert(conn.remoteAddr.transport === "tcp");
- assertEquals(conn.remoteAddr.hostname, "127.0.0.1");
- assertEquals(conn.remoteAddr.port, listenPort);
- assert(conn.localAddr != null);
- const buf = new Uint8Array(1024);
- const readResult = await conn.read(buf);
- assertEquals(3, readResult);
- assertEquals(1, buf[0]);
- assertEquals(2, buf[1]);
- assertEquals(3, buf[2]);
- assert(conn.rid > 0);
-
- assert(readResult !== null);
-
- const readResult2 = await conn.read(buf);
- assertEquals(readResult2, null);
-
- listener.close();
- conn.close();
-});
-
-Deno.test({ permissions: { net: true } }, async function netTcpSetNoDelay() {
- const listener = Deno.listen({ port: listenPort });
- listener.accept().then(
- async (conn) => {
- assert(conn.remoteAddr != null);
- assert(conn.localAddr.transport === "tcp");
- assertEquals(conn.localAddr.hostname, "127.0.0.1");
- assertEquals(conn.localAddr.port, listenPort);
- await conn.write(new Uint8Array([1, 2, 3]));
- conn.close();
- },
- );
-
- const conn = await Deno.connect({ hostname: "127.0.0.1", port: listenPort });
- conn.setNoDelay(true);
- assert(conn.remoteAddr.transport === "tcp");
- assertEquals(conn.remoteAddr.hostname, "127.0.0.1");
- assertEquals(conn.remoteAddr.port, listenPort);
- assert(conn.localAddr != null);
- const buf = new Uint8Array(1024);
- const readResult = await conn.read(buf);
- assertEquals(3, readResult);
- assertEquals(1, buf[0]);
- assertEquals(2, buf[1]);
- assertEquals(3, buf[2]);
- assert(conn.rid > 0);
-
- assert(readResult !== null);
-
- const readResult2 = await conn.read(buf);
- assertEquals(readResult2, null);
-
- listener.close();
- conn.close();
-});
-
-Deno.test({ permissions: { net: true } }, async function netTcpSetKeepAlive() {
- const listener = Deno.listen({ port: listenPort });
- listener.accept().then(
- async (conn) => {
- assert(conn.remoteAddr != null);
- assert(conn.localAddr.transport === "tcp");
- assertEquals(conn.localAddr.hostname, "127.0.0.1");
- assertEquals(conn.localAddr.port, listenPort);
- await conn.write(new Uint8Array([1, 2, 3]));
- conn.close();
- },
- );
-
- const conn = await Deno.connect({ hostname: "127.0.0.1", port: listenPort });
- conn.setKeepAlive(true);
- assert(conn.remoteAddr.transport === "tcp");
- assertEquals(conn.remoteAddr.hostname, "127.0.0.1");
- assertEquals(conn.remoteAddr.port, listenPort);
- assert(conn.localAddr != null);
- const buf = new Uint8Array(1024);
- const readResult = await conn.read(buf);
- assertEquals(3, readResult);
- assertEquals(1, buf[0]);
- assertEquals(2, buf[1]);
- assertEquals(3, buf[2]);
- assert(conn.rid > 0);
-
- assert(readResult !== null);
-
- const readResult2 = await conn.read(buf);
- assertEquals(readResult2, null);
-
- listener.close();
- conn.close();
-});
-
-Deno.test(
- {
- ignore: Deno.build.os === "windows",
- permissions: { read: true, write: true },
- },
- async function netUnixDialListen() {
- const filePath = tmpUnixSocketPath();
- const listener = Deno.listen({ path: filePath, transport: "unix" });
- listener.accept().then(
- async (conn) => {
- assert(conn.remoteAddr != null);
- assert(conn.localAddr.transport === "unix");
- assertEquals(conn.localAddr.path, filePath);
- await conn.write(new Uint8Array([1, 2, 3]));
- conn.close();
- },
- );
- const conn = await Deno.connect({ path: filePath, transport: "unix" });
- assert(conn.remoteAddr.transport === "unix");
- assertEquals(conn.remoteAddr.path, filePath);
- assert(conn.remoteAddr != null);
- const buf = new Uint8Array(1024);
- const readResult = await conn.read(buf);
- assertEquals(3, readResult);
- assertEquals(1, buf[0]);
- assertEquals(2, buf[1]);
- assertEquals(3, buf[2]);
- assert(conn.rid > 0);
-
- assert(readResult !== null);
-
- const readResult2 = await conn.read(buf);
- assertEquals(readResult2, null);
-
- listener.close();
- conn.close();
- },
-);
-
-Deno.test(
- { permissions: { net: true } },
- async function netUdpSendReceive() {
- const alice = Deno.listenDatagram({ port: listenPort, transport: "udp" });
- assert(alice.addr.transport === "udp");
- assertEquals(alice.addr.port, listenPort);
- assertEquals(alice.addr.hostname, "127.0.0.1");
-
- const bob = Deno.listenDatagram({ port: listenPort2, transport: "udp" });
- assert(bob.addr.transport === "udp");
- assertEquals(bob.addr.port, listenPort2);
- assertEquals(bob.addr.hostname, "127.0.0.1");
-
- const sent = new Uint8Array([1, 2, 3]);
- const byteLength = await alice.send(sent, bob.addr);
-
- assertEquals(byteLength, 3);
-
- const [recvd, remote] = await bob.receive();
- assert(remote.transport === "udp");
- assertEquals(remote.port, listenPort);
- assertEquals(recvd.length, 3);
- assertEquals(1, recvd[0]);
- assertEquals(2, recvd[1]);
- assertEquals(3, recvd[2]);
- alice.close();
- bob.close();
- },
-);
-
-Deno.test(
- { permissions: { net: true }, ignore: true },
- async function netUdpSendReceiveBroadcast() {
- // Must bind sender to an address that can send to the broadcast address on MacOS.
- // Macos will give us error 49 when sending the broadcast packet if we omit hostname here.
- const alice = Deno.listenDatagram({
- port: listenPort,
- transport: "udp",
- hostname: "0.0.0.0",
- });
-
- const bob = Deno.listenDatagram({
- port: listenPort,
- transport: "udp",
- hostname: "0.0.0.0",
- });
- assert(bob.addr.transport === "udp");
- assertEquals(bob.addr.port, listenPort);
- assertEquals(bob.addr.hostname, "0.0.0.0");
-
- const broadcastAddr = { ...bob.addr, hostname: "255.255.255.255" };
-
- const sent = new Uint8Array([1, 2, 3]);
- const byteLength = await alice.send(sent, broadcastAddr);
-
- assertEquals(byteLength, 3);
- const [recvd, remote] = await bob.receive();
- assert(remote.transport === "udp");
- assertEquals(remote.port, listenPort);
- assertEquals(recvd.length, 3);
- assertEquals(1, recvd[0]);
- assertEquals(2, recvd[1]);
- assertEquals(3, recvd[2]);
- alice.close();
- bob.close();
- },
-);
-
-Deno.test(
- { permissions: { net: true }, ignore: true },
- async function netUdpMulticastV4() {
- const listener = Deno.listenDatagram({
- hostname: "0.0.0.0",
- port: 5353,
- transport: "udp",
- reuseAddress: true,
- });
-
- const membership = await listener.joinMulticastV4(
- "224.0.0.251",
- "127.0.0.1",
- );
-
- membership.setLoopback(true);
- membership.setLoopback(false);
- membership.setTTL(50);
- membership.leave();
- listener.close();
- },
-);
-
-Deno.test(
- { permissions: { net: true }, ignore: true },
- async function netUdpMulticastV6() {
- const listener = Deno.listenDatagram({
- hostname: "::",
- port: 5353,
- transport: "udp",
- reuseAddress: true,
- });
-
- const membership = await listener.joinMulticastV6(
- "ff02::fb",
- 1,
- );
-
- membership.setLoopback(true);
- membership.setLoopback(false);
- membership.leave();
- listener.close();
- },
-);
-
-Deno.test(
- { permissions: { net: true }, ignore: true },
- async function netUdpSendReceiveMulticastv4() {
- const alice = Deno.listenDatagram({
- hostname: "0.0.0.0",
- port: 5353,
- transport: "udp",
- reuseAddress: true,
- loopback: true,
- });
-
- const bob = Deno.listenDatagram({
- hostname: "0.0.0.0",
- port: 5353,
- transport: "udp",
- reuseAddress: true,
- });
-
- const aliceMembership = await alice.joinMulticastV4(
- "224.0.0.1",
- "0.0.0.0",
- );
-
- const bobMembership = await bob.joinMulticastV4("224.0.0.1", "0.0.0.0");
-
- const sent = new Uint8Array([1, 2, 3]);
-
- await alice.send(sent, {
- hostname: "224.0.0.1",
- port: 5353,
- transport: "udp",
- });
-
- const [recvd, remote] = await bob.receive();
-
- assert(remote.transport === "udp");
- assertEquals(remote.port, 5353);
- assertEquals(recvd.length, 3);
- assertEquals(1, recvd[0]);
- assertEquals(2, recvd[1]);
- assertEquals(3, recvd[2]);
-
- aliceMembership.leave();
- bobMembership.leave();
-
- alice.close();
- bob.close();
- },
-);
-
-Deno.test(
- { permissions: { net: true }, ignore: true },
- async function netUdpMulticastLoopbackOption() {
- // Must bind sender to an address that can send to the broadcast address on MacOS.
- // Macos will give us error 49 when sending the broadcast packet if we omit hostname here.
- const listener = Deno.listenDatagram({
- port: 5353,
- transport: "udp",
- hostname: "0.0.0.0",
- loopback: true,
- reuseAddress: true,
- });
-
- const membership = await listener.joinMulticastV4(
- "224.0.0.1",
- "0.0.0.0",
- );
-
- // await membership.setLoopback(true);
-
- const sent = new Uint8Array([1, 2, 3]);
- const byteLength = await listener.send(sent, {
- hostname: "224.0.0.1",
- port: 5353,
- transport: "udp",
- });
-
- assertEquals(byteLength, 3);
- const [recvd, remote] = await listener.receive();
- assert(remote.transport === "udp");
- assertEquals(remote.port, 5353);
- assertEquals(recvd.length, 3);
- assertEquals(1, recvd[0]);
- assertEquals(2, recvd[1]);
- assertEquals(3, recvd[2]);
- membership.leave();
- listener.close();
- },
-);
-
-Deno.test(
- { permissions: { net: true } },
- async function netUdpConcurrentSendReceive() {
- const socket = Deno.listenDatagram({ port: listenPort, transport: "udp" });
- assert(socket.addr.transport === "udp");
- assertEquals(socket.addr.port, listenPort);
- assertEquals(socket.addr.hostname, "127.0.0.1");
-
- const recvPromise = socket.receive();
-
- const sendBuf = new Uint8Array([1, 2, 3]);
- const sendLen = await socket.send(sendBuf, socket.addr);
- assertEquals(sendLen, 3);
-
- const [recvBuf, _recvAddr] = await recvPromise;
- assertEquals(recvBuf.length, 3);
- assertEquals(1, recvBuf[0]);
- assertEquals(2, recvBuf[1]);
- assertEquals(3, recvBuf[2]);
-
- socket.close();
- },
-);
-
-Deno.test(
- { permissions: { net: true } },
- async function netUdpBorrowMutError() {
- const socket = Deno.listenDatagram({
- port: listenPort,
- transport: "udp",
- });
- // Panic happened on second send: BorrowMutError
- const a = socket.send(new Uint8Array(), socket.addr);
- const b = socket.send(new Uint8Array(), socket.addr);
- await Promise.all([a, b]);
- socket.close();
- },
-);
-
-Deno.test(
- {
- ignore: Deno.build.os === "windows",
- permissions: { read: true, write: true },
- },
- async function netUnixPacketSendReceive() {
- const aliceFilePath = tmpUnixSocketPath();
- const alice = Deno.listenDatagram({
- path: aliceFilePath,
- transport: "unixpacket",
- });
- assert(alice.addr.transport === "unixpacket");
- assertEquals(alice.addr.path, aliceFilePath);
-
- const bobFilePath = tmpUnixSocketPath();
- const bob = Deno.listenDatagram({
- path: bobFilePath,
- transport: "unixpacket",
- });
- assert(bob.addr.transport === "unixpacket");
- assertEquals(bob.addr.path, bobFilePath);
-
- const sent = new Uint8Array([1, 2, 3]);
- const byteLength = await alice.send(sent, bob.addr);
- assertEquals(byteLength, 3);
-
- const [recvd, remote] = await bob.receive();
- assert(remote.transport === "unixpacket");
- assertEquals(remote.path, aliceFilePath);
- assertEquals(recvd.length, 3);
- assertEquals(1, recvd[0]);
- assertEquals(2, recvd[1]);
- assertEquals(3, recvd[2]);
- alice.close();
- bob.close();
- },
-);
-
-// TODO(lucacasonato): support concurrent reads and writes on unixpacket sockets
-Deno.test(
- { ignore: true, permissions: { read: true, write: true } },
- async function netUnixPacketConcurrentSendReceive() {
- const filePath = tmpUnixSocketPath();
- const socket = Deno.listenDatagram({
- path: filePath,
- transport: "unixpacket",
- });
- assert(socket.addr.transport === "unixpacket");
- assertEquals(socket.addr.path, filePath);
-
- const recvPromise = socket.receive();
-
- const sendBuf = new Uint8Array([1, 2, 3]);
- const sendLen = await socket.send(sendBuf, socket.addr);
- assertEquals(sendLen, 3);
-
- const [recvBuf, _recvAddr] = await recvPromise;
- assertEquals(recvBuf.length, 3);
- assertEquals(1, recvBuf[0]);
- assertEquals(2, recvBuf[1]);
- assertEquals(3, recvBuf[2]);
-
- socket.close();
- },
-);
-
-Deno.test(
- { permissions: { net: true } },
- async function netTcpListenIteratorBreakClosesResource() {
- async function iterate(listener: Deno.Listener) {
- let i = 0;
-
- for await (const conn of listener) {
- conn.close();
- i++;
-
- if (i > 1) {
- break;
- }
- }
- }
-
- const addr = { hostname: "127.0.0.1", port: 8888 };
- const listener = Deno.listen(addr);
- const iteratePromise = iterate(listener);
-
- await delay(100);
- const conn1 = await Deno.connect(addr);
- conn1.close();
- const conn2 = await Deno.connect(addr);
- conn2.close();
-
- await iteratePromise;
- },
-);
-
-Deno.test(
- { permissions: { net: true } },
- async function netTcpListenCloseWhileIterating() {
- const listener = Deno.listen({ port: 8001 });
- const nextWhileClosing = listener[Symbol.asyncIterator]().next();
- listener.close();
- assertEquals(await nextWhileClosing, { value: undefined, done: true });
-
- const nextAfterClosing = listener[Symbol.asyncIterator]().next();
- assertEquals(await nextAfterClosing, { value: undefined, done: true });
- },
-);
-
-Deno.test(
- { permissions: { net: true } },
- async function netUdpListenCloseWhileIterating() {
- const socket = Deno.listenDatagram({ port: 8000, transport: "udp" });
- const nextWhileClosing = socket[Symbol.asyncIterator]().next();
- socket.close();
- assertEquals(await nextWhileClosing, { value: undefined, done: true });
-
- const nextAfterClosing = socket[Symbol.asyncIterator]().next();
- assertEquals(await nextAfterClosing, { value: undefined, done: true });
- },
-);
-
-Deno.test(
- {
- ignore: Deno.build.os === "windows",
- permissions: { read: true, write: true },
- },
- async function netUnixListenCloseWhileIterating() {
- const filePath = tmpUnixSocketPath();
- const socket = Deno.listen({ path: filePath, transport: "unix" });
- const nextWhileClosing = socket[Symbol.asyncIterator]().next();
- socket.close();
- assertEquals(await nextWhileClosing, { value: undefined, done: true });
-
- const nextAfterClosing = socket[Symbol.asyncIterator]().next();
- assertEquals(await nextAfterClosing, { value: undefined, done: true });
- },
-);
-
-Deno.test(
- {
- ignore: Deno.build.os === "windows",
- permissions: { read: true, write: true },
- },
- async function netUnixPacketListenCloseWhileIterating() {
- const filePath = tmpUnixSocketPath();
- const socket = Deno.listenDatagram({
- path: filePath,
- transport: "unixpacket",
- });
- const nextWhileClosing = socket[Symbol.asyncIterator]().next();
- socket.close();
- assertEquals(await nextWhileClosing, { value: undefined, done: true });
-
- const nextAfterClosing = socket[Symbol.asyncIterator]().next();
- assertEquals(await nextAfterClosing, { value: undefined, done: true });
- },
-);
-
-Deno.test(
- { permissions: { net: true } },
- async function netListenAsyncIterator() {
- const addr = { hostname: "127.0.0.1", port: listenPort };
- const listener = Deno.listen(addr);
- const runAsyncIterator = async () => {
- for await (const conn of listener) {
- await conn.write(new Uint8Array([1, 2, 3]));
- conn.close();
- }
- };
- runAsyncIterator();
- const conn = await Deno.connect(addr);
- const buf = new Uint8Array(1024);
- const readResult = await conn.read(buf);
- assertEquals(3, readResult);
- assertEquals(1, buf[0]);
- assertEquals(2, buf[1]);
- assertEquals(3, buf[2]);
- assert(conn.rid > 0);
-
- assert(readResult !== null);
-
- const readResult2 = await conn.read(buf);
- assertEquals(readResult2, null);
-
- listener.close();
- conn.close();
- },
-);
-
-Deno.test(
- {
- permissions: { net: true },
- },
- async function netCloseWriteSuccess() {
- const addr = { hostname: "127.0.0.1", port: listenPort };
- const listener = Deno.listen(addr);
- const { promise: closePromise, resolve } = Promise.withResolvers<void>();
- listener.accept().then(async (conn) => {
- await conn.write(new Uint8Array([1, 2, 3]));
- await closePromise;
- conn.close();
- });
- const conn = await Deno.connect(addr);
- conn.closeWrite(); // closing write
- const buf = new Uint8Array(1024);
- // Check read not impacted
- const readResult = await conn.read(buf);
- assertEquals(3, readResult);
- assertEquals(1, buf[0]);
- assertEquals(2, buf[1]);
- assertEquals(3, buf[2]);
- // Verify that the write end of the socket is closed.
- // TODO(piscisaureus): assert that thrown error is of a specific type.
- await assertRejects(async () => {
- await conn.write(new Uint8Array([1, 2, 3]));
- });
- resolve();
- listener.close();
- conn.close();
- },
-);
-
-Deno.test(
- {
- // https://github.com/denoland/deno/issues/11580
- ignore: Deno.build.os === "darwin" && isCI,
- permissions: { net: true },
- },
- async function netHangsOnClose() {
- let acceptedConn: Deno.Conn;
-
- async function iteratorReq(listener: Deno.Listener) {
- const p = new Uint8Array(10);
- const conn = await listener.accept();
- acceptedConn = conn;
-
- try {
- while (true) {
- const nread = await conn.read(p);
- if (nread === null) {
- break;
- }
- await conn.write(new Uint8Array([1, 2, 3]));
- }
- } catch (err) {
- assert(err);
- assert(err instanceof Deno.errors.Interrupted);
- }
- }
-
- const addr = { hostname: "127.0.0.1", port: listenPort };
- const listener = Deno.listen(addr);
- const listenerPromise = iteratorReq(listener);
- const connectionPromise = (async () => {
- const conn = await Deno.connect(addr);
- await conn.write(new Uint8Array([1, 2, 3, 4]));
- const buf = new Uint8Array(10);
- await conn.read(buf);
- conn!.close();
- acceptedConn!.close();
- listener.close();
- })();
-
- await Promise.all([
- listenerPromise,
- connectionPromise,
- ]);
- },
-);
-
-Deno.test(
- {
- permissions: { net: true },
- },
- function netExplicitUndefinedHostname() {
- const listener = Deno.listen({ hostname: undefined, port: 8080 });
- assertEquals((listener.addr as Deno.NetAddr).hostname, "0.0.0.0");
- listener.close();
- },
-);
-
-Deno.test(
- {
- ignore: Deno.build.os !== "linux",
- permissions: { read: true, write: true },
- },
- function netUnixAbstractPathShouldNotPanic() {
- const listener = Deno.listen({
- path: "\0aaa",
- transport: "unix",
- });
- assert("not panic");
- listener.close();
- },
-);
-
-Deno.test({ permissions: { net: true } }, async function whatwgStreams() {
- const server = (async () => {
- const listener = Deno.listen({ hostname: "127.0.0.1", port: listenPort });
- const conn = await listener.accept();
- await conn.readable.pipeTo(conn.writable);
- listener.close();
- })();
-
- const conn = await Deno.connect({ hostname: "127.0.0.1", port: listenPort });
- const reader = conn.readable.getReader();
- const writer = conn.writable.getWriter();
- const encoder = new TextEncoder();
- const decoder = new TextDecoder();
- const data = encoder.encode("Hello World");
-
- await writer.write(data);
- const { value, done } = await reader.read();
- assert(!done);
- assertEquals(decoder.decode(value), "Hello World");
- await reader.cancel();
- await server;
-});
-
-Deno.test(
- { permissions: { read: true } },
- async function readableStreamTextEncoderPipe() {
- const filename = "cli/tests/testdata/assets/hello.txt";
- const file = await Deno.open(filename);
- const readable = file.readable.pipeThrough(new TextDecoderStream());
- const chunks = [];
- for await (const chunk of readable) {
- chunks.push(chunk);
- }
- assertEquals(chunks.length, 1);
- assertEquals(chunks[0].length, 12);
- },
-);
-
-Deno.test(
- { permissions: { read: true, write: true } },
- async function writableStream() {
- const path = await Deno.makeTempFile();
- const file = await Deno.open(path, { write: true });
- assert(file.writable instanceof WritableStream);
- const readable = new ReadableStream({
- start(controller) {
- controller.enqueue(new TextEncoder().encode("hello "));
- controller.enqueue(new TextEncoder().encode("world!"));
- controller.close();
- },
- });
- await readable.pipeTo(file.writable);
- const res = await Deno.readTextFile(path);
- assertEquals(res, "hello world!");
- },
-);
-
-Deno.test(
- { permissions: { read: true, run: true } },
- async function netListenUnref() {
- const [statusCode, _output] = await execCode(`
- async function main() {
- const listener = Deno.listen({ port: ${listenPort} });
- listener.unref();
- await listener.accept(); // This doesn't block the program from exiting
- }
- main();
- `);
- assertEquals(statusCode, 0);
- },
-);
-
-Deno.test(
- { permissions: { read: true, run: true } },
- async function netListenUnref2() {
- const [statusCode, _output] = await execCode(`
- async function main() {
- const listener = Deno.listen({ port: ${listenPort} });
- await listener.accept();
- listener.unref();
- await listener.accept(); // The program exits here
- throw new Error(); // The program doesn't reach here
- }
- main();
- const conn = await Deno.connect({ port: ${listenPort} });
- conn.close();
- `);
- assertEquals(statusCode, 0);
- },
-);
-
-Deno.test(
- { permissions: { read: true, run: true, net: true } },
- async function netListenUnrefAndRef() {
- const p = execCode2(`
- async function main() {
- const listener = Deno.listen({ port: ${listenPort} });
- listener.unref();
- listener.ref(); // This restores 'ref' state of listener
- console.log("started");
- await listener.accept();
- console.log("accepted")
- }
- main();
- `);
- await p.waitStdoutText("started");
- const conn = await Deno.connect({ port: listenPort });
- conn.close();
- const [statusCode, output] = await p.finished();
- assertEquals(statusCode, 0);
- assertEquals(output.trim(), "started\naccepted");
- },
-);
-
-Deno.test(
- { permissions: { net: true } },
- async function netListenUnrefConcurrentAccept() {
- const timer = setTimeout(() => {}, 1000);
- const listener = Deno.listen({ port: listenPort });
- listener.accept().catch(() => {});
- listener.unref();
- // Unref'd listener still causes Busy error
- // on concurrent accept calls.
- await assertRejects(async () => {
- await listener.accept(); // The program exits here
- }, Deno.errors.Busy);
- listener.close();
- clearTimeout(timer);
- },
-);
-
-Deno.test({
- ignore: Deno.build.os === "windows",
- permissions: { read: true, write: true },
-}, function netUnixListenAddrAlreadyInUse() {
- const filePath = tmpUnixSocketPath();
- const listener = Deno.listen({ path: filePath, transport: "unix" });
- assertThrows(
- () => {
- Deno.listen({ path: filePath, transport: "unix" });
- },
- Deno.errors.AddrInUse,
- );
- listener.close();
-});
-
-Deno.test(
- { permissions: { net: true, read: true, run: true } },
- async function netConnUnref() {
- const listener = Deno.listen({ port: listenPort });
- const intervalId = setInterval(() => {}); // This keeps event loop alive.
-
- const program = execCode(`
- async function main() {
- const conn = await Deno.connect({ port: ${listenPort} });
- conn.unref();
- await conn.read(new Uint8Array(10)); // The program exits here
- throw new Error(); // The program doesn't reach here
- }
- main();
- `);
- const conn = await listener.accept();
- const [statusCode, _output] = await program;
- conn.close();
- listener.close();
- clearInterval(intervalId);
- assertEquals(statusCode, 0);
- },
-);
-
-Deno.test(
- { permissions: { net: true, read: true, run: true } },
- async function netConnUnrefReadable() {
- const listener = Deno.listen({ port: listenPort });
- const intervalId = setInterval(() => {}); // This keeps event loop alive.
-
- const program = execCode(`
- async function main() {
- const conn = await Deno.connect({ port: ${listenPort} });
- conn.unref();
- const reader = conn.readable.getReader();
- await reader.read(); // The program exits here
- throw new Error(); // The program doesn't reach here
- }
- main();
- `);
- const conn = await listener.accept();
- const [statusCode, _output] = await program;
- conn.close();
- listener.close();
- clearInterval(intervalId);
- assertEquals(statusCode, 0);
- },
-);
-
-Deno.test({ permissions: { net: true } }, async function netTcpReuseAddr() {
- const listener1 = Deno.listen({
- hostname: "127.0.0.1",
- port: listenPort,
- });
- listener1.accept().then(
- (conn) => {
- conn.close();
- },
- );
-
- const conn1 = await Deno.connect({ hostname: "127.0.0.1", port: listenPort });
- const buf1 = new Uint8Array(1024);
- await conn1.read(buf1);
- listener1.close();
- conn1.close();
-
- const listener2 = Deno.listen({
- hostname: "127.0.0.1",
- port: listenPort,
- });
-
- listener2.accept().then(
- (conn) => {
- conn.close();
- },
- );
-
- const conn2 = await Deno.connect({ hostname: "127.0.0.1", port: listenPort });
- const buf2 = new Uint8Array(1024);
- await conn2.read(buf2);
-
- listener2.close();
- conn2.close();
-});
-
-Deno.test(
- { permissions: { net: true } },
- async function netUdpReuseAddr() {
- const sender = Deno.listenDatagram({
- port: 4002,
- transport: "udp",
- });
- const listener1 = Deno.listenDatagram({
- port: 4000,
- transport: "udp",
- reuseAddress: true,
- });
- const listener2 = Deno.listenDatagram({
- port: 4000,
- transport: "udp",
- reuseAddress: true,
- });
-
- const sent = new Uint8Array([1, 2, 3]);
- await sender.send(sent, listener1.addr);
- await Promise.any([listener1.receive(), listener2.receive()]).then(
- ([recvd, remote]) => {
- assert(remote.transport === "udp");
- assertEquals(recvd.length, 3);
- assertEquals(1, recvd[0]);
- assertEquals(2, recvd[1]);
- assertEquals(3, recvd[2]);
- },
- );
- sender.close();
- listener1.close();
- listener2.close();
- },
-);
-
-Deno.test(
- { permissions: { net: true } },
- function netUdpNoReuseAddr() {
- let listener1;
- try {
- listener1 = Deno.listenDatagram({
- port: 4001,
- transport: "udp",
- reuseAddress: false,
- });
- } catch (err) {
- assert(err);
- assert(err instanceof Deno.errors.AddrInUse); // AddrInUse from previous test
- }
-
- assertThrows(() => {
- Deno.listenDatagram({
- port: 4001,
- transport: "udp",
- reuseAddress: false,
- });
- }, Deno.errors.AddrInUse);
- if (typeof listener1 !== "undefined") {
- listener1.close();
- }
- },
-);
-
-Deno.test({
- ignore: Deno.build.os !== "linux",
- permissions: { net: true },
-}, async function netTcpListenReusePort() {
- const port = 4003;
- const listener1 = Deno.listen({ port, reusePort: true });
- const listener2 = Deno.listen({ port, reusePort: true });
- let p1;
- let p2;
- let listener1Recv = false;
- let listener2Recv = false;
- while (!listener1Recv || !listener2Recv) {
- if (!p1) {
- p1 = listener1.accept().then((conn) => {
- conn.close();
- listener1Recv = true;
- p1 = undefined;
- }).catch(() => {});
- }
- if (!p2) {
- p2 = listener2.accept().then((conn) => {
- conn.close();
- listener2Recv = true;
- p2 = undefined;
- }).catch(() => {});
- }
- const conn = await Deno.connect({ port });
- conn.close();
- await Promise.race([p1, p2]);
- }
- listener1.close();
- listener2.close();
-});
-
-Deno.test({
- ignore: Deno.build.os === "linux",
- permissions: { net: true },
-}, function netTcpListenReusePortDoesNothing() {
- const listener1 = Deno.listen({ port: 4003, reusePort: true });
- assertThrows(() => {
- Deno.listen({ port: 4003, reusePort: true });
- }, Deno.errors.AddrInUse);
- listener1.close();
-});
-
-Deno.test({
- permissions: { net: true },
-}, function netTcpListenDoesNotThrowOnStringPort() {
- // @ts-ignore String port is not allowed by typing, but it shouldn't throw
- // for backwards compatibility.
- const listener = Deno.listen({ hostname: "localhost", port: "0" });
- listener.close();
-});
-
-Deno.test(
- { permissions: { net: true } },
- async function listenerExplicitResourceManagement() {
- let done: Promise<Deno.errors.BadResource>;
-
- {
- using listener = Deno.listen({ port: listenPort });
-
- done = assertRejects(
- () => listener.accept(),
- Deno.errors.BadResource,
- );
- }
-
- await done;
- },
-);
-
-Deno.test(
- { permissions: { net: true } },
- async function listenerExplicitResourceManagementManualClose() {
- using listener = Deno.listen({ port: listenPort });
- listener.close();
- await assertRejects( // definitely closed
- () => listener.accept(),
- Deno.errors.BadResource,
- );
- // calling [Symbol.dispose] after manual close is a no-op
- },
-);
diff --git a/cli/tests/unit/read_dir_test.ts b/cli/tests/unit/read_dir_test.ts
deleted file mode 100644
index 50447ef6a..000000000
--- a/cli/tests/unit/read_dir_test.ts
+++ /dev/null
@@ -1,113 +0,0 @@
-// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
-import {
- assert,
- assertEquals,
- assertRejects,
- assertThrows,
- pathToAbsoluteFileUrl,
-} from "./test_util.ts";
-
-function assertSameContent(files: Deno.DirEntry[]) {
- let counter = 0;
-
- for (const entry of files) {
- if (entry.name === "subdir") {
- assert(entry.isDirectory);
- counter++;
- }
- }
-
- assertEquals(counter, 1);
-}
-
-Deno.test({ permissions: { read: true } }, function readDirSyncSuccess() {
- const files = [...Deno.readDirSync("cli/tests/testdata")];
- assertSameContent(files);
-});
-
-Deno.test({ permissions: { read: true } }, function readDirSyncWithUrl() {
- const files = [
- ...Deno.readDirSync(pathToAbsoluteFileUrl("cli/tests/testdata")),
- ];
- assertSameContent(files);
-});
-
-Deno.test({ permissions: { read: false } }, function readDirSyncPerm() {
- assertThrows(() => {
- Deno.readDirSync("tests/");
- }, Deno.errors.PermissionDenied);
-});
-
-Deno.test({ permissions: { read: true } }, function readDirSyncNotDir() {
- assertThrows(
- () => {
- Deno.readDirSync("cli/tests/testdata/assets/fixture.json");
- },
- Error,
- `readdir 'cli/tests/testdata/assets/fixture.json'`,
- );
-});
-
-Deno.test({ permissions: { read: true } }, function readDirSyncNotFound() {
- assertThrows(
- () => {
- Deno.readDirSync("bad_dir_name");
- },
- Deno.errors.NotFound,
- `readdir 'bad_dir_name'`,
- );
-});
-
-Deno.test({ permissions: { read: true } }, async function readDirSuccess() {
- const files = [];
- for await (const dirEntry of Deno.readDir("cli/tests/testdata")) {
- files.push(dirEntry);
- }
- assertSameContent(files);
-});
-
-Deno.test({ permissions: { read: true } }, async function readDirWithUrl() {
- const files = [];
- for await (
- const dirEntry of Deno.readDir(pathToAbsoluteFileUrl("cli/tests/testdata"))
- ) {
- files.push(dirEntry);
- }
- assertSameContent(files);
-});
-
-Deno.test({ permissions: { read: false } }, async function readDirPerm() {
- await assertRejects(async () => {
- await Deno.readDir("tests/")[Symbol.asyncIterator]().next();
- }, Deno.errors.PermissionDenied);
-});
-
-Deno.test(
- { permissions: { read: true }, ignore: Deno.build.os == "windows" },
- async function readDirDevFd(): Promise<
- void
- > {
- for await (const _ of Deno.readDir("/dev/fd")) {
- // We don't actually care whats in here; just that we don't panic on non regular entries
- }
- },
-);
-
-Deno.test(
- { permissions: { read: true }, ignore: Deno.build.os == "windows" },
- function readDirDevFdSync() {
- for (const _ of Deno.readDirSync("/dev/fd")) {
- // We don't actually care whats in here; just that we don't panic on non regular file entries
- }
- },
-);
-
-Deno.test({ permissions: { read: true } }, async function readDirNotFound() {
- await assertRejects(
- async () => {
- await Deno.readDir("bad_dir_name")[Symbol.asyncIterator]().next();
- },
- Deno.errors.NotFound,
- `readdir 'bad_dir_name'`,
- );
-});
diff --git a/cli/tests/unit/read_file_test.ts b/cli/tests/unit/read_file_test.ts
deleted file mode 100644
index 24ec1aedc..000000000
--- a/cli/tests/unit/read_file_test.ts
+++ /dev/null
@@ -1,182 +0,0 @@
-// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
-import {
- assert,
- assertEquals,
- assertRejects,
- assertThrows,
- pathToAbsoluteFileUrl,
- unreachable,
-} from "./test_util.ts";
-
-Deno.test({ permissions: { read: true } }, function readFileSyncSuccess() {
- const data = Deno.readFileSync("cli/tests/testdata/assets/fixture.json");
- assert(data.byteLength > 0);
- const decoder = new TextDecoder("utf-8");
- const json = decoder.decode(data);
- const pkg = JSON.parse(json);
- assertEquals(pkg.name, "deno");
-});
-
-Deno.test({ permissions: { read: true } }, function readFileSyncUrl() {
- const data = Deno.readFileSync(
- pathToAbsoluteFileUrl("cli/tests/testdata/assets/fixture.json"),
- );
- assert(data.byteLength > 0);
- const decoder = new TextDecoder("utf-8");
- const json = decoder.decode(data);
- const pkg = JSON.parse(json);
- assertEquals(pkg.name, "deno");
-});
-
-Deno.test({ permissions: { read: false } }, function readFileSyncPerm() {
- assertThrows(() => {
- Deno.readFileSync("cli/tests/testdata/assets/fixture.json");
- }, Deno.errors.PermissionDenied);
-});
-
-Deno.test({ permissions: { read: true } }, function readFileSyncNotFound() {
- assertThrows(() => {
- Deno.readFileSync("bad_filename");
- }, Deno.errors.NotFound);
-});
-
-Deno.test({ permissions: { read: true } }, async function readFileUrl() {
- const data = await Deno.readFile(
- pathToAbsoluteFileUrl("cli/tests/testdata/assets/fixture.json"),
- );
- assert(data.byteLength > 0);
- const decoder = new TextDecoder("utf-8");
- const json = decoder.decode(data);
- const pkg = JSON.parse(json);
- assertEquals(pkg.name, "deno");
-});
-
-Deno.test({ permissions: { read: true } }, async function readFileSuccess() {
- const data = await Deno.readFile("cli/tests/testdata/assets/fixture.json");
- assert(data.byteLength > 0);
- const decoder = new TextDecoder("utf-8");
- const json = decoder.decode(data);
- const pkg = JSON.parse(json);
- assertEquals(pkg.name, "deno");
-});
-
-Deno.test({ permissions: { read: false } }, async function readFilePerm() {
- await assertRejects(async () => {
- await Deno.readFile("cli/tests/testdata/assets/fixture.json");
- }, Deno.errors.PermissionDenied);
-});
-
-Deno.test({ permissions: { read: true } }, function readFileSyncLoop() {
- for (let i = 0; i < 256; i++) {
- Deno.readFileSync("cli/tests/testdata/assets/fixture.json");
- }
-});
-
-Deno.test(
- { permissions: { read: true } },
- async function readFileDoesNotLeakResources() {
- await assertRejects(async () => await Deno.readFile("cli"));
- },
-);
-
-Deno.test(
- { permissions: { read: true } },
- function readFileSyncDoesNotLeakResources() {
- assertThrows(() => Deno.readFileSync("cli"));
- },
-);
-
-Deno.test(
- { permissions: { read: true } },
- async function readFileWithAbortSignal() {
- const ac = new AbortController();
- queueMicrotask(() => ac.abort());
- const error = await assertRejects(
- async () => {
- await Deno.readFile("cli/tests/testdata/assets/fixture.json", {
- signal: ac.signal,
- });
- },
- );
- assert(error instanceof DOMException);
- assertEquals(error.name, "AbortError");
- },
-);
-
-Deno.test(
- { permissions: { read: true } },
- async function readFileWithAbortSignalReason() {
- const ac = new AbortController();
- const abortReason = new Error();
- queueMicrotask(() => ac.abort(abortReason));
- const error = await assertRejects(
- async () => {
- await Deno.readFile("cli/tests/testdata/assets/fixture.json", {
- signal: ac.signal,
- });
- },
- );
- assertEquals(error, abortReason);
- },
-);
-
-Deno.test(
- { permissions: { read: true } },
- async function readFileWithAbortSignalPrimitiveReason() {
- const ac = new AbortController();
- queueMicrotask(() => ac.abort("Some string"));
- try {
- await Deno.readFile("cli/tests/testdata/assets/fixture.json", {
- signal: ac.signal,
- });
- unreachable();
- } catch (e) {
- assertEquals(e, "Some string");
- }
- },
-);
-
-// Test that AbortController's cancel handle is cleaned-up correctly, and do not leak resources.
-Deno.test(
- { permissions: { read: true } },
- async function readFileWithAbortSignalNotCalled() {
- const ac = new AbortController();
- await Deno.readFile("cli/tests/testdata/assets/fixture.json", {
- signal: ac.signal,
- });
- },
-);
-
-Deno.test(
- { permissions: { read: true }, ignore: Deno.build.os !== "linux" },
- async function readFileProcFs() {
- const data = await Deno.readFile("/proc/self/stat");
- assert(data.byteLength > 0);
- },
-);
-
-Deno.test(
- { permissions: { read: true } },
- async function readFileNotFoundErrorCode() {
- try {
- await Deno.readFile("definitely-not-found.json");
- } catch (e) {
- assertEquals(e.code, "ENOENT");
- }
- },
-);
-
-Deno.test(
- { permissions: { read: true } },
- async function readFileIsDirectoryErrorCode() {
- try {
- await Deno.readFile("cli/tests/testdata/assets/");
- } catch (e) {
- if (Deno.build.os === "windows") {
- assertEquals(e.code, "ENOENT");
- } else {
- assertEquals(e.code, "EISDIR");
- }
- }
- },
-);
diff --git a/cli/tests/unit/read_text_file_test.ts b/cli/tests/unit/read_text_file_test.ts
deleted file mode 100644
index 5a64522af..000000000
--- a/cli/tests/unit/read_text_file_test.ts
+++ /dev/null
@@ -1,208 +0,0 @@
-// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
-
-import {
- assert,
- assertEquals,
- assertRejects,
- assertThrows,
- pathToAbsoluteFileUrl,
- unreachable,
-} from "./test_util.ts";
-
-Deno.test({ permissions: { read: true } }, function readTextFileSyncSuccess() {
- const data = Deno.readTextFileSync("cli/tests/testdata/assets/fixture.json");
- assert(data.length > 0);
- const pkg = JSON.parse(data);
- assertEquals(pkg.name, "deno");
-});
-
-Deno.test({ permissions: { read: true } }, function readTextFileSyncByUrl() {
- const data = Deno.readTextFileSync(
- pathToAbsoluteFileUrl("cli/tests/testdata/assets/fixture.json"),
- );
- assert(data.length > 0);
- const pkg = JSON.parse(data);
- assertEquals(pkg.name, "deno");
-});
-
-Deno.test({ permissions: { read: false } }, function readTextFileSyncPerm() {
- assertThrows(() => {
- Deno.readTextFileSync("cli/tests/testdata/assets/fixture.json");
- }, Deno.errors.PermissionDenied);
-});
-
-Deno.test({ permissions: { read: true } }, function readTextFileSyncNotFound() {
- assertThrows(() => {
- Deno.readTextFileSync("bad_filename");
- }, Deno.errors.NotFound);
-});
-
-Deno.test(
- { permissions: { read: true } },
- async function readTextFileSuccess() {
- const data = await Deno.readTextFile(
- "cli/tests/testdata/assets/fixture.json",
- );
- assert(data.length > 0);
- const pkg = JSON.parse(data);
- assertEquals(pkg.name, "deno");
- },
-);
-
-Deno.test({ permissions: { read: true } }, async function readTextFileByUrl() {
- const data = await Deno.readTextFile(
- pathToAbsoluteFileUrl("cli/tests/testdata/assets/fixture.json"),
- );
- assert(data.length > 0);
- const pkg = JSON.parse(data);
- assertEquals(pkg.name, "deno");
-});
-
-Deno.test({ permissions: { read: false } }, async function readTextFilePerm() {
- await assertRejects(async () => {
- await Deno.readTextFile("cli/tests/testdata/assets/fixture.json");
- }, Deno.errors.PermissionDenied);
-});
-
-Deno.test({ permissions: { read: true } }, function readTextFileSyncLoop() {
- for (let i = 0; i < 256; i++) {
- Deno.readTextFileSync("cli/tests/testdata/assets/fixture.json");
- }
-});
-
-Deno.test(
- { permissions: { read: true } },
- async function readTextFileDoesNotLeakResources() {
- await assertRejects(async () => await Deno.readTextFile("cli"));
- },
-);
-
-Deno.test(
- { permissions: { read: true } },
- function readTextFileSyncDoesNotLeakResources() {
- assertThrows(() => Deno.readTextFileSync("cli"));
- },
-);
-
-Deno.test(
- { permissions: { read: true } },
- async function readTextFileWithAbortSignal() {
- const ac = new AbortController();
- queueMicrotask(() => ac.abort());
- const error = await assertRejects(
- async () => {
- await Deno.readTextFile("cli/tests/testdata/assets/fixture.json", {
- signal: ac.signal,
- });
- },
- );
- assert(error instanceof DOMException);
- assertEquals(error.name, "AbortError");
- },
-);
-
-Deno.test(
- { permissions: { read: true } },
- async function readTextFileWithAbortSignalReason() {
- const ac = new AbortController();
- const abortReason = new Error();
- queueMicrotask(() => ac.abort(abortReason));
- const error = await assertRejects(
- async () => {
- await Deno.readTextFile("cli/tests/testdata/assets/fixture.json", {
- signal: ac.signal,
- });
- },
- );
- assertEquals(error, abortReason);
- },
-);
-
-Deno.test(
- { permissions: { read: true } },
- async function readTextFileWithAbortSignalPrimitiveReason() {
- const ac = new AbortController();
- queueMicrotask(() => ac.abort("Some string"));
- try {
- await Deno.readTextFile("cli/tests/testdata/assets/fixture.json", {
- signal: ac.signal,
- });
- unreachable();
- } catch (e) {
- assertEquals(e, "Some string");
- }
- },
-);
-
-// Test that AbortController's cancel handle is cleaned-up correctly, and do not leak resources.
-Deno.test(
- { permissions: { read: true } },
- async function readTextFileWithAbortSignalNotCalled() {
- const ac = new AbortController();
- await Deno.readTextFile("cli/tests/testdata/assets/fixture.json", {
- signal: ac.signal,
- });
- },
-);
-
-Deno.test(
- { permissions: { read: true }, ignore: Deno.build.os !== "linux" },
- async function readTextFileProcFs() {
- const data = await Deno.readTextFile("/proc/self/stat");
- assert(data.length > 0);
- },
-);
-
-Deno.test(
- { permissions: { read: true, write: true } },
- function readTextFileSyncV8LimitError() {
- const kStringMaxLengthPlusOne = 536870888 + 1;
- const bytes = new Uint8Array(kStringMaxLengthPlusOne);
- const filePath = "cli/tests/testdata/too_big_a_file.txt";
-
- try {
- Deno.writeFileSync(filePath, bytes);
- } catch {
- // NOTE(bartlomieju): writing a 0.5Gb file might be too much for CI,
- // so skip running if writing fails.
- return;
- }
-
- assertThrows(
- () => {
- Deno.readTextFileSync(filePath);
- },
- TypeError,
- "buffer exceeds maximum length",
- );
-
- Deno.removeSync(filePath);
- },
-);
-
-Deno.test(
- { permissions: { read: true, write: true } },
- async function readTextFileV8LimitError() {
- const kStringMaxLengthPlusOne = 536870888 + 1;
- const bytes = new Uint8Array(kStringMaxLengthPlusOne);
- const filePath = "cli/tests/testdata/too_big_a_file_2.txt";
-
- try {
- await Deno.writeFile(filePath, bytes);
- } catch {
- // NOTE(bartlomieju): writing a 0.5Gb file might be too much for CI,
- // so skip running if writing fails.
- return;
- }
-
- await assertRejects(
- async () => {
- await Deno.readTextFile(filePath);
- },
- TypeError,
- "buffer exceeds maximum length",
- );
-
- await Deno.remove(filePath);
- },
-);
diff --git a/cli/tests/unit/real_path_test.ts b/cli/tests/unit/real_path_test.ts
deleted file mode 100644
index 1b944f5ad..000000000
--- a/cli/tests/unit/real_path_test.ts
+++ /dev/null
@@ -1,114 +0,0 @@
-// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
-import {
- assert,
- assertEquals,
- assertMatch,
- assertRejects,
- assertThrows,
- pathToAbsoluteFileUrl,
-} from "./test_util.ts";
-
-Deno.test({ permissions: { read: true } }, function realPathSyncSuccess() {
- const relative = "cli/tests/testdata/assets/fixture.json";
- const realPath = Deno.realPathSync(relative);
- if (Deno.build.os !== "windows") {
- assert(realPath.startsWith("/"));
- assert(realPath.endsWith(relative));
- } else {
- assertMatch(realPath, /^[A-Z]:\\/);
- assert(realPath.endsWith(relative.replace(/\//g, "\\")));
- }
-});
-
-Deno.test({ permissions: { read: true } }, function realPathSyncUrl() {
- const relative = "cli/tests/testdata/assets/fixture.json";
- const url = pathToAbsoluteFileUrl(relative);
- assertEquals(Deno.realPathSync(relative), Deno.realPathSync(url));
-});
-
-Deno.test(
- {
- permissions: { read: true, write: true },
- },
- function realPathSyncSymlink() {
- const testDir = Deno.makeTempDirSync();
- const target = testDir + "/target";
- const symlink = testDir + "/symln";
- Deno.mkdirSync(target);
- Deno.symlinkSync(target, symlink);
- const realPath = Deno.realPathSync(symlink);
- if (Deno.build.os !== "windows") {
- assert(realPath.startsWith("/"));
- assert(realPath.endsWith("/target"));
- } else {
- assertMatch(realPath, /^[A-Z]:\\/);
- assert(realPath.endsWith("\\target"));
- }
- },
-);
-
-Deno.test({ permissions: { read: false } }, function realPathSyncPerm() {
- assertThrows(() => {
- Deno.realPathSync("some_file");
- }, Deno.errors.PermissionDenied);
-});
-
-Deno.test({ permissions: { read: true } }, function realPathSyncNotFound() {
- assertThrows(() => {
- Deno.realPathSync("bad_filename");
- }, Deno.errors.NotFound);
-});
-
-Deno.test({ permissions: { read: true } }, async function realPathSuccess() {
- const relativePath = "cli/tests/testdata/assets/fixture.json";
- const realPath = await Deno.realPath(relativePath);
- if (Deno.build.os !== "windows") {
- assert(realPath.startsWith("/"));
- assert(realPath.endsWith(relativePath));
- } else {
- assertMatch(realPath, /^[A-Z]:\\/);
- assert(realPath.endsWith(relativePath.replace(/\//g, "\\")));
- }
-});
-
-Deno.test(
- { permissions: { read: true } },
- async function realPathUrl() {
- const relative = "cli/tests/testdata/assets/fixture.json";
- const url = pathToAbsoluteFileUrl(relative);
- assertEquals(await Deno.realPath(relative), await Deno.realPath(url));
- },
-);
-
-Deno.test(
- {
- permissions: { read: true, write: true },
- },
- async function realPathSymlink() {
- const testDir = Deno.makeTempDirSync();
- const target = testDir + "/target";
- const symlink = testDir + "/symln";
- Deno.mkdirSync(target);
- Deno.symlinkSync(target, symlink);
- const realPath = await Deno.realPath(symlink);
- if (Deno.build.os !== "windows") {
- assert(realPath.startsWith("/"));
- assert(realPath.endsWith("/target"));
- } else {
- assertMatch(realPath, /^[A-Z]:\\/);
- assert(realPath.endsWith("\\target"));
- }
- },
-);
-
-Deno.test({ permissions: { read: false } }, async function realPathPerm() {
- await assertRejects(async () => {
- await Deno.realPath("some_file");
- }, Deno.errors.PermissionDenied);
-});
-
-Deno.test({ permissions: { read: true } }, async function realPathNotFound() {
- await assertRejects(async () => {
- await Deno.realPath("bad_filename");
- }, Deno.errors.NotFound);
-});
diff --git a/cli/tests/unit/resources_test.ts b/cli/tests/unit/resources_test.ts
deleted file mode 100644
index 06558cdd1..000000000
--- a/cli/tests/unit/resources_test.ts
+++ /dev/null
@@ -1,55 +0,0 @@
-// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
-import { assert, assertEquals, assertThrows } from "./test_util.ts";
-
-const listenPort = 4505;
-
-Deno.test(function resourcesCloseBadArgs() {
- assertThrows(() => {
- Deno.close((null as unknown) as number);
- }, TypeError);
-});
-
-Deno.test(function resourcesStdio() {
- const res = Deno.resources();
-
- assertEquals(res[0], "stdin");
- assertEquals(res[1], "stdout");
- assertEquals(res[2], "stderr");
-});
-
-Deno.test({ permissions: { net: true } }, async function resourcesNet() {
- const listener = Deno.listen({ port: listenPort });
- const dialerConn = await Deno.connect({ port: listenPort });
- const listenerConn = await listener.accept();
-
- const res = Deno.resources();
- assertEquals(
- Object.values(res).filter((r): boolean => r === "tcpListener").length,
- 1,
- );
- const tcpStreams = Object.values(res).filter(
- (r): boolean => r === "tcpStream",
- );
- assert(tcpStreams.length >= 2);
-
- listenerConn.close();
- dialerConn.close();
- listener.close();
-});
-
-Deno.test({ permissions: { read: true } }, async function resourcesFile() {
- const resourcesBefore = Deno.resources();
- const f = await Deno.open("cli/tests/testdata/assets/hello.txt");
- const resourcesAfter = Deno.resources();
- f.close();
-
- // check that exactly one new resource (file) was added
- assertEquals(
- Object.keys(resourcesAfter).length,
- Object.keys(resourcesBefore).length + 1,
- );
- const newRid = +Object.keys(resourcesAfter).find((rid): boolean => {
- return !Object.prototype.hasOwnProperty.call(resourcesBefore, rid);
- })!;
- assertEquals(resourcesAfter[newRid], "fsFile");
-});
diff --git a/cli/tests/unit/serve_test.ts b/cli/tests/unit/serve_test.ts
deleted file mode 100644
index b5c966d6f..000000000
--- a/cli/tests/unit/serve_test.ts
+++ /dev/null
@@ -1,3932 +0,0 @@
-// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
-
-import { assertMatch, assertRejects } from "@test_util/std/assert/mod.ts";
-import { Buffer, BufReader, BufWriter } from "@test_util/std/io/mod.ts";
-import { TextProtoReader } from "../testdata/run/textproto.ts";
-import {
- assert,
- assertEquals,
- assertStringIncludes,
- assertThrows,
- execCode,
- fail,
- tmpUnixSocketPath,
-} from "./test_util.ts";
-
-// Since these tests may run in parallel, ensure this port is unique to this file
-const servePort = 4502;
-
-const {
- upgradeHttpRaw,
- addTrailers,
- serveHttpOnListener,
- serveHttpOnConnection,
- // @ts-expect-error TypeScript (as of 3.7) does not support indexing namespaces by symbol
-} = Deno[Deno.internal];
-
-function createOnErrorCb(ac: AbortController): (err: unknown) => Response {
- return (err) => {
- console.error(err);
- ac.abort();
- return new Response("Internal server error", { status: 500 });
- };
-}
-
-function onListen(
- resolve: (value: void | PromiseLike<void>) => void,
-): ({ hostname, port }: { hostname: string; port: number }) => void {
- return () => {
- resolve();
- };
-}
-
-async function makeServer(
- handler: (req: Request) => Response | Promise<Response>,
-): Promise<
- {
- finished: Promise<void>;
- abort: () => void;
- shutdown: () => Promise<void>;
- [Symbol.asyncDispose](): PromiseLike<void>;
- }
-> {
- const ac = new AbortController();
- const { promise, resolve } = Promise.withResolvers<void>();
-
- const server = Deno.serve({
- handler,
- port: servePort,
- signal: ac.signal,
- onListen: onListen(resolve),
- });
-
- await promise;
- return {
- finished: server.finished,
- abort() {
- ac.abort();
- },
- async shutdown() {
- await server.shutdown();
- },
- [Symbol.asyncDispose]() {
- return server[Symbol.asyncDispose]();
- },
- };
-}
-
-Deno.test(async function httpServerShutsDownPortBeforeResolving() {
- const { finished, abort } = await makeServer((_req) => new Response("ok"));
- assertThrows(() => Deno.listen({ port: servePort }));
- abort();
- await finished;
-
- const listener = Deno.listen({ port: servePort });
- listener!.close();
-});
-
-// When shutting down abruptly, we require that all in-progress connections are aborted,
-// no new connections are allowed, and no new transactions are allowed on existing connections.
-Deno.test(
- { permissions: { net: true } },
- async function httpServerShutdownAbruptGuaranteeHttp11() {
- const deferredQueue: {
- input: ReturnType<typeof Promise.withResolvers<string>>;
- out: ReturnType<typeof Promise.withResolvers<void>>;
- }[] = [];
- const { finished, abort } = await makeServer((_req) => {
- const { input, out } = deferredQueue.shift()!;
- return new Response(
- new ReadableStream({
- async start(controller) {
- controller.enqueue(new Uint8Array([46]));
- out.resolve();
- controller.enqueue(encoder.encode(await input.promise));
- controller.close();
- },
- }),
- );
- });
- const encoder = new TextEncoder();
- const decoder = new TextDecoder();
- const conn = await Deno.connect({ port: servePort });
- const w = conn.writable.getWriter();
- const r = conn.readable.getReader();
-
- const deferred1 = {
- input: Promise.withResolvers<string>(),
- out: Promise.withResolvers<void>(),
- };
- deferredQueue.push(deferred1);
- const deferred2 = {
- input: Promise.withResolvers<string>(),
- out: Promise.withResolvers<void>(),
- };
- deferredQueue.push(deferred2);
- const deferred3 = {
- input: Promise.withResolvers<string>(),
- out: Promise.withResolvers<void>(),
- };
- deferredQueue.push(deferred3);
- deferred1.input.resolve("#");
- deferred2.input.resolve("$");
- await w.write(encoder.encode(`GET / HTTP/1.1\nConnection: keep-alive\n\n`));
- await w.write(encoder.encode(`GET / HTTP/1.1\nConnection: keep-alive\n\n`));
-
- // Fully read two responses
- let text = "";
- while (!text.includes("$\r\n")) {
- text += decoder.decode((await r.read()).value);
- }
-
- await w.write(encoder.encode(`GET / HTTP/1.1\nConnection: keep-alive\n\n`));
- await deferred3.out.promise;
-
- // This is half served, so wait for the chunk that has the first '.'
- text = "";
- while (!text.includes("1\r\n.\r\n")) {
- text += decoder.decode((await r.read()).value);
- }
-
- abort();
-
- // This doesn't actually write anything, but we release it after aborting
- deferred3.input.resolve("!");
-
- // Guarantee: can't connect to an aborted server (though this may not happen immediately)
- let failed = false;
- for (let i = 0; i < 10; i++) {
- try {
- const conn = await Deno.connect({ port: servePort });
- conn.close();
- // Give the runtime a few ticks to settle (required for Windows)
- await new Promise((r) => setTimeout(r, 2 ** i));
- continue;
- } catch (_) {
- failed = true;
- break;
- }
- }
- assert(failed, "The Deno.serve listener was not disabled promptly");
-
- // Guarantee: the pipeline is closed abruptly
- assert((await r.read()).done);
-
- try {
- conn.close();
- } catch (_) {
- // Ignore
- }
- await finished;
- },
-);
-
-// When shutting down abruptly, we require that all in-progress connections are aborted,
-// no new connections are allowed, and no new transactions are allowed on existing connections.
-Deno.test(
- { permissions: { net: true } },
- async function httpServerShutdownGracefulGuaranteeHttp11() {
- const deferredQueue: {
- input: ReturnType<typeof Promise.withResolvers<string>>;
- out: ReturnType<typeof Promise.withResolvers<void>>;
- }[] = [];
- const { finished, shutdown } = await makeServer((_req) => {
- const { input, out } = deferredQueue.shift()!;
- return new Response(
- new ReadableStream({
- async start(controller) {
- controller.enqueue(new Uint8Array([46]));
- out.resolve();
- controller.enqueue(encoder.encode(await input.promise));
- controller.close();
- },
- }),
- );
- });
- const encoder = new TextEncoder();
- const decoder = new TextDecoder();
- const conn = await Deno.connect({ port: servePort });
- const w = conn.writable.getWriter();
- const r = conn.readable.getReader();
-
- const deferred1 = {
- input: Promise.withResolvers<string>(),
- out: Promise.withResolvers<void>(),
- };
- deferredQueue.push(deferred1);
- const deferred2 = {
- input: Promise.withResolvers<string>(),
- out: Promise.withResolvers<void>(),
- };
- deferredQueue.push(deferred2);
- const deferred3 = {
- input: Promise.withResolvers<string>(),
- out: Promise.withResolvers<void>(),
- };
- deferredQueue.push(deferred3);
- deferred1.input.resolve("#");
- deferred2.input.resolve("$");
- await w.write(encoder.encode(`GET / HTTP/1.1\nConnection: keep-alive\n\n`));
- await w.write(encoder.encode(`GET / HTTP/1.1\nConnection: keep-alive\n\n`));
-
- // Fully read two responses
- let text = "";
- while (!text.includes("$\r\n")) {
- text += decoder.decode((await r.read()).value);
- }
-
- await w.write(encoder.encode(`GET / HTTP/1.1\nConnection: keep-alive\n\n`));
- await deferred3.out.promise;
-
- // This is half served, so wait for the chunk that has the first '.'
- text = "";
- while (!text.includes("1\r\n.\r\n")) {
- text += decoder.decode((await r.read()).value);
- }
-
- const shutdownPromise = shutdown();
-
- // Release the final response _after_ we shut down
- deferred3.input.resolve("!");
-
- // Guarantee: can't connect to an aborted server (though this may not happen immediately)
- let failed = false;
- for (let i = 0; i < 10; i++) {
- try {
- const conn = await Deno.connect({ port: servePort });
- conn.close();
- // Give the runtime a few ticks to settle (required for Windows)
- await new Promise((r) => setTimeout(r, 2 ** i));
- continue;
- } catch (_) {
- failed = true;
- break;
- }
- }
- assert(failed, "The Deno.serve listener was not disabled promptly");
-
- // Guarantee: existing connections fully drain
- while (!text.includes("!\r\n")) {
- text += decoder.decode((await r.read()).value);
- }
-
- await shutdownPromise;
-
- try {
- conn.close();
- } catch (_) {
- // Ignore
- }
- await finished;
- },
-);
-
-// Ensure that resources don't leak during a graceful shutdown
-Deno.test(
- { permissions: { net: true, write: true, read: true } },
- async function httpServerShutdownGracefulResources() {
- const { promise, resolve } = Promise.withResolvers<void>();
- const { finished, shutdown } = await makeServer(async (_req) => {
- resolve();
- await new Promise((r) => setTimeout(r, 10));
- return new Response((await makeTempFile(1024 * 1024)).readable);
- });
-
- const f = fetch(`http://localhost:${servePort}`);
- await promise;
- assertEquals((await (await f).text()).length, 1048576);
- await shutdown();
- await finished;
- },
-);
-
-// Ensure that resources don't leak during a graceful shutdown
-Deno.test(
- { permissions: { net: true, write: true, read: true } },
- async function httpServerShutdownGracefulResources2() {
- const waitForAbort = Promise.withResolvers<void>();
- const waitForRequest = Promise.withResolvers<void>();
- const { finished, shutdown } = await makeServer(async (_req) => {
- waitForRequest.resolve();
- await waitForAbort.promise;
- await new Promise((r) => setTimeout(r, 10));
- return new Response((await makeTempFile(1024 * 1024)).readable);
- });
-
- const f = fetch(`http://localhost:${servePort}`);
- await waitForRequest.promise;
- const s = shutdown();
- waitForAbort.resolve();
- assertEquals((await (await f).text()).length, 1048576);
- await s;
- await finished;
- },
-);
-
-Deno.test(
- { permissions: { net: true, write: true, read: true } },
- async function httpServerExplicitResourceManagement() {
- let dataPromise;
-
- {
- await using _server = await makeServer(async (_req) => {
- return new Response((await makeTempFile(1024 * 1024)).readable);
- });
-
- const resp = await fetch(`http://localhost:${servePort}`);
- dataPromise = resp.arrayBuffer();
- }
-
- assertEquals((await dataPromise).byteLength, 1048576);
- },
-);
-
-Deno.test(
- { permissions: { net: true, write: true, read: true } },
- async function httpServerExplicitResourceManagementManualClose() {
- await using server = await makeServer(async (_req) => {
- return new Response((await makeTempFile(1024 * 1024)).readable);
- });
-
- const resp = await fetch(`http://localhost:${servePort}`);
-
- const [_, data] = await Promise.all([
- server.shutdown(),
- resp.arrayBuffer(),
- ]);
-
- assertEquals(data.byteLength, 1048576);
- },
-);
-
-Deno.test(
- { permissions: { read: true, run: true } },
- async function httpServerUnref() {
- const [statusCode, _output] = await execCode(`
- async function main() {
- const server = Deno.serve({ port: ${servePort}, handler: () => null });
- server.unref();
- await server.finished; // This doesn't block the program from exiting
- }
- main();
- `);
- assertEquals(statusCode, 0);
- },
-);
-
-Deno.test(async function httpServerCanResolveHostnames() {
- const ac = new AbortController();
- const { promise, resolve } = Promise.withResolvers<void>();
-
- const server = Deno.serve({
- handler: (_req) => new Response("ok"),
- hostname: "localhost",
- port: servePort,
- signal: ac.signal,
- onListen: onListen(resolve),
- onError: createOnErrorCb(ac),
- });
-
- await promise;
- const resp = await fetch(`http://localhost:${servePort}/`, {
- headers: { "connection": "close" },
- });
- const text = await resp.text();
- assertEquals(text, "ok");
- ac.abort();
- await server.finished;
-});
-
-Deno.test(async function httpServerRejectsOnAddrInUse() {
- const ac = new AbortController();
- const { promise, resolve } = Promise.withResolvers<void>();
-
- const server = Deno.serve({
- handler: (_req) => new Response("ok"),
- hostname: "localhost",
- port: servePort,
- signal: ac.signal,
- onListen: onListen(resolve),
- onError: createOnErrorCb(ac),
- });
- await promise;
-
- assertThrows(
- () =>
- Deno.serve({
- handler: (_req) => new Response("ok"),
- hostname: "localhost",
- port: servePort,
- signal: ac.signal,
- onListen: onListen(resolve),
- onError: createOnErrorCb(ac),
- }),
- Deno.errors.AddrInUse,
- );
- ac.abort();
- await server.finished;
-});
-
-Deno.test({ permissions: { net: true } }, async function httpServerBasic() {
- const ac = new AbortController();
- const deferred = Promise.withResolvers<void>();
- const listeningDeferred = Promise.withResolvers<void>();
-
- const server = Deno.serve({
- handler: async (request, { remoteAddr }) => {
- // FIXME(bartlomieju):
- // make sure that request can be inspected
- console.log(request);
- assertEquals(new URL(request.url).href, `http://127.0.0.1:${servePort}/`);
- assertEquals(await request.text(), "");
- assertEquals(remoteAddr.hostname, "127.0.0.1");
- deferred.resolve();
- return new Response("Hello World", { headers: { "foo": "bar" } });
- },
- port: servePort,
- signal: ac.signal,
- onListen: onListen(listeningDeferred.resolve),
- onError: createOnErrorCb(ac),
- });
-
- await listeningDeferred.promise;
- const resp = await fetch(`http://127.0.0.1:${servePort}/`, {
- headers: { "connection": "close" },
- });
- await deferred.promise;
- const clone = resp.clone();
- const text = await resp.text();
- assertEquals(text, "Hello World");
- assertEquals(resp.headers.get("foo"), "bar");
- const cloneText = await clone.text();
- assertEquals(cloneText, "Hello World");
- ac.abort();
- await server.finished;
-});
-
-// Test serving of HTTP on an arbitrary listener.
-Deno.test(
- { permissions: { net: true } },
- async function httpServerOnListener() {
- const ac = new AbortController();
- const deferred = Promise.withResolvers<void>();
- const listeningDeferred = Promise.withResolvers<void>();
- const listener = Deno.listen({ port: servePort });
- const server = serveHttpOnListener(
- listener,
- ac.signal,
- async (
- request: Request,
- { remoteAddr }: { remoteAddr: { hostname: string } },
- ) => {
- assertEquals(
- new URL(request.url).href,
- `http://127.0.0.1:${servePort}/`,
- );
- assertEquals(await request.text(), "");
- assertEquals(remoteAddr.hostname, "127.0.0.1");
- deferred.resolve();
- return new Response("Hello World", { headers: { "foo": "bar" } });
- },
- createOnErrorCb(ac),
- onListen(listeningDeferred.resolve),
- );
-
- await listeningDeferred.promise;
- const resp = await fetch(`http://127.0.0.1:${servePort}/`, {
- headers: { "connection": "close" },
- });
- await listeningDeferred.promise;
- const clone = resp.clone();
- const text = await resp.text();
- assertEquals(text, "Hello World");
- assertEquals(resp.headers.get("foo"), "bar");
- const cloneText = await clone.text();
- assertEquals(cloneText, "Hello World");
- ac.abort();
- await server.finished;
- },
-);
-
-// Test serving of HTTP on an arbitrary connection.
-Deno.test(
- { permissions: { net: true } },
- async function httpServerOnConnection() {
- const ac = new AbortController();
- const deferred = Promise.withResolvers<void>();
- const listeningDeferred = Promise.withResolvers<void>();
- const listener = Deno.listen({ port: servePort });
- const acceptPromise = listener.accept();
- const fetchPromise = fetch(`http://127.0.0.1:${servePort}/`, {
- headers: { "connection": "close" },
- });
-
- const server = serveHttpOnConnection(
- await acceptPromise,
- ac.signal,
- async (
- request: Request,
- { remoteAddr }: { remoteAddr: { hostname: string } },
- ) => {
- assertEquals(
- new URL(request.url).href,
- `http://127.0.0.1:${servePort}/`,
- );
- assertEquals(await request.text(), "");
- assertEquals(remoteAddr.hostname, "127.0.0.1");
- deferred.resolve();
- return new Response("Hello World", { headers: { "foo": "bar" } });
- },
- createOnErrorCb(ac),
- onListen(listeningDeferred.resolve),
- );
-
- const resp = await fetchPromise;
- await deferred.promise;
- const clone = resp.clone();
- const text = await resp.text();
- assertEquals(text, "Hello World");
- assertEquals(resp.headers.get("foo"), "bar");
- const cloneText = await clone.text();
- assertEquals(cloneText, "Hello World");
- // Note that we don't need to abort this server -- it closes when the connection does
- // ac.abort();
- await server.finished;
- listener.close();
- },
-);
-
-Deno.test({ permissions: { net: true } }, async function httpServerOnError() {
- const ac = new AbortController();
- const { promise, resolve } = Promise.withResolvers<void>();
- let requestStash: Request | null;
-
- const server = Deno.serve({
- handler: async (request: Request) => {
- requestStash = request;
- await new Promise((r) => setTimeout(r, 100));
- throw "fail";
- },
- port: servePort,
- signal: ac.signal,
- onListen: onListen(resolve),
- onError: () => {
- return new Response("failed: " + requestStash!.url, { status: 500 });
- },
- });
-
- await promise;
- const resp = await fetch(`http://127.0.0.1:${servePort}/`, {
- headers: { "connection": "close" },
- });
- const text = await resp.text();
- ac.abort();
- await server.finished;
-
- assertEquals(text, `failed: http://127.0.0.1:${servePort}/`);
-});
-
-Deno.test(
- { permissions: { net: true } },
- async function httpServerOnErrorFails() {
- const ac = new AbortController();
- const { promise, resolve } = Promise.withResolvers<void>();
- // NOTE(bartlomieju): deno lint doesn't know that it's actually used later,
- // but TypeScript can't see that either ¯\_(ツ)_/¯
- // deno-lint-ignore no-unused-vars
- let requestStash: Request | null;
-
- const server = Deno.serve({
- handler: async (request: Request) => {
- requestStash = request;
- await new Promise((r) => setTimeout(r, 100));
- throw "fail";
- },
- port: servePort,
- signal: ac.signal,
- onListen: onListen(resolve),
- onError: () => {
- throw "again";
- },
- });
-
- await promise;
- const resp = await fetch(`http://127.0.0.1:${servePort}/`, {
- headers: { "connection": "close" },
- });
- const text = await resp.text();
- ac.abort();
- await server.finished;
-
- assertEquals(text, "Internal Server Error");
- },
-);
-
-Deno.test({ permissions: { net: true } }, async function httpServerOverload1() {
- const ac = new AbortController();
- const deferred = Promise.withResolvers<void>();
- const listeningDeferred = Promise.withResolvers<void>();
-
- const server = Deno.serve({
- port: servePort,
- signal: ac.signal,
- onListen: onListen(listeningDeferred.resolve),
- onError: createOnErrorCb(ac),
- }, async (request) => {
- // FIXME(bartlomieju):
- // make sure that request can be inspected
- console.log(request);
- assertEquals(new URL(request.url).href, `http://127.0.0.1:${servePort}/`);
- assertEquals(await request.text(), "");
- deferred.resolve();
- return new Response("Hello World", { headers: { "foo": "bar" } });
- });
-
- await listeningDeferred.promise;
- const resp = await fetch(`http://127.0.0.1:${servePort}/`, {
- headers: { "connection": "close" },
- });
- await deferred.promise;
- const clone = resp.clone();
- const text = await resp.text();
- assertEquals(text, "Hello World");
- assertEquals(resp.headers.get("foo"), "bar");
- const cloneText = await clone.text();
- assertEquals(cloneText, "Hello World");
- ac.abort();
- await server.finished;
-});
-
-Deno.test({ permissions: { net: true } }, async function httpServerOverload2() {
- const ac = new AbortController();
- const deferred = Promise.withResolvers<void>();
- const listeningDeferred = Promise.withResolvers<void>();
-
- const server = Deno.serve({
- port: servePort,
- signal: ac.signal,
- onListen: onListen(listeningDeferred.resolve),
- onError: createOnErrorCb(ac),
- }, async (request) => {
- // FIXME(bartlomieju):
- // make sure that request can be inspected
- console.log(request);
- assertEquals(new URL(request.url).href, `http://127.0.0.1:${servePort}/`);
- assertEquals(await request.text(), "");
- deferred.resolve();
- return new Response("Hello World", { headers: { "foo": "bar" } });
- });
-
- await listeningDeferred.promise;
- const resp = await fetch(`http://127.0.0.1:${servePort}/`, {
- headers: { "connection": "close" },
- });
- await deferred.promise;
- const clone = resp.clone();
- const text = await resp.text();
- assertEquals(text, "Hello World");
- assertEquals(resp.headers.get("foo"), "bar");
- const cloneText = await clone.text();
- assertEquals(cloneText, "Hello World");
- ac.abort();
- await server.finished;
-});
-
-Deno.test(
- { permissions: { net: true } },
- function httpServerErrorOverloadMissingHandler() {
- // @ts-ignore - testing invalid overload
- assertThrows(() => Deno.serve(), TypeError, "handler");
- // @ts-ignore - testing invalid overload
- assertThrows(() => Deno.serve({}), TypeError, "handler");
- assertThrows(
- // @ts-ignore - testing invalid overload
- () => Deno.serve({ handler: undefined }),
- TypeError,
- "handler",
- );
- assertThrows(
- // @ts-ignore - testing invalid overload
- () => Deno.serve(undefined, { handler: () => {} }),
- TypeError,
- "handler",
- );
- },
-);
-
-Deno.test({ permissions: { net: true } }, async function httpServerPort0() {
- const ac = new AbortController();
-
- const server = Deno.serve({
- handler() {
- return new Response("Hello World");
- },
- port: 0,
- signal: ac.signal,
- onListen({ port }) {
- assert(port > 0 && port < 65536);
- ac.abort();
- },
- });
- await server.finished;
-});
-
-Deno.test(
- { permissions: { net: true } },
- async function httpServerDefaultOnListenCallback() {
- const ac = new AbortController();
-
- const consoleLog = console.log;
- console.log = (msg) => {
- try {
- const match = msg.match(/Listening on http:\/\/localhost:(\d+)\//);
- assert(!!match, `Didn't match ${msg}`);
- const port = +match[1];
- assert(port > 0 && port < 65536);
- } finally {
- ac.abort();
- }
- };
-
- try {
- const server = Deno.serve({
- handler() {
- return new Response("Hello World");
- },
- hostname: "0.0.0.0",
- port: 0,
- signal: ac.signal,
- });
-
- await server.finished;
- } finally {
- console.log = consoleLog;
- }
- },
-);
-
-// https://github.com/denoland/deno/issues/15107
-Deno.test(
- { permissions: { net: true } },
- async function httpLazyHeadersIssue15107() {
- const deferred = Promise.withResolvers<void>();
- const listeningDeferred = Promise.withResolvers<void>();
- const ac = new AbortController();
-
- let headers: Headers;
- const server = Deno.serve({
- handler: async (request) => {
- await request.text();
- headers = request.headers;
- deferred.resolve();
- return new Response("");
- },
- port: servePort,
- signal: ac.signal,
- onListen: onListen(listeningDeferred.resolve),
- onError: createOnErrorCb(ac),
- });
-
- await listeningDeferred.promise;
- const conn = await Deno.connect({ port: servePort });
- // Send GET request with a body + content-length.
- const encoder = new TextEncoder();
- const body =
- `GET / HTTP/1.1\r\nHost: 127.0.0.1:2333\r\nContent-Length: 5\r\n\r\n12345`;
- const writeResult = await conn.write(encoder.encode(body));
- assertEquals(body.length, writeResult);
- await deferred.promise;
- conn.close();
- assertEquals(headers!.get("content-length"), "5");
- ac.abort();
- await server.finished;
- },
-);
-
-function createUrlTest(
- name: string,
- methodAndPath: string,
- host: string | null,
- expected: string,
-) {
- Deno.test(`httpServerUrl${name}`, async () => {
- const listeningDeferred = Promise.withResolvers<number>();
- const urlDeferred = Promise.withResolvers<string>();
- const ac = new AbortController();
- const server = Deno.serve({
- handler: (request: Request) => {
- urlDeferred.resolve(request.url);
- return new Response("");
- },
- port: 0,
- signal: ac.signal,
- onListen: ({ port }: { port: number }) => {
- listeningDeferred.resolve(port);
- },
- onError: createOnErrorCb(ac),
- });
-
- const port = await listeningDeferred.promise;
- const conn = await Deno.connect({ port });
-
- const encoder = new TextEncoder();
- const body = `${methodAndPath} HTTP/1.1\r\n${
- host ? ("Host: " + host + "\r\n") : ""
- }Content-Length: 5\r\n\r\n12345`;
- const writeResult = await conn.write(encoder.encode(body));
- assertEquals(body.length, writeResult);
-
- try {
- const expectedResult = expected.replace("HOST", "localhost").replace(
- "PORT",
- `${port}`,
- );
- assertEquals(await urlDeferred.promise, expectedResult);
- } finally {
- ac.abort();
- await server.finished;
- conn.close();
- }
- });
-}
-
-createUrlTest("WithPath", "GET /path", null, "http://HOST:PORT/path");
-createUrlTest(
- "WithPathAndHost",
- "GET /path",
- "deno.land",
- "http://deno.land/path",
-);
-createUrlTest(
- "WithAbsolutePath",
- "GET http://localhost/path",
- null,
- "http://localhost/path",
-);
-createUrlTest(
- "WithAbsolutePathAndHost",
- "GET http://localhost/path",
- "deno.land",
- "http://localhost/path",
-);
-createUrlTest(
- "WithPortAbsolutePath",
- "GET http://localhost:1234/path",
- null,
- "http://localhost:1234/path",
-);
-createUrlTest(
- "WithPortAbsolutePathAndHost",
- "GET http://localhost:1234/path",
- "deno.land",
- "http://localhost:1234/path",
-);
-createUrlTest(
- "WithPortAbsolutePathAndHostWithPort",
- "GET http://localhost:1234/path",
- "deno.land:9999",
- "http://localhost:1234/path",
-);
-
-createUrlTest("WithAsterisk", "OPTIONS *", null, "*");
-createUrlTest(
- "WithAuthorityForm",
- "CONNECT deno.land:80",
- null,
- "deno.land:80",
-);
-
-// TODO(mmastrac): These should probably be 400 errors
-createUrlTest("WithInvalidAsterisk", "GET *", null, "*");
-createUrlTest("WithInvalidNakedPath", "GET path", null, "path");
-createUrlTest(
- "WithInvalidNakedAuthority",
- "GET deno.land:1234",
- null,
- "deno.land:1234",
-);
-
-Deno.test(
- { permissions: { net: true } },
- async function httpServerGetRequestBody() {
- const deferred = Promise.withResolvers<void>();
- const ac = new AbortController();
- const listeningDeferred = Promise.withResolvers<void>();
-
- const server = Deno.serve({
- handler: (request) => {
- assertEquals(request.body, null);
- deferred.resolve();
- return new Response("", { headers: {} });
- },
- port: servePort,
- signal: ac.signal,
- onListen: onListen(listeningDeferred.resolve),
- onError: createOnErrorCb(ac),
- });
-
- await listeningDeferred.promise;
- const conn = await Deno.connect({ port: servePort });
- // Send GET request with a body + content-length.
- const encoder = new TextEncoder();
- const body =
- `GET / HTTP/1.1\r\nHost: 127.0.0.1:${servePort}\r\nContent-Length: 5\r\n\r\n12345`;
- const writeResult = await conn.write(encoder.encode(body));
- assertEquals(body.length, writeResult);
-
- const resp = new Uint8Array(200);
- const readResult = await conn.read(resp);
- assert(readResult);
- assert(readResult > 0);
-
- conn.close();
- await deferred.promise;
- ac.abort();
- await server.finished;
- },
-);
-
-Deno.test(
- { permissions: { net: true } },
- async function httpServerAbortedRequestBody() {
- const deferred = Promise.withResolvers<void>();
- const ac = new AbortController();
- const listeningDeferred = Promise.withResolvers<void>();
-
- const server = Deno.serve({
- handler: async (request) => {
- await assertRejects(async () => {
- await request.text();
- });
- deferred.resolve();
- // Not actually used
- return new Response();
- },
- port: servePort,
- signal: ac.signal,
- onListen: onListen(listeningDeferred.resolve),
- onError: createOnErrorCb(ac),
- });
-
- await listeningDeferred.promise;
- const conn = await Deno.connect({ port: servePort });
- // Send POST request with a body + content-length, but don't send it all
- const encoder = new TextEncoder();
- const body =
- `POST / HTTP/1.1\r\nHost: 127.0.0.1:${servePort}\r\nContent-Length: 10\r\n\r\n12345`;
- const writeResult = await conn.write(encoder.encode(body));
- assertEquals(body.length, writeResult);
- conn.close();
- await deferred.promise;
- ac.abort();
- await server.finished;
- },
-);
-
-function createStreamTest(count: number, delay: number, action: string) {
- function doAction(controller: ReadableStreamDefaultController, i: number) {
- if (i == count) {
- if (action == "Throw") {
- controller.error(new Error("Expected error!"));
- } else {
- controller.close();
- }
- } else {
- controller.enqueue(`a${i}`);
-
- if (delay == 0) {
- doAction(controller, i + 1);
- } else {
- setTimeout(() => doAction(controller, i + 1), delay);
- }
- }
- }
-
- function makeStream(_count: number, delay: number): ReadableStream {
- return new ReadableStream({
- start(controller) {
- if (delay == 0) {
- doAction(controller, 0);
- } else {
- setTimeout(() => doAction(controller, 0), delay);
- }
- },
- }).pipeThrough(new TextEncoderStream());
- }
-
- Deno.test(`httpServerStreamCount${count}Delay${delay}${action}`, async () => {
- const ac = new AbortController();
- const { promise, resolve } = Promise.withResolvers<void>();
- const server = Deno.serve({
- handler: (_request) => {
- return new Response(makeStream(count, delay));
- },
- port: servePort,
- signal: ac.signal,
- onListen: onListen(resolve),
- onError: createOnErrorCb(ac),
- });
-
- try {
- await promise;
- const resp = await fetch(`http://127.0.0.1:${servePort}/`);
- if (action == "Throw") {
- await assertRejects(async () => {
- await resp.text();
- });
- } else {
- const text = await resp.text();
-
- let expected = "";
- for (let i = 0; i < count; i++) {
- expected += `a${i}`;
- }
-
- assertEquals(text, expected);
- }
- } finally {
- ac.abort();
- await server.shutdown();
- }
- });
-}
-
-for (const count of [0, 1, 2, 3]) {
- for (const delay of [0, 1, 25]) {
- // Creating a stream that errors in start will throw
- if (delay > 0) {
- createStreamTest(count, delay, "Throw");
- }
- createStreamTest(count, delay, "Close");
- }
-}
-
-Deno.test(
- { permissions: { net: true } },
- async function httpServerStreamRequest() {
- const stream = new TransformStream();
- const writer = stream.writable.getWriter();
- writer.write(new TextEncoder().encode("hello "));
- writer.write(new TextEncoder().encode("world"));
- writer.close();
- const { promise, resolve } = Promise.withResolvers<void>();
- const ac = new AbortController();
- const server = Deno.serve({
- handler: async (request) => {
- const reqBody = await request.text();
- assertEquals("hello world", reqBody);
- return new Response("yo");
- },
- port: servePort,
- signal: ac.signal,
- onListen: onListen(resolve),
- onError: createOnErrorCb(ac),
- });
-
- await promise;
- const resp = await fetch(`http://127.0.0.1:${servePort}/`, {
- body: stream.readable,
- method: "POST",
- headers: { "connection": "close" },
- });
-
- assertEquals(await resp.text(), "yo");
- ac.abort();
- await server.finished;
- },
-);
-
-Deno.test({ permissions: { net: true } }, async function httpServerClose() {
- const ac = new AbortController();
- const { promise, resolve } = Promise.withResolvers<void>();
- const server = Deno.serve({
- handler: () => new Response("ok"),
- port: servePort,
- signal: ac.signal,
- onListen: onListen(resolve),
- onError: createOnErrorCb(ac),
- });
- await promise;
- const client = await Deno.connect({ port: servePort });
- client.close();
- ac.abort();
- await server.finished;
-});
-
-// https://github.com/denoland/deno/issues/15427
-Deno.test({ permissions: { net: true } }, async function httpServerCloseGet() {
- const ac = new AbortController();
- const listeningDeferred = Promise.withResolvers<void>();
- const requestDeferred = Promise.withResolvers<void>();
- const responseDeferred = Promise.withResolvers<void>();
- const server = Deno.serve({
- handler: async () => {
- requestDeferred.resolve();
- await new Promise((r) => setTimeout(r, 500));
- responseDeferred.resolve();
- return new Response("ok");
- },
- port: servePort,
- signal: ac.signal,
- onListen: onListen(listeningDeferred.resolve),
- onError: createOnErrorCb(ac),
- });
- await listeningDeferred.promise;
- const conn = await Deno.connect({ port: servePort });
- const encoder = new TextEncoder();
- const body =
- `GET / HTTP/1.1\r\nHost: example.domain\r\nConnection: close\r\n\r\n`;
- const writeResult = await conn.write(encoder.encode(body));
- assertEquals(body.length, writeResult);
- await requestDeferred.promise;
- conn.close();
- await responseDeferred.promise;
- ac.abort();
- await server.finished;
-});
-
-// FIXME:
-Deno.test(
- { permissions: { net: true } },
- async function httpServerEmptyBlobResponse() {
- const ac = new AbortController();
- const { promise, resolve } = Promise.withResolvers<void>();
- const server = Deno.serve({
- handler: () => new Response(new Blob([])),
- port: servePort,
- signal: ac.signal,
- onListen: onListen(resolve),
- onError: createOnErrorCb(ac),
- });
-
- await promise;
- const resp = await fetch(`http://127.0.0.1:${servePort}/`);
- const respBody = await resp.text();
-
- assertEquals("", respBody);
- ac.abort();
- await server.finished;
- },
-);
-
-// https://github.com/denoland/deno/issues/17291
-Deno.test(
- { permissions: { net: true } },
- async function httpServerIncorrectChunkedResponse() {
- const ac = new AbortController();
- const listeningDeferred = Promise.withResolvers<void>();
- const errorDeferred = Promise.withResolvers<void>();
- const server = Deno.serve({
- handler: () => {
- const body = new ReadableStream({
- start(controller) {
- // Non-encoded string is not a valid readable chunk.
- // @ts-ignore we're testing that input is invalid
- controller.enqueue("wat");
- },
- type: "bytes",
- });
- return new Response(body);
- },
- port: servePort,
- signal: ac.signal,
- onListen: onListen(listeningDeferred.resolve),
- onError: (err) => {
- const errResp = new Response(
- `Internal server error: ${(err as Error).message}`,
- { status: 500 },
- );
- errorDeferred.resolve();
- return errResp;
- },
- });
-
- await listeningDeferred.promise;
- const resp = await fetch(`http://127.0.0.1:${servePort}/`);
- // Incorrectly implemented reader ReadableStream should reject.
- assertStringIncludes(await resp.text(), "Failed to execute 'enqueue'");
- await errorDeferred.promise;
- ac.abort();
- await server.finished;
- },
-);
-
-Deno.test(
- { permissions: { net: true } },
- async function httpServerCorrectLengthForUnicodeString() {
- const ac = new AbortController();
- const { promise, resolve } = Promise.withResolvers<void>();
-
- const server = Deno.serve({
- handler: () => new Response("韓國".repeat(10)),
- port: servePort,
- signal: ac.signal,
- onListen: onListen(resolve),
- onError: createOnErrorCb(ac),
- });
-
- await promise;
- const conn = await Deno.connect({ port: servePort });
- const encoder = new TextEncoder();
- const decoder = new TextDecoder();
-
- const body =
- `GET / HTTP/1.1\r\nHost: example.domain\r\nConnection: close\r\n\r\n`;
- const writeResult = await conn.write(encoder.encode(body));
- assertEquals(body.length, writeResult);
-
- const buf = new Uint8Array(1024);
- const readResult = await conn.read(buf);
- assert(readResult);
- const msg = decoder.decode(buf.subarray(0, readResult));
-
- conn.close();
-
- ac.abort();
- await server.finished;
- assert(msg.includes("content-length: 60"));
- },
-);
-
-Deno.test({ permissions: { net: true } }, async function httpServerWebSocket() {
- const ac = new AbortController();
- const listeningDeferred = Promise.withResolvers<void>();
- const doneDeferred = Promise.withResolvers<void>();
- const server = Deno.serve({
- handler: (request) => {
- const {
- response,
- socket,
- } = Deno.upgradeWebSocket(request);
- socket.onerror = (e) => {
- console.error(e);
- fail();
- };
- socket.onmessage = (m) => {
- socket.send(m.data);
- socket.close(1001);
- };
- socket.onclose = () => doneDeferred.resolve();
- return response;
- },
- port: servePort,
- signal: ac.signal,
- onListen: onListen(listeningDeferred.resolve),
- onError: createOnErrorCb(ac),
- });
-
- await listeningDeferred.promise;
- const def = Promise.withResolvers<void>();
- const ws = new WebSocket(`ws://localhost:${servePort}`);
- ws.onmessage = (m) => assertEquals(m.data, "foo");
- ws.onerror = (e) => {
- console.error(e);
- fail();
- };
- ws.onclose = () => def.resolve();
- ws.onopen = () => ws.send("foo");
-
- await def.promise;
- await doneDeferred.promise;
- ac.abort();
- await server.finished;
-});
-
-Deno.test(
- { permissions: { net: true } },
- async function httpServerWebSocketRaw() {
- const ac = new AbortController();
- const { promise, resolve } = Promise.withResolvers<void>();
- const server = Deno.serve({
- handler: async (request) => {
- const { conn, response } = upgradeHttpRaw(request);
- const buf = new Uint8Array(1024);
- let read;
-
- // Write our fake HTTP upgrade
- await conn.write(
- new TextEncoder().encode(
- "HTTP/1.1 101 Switching Protocols\r\nConnection: Upgraded\r\n\r\nExtra",
- ),
- );
-
- // Upgrade data
- read = await conn.read(buf);
- assertEquals(
- new TextDecoder().decode(buf.subarray(0, read!)),
- "Upgrade data",
- );
- // Read the packet to echo
- read = await conn.read(buf);
- // Echo
- await conn.write(buf.subarray(0, read!));
-
- conn.close();
- return response;
- },
- port: servePort,
- signal: ac.signal,
- onListen: onListen(resolve),
- onError: createOnErrorCb(ac),
- });
-
- await promise;
-
- const conn = await Deno.connect({ port: servePort });
- await conn.write(
- new TextEncoder().encode(
- "GET / HTTP/1.1\r\nConnection: Upgrade\r\nUpgrade: websocket\r\n\r\nUpgrade data",
- ),
- );
- const buf = new Uint8Array(1024);
- let len;
-
- // Headers
- let headers = "";
- for (let i = 0; i < 2; i++) {
- len = await conn.read(buf);
- headers += new TextDecoder().decode(buf.subarray(0, len!));
- if (headers.endsWith("Extra")) {
- break;
- }
- }
- assertMatch(
- headers,
- /HTTP\/1\.1 101 Switching Protocols[ ,.A-Za-z:0-9\r\n]*Extra/im,
- );
-
- // Data to echo
- await conn.write(new TextEncoder().encode("buffer data"));
-
- // Echo
- len = await conn.read(buf);
- assertEquals(
- new TextDecoder().decode(buf.subarray(0, len!)),
- "buffer data",
- );
-
- conn.close();
- ac.abort();
- await server.finished;
- },
-);
-
-Deno.test(
- { permissions: { net: true } },
- async function httpServerWebSocketUpgradeTwice() {
- const ac = new AbortController();
- const done = Promise.withResolvers<void>();
- const listeningDeferred = Promise.withResolvers<void>();
- const server = Deno.serve({
- handler: (request) => {
- const {
- response,
- socket,
- } = Deno.upgradeWebSocket(request);
- assertThrows(
- () => {
- Deno.upgradeWebSocket(request);
- },
- Deno.errors.Http,
- "already upgraded",
- );
- socket.onerror = (e) => {
- console.error(e);
- fail();
- };
- socket.onmessage = (m) => {
- socket.send(m.data);
- socket.close(1001);
- };
- socket.onclose = () => done.resolve();
- return response;
- },
- port: servePort,
- signal: ac.signal,
- onListen: onListen(listeningDeferred.resolve),
- onError: createOnErrorCb(ac),
- });
-
- await listeningDeferred.promise;
- const def = Promise.withResolvers<void>();
- const ws = new WebSocket(`ws://localhost:${servePort}`);
- ws.onmessage = (m) => assertEquals(m.data, "foo");
- ws.onerror = (e) => {
- console.error(e);
- fail();
- };
- ws.onclose = () => def.resolve();
- ws.onopen = () => ws.send("foo");
-
- await def.promise;
- await done.promise;
- ac.abort();
- await server.finished;
- },
-);
-
-Deno.test(
- { permissions: { net: true } },
- async function httpServerWebSocketCloseFast() {
- const ac = new AbortController();
- const done = Promise.withResolvers<void>();
- const listeningDeferred = Promise.withResolvers<void>();
- const server = Deno.serve({
- handler: (request) => {
- const {
- response,
- socket,
- } = Deno.upgradeWebSocket(request);
- socket.onopen = () => socket.close();
- socket.onclose = () => done.resolve();
- return response;
- },
- port: servePort,
- signal: ac.signal,
- onListen: onListen(listeningDeferred.resolve),
- onError: createOnErrorCb(ac),
- });
-
- await listeningDeferred.promise;
- const def = Promise.withResolvers<void>();
- const ws = new WebSocket(`ws://localhost:${servePort}`);
- ws.onerror = (e) => {
- console.error(e);
- fail();
- };
- ws.onclose = () => def.resolve();
-
- await def.promise;
- await done.promise;
- ac.abort();
- await server.finished;
- },
-);
-
-Deno.test(
- { permissions: { net: true } },
- async function httpServerWebSocketCanAccessRequest() {
- const ac = new AbortController();
- const done = Promise.withResolvers<void>();
- const listeningDeferred = Promise.withResolvers<void>();
- const server = Deno.serve({
- handler: (request) => {
- const {
- response,
- socket,
- } = Deno.upgradeWebSocket(request);
- socket.onerror = (e) => {
- console.error(e);
- fail();
- };
- socket.onmessage = (_m) => {
- socket.send(request.url.toString());
- socket.close(1001);
- };
- socket.onclose = () => done.resolve();
- return response;
- },
- port: servePort,
- signal: ac.signal,
- onListen: onListen(listeningDeferred.resolve),
- onError: createOnErrorCb(ac),
- });
-
- await listeningDeferred.promise;
- const def = Promise.withResolvers<void>();
- const ws = new WebSocket(`ws://localhost:${servePort}`);
- ws.onmessage = (m) =>
- assertEquals(m.data, `http://localhost:${servePort}/`);
- ws.onerror = (e) => {
- console.error(e);
- fail();
- };
- ws.onclose = () => def.resolve();
- ws.onopen = () => ws.send("foo");
-
- await def.promise;
- await done.promise;
- ac.abort();
- await server.finished;
- },
-);
-
-Deno.test(
- { permissions: { net: true } },
- async function httpVeryLargeRequest() {
- const deferred = Promise.withResolvers<void>();
- const listeningDeferred = Promise.withResolvers<void>();
- const ac = new AbortController();
-
- let headers: Headers;
- const server = Deno.serve({
- handler: (request) => {
- headers = request.headers;
- deferred.resolve();
- return new Response("");
- },
- port: servePort,
- signal: ac.signal,
- onListen: onListen(listeningDeferred.resolve),
- onError: createOnErrorCb(ac),
- });
-
- await listeningDeferred.promise;
- const conn = await Deno.connect({ port: servePort });
- // Send GET request with a body + content-length.
- const encoder = new TextEncoder();
- const smthElse = "x".repeat(16 * 1024 + 256);
- const body =
- `GET / HTTP/1.1\r\nHost: 127.0.0.1:2333\r\nContent-Length: 5\r\nSomething-Else: ${smthElse}\r\n\r\n`;
- const writeResult = await conn.write(encoder.encode(body));
- assertEquals(body.length, writeResult);
- await deferred.promise;
- conn.close();
- assertEquals(headers!.get("content-length"), "5");
- assertEquals(headers!.get("something-else"), smthElse);
- ac.abort();
- await server.finished;
- },
-);
-
-Deno.test(
- { permissions: { net: true } },
- async function httpVeryLargeRequestAndBody() {
- const deferred = Promise.withResolvers<void>();
- const listeningDeferred = Promise.withResolvers<void>();
- const ac = new AbortController();
-
- let headers: Headers;
- let text: string;
- const server = Deno.serve({
- handler: async (request) => {
- headers = request.headers;
- text = await request.text();
- deferred.resolve();
- return new Response("");
- },
- port: servePort,
- signal: ac.signal,
- onListen: onListen(listeningDeferred.resolve),
- onError: createOnErrorCb(ac),
- });
-
- await listeningDeferred.promise;
- const conn = await Deno.connect({ port: servePort });
- // Send GET request with a body + content-length.
- const encoder = new TextEncoder();
- const smthElse = "x".repeat(16 * 1024 + 256);
- const reqBody = "hello world".repeat(1024);
- let body =
- `PUT / HTTP/1.1\r\nHost: 127.0.0.1:2333\r\nContent-Length: ${reqBody.length}\r\nSomething-Else: ${smthElse}\r\n\r\n${reqBody}`;
-
- while (body.length > 0) {
- const writeResult = await conn.write(encoder.encode(body));
- body = body.slice(writeResult);
- }
-
- await deferred.promise;
- conn.close();
-
- assertEquals(headers!.get("content-length"), `${reqBody.length}`);
- assertEquals(headers!.get("something-else"), smthElse);
- assertEquals(text!, reqBody);
- ac.abort();
- await server.finished;
- },
-);
-
-Deno.test(
- { permissions: { net: true } },
- async function httpConnectionClose() {
- const deferred = Promise.withResolvers<void>();
- const ac = new AbortController();
- const listeningDeferred = Promise.withResolvers<void>();
-
- const server = Deno.serve({
- handler: () => {
- deferred.resolve();
- return new Response("");
- },
- port: servePort,
- signal: ac.signal,
- onListen: onListen(listeningDeferred.resolve),
- onError: createOnErrorCb(ac),
- });
-
- await listeningDeferred.promise;
- const conn = await Deno.connect({ port: servePort });
- // Send GET request with a body + connection: close.
- const encoder = new TextEncoder();
- const body =
- `GET / HTTP/1.1\r\nHost: 127.0.0.1:2333\r\nConnection: Close\r\n\r\n`;
- const writeResult = await conn.write(encoder.encode(body));
- assertEquals(body.length, writeResult);
-
- await deferred.promise;
- conn.close();
-
- ac.abort();
- await server.finished;
- },
-);
-
-async function testDuplex(
- reader: ReadableStreamDefaultReader<Uint8Array>,
- writable: WritableStreamDefaultWriter<Uint8Array>,
-) {
- await writable.write(new Uint8Array([1]));
- const chunk1 = await reader.read();
- assert(!chunk1.done);
- assertEquals(chunk1.value, new Uint8Array([1]));
- await writable.write(new Uint8Array([2]));
- const chunk2 = await reader.read();
- assert(!chunk2.done);
- assertEquals(chunk2.value, new Uint8Array([2]));
- await writable.close();
- const chunk3 = await reader.read();
- assert(chunk3.done);
-}
-
-Deno.test(
- { permissions: { net: true } },
- async function httpServerStreamDuplexDirect() {
- const { promise, resolve } = Promise.withResolvers<void>();
- const ac = new AbortController();
-
- const server = Deno.serve(
- { port: servePort, signal: ac.signal },
- (request: Request) => {
- assert(request.body);
- resolve();
- return new Response(request.body);
- },
- );
-
- const { readable, writable } = new TransformStream();
- const resp = await fetch(`http://127.0.0.1:${servePort}/`, {
- method: "POST",
- body: readable,
- });
-
- await promise;
- assert(resp.body);
- await testDuplex(resp.body.getReader(), writable.getWriter());
- ac.abort();
- await server.finished;
- },
-);
-
-// Test that a duplex stream passing through JavaScript also works (ie: that the request body resource
-// is still alive). https://github.com/denoland/deno/pull/20206
-Deno.test(
- { permissions: { net: true } },
- async function httpServerStreamDuplexJavascript() {
- const { promise, resolve } = Promise.withResolvers<void>();
- const ac = new AbortController();
-
- const server = Deno.serve(
- { port: servePort, signal: ac.signal },
- (request: Request) => {
- assert(request.body);
- resolve();
- const reader = request.body.getReader();
- return new Response(
- new ReadableStream({
- async pull(controller) {
- await new Promise((r) => setTimeout(r, 100));
- const { done, value } = await reader.read();
- if (done) {
- controller.close();
- } else {
- controller.enqueue(value);
- }
- },
- }),
- );
- },
- );
-
- const { readable, writable } = new TransformStream();
- const resp = await fetch(`http://127.0.0.1:${servePort}/`, {
- method: "POST",
- body: readable,
- });
-
- await promise;
- assert(resp.body);
- await testDuplex(resp.body.getReader(), writable.getWriter());
- ac.abort();
- await server.finished;
- },
-);
-
-Deno.test(
- { permissions: { net: true } },
- // Issue: https://github.com/denoland/deno/issues/10930
- async function httpServerStreamingResponse() {
- // This test enqueues a single chunk for readable
- // stream and waits for client to read that chunk and signal
- // it before enqueueing subsequent chunk. Issue linked above
- // presented a situation where enqueued chunks were not
- // written to the HTTP connection until the next chunk was enqueued.
- const listeningDeferred = Promise.withResolvers<void>();
- const deferred = Promise.withResolvers<void>();
- const ac = new AbortController();
-
- let counter = 0;
-
- const deferreds = [
- Promise.withResolvers<void>(),
- Promise.withResolvers<void>(),
- Promise.withResolvers<void>(),
- ];
-
- async function writeRequest(conn: Deno.Conn) {
- const encoder = new TextEncoder();
- const decoder = new TextDecoder();
-
- const w = new BufWriter(conn);
- const r = new BufReader(conn);
- const body = `GET / HTTP/1.1\r\nHost: 127.0.0.1:${servePort}\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);
- const headers = await tpr.readMimeHeader();
- assert(headers !== null);
-
- const chunkedReader = chunkedBodyReader(headers, r);
-
- const buf = new Uint8Array(5);
- const dest = new Buffer();
-
- let result: number | null;
-
- try {
- while ((result = await chunkedReader.read(buf)) !== null) {
- const len = Math.min(buf.byteLength, result);
-
- await dest.write(buf.subarray(0, len));
-
- // Resolve a deferred - this will make response stream to
- // enqueue next chunk.
- deferreds[counter - 1].resolve();
- }
- return decoder.decode(dest.bytes());
- } catch (e) {
- console.error(e);
- }
- }
-
- function periodicStream() {
- return new ReadableStream({
- start(controller) {
- controller.enqueue(`${counter}\n`);
- counter++;
- },
-
- async pull(controller) {
- if (counter >= 3) {
- return controller.close();
- }
-
- await deferreds[counter - 1].promise;
-
- controller.enqueue(`${counter}\n`);
- counter++;
- },
- }).pipeThrough(new TextEncoderStream());
- }
-
- const server = Deno.serve({
- handler: () => {
- deferred.resolve();
- return new Response(periodicStream());
- },
- port: servePort,
- signal: ac.signal,
- onListen: onListen(listeningDeferred.resolve),
- onError: createOnErrorCb(ac),
- });
-
- await listeningDeferred.promise;
- // start a client
- const clientConn = await Deno.connect({ port: servePort });
-
- const r1 = await writeRequest(clientConn);
- assertEquals(r1, "0\n1\n2\n");
-
- ac.abort();
- await deferred.promise;
- await server.finished;
- clientConn.close();
- },
-);
-
-// Make sure that the chunks of a large response aren't repeated or corrupted in some other way by
-// scatterning sentinels throughout.
-// https://github.com/denoland/fresh/issues/1699
-Deno.test(
- { permissions: { net: true } },
- async function httpLargeReadableStreamChunk() {
- const ac = new AbortController();
- const server = Deno.serve({
- handler() {
- return new Response(
- new ReadableStream({
- start(controller) {
- const buffer = new Uint8Array(1024 * 1024);
- // Mark the buffer with sentinels
- for (let i = 0; i < 256; i++) {
- buffer[i * 4096] = i;
- }
- controller.enqueue(buffer);
- controller.close();
- },
- }),
- );
- },
- port: servePort,
- signal: ac.signal,
- });
- const response = await fetch(`http://localhost:${servePort}/`);
- const body = await response.arrayBuffer();
- assertEquals(1024 * 1024, body.byteLength);
- const buffer = new Uint8Array(body);
- for (let i = 0; i < 256; i++) {
- assertEquals(
- i,
- buffer[i * 4096],
- `sentinel mismatch at index ${i * 4096}`,
- );
- }
- ac.abort();
- await server.finished;
- },
-);
-
-Deno.test(
- { permissions: { net: true } },
- async function httpRequestLatin1Headers() {
- const listeningDeferred = Promise.withResolvers<void>();
- const deferred = Promise.withResolvers<void>();
- const ac = new AbortController();
- const server = Deno.serve({
- handler: (request) => {
- assertEquals(request.headers.get("X-Header-Test"), "á");
- deferred.resolve();
- return new Response("hello", { headers: { "X-Header-Test": "Æ" } });
- },
- port: servePort,
- signal: ac.signal,
- onListen: onListen(listeningDeferred.resolve),
- onError: createOnErrorCb(ac),
- });
-
- await listeningDeferred.promise;
- const clientConn = await Deno.connect({ port: servePort });
- const requestText =
- `GET / HTTP/1.1\r\nHost: 127.0.0.1:${servePort}\r\nX-Header-Test: á\r\n\r\n`;
- const requestBytes = new Uint8Array(requestText.length);
- for (let i = 0; i < requestText.length; i++) {
- requestBytes[i] = requestText.charCodeAt(i);
- }
- let written = 0;
- while (written < requestBytes.byteLength) {
- written += await clientConn.write(requestBytes.slice(written));
- }
-
- const buf = new Uint8Array(1024);
- await clientConn.read(buf);
-
- await deferred.promise;
- const responseText = new TextDecoder("iso-8859-1").decode(buf);
- clientConn.close();
-
- ac.abort();
- await server.finished;
-
- assertMatch(responseText, /\r\n[Xx]-[Hh]eader-[Tt]est: Æ\r\n/);
- },
-);
-
-Deno.test(
- { permissions: { net: true } },
- async function httpServerRequestWithoutPath() {
- const deferred = Promise.withResolvers<void>();
- const listeningDeferred = Promise.withResolvers<void>();
- const ac = new AbortController();
-
- const server = Deno.serve({
- handler: async (request) => {
- // FIXME:
- // assertEquals(new URL(request.url).href, `http://127.0.0.1:${servePort}/`);
- assertEquals(await request.text(), "");
- deferred.resolve();
- return new Response("11");
- },
- port: servePort,
- signal: ac.signal,
- onListen: onListen(listeningDeferred.resolve),
- onError: createOnErrorCb(ac),
- });
-
- await listeningDeferred.promise;
- const clientConn = await Deno.connect({ port: servePort });
-
- async function writeRequest(conn: Deno.Conn) {
- const encoder = new TextEncoder();
-
- const w = new BufWriter(conn);
- const r = new BufReader(conn);
- const body =
- `CONNECT 127.0.0.1:${servePort} HTTP/1.1\r\nHost: 127.0.0.1:${servePort}\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);
- const m = statusLine.match(/^(.+?) (.+?) (.+?)$/);
- assert(m !== null, "must be matched");
- const [_, _proto, status, _ok] = m;
- assertEquals(status, "200");
- const headers = await tpr.readMimeHeader();
- assert(headers !== null);
- }
-
- await writeRequest(clientConn);
- clientConn.close();
- await deferred.promise;
-
- ac.abort();
- await server.finished;
- },
-);
-
-Deno.test(
- { permissions: { net: true } },
- async function httpCookieConcatenation() {
- const deferred = Promise.withResolvers<void>();
- const listeningDeferred = Promise.withResolvers<void>();
- const ac = new AbortController();
-
- const server = Deno.serve({
- handler: async (request) => {
- assertEquals(await request.text(), "");
- assertEquals(request.headers.get("cookie"), "foo=bar; bar=foo");
- deferred.resolve();
- return new Response("ok");
- },
- port: servePort,
- signal: ac.signal,
- onListen: onListen(listeningDeferred.resolve),
- onError: createOnErrorCb(ac),
- reusePort: true,
- });
-
- await listeningDeferred.promise;
- const resp = await fetch(`http://127.0.0.1:${servePort}/`, {
- headers: [
- ["connection", "close"],
- ["cookie", "foo=bar"],
- ["cookie", "bar=foo"],
- ],
- });
- await deferred.promise;
-
- const text = await resp.text();
- assertEquals(text, "ok");
-
- ac.abort();
- await server.finished;
- },
-);
-
-// https://github.com/denoland/deno/issues/12741
-// https://github.com/denoland/deno/pull/12746
-// https://github.com/denoland/deno/pull/12798
-Deno.test(
- { permissions: { net: true, run: true } },
- async function httpServerDeleteRequestHasBody() {
- const deferred = Promise.withResolvers<void>();
- const listeningDeferred = Promise.withResolvers<void>();
- const ac = new AbortController();
-
- const hostname = "localhost";
-
- const server = Deno.serve({
- handler: () => {
- deferred.resolve();
- return new Response("ok");
- },
- port: servePort,
- signal: ac.signal,
- onListen: onListen(listeningDeferred.resolve),
- onError: createOnErrorCb(ac),
- });
-
- await listeningDeferred.promise;
- const url = `http://${hostname}:${servePort}/`;
- const args = ["-X", "DELETE", url];
- const { success } = await new Deno.Command("curl", {
- args,
- stdout: "null",
- stderr: "null",
- }).output();
- assert(success);
- await deferred.promise;
- ac.abort();
-
- await server.finished;
- },
-);
-
-// FIXME:
-Deno.test(
- { permissions: { net: true } },
- async function httpServerRespondNonAsciiUint8Array() {
- const deferred = Promise.withResolvers<void>();
- const listeningDeferred = Promise.withResolvers<void>();
- const ac = new AbortController();
-
- const server = Deno.serve({
- handler: (request) => {
- assertEquals(request.body, null);
- deferred.resolve();
- return new Response(new Uint8Array([128]));
- },
- port: servePort,
- signal: ac.signal,
- onListen: onListen(listeningDeferred.resolve),
- onError: createOnErrorCb(ac),
- });
- await listeningDeferred.resolve;
- const resp = await fetch(`http://localhost:${servePort}/`);
-
- await deferred.promise;
-
- assertEquals(resp.status, 200);
- const body = await resp.arrayBuffer();
- assertEquals(new Uint8Array(body), new Uint8Array([128]));
-
- ac.abort();
- await server.finished;
- },
-);
-
-// Some of these tests are ported from Hyper
-// https://github.com/hyperium/hyper/blob/889fa2d87252108eb7668b8bf034ffcc30985117/src/proto/h1/role.rs
-// https://github.com/hyperium/hyper/blob/889fa2d87252108eb7668b8bf034ffcc30985117/tests/server.rs
-
-Deno.test(
- { permissions: { net: true } },
- async function httpServerParseRequest() {
- const deferred = Promise.withResolvers<void>();
- const listeningDeferred = Promise.withResolvers<void>();
- const ac = new AbortController();
-
- const server = Deno.serve({
- handler: (request) => {
- assertEquals(request.method, "GET");
- assertEquals(request.headers.get("host"), "deno.land");
- deferred.resolve();
- return new Response("ok");
- },
- port: servePort,
- signal: ac.signal,
- onListen: onListen(listeningDeferred.resolve),
- onError: createOnErrorCb(ac),
- });
-
- await listeningDeferred.promise;
- const conn = await Deno.connect({ port: servePort });
- const encoder = new TextEncoder();
- const body = `GET /echo HTTP/1.1\r\nHost: deno.land\r\n\r\n`;
- const writeResult = await conn.write(encoder.encode(body));
- assertEquals(body.length, writeResult);
- await deferred.promise;
- conn.close();
-
- ac.abort();
- await server.finished;
- },
-);
-
-Deno.test(
- { permissions: { net: true } },
- async function httpServerParseHeaderHtabs() {
- const deferred = Promise.withResolvers<void>();
- const listeningDeferred = Promise.withResolvers<void>();
- const ac = new AbortController();
-
- const server = Deno.serve({
- handler: (request) => {
- assertEquals(request.method, "GET");
- assertEquals(request.headers.get("server"), "hello\tworld");
- deferred.resolve();
- return new Response("ok");
- },
- port: servePort,
- signal: ac.signal,
- onListen: onListen(listeningDeferred.resolve),
- onError: createOnErrorCb(ac),
- });
-
- await listeningDeferred.promise;
- const conn = await Deno.connect({ port: servePort });
- const encoder = new TextEncoder();
- const body = `GET / HTTP/1.1\r\nserver: hello\tworld\r\n\r\n`;
- const writeResult = await conn.write(encoder.encode(body));
- assertEquals(body.length, writeResult);
- await deferred.promise;
- conn.close();
-
- ac.abort();
- await server.finished;
- },
-);
-
-Deno.test(
- { permissions: { net: true } },
- async function httpServerGetShouldIgnoreBody() {
- const deferred = Promise.withResolvers<void>();
- const listeningDeferred = Promise.withResolvers<void>();
- const ac = new AbortController();
-
- const server = Deno.serve({
- handler: async (request) => {
- assertEquals(request.method, "GET");
- assertEquals(await request.text(), "");
- deferred.resolve();
- return new Response("ok");
- },
- port: servePort,
- signal: ac.signal,
- onListen: onListen(listeningDeferred.resolve),
- onError: createOnErrorCb(ac),
- });
-
- await listeningDeferred.promise;
- const conn = await Deno.connect({ port: servePort });
- const encoder = new TextEncoder();
- // Connection: close = don't try to parse the body as a new request
- const body =
- `GET / HTTP/1.1\r\nHost: example.domain\r\nConnection: close\r\n\r\nI shouldn't be read.\r\n`;
- const writeResult = await conn.write(encoder.encode(body));
- assertEquals(body.length, writeResult);
- await deferred.promise;
- conn.close();
-
- ac.abort();
- await server.finished;
- },
-);
-
-Deno.test(
- { permissions: { net: true } },
- async function httpServerPostWithBody() {
- const deferred = Promise.withResolvers<void>();
- const listeningDeferred = Promise.withResolvers<void>();
- const ac = new AbortController();
-
- const server = Deno.serve({
- handler: async (request) => {
- assertEquals(request.method, "POST");
- assertEquals(await request.text(), "I'm a good request.");
- deferred.resolve();
- return new Response("ok");
- },
- port: servePort,
- signal: ac.signal,
- onListen: onListen(listeningDeferred.resolve),
- onError: createOnErrorCb(ac),
- });
-
- await listeningDeferred.promise;
- const conn = await Deno.connect({ port: servePort });
- const encoder = new TextEncoder();
- const body =
- `POST / HTTP/1.1\r\nHost: example.domain\r\nContent-Length: 19\r\n\r\nI'm a good request.`;
- const writeResult = await conn.write(encoder.encode(body));
- assertEquals(body.length, writeResult);
- await deferred.promise;
- conn.close();
-
- ac.abort();
- await server.finished;
- },
-);
-
-type TestCase = {
- headers?: Record<string, string>;
- // deno-lint-ignore no-explicit-any
- body: any;
- expectsChunked?: boolean;
- expectsConnLen?: boolean;
-};
-
-function hasHeader(msg: string, name: string): boolean {
- const n = msg.indexOf("\r\n\r\n") || msg.length;
- return msg.slice(0, n).includes(name);
-}
-
-function createServerLengthTest(name: string, testCase: TestCase) {
- Deno.test(name, async function () {
- const deferred = Promise.withResolvers<void>();
- const listeningDeferred = Promise.withResolvers<void>();
- const ac = new AbortController();
-
- const server = Deno.serve({
- handler: (request) => {
- assertEquals(request.method, "GET");
- deferred.resolve();
- return new Response(testCase.body, testCase.headers ?? {});
- },
- port: servePort,
- signal: ac.signal,
- onListen: onListen(listeningDeferred.resolve),
- onError: createOnErrorCb(ac),
- });
-
- await listeningDeferred.promise;
- const conn = await Deno.connect({ port: servePort });
- const encoder = new TextEncoder();
- const body =
- `GET / HTTP/1.1\r\nHost: example.domain\r\nConnection: close\r\n\r\n`;
- const writeResult = await conn.write(encoder.encode(body));
- assertEquals(body.length, writeResult);
- await deferred.promise;
-
- const decoder = new TextDecoder();
- let msg = "";
- while (true) {
- const buf = new Uint8Array(1024);
- const readResult = await conn.read(buf);
- if (!readResult) {
- break;
- }
- msg += decoder.decode(buf.subarray(0, readResult));
- try {
- assert(
- testCase.expectsChunked == hasHeader(msg, "Transfer-Encoding:"),
- );
- assert(testCase.expectsChunked == hasHeader(msg, "chunked"));
- assert(testCase.expectsConnLen == hasHeader(msg, "Content-Length:"));
-
- const n = msg.indexOf("\r\n\r\n") + 4;
-
- if (testCase.expectsChunked) {
- assertEquals(msg.slice(n + 1, n + 3), "\r\n");
- assertEquals(msg.slice(msg.length - 7), "\r\n0\r\n\r\n");
- }
-
- if (testCase.expectsConnLen && typeof testCase.body === "string") {
- assertEquals(msg.slice(n), testCase.body);
- }
- break;
- } catch {
- continue;
- }
- }
-
- conn.close();
-
- ac.abort();
- await server.finished;
- });
-}
-
-// Quick and dirty way to make a readable stream from a string. Alternatively,
-// `readableStreamFromReader(file)` could be used.
-function stream(s: string): ReadableStream<Uint8Array> {
- return new Response(s).body!;
-}
-
-createServerLengthTest("fixedResponseKnown", {
- headers: { "content-length": "11" },
- body: "foo bar baz",
- expectsChunked: false,
- expectsConnLen: true,
-});
-
-createServerLengthTest("fixedResponseUnknown", {
- headers: { "content-length": "11" },
- body: stream("foo bar baz"),
- expectsChunked: true,
- expectsConnLen: false,
-});
-
-createServerLengthTest("fixedResponseKnownEmpty", {
- headers: { "content-length": "0" },
- body: "",
- expectsChunked: false,
- expectsConnLen: true,
-});
-
-createServerLengthTest("chunkedRespondKnown", {
- headers: { "transfer-encoding": "chunked" },
- body: "foo bar baz",
- expectsChunked: false,
- expectsConnLen: true,
-});
-
-createServerLengthTest("chunkedRespondUnknown", {
- headers: { "transfer-encoding": "chunked" },
- body: stream("foo bar baz"),
- expectsChunked: true,
- expectsConnLen: false,
-});
-
-createServerLengthTest("autoResponseWithKnownLength", {
- body: "foo bar baz",
- expectsChunked: false,
- expectsConnLen: true,
-});
-
-createServerLengthTest("autoResponseWithUnknownLength", {
- body: stream("foo bar baz"),
- expectsChunked: true,
- expectsConnLen: false,
-});
-
-createServerLengthTest("autoResponseWithKnownLengthEmpty", {
- body: "",
- expectsChunked: false,
- expectsConnLen: true,
-});
-
-createServerLengthTest("autoResponseWithUnknownLengthEmpty", {
- body: stream(""),
- expectsChunked: true,
- expectsConnLen: false,
-});
-
-Deno.test(
- { permissions: { net: true } },
- async function httpServerPostWithContentLengthBody() {
- const deferred = Promise.withResolvers<void>();
- const listeningDeferred = Promise.withResolvers<void>();
- const ac = new AbortController();
-
- const server = Deno.serve({
- handler: async (request) => {
- assertEquals(request.method, "POST");
- assertEquals(request.headers.get("content-length"), "5");
- assertEquals(await request.text(), "hello");
- deferred.resolve();
- return new Response("ok");
- },
- port: servePort,
- signal: ac.signal,
- onListen: onListen(listeningDeferred.resolve),
- onError: createOnErrorCb(ac),
- });
-
- await listeningDeferred.promise;
- const conn = await Deno.connect({ port: servePort });
- const encoder = new TextEncoder();
-
- const body =
- `POST / HTTP/1.1\r\nHost: example.domain\r\nContent-Length: 5\r\n\r\nhello`;
- const writeResult = await conn.write(encoder.encode(body));
- assertEquals(body.length, writeResult);
- await deferred.promise;
-
- conn.close();
-
- ac.abort();
- await server.finished;
- },
-);
-
-Deno.test(
- { permissions: { net: true } },
- async function httpServerPostWithInvalidPrefixContentLength() {
- const ac = new AbortController();
- const { promise, resolve } = Promise.withResolvers<void>();
- const server = Deno.serve({
- handler: () => {
- throw new Error("unreachable");
- },
- port: servePort,
- signal: ac.signal,
- onListen: onListen(resolve),
- onError: createOnErrorCb(ac),
- });
-
- await promise;
- const conn = await Deno.connect({ port: servePort });
- const encoder = new TextEncoder();
- const decoder = new TextDecoder();
-
- const body =
- `POST / HTTP/1.1\r\nHost: example.domain\r\nContent-Length: +5\r\n\r\nhello`;
- const writeResult = await conn.write(encoder.encode(body));
- assertEquals(body.length, writeResult);
-
- const buf = new Uint8Array(1024);
- const readResult = await conn.read(buf);
- assert(readResult);
- const msg = decoder.decode(buf.subarray(0, readResult));
- assert(msg.includes("HTTP/1.1 400 Bad Request"));
-
- conn.close();
-
- ac.abort();
- await server.finished;
- },
-);
-
-Deno.test(
- { permissions: { net: true } },
- async function httpServerPostWithChunkedBody() {
- const deferred = Promise.withResolvers<void>();
- const listeningDeferred = Promise.withResolvers<void>();
- const ac = new AbortController();
-
- const server = Deno.serve({
- handler: async (request) => {
- assertEquals(request.method, "POST");
- assertEquals(await request.text(), "qwert");
- deferred.resolve();
- return new Response("ok");
- },
- port: servePort,
- signal: ac.signal,
- onListen: onListen(listeningDeferred.resolve),
- onError: createOnErrorCb(ac),
- });
-
- await listeningDeferred.promise;
- const conn = await Deno.connect({ port: servePort });
- const encoder = new TextEncoder();
-
- const body =
- `POST / HTTP/1.1\r\nHost: example.domain\r\nTransfer-Encoding: chunked\r\n\r\n1\r\nq\r\n2\r\nwe\r\n2\r\nrt\r\n0\r\n\r\n`;
- const writeResult = await conn.write(encoder.encode(body));
- assertEquals(body.length, writeResult);
- await deferred.promise;
-
- conn.close();
-
- ac.abort();
- await server.finished;
- },
-);
-
-Deno.test(
- { permissions: { net: true } },
- async function httpServerPostWithIncompleteBody() {
- const deferred = Promise.withResolvers<void>();
- const listeningDeferred = Promise.withResolvers<void>();
- const ac = new AbortController();
-
- const server = Deno.serve({
- handler: async (r) => {
- deferred.resolve();
- assertEquals(await r.text(), "12345");
- return new Response("ok");
- },
- port: servePort,
- signal: ac.signal,
- onListen: onListen(listeningDeferred.resolve),
- onError: createOnErrorCb(ac),
- });
-
- await listeningDeferred.promise;
- const conn = await Deno.connect({ port: servePort });
- const encoder = new TextEncoder();
-
- const body =
- `POST / HTTP/1.1\r\nHost: example.domain\r\nContent-Length: 10\r\n\r\n12345`;
- const writeResult = await conn.write(encoder.encode(body));
- assertEquals(body.length, writeResult);
-
- await deferred.promise;
- conn.close();
-
- ac.abort();
- await server.finished;
- },
-);
-
-Deno.test(
- { permissions: { net: true } },
- async function httpServerHeadResponseDoesntSendBody() {
- const deferred = Promise.withResolvers<void>();
- const listeningDeferred = Promise.withResolvers<void>();
- const ac = new AbortController();
-
- const server = Deno.serve({
- handler: () => {
- deferred.resolve();
- return new Response("NaN".repeat(100));
- },
- port: servePort,
- signal: ac.signal,
- onListen: onListen(listeningDeferred.resolve),
- onError: createOnErrorCb(ac),
- });
-
- await listeningDeferred.promise;
- const conn = await Deno.connect({ port: servePort });
- const encoder = new TextEncoder();
- const decoder = new TextDecoder();
-
- const body =
- `HEAD / HTTP/1.1\r\nHost: example.domain\r\nConnection: close\r\n\r\n`;
- const writeResult = await conn.write(encoder.encode(body));
- assertEquals(body.length, writeResult);
-
- await deferred.promise;
-
- const buf = new Uint8Array(1024);
- const readResult = await conn.read(buf);
- assert(readResult);
- const msg = decoder.decode(buf.subarray(0, readResult));
-
- assert(msg.includes("content-length: 300\r\n"));
-
- conn.close();
-
- ac.abort();
- await server.finished;
- },
-);
-
-function makeTempData(size: number) {
- return new Uint8Array(size).fill(1);
-}
-
-async function makeTempFile(size: number) {
- const tmpFile = await Deno.makeTempFile();
- using file = await Deno.open(tmpFile, { write: true, read: true });
- const data = makeTempData(size);
- await file.write(data);
-
- return await Deno.open(tmpFile, { write: true, read: true });
-}
-
-const compressionTestCases = [
- { name: "Empty", length: 0, in: {}, out: {}, expect: null },
- {
- name: "EmptyAcceptGzip",
- length: 0,
- in: { "Accept-Encoding": "gzip" },
- out: {},
- expect: null,
- },
- // This technically would be compressible if not for the size, however the size_hint is not implemented
- // for FileResource and we don't currently peek ahead on resources.
- // {
- // name: "EmptyAcceptGzip2",
- // length: 0,
- // in: { "Accept-Encoding": "gzip" },
- // out: { "Content-Type": "text/plain" },
- // expect: null,
- // },
- { name: "Incompressible", length: 1024, in: {}, out: {}, expect: null },
- {
- name: "IncompressibleAcceptGzip",
- length: 1024,
- in: { "Accept-Encoding": "gzip" },
- out: {},
- expect: null,
- },
- {
- name: "IncompressibleType",
- length: 1024,
- in: { "Accept-Encoding": "gzip" },
- out: { "Content-Type": "text/fake" },
- expect: null,
- },
- {
- name: "CompressibleType",
- length: 1024,
- in: { "Accept-Encoding": "gzip" },
- out: { "Content-Type": "text/plain" },
- expect: "gzip",
- },
- {
- name: "CompressibleType2",
- length: 1024,
- in: { "Accept-Encoding": "gzip, deflate, br" },
- out: { "Content-Type": "text/plain" },
- expect: "gzip",
- },
- {
- name: "CompressibleType3",
- length: 1024,
- in: { "Accept-Encoding": "br" },
- out: { "Content-Type": "text/plain" },
- expect: "br",
- },
- {
- name: "IncompressibleRange",
- length: 1024,
- in: { "Accept-Encoding": "gzip" },
- out: { "Content-Type": "text/plain", "Content-Range": "1" },
- expect: null,
- },
- {
- name: "IncompressibleCE",
- length: 1024,
- in: { "Accept-Encoding": "gzip" },
- out: { "Content-Type": "text/plain", "Content-Encoding": "random" },
- expect: null,
- },
- {
- name: "IncompressibleCC",
- length: 1024,
- in: { "Accept-Encoding": "gzip" },
- out: { "Content-Type": "text/plain", "Cache-Control": "no-transform" },
- expect: null,
- },
- {
- name: "BadHeader",
- length: 1024,
- in: { "Accept-Encoding": "\x81" },
- out: { "Content-Type": "text/plain", "Cache-Control": "no-transform" },
- expect: null,
- },
-];
-
-for (const testCase of compressionTestCases) {
- const name = `httpServerCompression${testCase.name}`;
- Deno.test(
- { permissions: { net: true, write: true, read: true } },
- {
- [name]: async function () {
- const deferred = Promise.withResolvers<void>();
- const listeningDeferred = Promise.withResolvers<void>();
- const ac = new AbortController();
- const server = Deno.serve({
- handler: async (_request) => {
- const f = await makeTempFile(testCase.length);
- deferred.resolve();
- // deno-lint-ignore no-explicit-any
- const headers = testCase.out as any;
- headers["Content-Length"] = testCase.length.toString();
- return new Response(f.readable, {
- headers: headers as HeadersInit,
- });
- },
- port: servePort,
- signal: ac.signal,
- onListen: onListen(listeningDeferred.resolve),
- onError: createOnErrorCb(ac),
- });
- try {
- await listeningDeferred.promise;
- const resp = await fetch(`http://127.0.0.1:${servePort}/`, {
- headers: testCase.in as HeadersInit,
- });
- await deferred.promise;
- const body = await resp.arrayBuffer();
- if (testCase.expect == null) {
- assertEquals(body.byteLength, testCase.length);
- assertEquals(
- resp.headers.get("content-length"),
- testCase.length.toString(),
- );
- assertEquals(
- resp.headers.get("content-encoding"),
- testCase.out["Content-Encoding"] || null,
- );
- } else if (testCase.expect == "gzip") {
- // Note the fetch will transparently decompress this response, BUT we can detect that a response
- // was compressed by the lack of a content length.
- assertEquals(body.byteLength, testCase.length);
- assertEquals(resp.headers.get("content-encoding"), null);
- assertEquals(resp.headers.get("content-length"), null);
- }
- } finally {
- ac.abort();
- await server.finished;
- }
- },
- }[name],
- );
-}
-
-Deno.test(
- { permissions: { net: true, write: true, read: true } },
- async function httpServerPostFile() {
- const deferred = Promise.withResolvers<void>();
- const listeningDeferred = Promise.withResolvers<void>();
- const ac = new AbortController();
-
- const server = Deno.serve({
- handler: async (request) => {
- assertEquals(
- new Uint8Array(await request.arrayBuffer()),
- makeTempData(70 * 1024),
- );
- deferred.resolve();
- return new Response("ok");
- },
- port: servePort,
- signal: ac.signal,
- onListen: onListen(listeningDeferred.resolve),
- onError: createOnErrorCb(ac),
- });
-
- await listeningDeferred.promise;
- const f = await makeTempFile(70 * 1024);
- const response = await fetch(`http://localhost:${servePort}/`, {
- method: "POST",
- body: f.readable,
- });
-
- await deferred.promise;
-
- assertEquals(response.status, 200);
- assertEquals(await response.text(), "ok");
-
- ac.abort();
- await server.finished;
- },
-);
-
-for (const delay of ["delay", "nodelay"]) {
- for (const url of ["text", "file", "stream"]) {
- // Ensure that we don't panic when the incoming TCP request was dropped
- // https://github.com/denoland/deno/issues/20315 and that we correctly
- // close/cancel the response
- Deno.test({
- permissions: { read: true, write: true, net: true },
- name: `httpServerTcpCancellation_${url}_${delay}`,
- fn: async function () {
- const ac = new AbortController();
- const streamCancelled = url == "stream"
- ? Promise.withResolvers<void>()
- : undefined;
- const listeningDeferred = Promise.withResolvers<void>();
- const waitForAbort = Promise.withResolvers<void>();
- const waitForRequest = Promise.withResolvers<void>();
- const server = Deno.serve({
- port: servePort,
- signal: ac.signal,
- onListen: onListen(listeningDeferred.resolve),
- handler: async (req: Request) => {
- let respBody = null;
- if (req.url.includes("/text")) {
- respBody = "text";
- } else if (req.url.includes("/file")) {
- respBody = (await makeTempFile(1024)).readable;
- } else if (req.url.includes("/stream")) {
- respBody = new ReadableStream({
- start(controller) {
- controller.enqueue(new Uint8Array([1]));
- },
- cancel(reason) {
- streamCancelled!.resolve(reason);
- },
- });
- } else {
- fail();
- }
- waitForRequest.resolve();
- await waitForAbort.promise;
-
- if (delay == "delay") {
- await new Promise((r) => setTimeout(r, 1000));
- }
- // Allocate the request body
- req.body;
- return new Response(respBody);
- },
- });
-
- await listeningDeferred.promise;
-
- // Create a POST request and drop it once the server has received it
- const conn = await Deno.connect({ port: servePort });
- const writer = conn.writable.getWriter();
- await writer.write(
- new TextEncoder().encode(`POST /${url} HTTP/1.0\n\n`),
- );
- await waitForRequest.promise;
- await writer.close();
-
- waitForAbort.resolve();
-
- // Wait for cancellation before we shut the server down
- if (streamCancelled !== undefined) {
- await streamCancelled;
- }
-
- // Since the handler has a chance of creating resources or running async
- // ops, we need to use a graceful shutdown here to ensure they have fully
- // drained.
- await server.shutdown();
-
- await server.finished;
- },
- });
- }
-}
-
-Deno.test(
- { permissions: { net: true } },
- async function httpServerCancelFetch() {
- const request2 = Promise.withResolvers<void>();
- const request2Aborted = Promise.withResolvers<string>();
- const { finished, abort } = await makeServer(async (req) => {
- if (req.url.endsWith("/1")) {
- const fetchRecursive = await fetch(`http://localhost:${servePort}/2`);
- return new Response(fetchRecursive.body);
- } else if (req.url.endsWith("/2")) {
- request2.resolve();
- return new Response(
- new ReadableStream({
- start(_controller) {/* just hang */},
- cancel(reason) {
- request2Aborted.resolve(reason);
- },
- }),
- );
- }
- fail();
- });
- const fetchAbort = new AbortController();
- const fetchPromise = await fetch(`http://localhost:${servePort}/1`, {
- signal: fetchAbort.signal,
- });
- await fetchPromise;
- await request2.promise;
- fetchAbort.abort();
- assertEquals("resource closed", await request2Aborted.promise);
-
- abort();
- await finished;
- },
-);
-
-Deno.test(
- { permissions: { read: true, net: true } },
- async function httpServerWithTls() {
- const ac = new AbortController();
- const { promise, resolve } = Promise.withResolvers<void>();
- const hostname = "127.0.0.1";
-
- const server = Deno.serve({
- handler: () => new Response("Hello World"),
- hostname,
- port: servePort,
- signal: ac.signal,
- onListen: onListen(resolve),
- onError: createOnErrorCb(ac),
- cert: Deno.readTextFileSync("cli/tests/testdata/tls/localhost.crt"),
- key: Deno.readTextFileSync("cli/tests/testdata/tls/localhost.key"),
- });
-
- await promise;
- const caCert = Deno.readTextFileSync("cli/tests/testdata/tls/RootCA.pem");
- const client = Deno.createHttpClient({ caCerts: [caCert] });
- const resp = await fetch(`https://localhost:${servePort}/`, {
- client,
- headers: { "connection": "close" },
- });
-
- const respBody = await resp.text();
- assertEquals("Hello World", respBody);
-
- client.close();
- ac.abort();
- await server.finished;
- },
-);
-
-Deno.test(
- { permissions: { net: true, write: true, read: true } },
- async function httpServerRequestCLTE() {
- const ac = new AbortController();
- const listeningDeferred = Promise.withResolvers<void>();
- const deferred = Promise.withResolvers<void>();
-
- const server = Deno.serve({
- handler: async (req) => {
- assertEquals(await req.text(), "");
- deferred.resolve();
- return new Response("ok");
- },
- port: servePort,
- signal: ac.signal,
- onListen: onListen(listeningDeferred.resolve),
- onError: createOnErrorCb(ac),
- });
-
- await listeningDeferred.promise;
- const conn = await Deno.connect({ port: servePort });
- const encoder = new TextEncoder();
-
- const body =
- `POST / HTTP/1.1\r\nHost: example.domain\r\nContent-Length: 13\r\nTransfer-Encoding: chunked\r\n\r\n0\r\n\r\nEXTRA`;
- const writeResult = await conn.write(encoder.encode(body));
- assertEquals(body.length, writeResult);
- await deferred.promise;
-
- conn.close();
-
- ac.abort();
- await server.finished;
- },
-);
-
-Deno.test(
- { permissions: { net: true, write: true, read: true } },
- async function httpServerRequestTETE() {
- const ac = new AbortController();
- const { promise, resolve } = Promise.withResolvers<void>();
-
- const server = Deno.serve({
- handler: () => {
- throw new Error("oops");
- },
- port: servePort,
- signal: ac.signal,
- onListen: onListen(resolve),
- onError: createOnErrorCb(ac),
- });
-
- const encoder = new TextEncoder();
- const decoder = new TextDecoder();
-
- const variations = [
- "Transfer-Encoding : chunked",
- "Transfer-Encoding: xchunked",
- "Transfer-Encoding: chunkedx",
- "Transfer-Encoding\n: chunked",
- ];
-
- await promise;
- for (const teHeader of variations) {
- const conn = await Deno.connect({ port: servePort });
- const body =
- `POST / HTTP/1.1\r\nHost: example.domain\r\n${teHeader}\r\n\r\n0\r\n\r\n`;
- const writeResult = await conn.write(encoder.encode(body));
- assertEquals(body.length, writeResult);
-
- const buf = new Uint8Array(1024);
- const readResult = await conn.read(buf);
- assert(readResult);
- const msg = decoder.decode(buf.subarray(0, readResult));
- assert(msg.includes("HTTP/1.1 400 Bad Request\r\n"));
-
- conn.close();
- }
-
- ac.abort();
- await server.finished;
- },
-);
-
-Deno.test(
- { permissions: { net: true } },
- async function httpServer204ResponseDoesntSendContentLength() {
- const { promise, resolve } = Promise.withResolvers<void>();
- const ac = new AbortController();
- const server = Deno.serve({
- handler: (_request) => new Response(null, { status: 204 }),
- port: servePort,
- signal: ac.signal,
- onListen: onListen(resolve),
- onError: createOnErrorCb(ac),
- });
-
- try {
- await promise;
- const resp = await fetch(`http://127.0.0.1:${servePort}/`, {
- method: "GET",
- headers: { "connection": "close" },
- });
- assertEquals(resp.status, 204);
- assertEquals(resp.headers.get("Content-Length"), null);
- } finally {
- ac.abort();
- await server.finished;
- }
- },
-);
-
-Deno.test(
- { permissions: { net: true } },
- async function httpServer304ResponseDoesntSendBody() {
- const deferred = Promise.withResolvers<void>();
- const ac = new AbortController();
- const listeningDeferred = Promise.withResolvers<void>();
-
- const server = Deno.serve({
- handler: () => {
- deferred.resolve();
- return new Response(null, { status: 304 });
- },
- port: servePort,
- signal: ac.signal,
- onListen: onListen(listeningDeferred.resolve),
- onError: createOnErrorCb(ac),
- });
-
- await listeningDeferred.promise;
- const conn = await Deno.connect({ port: servePort });
- const encoder = new TextEncoder();
- const decoder = new TextDecoder();
-
- const body =
- `GET / HTTP/1.1\r\nHost: example.domain\r\nConnection: close\r\n\r\n`;
- const writeResult = await conn.write(encoder.encode(body));
- assertEquals(body.length, writeResult);
-
- await deferred.promise;
-
- const buf = new Uint8Array(1024);
- const readResult = await conn.read(buf);
- assert(readResult);
- const msg = decoder.decode(buf.subarray(0, readResult));
-
- assert(msg.startsWith("HTTP/1.1 304 Not Modified"));
- assert(msg.endsWith("\r\n\r\n"));
-
- conn.close();
-
- ac.abort();
- await server.finished;
- },
-);
-
-Deno.test(
- { permissions: { net: true } },
- async function httpServerExpectContinue() {
- const deferred = Promise.withResolvers<void>();
- const ac = new AbortController();
- const listeningDeferred = Promise.withResolvers<void>();
-
- const server = Deno.serve({
- handler: async (req) => {
- deferred.resolve();
- assertEquals(await req.text(), "hello");
- return new Response(null, { status: 304 });
- },
- port: servePort,
- signal: ac.signal,
- onListen: onListen(listeningDeferred.resolve),
- onError: createOnErrorCb(ac),
- });
-
- await listeningDeferred.promise;
- const conn = await Deno.connect({ port: servePort });
- const encoder = new TextEncoder();
- const decoder = new TextDecoder();
-
- {
- const body =
- `POST / HTTP/1.1\r\nHost: example.domain\r\nExpect: 100-continue\r\nContent-Length: 5\r\nConnection: close\r\n\r\n`;
- const writeResult = await conn.write(encoder.encode(body));
- assertEquals(body.length, writeResult);
- }
-
- await deferred.promise;
-
- {
- const msgExpected = "HTTP/1.1 100 Continue\r\n\r\n";
- const buf = new Uint8Array(encoder.encode(msgExpected).byteLength);
- const readResult = await conn.read(buf);
- assert(readResult);
- const msg = decoder.decode(buf.subarray(0, readResult));
- assert(msg.startsWith(msgExpected));
- }
-
- {
- const body = "hello";
- const writeResult = await conn.write(encoder.encode(body));
- assertEquals(body.length, writeResult);
- }
-
- const buf = new Uint8Array(1024);
- const readResult = await conn.read(buf);
- assert(readResult);
- const msg = decoder.decode(buf.subarray(0, readResult));
-
- assert(msg.startsWith("HTTP/1.1 304 Not Modified"));
- conn.close();
-
- ac.abort();
- await server.finished;
- },
-);
-
-Deno.test(
- { permissions: { net: true } },
- async function httpServerExpectContinueButNoBodyLOL() {
- const deferred = Promise.withResolvers<void>();
- const listeningDeferred = Promise.withResolvers<void>();
- const ac = new AbortController();
-
- const server = Deno.serve({
- handler: async (req) => {
- deferred.resolve();
- assertEquals(await req.text(), "");
- return new Response(null, { status: 304 });
- },
- port: servePort,
- signal: ac.signal,
- onListen: onListen(listeningDeferred.resolve),
- onError: createOnErrorCb(ac),
- });
-
- await listeningDeferred.promise;
- const conn = await Deno.connect({ port: servePort });
- const encoder = new TextEncoder();
- const decoder = new TextDecoder();
-
- {
- // // no content-length or transfer-encoding means no body!
- const body =
- `POST / HTTP/1.1\r\nHost: example.domain\r\nExpect: 100-continue\r\nConnection: close\r\n\r\n`;
- const writeResult = await conn.write(encoder.encode(body));
- assertEquals(body.length, writeResult);
- }
-
- await deferred.promise;
-
- const buf = new Uint8Array(1024);
- const readResult = await conn.read(buf);
- assert(readResult);
- const msg = decoder.decode(buf.subarray(0, readResult));
-
- assert(msg.startsWith("HTTP/1.1 304 Not Modified"));
- conn.close();
-
- ac.abort();
- await server.finished;
- },
-);
-
-const badRequests = [
- ["weirdMethodName", "GE T / HTTP/1.1\r\n\r\n"],
- ["illegalRequestLength", "POST / HTTP/1.1\r\nContent-Length: foo\r\n\r\n"],
- ["illegalRequestLength2", "POST / HTTP/1.1\r\nContent-Length: -1\r\n\r\n"],
- ["illegalRequestLength3", "POST / HTTP/1.1\r\nContent-Length: 1.1\r\n\r\n"],
- ["illegalRequestLength4", "POST / HTTP/1.1\r\nContent-Length: 1.\r\n\r\n"],
-];
-
-for (const [name, req] of badRequests) {
- const testFn = {
- [name]: async () => {
- const ac = new AbortController();
- const { promise, resolve } = Promise.withResolvers<void>();
-
- const server = Deno.serve({
- handler: () => {
- throw new Error("oops");
- },
- port: servePort,
- signal: ac.signal,
- onListen: onListen(resolve),
- onError: createOnErrorCb(ac),
- });
-
- await promise;
- const conn = await Deno.connect({ port: servePort });
- const encoder = new TextEncoder();
- const decoder = new TextDecoder();
-
- {
- const writeResult = await conn.write(encoder.encode(req));
- assertEquals(req.length, writeResult);
- }
-
- const buf = new Uint8Array(100);
- const readResult = await conn.read(buf);
- assert(readResult);
- const msg = decoder.decode(buf.subarray(0, readResult));
-
- assert(msg.startsWith("HTTP/1.1 400 "));
- conn.close();
-
- ac.abort();
- await server.finished;
- },
- }[name];
-
- Deno.test(
- { permissions: { net: true } },
- testFn,
- );
-}
-
-Deno.test(
- { permissions: { net: true } },
- async function httpServerConcurrentRequests() {
- const ac = new AbortController();
- const { resolve } = Promise.withResolvers<void>();
-
- let reqCount = -1;
- let timerId: number | undefined;
- const server = Deno.serve({
- handler: (_req) => {
- reqCount++;
- if (reqCount === 0) {
- const msg = new TextEncoder().encode("data: hello\r\n\r\n");
- // SSE
- const body = new ReadableStream({
- start(controller) {
- timerId = setInterval(() => {
- controller.enqueue(msg);
- }, 1000);
- },
- cancel() {
- if (typeof timerId === "number") {
- clearInterval(timerId);
- }
- },
- });
- return new Response(body, {
- headers: {
- "Content-Type": "text/event-stream",
- },
- });
- }
-
- return new Response(`hello ${reqCount}`);
- },
- port: servePort,
- signal: ac.signal,
- onListen: onListen(resolve),
- onError: createOnErrorCb(ac),
- });
-
- const sseRequest = await fetch(`http://localhost:${servePort}/`);
-
- const decoder = new TextDecoder();
- const stream = sseRequest.body!.getReader();
- {
- const { done, value } = await stream.read();
- assert(!done);
- assertEquals(decoder.decode(value), "data: hello\r\n\r\n");
- }
-
- const helloRequest = await fetch(`http://localhost:${servePort}/`);
- assertEquals(helloRequest.status, 200);
- assertEquals(await helloRequest.text(), "hello 1");
-
- {
- const { done, value } = await stream.read();
- assert(!done);
- assertEquals(decoder.decode(value), "data: hello\r\n\r\n");
- }
-
- await stream.cancel();
- clearInterval(timerId);
- ac.abort();
- await server.finished;
- },
-);
-
-Deno.test(
- { permissions: { net: true } },
- async function serveWithPrototypePollution() {
- const originalThen = Promise.prototype.then;
- const originalSymbolIterator = Array.prototype[Symbol.iterator];
- try {
- Promise.prototype.then = Array.prototype[Symbol.iterator] = () => {
- throw new Error();
- };
- const ac = new AbortController();
- const { resolve } = Promise.withResolvers<void>();
- const server = Deno.serve({
- handler: (_req) => new Response("ok"),
- hostname: "localhost",
- port: servePort,
- signal: ac.signal,
- onListen: onListen(resolve),
- onError: createOnErrorCb(ac),
- });
- ac.abort();
- await server.finished;
- } finally {
- Promise.prototype.then = originalThen;
- Array.prototype[Symbol.iterator] = originalSymbolIterator;
- }
- },
-);
-
-// https://github.com/denoland/deno/issues/15549
-Deno.test(
- { permissions: { net: true } },
- async function testIssue15549() {
- const ac = new AbortController();
- const { promise, resolve } = Promise.withResolvers<void>();
- let count = 0;
- const server = Deno.serve({
- async onListen({ port }: { port: number }) {
- const res1 = await fetch(`http://localhost:${port}/`);
- assertEquals(await res1.text(), "hello world 1");
-
- const res2 = await fetch(`http://localhost:${port}/`);
- assertEquals(await res2.text(), "hello world 2");
-
- resolve();
- ac.abort();
- },
- signal: ac.signal,
- }, () => {
- count++;
- return new Response(`hello world ${count}`);
- });
-
- await promise;
- await server.finished;
- },
-);
-
-// https://github.com/denoland/deno/issues/15858
-Deno.test(
- "Clone should work",
- { permissions: { net: true } },
- async function httpServerCanCloneRequest() {
- const ac = new AbortController();
- const { promise, resolve } = Promise.withResolvers<number>();
-
- const server = Deno.serve({
- handler: async (req) => {
- const cloned = req.clone();
- assertEquals(req.headers, cloned.headers);
-
- assertEquals(cloned.url, req.url);
- assertEquals(cloned.cache, req.cache);
- assertEquals(cloned.destination, req.destination);
- assertEquals(cloned.headers, req.headers);
- assertEquals(cloned.integrity, req.integrity);
- assertEquals(cloned.isHistoryNavigation, req.isHistoryNavigation);
- assertEquals(cloned.isReloadNavigation, req.isReloadNavigation);
- assertEquals(cloned.keepalive, req.keepalive);
- assertEquals(cloned.method, req.method);
- assertEquals(cloned.mode, req.mode);
- assertEquals(cloned.redirect, req.redirect);
- assertEquals(cloned.referrer, req.referrer);
- assertEquals(cloned.referrerPolicy, req.referrerPolicy);
-
- // both requests can read body
- await req.text();
- await cloned.json();
-
- return new Response("ok");
- },
- signal: ac.signal,
- onListen: ({ port }: { port: number }) => resolve(port),
- onError: createOnErrorCb(ac),
- });
-
- try {
- const port = await promise;
- const resp = await fetch(`http://localhost:${port}/`, {
- headers: { connection: "close" },
- method: "POST",
- body: '{"sus":true}',
- });
- const text = await resp.text();
- assertEquals(text, "ok");
- } finally {
- ac.abort();
- await server.finished;
- }
- },
-);
-
-// https://fetch.spec.whatwg.org/#dom-request-clone
-Deno.test(
- "Throw if disturbed",
- { permissions: { net: true } },
- async function shouldThrowIfBodyIsUnusableDisturbed() {
- const ac = new AbortController();
- const { promise, resolve } = Promise.withResolvers<number>();
-
- const server = Deno.serve({
- handler: async (req) => {
- await req.text();
-
- try {
- req.clone();
- fail();
- } catch (cloneError) {
- assert(cloneError instanceof TypeError);
- assert(
- cloneError.message.endsWith("Body is unusable."),
- );
-
- ac.abort();
- await server.finished;
- }
-
- return new Response("ok");
- },
- signal: ac.signal,
- onListen: ({ port }: { port: number }) => resolve(port),
- });
-
- try {
- const port = await promise;
- await fetch(`http://localhost:${port}/`, {
- headers: { connection: "close" },
- method: "POST",
- body: '{"bar":true}',
- });
- fail();
- } catch (clientError) {
- assert(clientError instanceof TypeError);
- assert(
- clientError.message.endsWith(
- "connection closed before message completed",
- ),
- );
- } finally {
- ac.abort();
- await server.finished;
- }
- },
-);
-
-// https://fetch.spec.whatwg.org/#dom-request-clone
-Deno.test({
- name: "Throw if locked",
- permissions: { net: true },
- fn: async function shouldThrowIfBodyIsUnusableLocked() {
- const ac = new AbortController();
- const { promise, resolve } = Promise.withResolvers<number>();
-
- const server = Deno.serve({
- handler: async (req) => {
- const _reader = req.body?.getReader();
-
- try {
- req.clone();
- fail();
- } catch (cloneError) {
- assert(cloneError instanceof TypeError);
- assert(
- cloneError.message.endsWith("Body is unusable."),
- );
-
- ac.abort();
- await server.finished;
- }
- return new Response("ok");
- },
- signal: ac.signal,
- onListen: ({ port }: { port: number }) => resolve(port),
- });
-
- try {
- const port = await promise;
- await fetch(`http://localhost:${port}/`, {
- headers: { connection: "close" },
- method: "POST",
- body: '{"bar":true}',
- });
- fail();
- } catch (clientError) {
- assert(clientError instanceof TypeError);
- assert(
- clientError.message.endsWith(
- "connection closed before message completed",
- ),
- );
- } finally {
- ac.abort();
- await server.finished;
- }
- },
-});
-
-// Checks large streaming response
-// https://github.com/denoland/deno/issues/16567
-Deno.test(
- { permissions: { net: true } },
- async function testIssue16567() {
- const ac = new AbortController();
- const { promise, resolve } = Promise.withResolvers<void>();
- const server = Deno.serve({
- async onListen({ port }) {
- const res1 = await fetch(`http://localhost:${port}/`);
- assertEquals((await res1.text()).length, 40 * 50_000);
-
- resolve();
- ac.abort();
- },
- signal: ac.signal,
- }, () =>
- new Response(
- new ReadableStream({
- start(c) {
- // 2MB "a...a" response with 40 chunks
- for (const _ of Array(40)) {
- c.enqueue(new Uint8Array(50_000).fill(97));
- }
- c.close();
- },
- }),
- ));
-
- await promise;
- await server.finished;
- },
-);
-
-function chunkedBodyReader(h: Headers, r: BufReader): Deno.Reader {
- // Based on https://tools.ietf.org/html/rfc2616#section-19.4.6
- const tp = new TextProtoReader(r);
- let finished = false;
- const chunks: Array<{
- offset: number;
- data: Uint8Array;
- }> = [];
- async function read(buf: Uint8Array): Promise<number | null> {
- if (finished) return null;
- const [chunk] = chunks;
- if (chunk) {
- const chunkRemaining = chunk.data.byteLength - chunk.offset;
- const readLength = Math.min(chunkRemaining, buf.byteLength);
- for (let i = 0; i < readLength; i++) {
- buf[i] = chunk.data[chunk.offset + i];
- }
- chunk.offset += readLength;
- if (chunk.offset === chunk.data.byteLength) {
- chunks.shift();
- // Consume \r\n;
- if ((await tp.readLine()) === null) {
- throw new Deno.errors.UnexpectedEof();
- }
- }
- return readLength;
- }
- const line = await tp.readLine();
- if (line === null) throw new Deno.errors.UnexpectedEof();
- // TODO(bartlomieju): handle chunk extension
- const [chunkSizeString] = line.split(";");
- const chunkSize = parseInt(chunkSizeString, 16);
- if (Number.isNaN(chunkSize) || chunkSize < 0) {
- throw new Deno.errors.InvalidData("Invalid chunk size");
- }
- if (chunkSize > 0) {
- if (chunkSize > buf.byteLength) {
- let eof = await r.readFull(buf);
- if (eof === null) {
- throw new Deno.errors.UnexpectedEof();
- }
- const restChunk = new Uint8Array(chunkSize - buf.byteLength);
- eof = await r.readFull(restChunk);
- if (eof === null) {
- throw new Deno.errors.UnexpectedEof();
- } else {
- chunks.push({
- offset: 0,
- data: restChunk,
- });
- }
- return buf.byteLength;
- } else {
- const bufToFill = buf.subarray(0, chunkSize);
- const eof = await r.readFull(bufToFill);
- if (eof === null) {
- throw new Deno.errors.UnexpectedEof();
- }
- // Consume \r\n
- if ((await tp.readLine()) === null) {
- throw new Deno.errors.UnexpectedEof();
- }
- return chunkSize;
- }
- } else {
- assert(chunkSize === 0);
- // Consume \r\n
- if ((await r.readLine()) === null) {
- throw new Deno.errors.UnexpectedEof();
- }
- await readTrailers(h, r);
- finished = true;
- return null;
- }
- }
- return { read };
-}
-
-async function readTrailers(
- headers: Headers,
- r: BufReader,
-) {
- const trailers = parseTrailer(headers.get("trailer"));
- if (trailers == null) return;
- const trailerNames = [...trailers.keys()];
- const tp = new TextProtoReader(r);
- const result = await tp.readMimeHeader();
- if (result == null) {
- throw new Deno.errors.InvalidData("Missing trailer header.");
- }
- const undeclared = [...result.keys()].filter(
- (k) => !trailerNames.includes(k),
- );
- if (undeclared.length > 0) {
- throw new Deno.errors.InvalidData(
- `Undeclared trailers: ${Deno.inspect(undeclared)}.`,
- );
- }
- for (const [k, v] of result) {
- headers.append(k, v);
- }
- const missingTrailers = trailerNames.filter((k) => !result.has(k));
- if (missingTrailers.length > 0) {
- throw new Deno.errors.InvalidData(
- `Missing trailers: ${Deno.inspect(missingTrailers)}.`,
- );
- }
- headers.delete("trailer");
-}
-
-function parseTrailer(field: string | null): Headers | undefined {
- if (field == null) {
- return undefined;
- }
- const trailerNames = field.split(",").map((v) => v.trim().toLowerCase());
- if (trailerNames.length === 0) {
- throw new Deno.errors.InvalidData("Empty trailer header.");
- }
- const prohibited = trailerNames.filter((k) => isProhibitedForTrailer(k));
- if (prohibited.length > 0) {
- throw new Deno.errors.InvalidData(
- `Prohibited trailer names: ${Deno.inspect(prohibited)}.`,
- );
- }
- return new Headers(trailerNames.map((key) => [key, ""]));
-}
-
-function isProhibitedForTrailer(key: string): boolean {
- const s = new Set(["transfer-encoding", "content-length", "trailer"]);
- return s.has(key.toLowerCase());
-}
-
-// TODO(mmastrac): curl on Windows CI stopped supporting --http2?
-Deno.test(
- {
- permissions: { net: true, run: true },
- ignore: Deno.build.os === "windows",
- },
- async function httpServeCurlH2C() {
- const ac = new AbortController();
- const server = Deno.serve(
- { port: servePort, signal: ac.signal },
- () => new Response("hello world!"),
- );
-
- assertEquals(
- "hello world!",
- await curlRequest([`http://localhost:${servePort}/path`]),
- );
- assertEquals(
- "hello world!",
- await curlRequest([`http://localhost:${servePort}/path`, "--http2"]),
- );
- assertEquals(
- "hello world!",
- await curlRequest([
- `http://localhost:${servePort}/path`,
- "--http2",
- "--http2-prior-knowledge",
- ]),
- );
-
- ac.abort();
- await server.finished;
- },
-);
-
-// TODO(mmastrac): This test should eventually use fetch, when we support trailers there.
-// This test is ignored because it's flaky and relies on cURL's verbose output.
-Deno.test(
- { permissions: { net: true, run: true, read: true }, ignore: true },
- async function httpServerTrailers() {
- const ac = new AbortController();
- const { resolve } = Promise.withResolvers<void>();
-
- const server = Deno.serve({
- handler: () => {
- const response = new Response("Hello World", {
- headers: {
- "trailer": "baz",
- "transfer-encoding": "chunked",
- "foo": "bar",
- },
- });
- addTrailers(response, [["baz", "why"]]);
- return response;
- },
- port: servePort,
- signal: ac.signal,
- onListen: onListen(resolve),
- onError: createOnErrorCb(ac),
- });
-
- // We don't have a great way to access this right now, so just fetch the trailers with cURL
- const [_, stderr] = await curlRequestWithStdErr([
- `http://localhost:${servePort}/path`,
- "-v",
- "--http2",
- "--http2-prior-knowledge",
- ]);
- assertMatch(stderr, /baz: why/);
- ac.abort();
- await server.finished;
- },
-);
-
-// TODO(mmastrac): curl on CI stopped supporting --http2?
-Deno.test(
- {
- permissions: {
- net: true,
- run: true,
- read: true,
- },
- ignore: Deno.build.os === "windows",
- },
- async function httpsServeCurlH2C() {
- const ac = new AbortController();
- const server = Deno.serve(
- {
- signal: ac.signal,
- port: servePort,
- cert: Deno.readTextFileSync("cli/tests/testdata/tls/localhost.crt"),
- key: Deno.readTextFileSync("cli/tests/testdata/tls/localhost.key"),
- },
- () => new Response("hello world!"),
- );
-
- assertEquals(
- "hello world!",
- await curlRequest([`https://localhost:${servePort}/path`, "-k"]),
- );
- assertEquals(
- "hello world!",
- await curlRequest([
- `https://localhost:${servePort}/path`,
- "-k",
- "--http2",
- ]),
- );
- assertEquals(
- "hello world!",
- await curlRequest([
- `https://localhost:${servePort}/path`,
- "-k",
- "--http2",
- "--http2-prior-knowledge",
- ]),
- );
-
- ac.abort();
- await server.finished;
- },
-);
-
-async function curlRequest(args: string[]) {
- const { success, stdout, stderr } = await new Deno.Command("curl", {
- args,
- stdout: "piped",
- stderr: "piped",
- }).output();
- assert(
- success,
- `Failed to cURL ${args}: stdout\n\n${stdout}\n\nstderr:\n\n${stderr}`,
- );
- return new TextDecoder().decode(stdout);
-}
-
-async function curlRequestWithStdErr(args: string[]) {
- const { success, stdout, stderr } = await new Deno.Command("curl", {
- args,
- stdout: "piped",
- stderr: "piped",
- }).output();
- assert(
- success,
- `Failed to cURL ${args}: stdout\n\n${stdout}\n\nstderr:\n\n${stderr}`,
- );
- return [new TextDecoder().decode(stdout), new TextDecoder().decode(stderr)];
-}
-
-Deno.test("Deno.HttpServer is not thenable", async () => {
- // deno-lint-ignore require-await
- async function serveTest() {
- const server = Deno.serve({ port: servePort }, (_) => new Response(""));
- assert(!("then" in server));
- return server;
- }
- const server = await serveTest();
- await server.shutdown();
-});
-
-Deno.test(
- {
- ignore: Deno.build.os === "windows",
- permissions: { run: true, read: true, write: true },
- },
- async function httpServerUnixDomainSocket() {
- const { promise, resolve } = Promise.withResolvers<{ path: string }>();
- const ac = new AbortController();
- const filePath = tmpUnixSocketPath();
- const server = Deno.serve(
- {
- signal: ac.signal,
- path: filePath,
- onListen(info) {
- resolve(info);
- },
- onError: createOnErrorCb(ac),
- },
- (_req, { remoteAddr }) => {
- assertEquals(remoteAddr, { path: filePath, transport: "unix" });
- return new Response("hello world!");
- },
- );
-
- assertEquals(await promise, { path: filePath });
- assertEquals(
- "hello world!",
- await curlRequest(["--unix-socket", filePath, "http://localhost"]),
- );
- ac.abort();
- await server.finished;
- },
-);
-
-// serve Handler must return Response class or promise that resolves Response class
-Deno.test(
- { permissions: { net: true, run: true } },
- async function handleServeCallbackReturn() {
- const deferred = Promise.withResolvers<void>();
- const listeningDeferred = Promise.withResolvers<void>();
- const ac = new AbortController();
-
- const server = Deno.serve(
- {
- port: servePort,
- onListen: onListen(listeningDeferred.resolve),
- signal: ac.signal,
- onError: (error) => {
- assert(error instanceof TypeError);
- assert(
- error.message ===
- "Return value from serve handler must be a response or a promise resolving to a response",
- );
- deferred.resolve();
- return new Response("Customized Internal Error from onError");
- },
- },
- () => {
- // Trick the typechecker
- return <Response> <unknown> undefined;
- },
- );
- await listeningDeferred.promise;
- const respText = await curlRequest([`http://localhost:${servePort}`]);
- await deferred.promise;
- ac.abort();
- await server.finished;
- assert(respText === "Customized Internal Error from onError");
- },
-);
-
-// onError Handler must return Response class or promise that resolves Response class
-Deno.test(
- { permissions: { net: true, run: true } },
- async function handleServeErrorCallbackReturn() {
- const { promise, resolve } = Promise.withResolvers<void>();
- const ac = new AbortController();
-
- const server = Deno.serve(
- {
- port: servePort,
- onListen: onListen(resolve),
- signal: ac.signal,
- onError: () => {
- // Trick the typechecker
- return <Response> <unknown> undefined;
- },
- },
- () => {
- // Trick the typechecker
- return <Response> <unknown> undefined;
- },
- );
- await promise;
- const respText = await curlRequest([`http://localhost:${servePort}`]);
- ac.abort();
- await server.finished;
- assert(respText === "Internal Server Error");
- },
-);
diff --git a/cli/tests/unit/stat_test.ts b/cli/tests/unit/stat_test.ts
deleted file mode 100644
index ccb17b164..000000000
--- a/cli/tests/unit/stat_test.ts
+++ /dev/null
@@ -1,342 +0,0 @@
-// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
-import {
- assert,
- assertEquals,
- assertRejects,
- assertThrows,
- pathToAbsoluteFileUrl,
-} from "./test_util.ts";
-
-Deno.test({ permissions: { read: true } }, function fstatSyncSuccess() {
- using file = Deno.openSync("README.md");
- const fileInfo = Deno.fstatSync(file.rid);
- assert(fileInfo.isFile);
- assert(!fileInfo.isSymlink);
- assert(!fileInfo.isDirectory);
- assert(fileInfo.size);
- assert(fileInfo.atime);
- assert(fileInfo.mtime);
- // The `birthtime` field is not available on Linux before kernel version 4.11.
- assert(fileInfo.birthtime || Deno.build.os === "linux");
-});
-
-Deno.test({ permissions: { read: true } }, async function fstatSuccess() {
- using file = await Deno.open("README.md");
- const fileInfo = await Deno.fstat(file.rid);
- assert(fileInfo.isFile);
- assert(!fileInfo.isSymlink);
- assert(!fileInfo.isDirectory);
- assert(fileInfo.size);
- assert(fileInfo.atime);
- assert(fileInfo.mtime);
- // The `birthtime` field is not available on Linux before kernel version 4.11.
- assert(fileInfo.birthtime || Deno.build.os === "linux");
-});
-
-Deno.test(
- { permissions: { read: true, write: true } },
- function statSyncSuccess() {
- const readmeInfo = Deno.statSync("README.md");
- assert(readmeInfo.isFile);
- assert(!readmeInfo.isSymlink);
-
- const modulesInfo = Deno.statSync("cli/tests/testdata/symlink_to_subdir");
- assert(modulesInfo.isDirectory);
- assert(!modulesInfo.isSymlink);
-
- const testsInfo = Deno.statSync("cli/tests");
- assert(testsInfo.isDirectory);
- assert(!testsInfo.isSymlink);
-
- const tempFile = Deno.makeTempFileSync();
- const tempInfo = Deno.statSync(tempFile);
- let now = Date.now();
- assert(tempInfo.atime !== null && now - tempInfo.atime.valueOf() < 1000);
- assert(tempInfo.mtime !== null && now - tempInfo.mtime.valueOf() < 1000);
- assert(
- tempInfo.birthtime === null || now - tempInfo.birthtime.valueOf() < 1000,
- );
-
- const readmeInfoByUrl = Deno.statSync(pathToAbsoluteFileUrl("README.md"));
- assert(readmeInfoByUrl.isFile);
- assert(!readmeInfoByUrl.isSymlink);
-
- const modulesInfoByUrl = Deno.statSync(
- pathToAbsoluteFileUrl("cli/tests/testdata/symlink_to_subdir"),
- );
- assert(modulesInfoByUrl.isDirectory);
- assert(!modulesInfoByUrl.isSymlink);
-
- const testsInfoByUrl = Deno.statSync(pathToAbsoluteFileUrl("cli/tests"));
- assert(testsInfoByUrl.isDirectory);
- assert(!testsInfoByUrl.isSymlink);
-
- const tempFileForUrl = Deno.makeTempFileSync();
- const tempInfoByUrl = Deno.statSync(
- new URL(
- `file://${Deno.build.os === "windows" ? "/" : ""}${tempFileForUrl}`,
- ),
- );
- now = Date.now();
- assert(
- tempInfoByUrl.atime !== null &&
- now - tempInfoByUrl.atime.valueOf() < 1000,
- );
- assert(
- tempInfoByUrl.mtime !== null &&
- now - tempInfoByUrl.mtime.valueOf() < 1000,
- );
- assert(
- tempInfoByUrl.birthtime === null ||
- now - tempInfoByUrl.birthtime.valueOf() < 1000,
- );
-
- Deno.removeSync(tempFile, { recursive: true });
- Deno.removeSync(tempFileForUrl, { recursive: true });
- },
-);
-
-Deno.test({ permissions: { read: false } }, function statSyncPerm() {
- assertThrows(() => {
- Deno.statSync("README.md");
- }, Deno.errors.PermissionDenied);
-});
-
-Deno.test({ permissions: { read: true } }, function statSyncNotFound() {
- assertThrows(
- () => {
- Deno.statSync("bad_file_name");
- },
- Deno.errors.NotFound,
- `stat 'bad_file_name'`,
- );
-});
-
-Deno.test({ permissions: { read: true } }, function lstatSyncSuccess() {
- const packageInfo = Deno.lstatSync("README.md");
- assert(packageInfo.isFile);
- assert(!packageInfo.isSymlink);
-
- const packageInfoByUrl = Deno.lstatSync(pathToAbsoluteFileUrl("README.md"));
- assert(packageInfoByUrl.isFile);
- assert(!packageInfoByUrl.isSymlink);
-
- const modulesInfo = Deno.lstatSync("cli/tests/testdata/symlink_to_subdir");
- assert(!modulesInfo.isDirectory);
- assert(modulesInfo.isSymlink);
-
- const modulesInfoByUrl = Deno.lstatSync(
- pathToAbsoluteFileUrl("cli/tests/testdata/symlink_to_subdir"),
- );
- assert(!modulesInfoByUrl.isDirectory);
- assert(modulesInfoByUrl.isSymlink);
-
- const coreInfo = Deno.lstatSync("cli");
- assert(coreInfo.isDirectory);
- assert(!coreInfo.isSymlink);
-
- const coreInfoByUrl = Deno.lstatSync(pathToAbsoluteFileUrl("cli"));
- assert(coreInfoByUrl.isDirectory);
- assert(!coreInfoByUrl.isSymlink);
-});
-
-Deno.test({ permissions: { read: false } }, function lstatSyncPerm() {
- assertThrows(() => {
- Deno.lstatSync("assets/hello.txt");
- }, Deno.errors.PermissionDenied);
-});
-
-Deno.test({ permissions: { read: true } }, function lstatSyncNotFound() {
- assertThrows(
- () => {
- Deno.lstatSync("bad_file_name");
- },
- Deno.errors.NotFound,
- `stat 'bad_file_name'`,
- );
-});
-
-Deno.test(
- { permissions: { read: true, write: true } },
- async function statSuccess() {
- const readmeInfo = await Deno.stat("README.md");
- assert(readmeInfo.isFile);
- assert(!readmeInfo.isSymlink);
-
- const readmeInfoByUrl = await Deno.stat(
- pathToAbsoluteFileUrl("README.md"),
- );
- assert(readmeInfoByUrl.isFile);
- assert(!readmeInfoByUrl.isSymlink);
-
- const modulesInfo = await Deno.stat("cli/tests/testdata/symlink_to_subdir");
- assert(modulesInfo.isDirectory);
- assert(!modulesInfo.isSymlink);
-
- const modulesInfoByUrl = await Deno.stat(
- pathToAbsoluteFileUrl("cli/tests/testdata/symlink_to_subdir"),
- );
- assert(modulesInfoByUrl.isDirectory);
- assert(!modulesInfoByUrl.isSymlink);
-
- const testsInfo = await Deno.stat("cli/tests");
- assert(testsInfo.isDirectory);
- assert(!testsInfo.isSymlink);
-
- const testsInfoByUrl = await Deno.stat(pathToAbsoluteFileUrl("cli/tests"));
- assert(testsInfoByUrl.isDirectory);
- assert(!testsInfoByUrl.isSymlink);
-
- const tempFile = await Deno.makeTempFile();
- const tempInfo = await Deno.stat(tempFile);
- let now = Date.now();
- assert(tempInfo.atime !== null && now - tempInfo.atime.valueOf() < 1000);
- assert(tempInfo.mtime !== null && now - tempInfo.mtime.valueOf() < 1000);
-
- assert(
- tempInfo.birthtime === null || now - tempInfo.birthtime.valueOf() < 1000,
- );
-
- const tempFileForUrl = await Deno.makeTempFile();
- const tempInfoByUrl = await Deno.stat(
- new URL(
- `file://${Deno.build.os === "windows" ? "/" : ""}${tempFileForUrl}`,
- ),
- );
- now = Date.now();
- assert(
- tempInfoByUrl.atime !== null &&
- now - tempInfoByUrl.atime.valueOf() < 1000,
- );
- assert(
- tempInfoByUrl.mtime !== null &&
- now - tempInfoByUrl.mtime.valueOf() < 1000,
- );
- assert(
- tempInfoByUrl.birthtime === null ||
- now - tempInfoByUrl.birthtime.valueOf() < 1000,
- );
-
- Deno.removeSync(tempFile, { recursive: true });
- Deno.removeSync(tempFileForUrl, { recursive: true });
- },
-);
-
-Deno.test({ permissions: { read: false } }, async function statPerm() {
- await assertRejects(async () => {
- await Deno.stat("README.md");
- }, Deno.errors.PermissionDenied);
-});
-
-Deno.test({ permissions: { read: true } }, async function statNotFound() {
- await assertRejects(
- async () => {
- await Deno.stat("bad_file_name");
- },
- Deno.errors.NotFound,
- `stat 'bad_file_name'`,
- );
-});
-
-Deno.test({ permissions: { read: true } }, async function lstatSuccess() {
- const readmeInfo = await Deno.lstat("README.md");
- assert(readmeInfo.isFile);
- assert(!readmeInfo.isSymlink);
-
- const readmeInfoByUrl = await Deno.lstat(pathToAbsoluteFileUrl("README.md"));
- assert(readmeInfoByUrl.isFile);
- assert(!readmeInfoByUrl.isSymlink);
-
- const modulesInfo = await Deno.lstat("cli/tests/testdata/symlink_to_subdir");
- assert(!modulesInfo.isDirectory);
- assert(modulesInfo.isSymlink);
-
- const modulesInfoByUrl = await Deno.lstat(
- pathToAbsoluteFileUrl("cli/tests/testdata/symlink_to_subdir"),
- );
- assert(!modulesInfoByUrl.isDirectory);
- assert(modulesInfoByUrl.isSymlink);
-
- const coreInfo = await Deno.lstat("cli");
- assert(coreInfo.isDirectory);
- assert(!coreInfo.isSymlink);
-
- const coreInfoByUrl = await Deno.lstat(pathToAbsoluteFileUrl("cli"));
- assert(coreInfoByUrl.isDirectory);
- assert(!coreInfoByUrl.isSymlink);
-});
-
-Deno.test({ permissions: { read: false } }, async function lstatPerm() {
- await assertRejects(async () => {
- await Deno.lstat("README.md");
- }, Deno.errors.PermissionDenied);
-});
-
-Deno.test({ permissions: { read: true } }, async function lstatNotFound() {
- await assertRejects(
- async () => {
- await Deno.lstat("bad_file_name");
- },
- Deno.errors.NotFound,
- `stat 'bad_file_name'`,
- );
-});
-
-Deno.test(
- {
- ignore: Deno.build.os !== "windows",
- permissions: { read: true, write: true },
- },
- function statNoUnixFields() {
- const enc = new TextEncoder();
- const data = enc.encode("Hello");
- const tempDir = Deno.makeTempDirSync();
- const filename = tempDir + "/test.txt";
- Deno.writeFileSync(filename, data, { mode: 0o666 });
- const s = Deno.statSync(filename);
- assert(s.dev !== 0);
- assert(s.ino === null);
- assert(s.mode === null);
- assert(s.nlink === null);
- assert(s.uid === null);
- assert(s.gid === null);
- assert(s.rdev === null);
- assert(s.blksize === null);
- assert(s.blocks === null);
- assert(s.isBlockDevice === null);
- assert(s.isCharDevice === null);
- assert(s.isFifo === null);
- assert(s.isSocket === null);
- },
-);
-
-Deno.test(
- {
- ignore: Deno.build.os === "windows",
- permissions: { read: true, write: true },
- },
- function statUnixFields() {
- const enc = new TextEncoder();
- const data = enc.encode("Hello");
- const tempDir = Deno.makeTempDirSync();
- const filename = tempDir + "/test.txt";
- const filename2 = tempDir + "/test2.txt";
- Deno.writeFileSync(filename, data, { mode: 0o666 });
- // Create a link
- Deno.linkSync(filename, filename2);
- const s = Deno.statSync(filename);
- assert(s.dev !== null);
- assert(s.ino !== null);
- assertEquals(s.mode! & 0o666, 0o666);
- assertEquals(s.nlink, 2);
- assert(s.uid !== null);
- assert(s.gid !== null);
- assert(s.rdev !== null);
- assert(s.blksize !== null);
- assert(s.blocks !== null);
- assert(!s.isBlockDevice);
- assert(!s.isCharDevice);
- assert(!s.isFifo);
- assert(!s.isSocket);
- },
-);
diff --git a/cli/tests/unit/tls_test.ts b/cli/tests/unit/tls_test.ts
deleted file mode 100644
index bbf48cf8f..000000000
--- a/cli/tests/unit/tls_test.ts
+++ /dev/null
@@ -1,1546 +0,0 @@
-// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
-import {
- assert,
- assertEquals,
- assertNotEquals,
- assertRejects,
- assertStrictEquals,
- assertThrows,
-} from "./test_util.ts";
-import { BufReader, BufWriter } from "@test_util/std/io/mod.ts";
-import { readAll } from "@test_util/std/streams/read_all.ts";
-import { writeAll } from "@test_util/std/streams/write_all.ts";
-import { TextProtoReader } from "../testdata/run/textproto.ts";
-
-const encoder = new TextEncoder();
-const decoder = new TextDecoder();
-const cert = await Deno.readTextFile("cli/tests/testdata/tls/localhost.crt");
-const key = await Deno.readTextFile("cli/tests/testdata/tls/localhost.key");
-const caCerts = [await Deno.readTextFile("cli/tests/testdata/tls/RootCA.pem")];
-
-async function sleep(msec: number) {
- await new Promise((res, _rej) => setTimeout(res, msec));
-}
-
-function unreachable(): never {
- throw new Error("Unreachable code reached");
-}
-
-Deno.test({ permissions: { net: false } }, async function connectTLSNoPerm() {
- await assertRejects(async () => {
- await Deno.connectTls({ hostname: "deno.land", port: 443 });
- }, Deno.errors.PermissionDenied);
-});
-
-Deno.test(
- { permissions: { read: true, net: true } },
- async function connectTLSInvalidHost() {
- await assertRejects(async () => {
- await Deno.connectTls({ hostname: "256.0.0.0", port: 3567 });
- }, TypeError);
- },
-);
-
-Deno.test(
- { permissions: { net: true, read: false } },
- async function connectTLSCertFileNoReadPerm() {
- await assertRejects(async () => {
- await Deno.connectTls({
- hostname: "deno.land",
- port: 443,
- certFile: "cli/tests/testdata/tls/RootCA.crt",
- });
- }, Deno.errors.PermissionDenied);
- },
-);
-
-Deno.test(
- { permissions: { read: true, net: true } },
- function listenTLSNonExistentCertKeyFiles() {
- const options = {
- hostname: "localhost",
- port: 3500,
- certFile: "cli/tests/testdata/tls/localhost.crt",
- keyFile: "cli/tests/testdata/tls/localhost.key",
- };
-
- assertThrows(() => {
- Deno.listenTls({
- ...options,
- certFile: "./non/existent/file",
- });
- }, Deno.errors.NotFound);
-
- assertThrows(() => {
- Deno.listenTls({
- ...options,
- keyFile: "./non/existent/file",
- });
- }, Deno.errors.NotFound);
- },
-);
-
-Deno.test(
- { permissions: { net: true, read: false } },
- function listenTLSNoReadPerm() {
- assertThrows(() => {
- Deno.listenTls({
- hostname: "localhost",
- port: 3500,
- certFile: "cli/tests/testdata/tls/localhost.crt",
- keyFile: "cli/tests/testdata/tls/localhost.key",
- });
- }, Deno.errors.PermissionDenied);
- },
-);
-
-Deno.test(
- {
- permissions: { read: true, write: true, net: true },
- },
- function listenTLSEmptyKeyFile() {
- const options = {
- hostname: "localhost",
- port: 3500,
- certFile: "cli/tests/testdata/tls/localhost.crt",
- keyFile: "cli/tests/testdata/tls/localhost.key",
- };
-
- const testDir = Deno.makeTempDirSync();
- const keyFilename = testDir + "/key.pem";
- Deno.writeFileSync(keyFilename, new Uint8Array([]), {
- mode: 0o666,
- });
-
- assertThrows(() => {
- Deno.listenTls({
- ...options,
- keyFile: keyFilename,
- });
- }, Error);
- },
-);
-
-Deno.test(
- { permissions: { read: true, write: true, net: true } },
- function listenTLSEmptyCertFile() {
- const options = {
- hostname: "localhost",
- port: 3500,
- certFile: "cli/tests/testdata/tls/localhost.crt",
- keyFile: "cli/tests/testdata/tls/localhost.key",
- };
-
- const testDir = Deno.makeTempDirSync();
- const certFilename = testDir + "/cert.crt";
- Deno.writeFileSync(certFilename, new Uint8Array([]), {
- mode: 0o666,
- });
-
- assertThrows(() => {
- Deno.listenTls({
- ...options,
- certFile: certFilename,
- });
- }, Error);
- },
-);
-
-Deno.test(
- { permissions: { net: true } },
- async function startTlsWithoutExclusiveAccessToTcpConn() {
- const hostname = "localhost";
- const port = getPort();
-
- const tcpListener = Deno.listen({ hostname, port });
- const [serverConn, clientConn] = await Promise.all([
- tcpListener.accept(),
- Deno.connect({ hostname, port }),
- ]);
-
- const buf = new Uint8Array(128);
- const readPromise = clientConn.read(buf);
- // `clientConn` is being used by a pending promise (`readPromise`) so
- // `Deno.startTls` cannot consume the connection.
- await assertRejects(
- () => Deno.startTls(clientConn, { hostname }),
- Deno.errors.BadResource,
- );
-
- serverConn.close();
- tcpListener.close();
- await readPromise;
- },
-);
-
-Deno.test(
- { permissions: { read: true, net: true } },
- async function dialAndListenTLS() {
- const { promise, resolve } = Promise.withResolvers<void>();
- const hostname = "localhost";
- const port = 3500;
-
- const listener = Deno.listenTls({
- hostname,
- port,
- cert: await Deno.readTextFile("cli/tests/testdata/tls/localhost.crt"),
- key: await Deno.readTextFile("cli/tests/testdata/tls/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, caCerts });
- assert(conn.rid > 0);
- 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;
- },
-);
-Deno.test(
- { permissions: { read: false, net: true } },
- async function listenTlsWithCertAndKey() {
- const { promise, resolve } = Promise.withResolvers<void>();
- const hostname = "localhost";
- const port = 3500;
-
- const listener = Deno.listenTls({ hostname, port, cert, 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);
- setTimeout(() => {
- conn.close();
- resolve();
- }, 0);
- },
- );
-
- const conn = await Deno.connectTls({ hostname, port, caCerts });
- assert(conn.rid > 0);
- 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;
- },
-);
-
-let nextPort = 3501;
-function getPort() {
- return nextPort++;
-}
-
-async function tlsPair(): Promise<[Deno.Conn, Deno.Conn]> {
- const port = getPort();
- const listener = Deno.listenTls({
- hostname: "localhost",
- port,
- cert: await Deno.readTextFile("cli/tests/testdata/tls/localhost.crt"),
- key: await Deno.readTextFile("cli/tests/testdata/tls/localhost.key"),
- });
-
- const acceptPromise = listener.accept();
- const connectPromise = Deno.connectTls({
- hostname: "localhost",
- port,
- caCerts: [Deno.readTextFileSync("cli/tests/testdata/tls/RootCA.pem")],
- });
- const endpoints = await Promise.all([acceptPromise, connectPromise]);
-
- listener.close();
-
- return endpoints;
-}
-
-async function tlsAlpn(
- useStartTls: boolean,
-): Promise<[Deno.TlsConn, Deno.TlsConn]> {
- const port = getPort();
- const listener = Deno.listenTls({
- hostname: "localhost",
- port,
- cert: await Deno.readTextFile("cli/tests/testdata/tls/localhost.crt"),
- key: await Deno.readTextFile("cli/tests/testdata/tls/localhost.key"),
- alpnProtocols: ["deno", "rocks"],
- });
-
- const acceptPromise = listener.accept();
-
- const caCerts = [Deno.readTextFileSync("cli/tests/testdata/tls/RootCA.pem")];
- const clientAlpnProtocols = ["rocks", "rises"];
- let endpoints: [Deno.TlsConn, Deno.TlsConn];
-
- if (!useStartTls) {
- const connectPromise = Deno.connectTls({
- hostname: "localhost",
- port,
- caCerts,
- alpnProtocols: clientAlpnProtocols,
- });
- endpoints = await Promise.all([acceptPromise, connectPromise]);
- } else {
- const client = await Deno.connect({
- hostname: "localhost",
- port,
- });
- const connectPromise = Deno.startTls(client, {
- hostname: "localhost",
- caCerts,
- alpnProtocols: clientAlpnProtocols,
- });
- endpoints = await Promise.all([acceptPromise, connectPromise]);
- }
-
- listener.close();
- return endpoints;
-}
-
-async function sendThenCloseWriteThenReceive(
- conn: Deno.Conn,
- chunkCount: number,
- chunkSize: number,
-) {
- const byteCount = chunkCount * chunkSize;
- const buf = new Uint8Array(chunkSize); // Note: buf is size of _chunk_.
- let n: number;
-
- // Slowly send 42s.
- buf.fill(42);
- for (let remaining = byteCount; remaining > 0; remaining -= n) {
- n = await conn.write(buf.subarray(0, remaining));
- assert(n >= 1);
- await sleep(10);
- }
-
- // Send EOF.
- await conn.closeWrite();
-
- // Receive 69s.
- for (let remaining = byteCount; remaining > 0; remaining -= n) {
- buf.fill(0);
- n = await conn.read(buf) as number;
- assert(n >= 1);
- assertStrictEquals(buf[0], 69);
- assertStrictEquals(buf[n - 1], 69);
- }
-
- conn.close();
-}
-
-async function receiveThenSend(
- conn: Deno.Conn,
- chunkCount: number,
- chunkSize: number,
-) {
- const byteCount = chunkCount * chunkSize;
- const buf = new Uint8Array(byteCount); // Note: buf size equals `byteCount`.
- let n: number;
-
- // Receive 42s.
- for (let remaining = byteCount; remaining > 0; remaining -= n) {
- buf.fill(0);
- n = await conn.read(buf) as number;
- assert(n >= 1);
- assertStrictEquals(buf[0], 42);
- assertStrictEquals(buf[n - 1], 42);
- }
-
- // Slowly send 69s.
- buf.fill(69);
- for (let remaining = byteCount; remaining > 0; remaining -= n) {
- n = await conn.write(buf.subarray(0, remaining));
- assert(n >= 1);
- await sleep(10);
- }
-
- conn.close();
-}
-
-Deno.test(
- { permissions: { read: true, net: true } },
- async function tlsServerAlpnListenConnect() {
- const [serverConn, clientConn] = await tlsAlpn(false);
- const [serverHS, clientHS] = await Promise.all([
- serverConn.handshake(),
- clientConn.handshake(),
- ]);
- assertStrictEquals(serverHS.alpnProtocol, "rocks");
- assertStrictEquals(clientHS.alpnProtocol, "rocks");
-
- serverConn.close();
- clientConn.close();
- },
-);
-
-Deno.test(
- { permissions: { read: true, net: true } },
- async function tlsServerAlpnListenStartTls() {
- const [serverConn, clientConn] = await tlsAlpn(true);
- const [serverHS, clientHS] = await Promise.all([
- serverConn.handshake(),
- clientConn.handshake(),
- ]);
- assertStrictEquals(serverHS.alpnProtocol, "rocks");
- assertStrictEquals(clientHS.alpnProtocol, "rocks");
-
- serverConn.close();
- clientConn.close();
- },
-);
-
-Deno.test(
- { permissions: { read: true, net: true } },
- async function tlsServerStreamHalfCloseSendOneByte() {
- const [serverConn, clientConn] = await tlsPair();
- await Promise.all([
- sendThenCloseWriteThenReceive(serverConn, 1, 1),
- receiveThenSend(clientConn, 1, 1),
- ]);
- },
-);
-
-Deno.test(
- { permissions: { read: true, net: true } },
- async function tlsClientStreamHalfCloseSendOneByte() {
- const [serverConn, clientConn] = await tlsPair();
- await Promise.all([
- sendThenCloseWriteThenReceive(clientConn, 1, 1),
- receiveThenSend(serverConn, 1, 1),
- ]);
- },
-);
-
-Deno.test(
- { permissions: { read: true, net: true } },
- async function tlsServerStreamHalfCloseSendOneChunk() {
- const [serverConn, clientConn] = await tlsPair();
- await Promise.all([
- sendThenCloseWriteThenReceive(serverConn, 1, 1 << 20 /* 1 MB */),
- receiveThenSend(clientConn, 1, 1 << 20 /* 1 MB */),
- ]);
- },
-);
-
-Deno.test(
- { permissions: { read: true, net: true } },
- async function tlsClientStreamHalfCloseSendOneChunk() {
- const [serverConn, clientConn] = await tlsPair();
- await Promise.all([
- sendThenCloseWriteThenReceive(clientConn, 1, 1 << 20 /* 1 MB */),
- receiveThenSend(serverConn, 1, 1 << 20 /* 1 MB */),
- ]);
- },
-);
-
-Deno.test(
- { permissions: { read: true, net: true } },
- async function tlsServerStreamHalfCloseSendManyBytes() {
- const [serverConn, clientConn] = await tlsPair();
- await Promise.all([
- sendThenCloseWriteThenReceive(serverConn, 100, 1),
- receiveThenSend(clientConn, 100, 1),
- ]);
- },
-);
-
-Deno.test(
- { permissions: { read: true, net: true } },
- async function tlsClientStreamHalfCloseSendManyBytes() {
- const [serverConn, clientConn] = await tlsPair();
- await Promise.all([
- sendThenCloseWriteThenReceive(clientConn, 100, 1),
- receiveThenSend(serverConn, 100, 1),
- ]);
- },
-);
-
-Deno.test(
- { permissions: { read: true, net: true } },
- async function tlsServerStreamHalfCloseSendManyChunks() {
- const [serverConn, clientConn] = await tlsPair();
- await Promise.all([
- sendThenCloseWriteThenReceive(serverConn, 100, 1 << 16 /* 64 kB */),
- receiveThenSend(clientConn, 100, 1 << 16 /* 64 kB */),
- ]);
- },
-);
-
-Deno.test(
- { permissions: { read: true, net: true } },
- async function tlsClientStreamHalfCloseSendManyChunks() {
- const [serverConn, clientConn] = await tlsPair();
- await Promise.all([
- sendThenCloseWriteThenReceive(clientConn, 100, 1 << 16 /* 64 kB */),
- receiveThenSend(serverConn, 100, 1 << 16 /* 64 kB */),
- ]);
- },
-);
-
-const largeAmount = 1 << 20 /* 1 MB */;
-
-async function sendAlotReceiveNothing(conn: Deno.Conn) {
- // Start receive op.
- const readBuf = new Uint8Array(1024);
- const readPromise = conn.read(readBuf);
-
- const timeout = setTimeout(() => {
- throw new Error("Failed to send buffer in a reasonable amount of time");
- }, 10_000);
-
- // Send 1 MB of data.
- const writeBuf = new Uint8Array(largeAmount);
- writeBuf.fill(42);
- await writeAll(conn, writeBuf);
-
- clearTimeout(timeout);
-
- // Send EOF.
- await conn.closeWrite();
-
- // Close the connection.
- conn.close();
-
- // Read op should be canceled.
- await assertRejects(
- async () => await readPromise,
- Deno.errors.Interrupted,
- );
-}
-
-async function receiveAlotSendNothing(conn: Deno.Conn) {
- const readBuf = new Uint8Array(1024);
- let n: number | null;
- let nread = 0;
-
- const timeout = setTimeout(() => {
- throw new Error(
- `Failed to read buffer in a reasonable amount of time (got ${nread}/${largeAmount})`,
- );
- }, 10_000);
-
- // Receive 1 MB of data.
- try {
- for (; nread < largeAmount; nread += n!) {
- n = await conn.read(readBuf);
- assertStrictEquals(typeof n, "number");
- assert(n! > 0);
- assertStrictEquals(readBuf[0], 42);
- }
- } catch (e) {
- throw new Error(
- `Got an error (${e.message}) after reading ${nread}/${largeAmount} bytes`,
- { cause: e },
- );
- }
- clearTimeout(timeout);
-
- // Close the connection, without sending anything at all.
- conn.close();
-}
-
-Deno.test(
- { permissions: { read: true, net: true } },
- async function tlsServerStreamCancelRead() {
- const [serverConn, clientConn] = await tlsPair();
- await Promise.all([
- sendAlotReceiveNothing(serverConn),
- receiveAlotSendNothing(clientConn),
- ]);
- },
-);
-
-Deno.test(
- { permissions: { read: true, net: true } },
- async function tlsClientStreamCancelRead() {
- const [serverConn, clientConn] = await tlsPair();
- await Promise.all([
- sendAlotReceiveNothing(clientConn),
- receiveAlotSendNothing(serverConn),
- ]);
- },
-);
-
-async function sendReceiveEmptyBuf(conn: Deno.Conn) {
- const byteBuf = new Uint8Array([1]);
- const emptyBuf = new Uint8Array(0);
- let n: number | null;
-
- n = await conn.write(emptyBuf);
- assertStrictEquals(n, 0);
-
- n = await conn.read(emptyBuf);
- assertStrictEquals(n, 0);
-
- n = await conn.write(byteBuf);
- assertStrictEquals(n, 1);
-
- n = await conn.read(byteBuf);
- assertStrictEquals(n, 1);
-
- await conn.closeWrite();
-
- n = await conn.write(emptyBuf);
- assertStrictEquals(n, 0);
-
- await assertRejects(async () => {
- await conn.write(byteBuf);
- }, Deno.errors.NotConnected);
-
- n = await conn.write(emptyBuf);
- assertStrictEquals(n, 0);
-
- n = await conn.read(byteBuf);
- assertStrictEquals(n, null);
-
- conn.close();
-}
-
-Deno.test(
- { permissions: { read: true, net: true } },
- async function tlsStreamSendReceiveEmptyBuf() {
- const [serverConn, clientConn] = await tlsPair();
- await Promise.all([
- sendReceiveEmptyBuf(serverConn),
- sendReceiveEmptyBuf(clientConn),
- ]);
- },
-);
-
-function immediateClose(conn: Deno.Conn) {
- conn.close();
- return Promise.resolve();
-}
-
-async function closeWriteAndClose(conn: Deno.Conn) {
- await conn.closeWrite();
-
- if (await conn.read(new Uint8Array(1)) !== null) {
- throw new Error("did not expect to receive data on TLS stream");
- }
-
- conn.close();
-}
-
-Deno.test(
- { permissions: { read: true, net: true } },
- async function tlsServerStreamImmediateClose() {
- const [serverConn, clientConn] = await tlsPair();
- await Promise.all([
- immediateClose(serverConn),
- closeWriteAndClose(clientConn),
- ]);
- },
-);
-
-Deno.test(
- { permissions: { read: true, net: true } },
- async function tlsClientStreamImmediateClose() {
- const [serverConn, clientConn] = await tlsPair();
- await Promise.all([
- closeWriteAndClose(serverConn),
- immediateClose(clientConn),
- ]);
- },
-);
-
-Deno.test(
- { permissions: { read: true, net: true } },
- async function tlsClientAndServerStreamImmediateClose() {
- const [serverConn, clientConn] = await tlsPair();
- await Promise.all([
- immediateClose(serverConn),
- immediateClose(clientConn),
- ]);
- },
-);
-
-async function tlsWithTcpFailureTestImpl(
- phase: "handshake" | "traffic",
- cipherByteCount: number,
- failureMode: "corruption" | "shutdown",
- reverse: boolean,
-) {
- const tlsPort = getPort();
- const tlsListener = Deno.listenTls({
- hostname: "localhost",
- port: tlsPort,
- cert: await Deno.readTextFile("cli/tests/testdata/tls/localhost.crt"),
- key: await Deno.readTextFile("cli/tests/testdata/tls/localhost.key"),
- });
-
- const tcpPort = getPort();
- const tcpListener = Deno.listen({ hostname: "localhost", port: tcpPort });
-
- const [tlsServerConn, tcpServerConn] = await Promise.all([
- tlsListener.accept(),
- Deno.connect({ hostname: "localhost", port: tlsPort }),
- ]);
-
- const [tcpClientConn, tlsClientConn] = await Promise.all([
- tcpListener.accept(),
- Deno.connectTls({
- hostname: "localhost",
- port: tcpPort,
- caCerts: [Deno.readTextFileSync("cli/tests/testdata/tls/RootCA.pem")],
- }),
- ]);
-
- tlsListener.close();
- tcpListener.close();
-
- const {
- tlsConn1,
- tlsConn2,
- tcpConn1,
- tcpConn2,
- } = reverse
- ? {
- tlsConn1: tlsClientConn,
- tlsConn2: tlsServerConn,
- tcpConn1: tcpClientConn,
- tcpConn2: tcpServerConn,
- }
- : {
- tlsConn1: tlsServerConn,
- tlsConn2: tlsClientConn,
- tcpConn1: tcpServerConn,
- tcpConn2: tcpClientConn,
- };
-
- const tcpForwardingInterruptDeferred1 = Promise.withResolvers<void>();
- const tcpForwardingPromise1 = forwardBytes(
- tcpConn2,
- tcpConn1,
- cipherByteCount,
- tcpForwardingInterruptDeferred1,
- );
-
- const tcpForwardingInterruptDeferred2 = Promise.withResolvers<void>();
- const tcpForwardingPromise2 = forwardBytes(
- tcpConn1,
- tcpConn2,
- Infinity,
- tcpForwardingInterruptDeferred2,
- );
-
- switch (phase) {
- case "handshake": {
- let expectedError;
- switch (failureMode) {
- case "corruption":
- expectedError = Deno.errors.InvalidData;
- break;
- case "shutdown":
- expectedError = Deno.errors.UnexpectedEof;
- break;
- default:
- unreachable();
- }
-
- const tlsTrafficPromise1 = Promise.all([
- assertRejects(
- () => sendBytes(tlsConn1, 0x01, 1),
- expectedError,
- ),
- assertRejects(
- () => receiveBytes(tlsConn1, 0x02, 1),
- expectedError,
- ),
- ]);
-
- const tlsTrafficPromise2 = Promise.all([
- assertRejects(
- () => sendBytes(tlsConn2, 0x02, 1),
- Deno.errors.UnexpectedEof,
- ),
- assertRejects(
- () => receiveBytes(tlsConn2, 0x01, 1),
- Deno.errors.UnexpectedEof,
- ),
- ]);
-
- await tcpForwardingPromise1;
-
- switch (failureMode) {
- case "corruption":
- await sendBytes(tcpConn1, 0xff, 1 << 14 /* 16 kB */);
- break;
- case "shutdown":
- await tcpConn1.closeWrite();
- break;
- default:
- unreachable();
- }
- await tlsTrafficPromise1;
-
- tcpForwardingInterruptDeferred2.resolve();
- await tcpForwardingPromise2;
- await tcpConn2.closeWrite();
- await tlsTrafficPromise2;
-
- break;
- }
-
- case "traffic": {
- await Promise.all([
- sendBytes(tlsConn2, 0x88, 8888),
- receiveBytes(tlsConn1, 0x88, 8888),
- sendBytes(tlsConn1, 0x99, 99999),
- receiveBytes(tlsConn2, 0x99, 99999),
- ]);
-
- tcpForwardingInterruptDeferred1.resolve();
- await tcpForwardingInterruptDeferred1.promise;
-
- switch (failureMode) {
- case "corruption":
- await sendBytes(tcpConn1, 0xff, 1 << 14 /* 16 kB */);
- await assertRejects(
- () => receiveEof(tlsConn1),
- Deno.errors.InvalidData,
- );
- tcpForwardingInterruptDeferred2.resolve();
- break;
- case "shutdown":
- await Promise.all([
- tcpConn1.closeWrite(),
- await assertRejects(
- () => receiveEof(tlsConn1),
- Deno.errors.UnexpectedEof,
- ),
- await tlsConn1.closeWrite(),
- await receiveEof(tlsConn2),
- ]);
- break;
- default:
- unreachable();
- }
-
- await tcpForwardingPromise2;
-
- break;
- }
-
- default:
- unreachable();
- }
-
- tlsServerConn.close();
- tlsClientConn.close();
- tcpServerConn.close();
- tcpClientConn.close();
-
- async function sendBytes(
- conn: Deno.Conn,
- byte: number,
- count: number,
- ) {
- let buf = new Uint8Array(1 << 12 /* 4 kB */);
- buf.fill(byte);
-
- while (count > 0) {
- buf = buf.subarray(0, Math.min(buf.length, count));
- const nwritten = await conn.write(buf);
- assertStrictEquals(nwritten, buf.length);
- count -= nwritten;
- }
- }
-
- async function receiveBytes(
- conn: Deno.Conn,
- byte: number,
- count: number,
- ) {
- let buf = new Uint8Array(1 << 12 /* 4 kB */);
- while (count > 0) {
- buf = buf.subarray(0, Math.min(buf.length, count));
- const r = await conn.read(buf);
- assertNotEquals(r, null);
- assert(buf.subarray(0, r!).every((b) => b === byte));
- count -= r!;
- }
- }
-
- async function receiveEof(conn: Deno.Conn) {
- const buf = new Uint8Array(1);
- const r = await conn.read(buf);
- assertStrictEquals(r, null);
- }
-
- async function forwardBytes(
- source: Deno.Conn,
- sink: Deno.Conn,
- count: number,
- interruptPromise: ReturnType<typeof Promise.withResolvers<void>>,
- ) {
- let buf = new Uint8Array(1 << 12 /* 4 kB */);
- while (count > 0) {
- buf = buf.subarray(0, Math.min(buf.length, count));
- const nread = await Promise.race([
- source.read(buf),
- interruptPromise.promise,
- ]);
- if (nread == null) break; // Either EOF or interrupted.
- const nwritten = await sink.write(buf.subarray(0, nread));
- assertStrictEquals(nread, nwritten);
- count -= nwritten;
- }
- }
-}
-
-Deno.test(
- { permissions: { read: true, net: true } },
- async function tlsHandshakeWithTcpCorruptionImmediately() {
- await tlsWithTcpFailureTestImpl("handshake", 0, "corruption", false);
- await tlsWithTcpFailureTestImpl("handshake", 0, "corruption", true);
- },
-);
-
-Deno.test(
- { permissions: { read: true, net: true } },
- async function tlsHandshakeWithTcpShutdownImmediately() {
- await tlsWithTcpFailureTestImpl("handshake", 0, "shutdown", false);
- await tlsWithTcpFailureTestImpl("handshake", 0, "shutdown", true);
- },
-);
-
-Deno.test(
- { permissions: { read: true, net: true } },
- async function tlsHandshakeWithTcpCorruptionAfter70Bytes() {
- await tlsWithTcpFailureTestImpl("handshake", 76, "corruption", false);
- await tlsWithTcpFailureTestImpl("handshake", 78, "corruption", true);
- },
-);
-
-Deno.test(
- { permissions: { read: true, net: true } },
- async function tlsHandshakeWithTcpShutdownAfter70bytes() {
- await tlsWithTcpFailureTestImpl("handshake", 77, "shutdown", false);
- await tlsWithTcpFailureTestImpl("handshake", 79, "shutdown", true);
- },
-);
-
-Deno.test(
- { permissions: { read: true, net: true } },
- async function tlsHandshakeWithTcpCorruptionAfter200Bytes() {
- await tlsWithTcpFailureTestImpl("handshake", 200, "corruption", false);
- await tlsWithTcpFailureTestImpl("handshake", 202, "corruption", true);
- },
-);
-
-Deno.test(
- { permissions: { read: true, net: true } },
- async function tlsHandshakeWithTcpShutdownAfter200bytes() {
- await tlsWithTcpFailureTestImpl("handshake", 201, "shutdown", false);
- await tlsWithTcpFailureTestImpl("handshake", 203, "shutdown", true);
- },
-);
-
-Deno.test(
- { permissions: { read: true, net: true } },
- async function tlsTrafficWithTcpCorruption() {
- await tlsWithTcpFailureTestImpl("traffic", Infinity, "corruption", false);
- await tlsWithTcpFailureTestImpl("traffic", Infinity, "corruption", true);
- },
-);
-
-Deno.test(
- { permissions: { read: true, net: true } },
- async function tlsTrafficWithTcpShutdown() {
- await tlsWithTcpFailureTestImpl("traffic", Infinity, "shutdown", false);
- await tlsWithTcpFailureTestImpl("traffic", Infinity, "shutdown", true);
- },
-);
-
-function createHttpsListener(port: number): Deno.Listener {
- // Query format: `curl --insecure https://localhost:8443/z/12345`
- // The server returns a response consisting of 12345 times the letter 'z'.
- const listener = Deno.listenTls({
- hostname: "localhost",
- port,
- cert: Deno.readTextFileSync("./cli/tests/testdata/tls/localhost.crt"),
- key: Deno.readTextFileSync("./cli/tests/testdata/tls/localhost.key"),
- });
-
- serve(listener);
- return listener;
-
- async function serve(listener: Deno.Listener) {
- for await (const conn of listener) {
- const EOL = "\r\n";
-
- // Read GET request plus headers.
- const buf = new Uint8Array(1 << 12 /* 4 kB */);
- const decoder = new TextDecoder();
- let req = "";
- while (!req.endsWith(EOL + EOL)) {
- const n = await conn.read(buf);
- if (n === null) throw new Error("Unexpected EOF");
- req += decoder.decode(buf.subarray(0, n));
- }
-
- // Parse GET request.
- const { filler, count, version } =
- /^GET \/(?<filler>[^\/]+)\/(?<count>\d+) HTTP\/(?<version>1\.\d)\r\n/
- .exec(req)!.groups as {
- filler: string;
- count: string;
- version: string;
- };
-
- // Generate response.
- const resBody = new TextEncoder().encode(filler.repeat(+count));
- const resHead = new TextEncoder().encode(
- [
- `HTTP/${version} 200 OK`,
- `Content-Length: ${resBody.length}`,
- "Content-Type: text/plain",
- ].join(EOL) + EOL + EOL,
- );
-
- // Send response.
- await writeAll(conn, resHead);
- await writeAll(conn, resBody);
-
- // Close TCP connection.
- conn.close();
- }
- }
-}
-
-async function curl(url: string): Promise<string> {
- const { success, code, stdout, stderr } = await new Deno.Command("curl", {
- args: ["--insecure", url],
- }).output();
-
- if (!success) {
- throw new Error(
- `curl ${url} failed: ${code}:\n${new TextDecoder().decode(stderr)}`,
- );
- }
- return new TextDecoder().decode(stdout);
-}
-
-Deno.test(
- { permissions: { read: true, net: true, run: true } },
- async function curlFakeHttpsServer() {
- const port = getPort();
- const listener = createHttpsListener(port);
-
- const res1 = await curl(`https://localhost:${port}/d/1`);
- assertStrictEquals(res1, "d");
-
- const res2 = await curl(`https://localhost:${port}/e/12345`);
- assertStrictEquals(res2, "e".repeat(12345));
-
- const count3 = 1 << 17; // 128 kB.
- const res3 = await curl(`https://localhost:${port}/n/${count3}`);
- assertStrictEquals(res3, "n".repeat(count3));
-
- const count4 = 12345678;
- const res4 = await curl(`https://localhost:${port}/o/${count4}`);
- assertStrictEquals(res4, "o".repeat(count4));
-
- listener.close();
- },
-);
-
-Deno.test(
- // Ignored because gmail appears to reject us on CI sometimes
- { ignore: true, permissions: { read: true, net: true } },
- async function startTls() {
- const hostname = "smtp.gmail.com";
- const port = 587;
- const encoder = new TextEncoder();
-
- const conn = await Deno.connect({
- hostname,
- port,
- });
-
- let writer = new BufWriter(conn);
- let reader = new TextProtoReader(new BufReader(conn));
-
- let line: string | null = (await reader.readLine()) as string;
- assert(line.startsWith("220"));
-
- await writer.write(encoder.encode(`EHLO ${hostname}\r\n`));
- await writer.flush();
-
- while ((line = (await reader.readLine()) as string)) {
- assert(line.startsWith("250"));
- if (line.startsWith("250 ")) break;
- }
-
- await writer.write(encoder.encode("STARTTLS\r\n"));
- await writer.flush();
-
- line = await reader.readLine();
-
- // Received the message that the server is ready to establish TLS
- assertEquals(line, "220 2.0.0 Ready to start TLS");
-
- const tlsConn = await Deno.startTls(conn, { hostname });
- writer = new BufWriter(tlsConn);
- reader = new TextProtoReader(new BufReader(tlsConn));
-
- // After that use TLS communication again
- await writer.write(encoder.encode(`EHLO ${hostname}\r\n`));
- await writer.flush();
-
- while ((line = (await reader.readLine()) as string)) {
- assert(line.startsWith("250"));
- if (line.startsWith("250 ")) break;
- }
-
- tlsConn.close();
- },
-);
-
-Deno.test(
- { permissions: { read: true, net: true } },
- async function connectTLSBadClientCertPrivateKey(): Promise<void> {
- await assertRejects(async () => {
- await Deno.connectTls({
- hostname: "deno.land",
- port: 443,
- certChain: "bad data",
- privateKey: await Deno.readTextFile(
- "cli/tests/testdata/tls/localhost.key",
- ),
- });
- }, Deno.errors.InvalidData);
- },
-);
-
-Deno.test(
- { permissions: { read: true, net: true } },
- async function connectTLSBadPrivateKey(): Promise<void> {
- await assertRejects(async () => {
- await Deno.connectTls({
- hostname: "deno.land",
- port: 443,
- certChain: await Deno.readTextFile(
- "cli/tests/testdata/tls/localhost.crt",
- ),
- privateKey: "bad data",
- });
- }, Deno.errors.InvalidData);
- },
-);
-
-Deno.test(
- { permissions: { read: true, net: true } },
- async function connectTLSNotPrivateKey(): Promise<void> {
- await assertRejects(async () => {
- await Deno.connectTls({
- hostname: "deno.land",
- port: 443,
- certChain: await Deno.readTextFile(
- "cli/tests/testdata/tls/localhost.crt",
- ),
- privateKey: "",
- });
- }, Deno.errors.InvalidData);
- },
-);
-
-Deno.test(
- { permissions: { read: true, net: true } },
- async function connectWithClientCert() {
- // The test_server running on port 4552 responds with 'PASS' if client
- // authentication was successful. Try it by running test_server and
- // curl --key cli/tests/testdata/tls/localhost.key \
- // --cert cli/tests/testdata/tls/localhost.crt \
- // --cacert cli/tests/testdata/tls/RootCA.crt https://localhost:4552/
- const conn = await Deno.connectTls({
- hostname: "localhost",
- port: 4552,
- certChain: await Deno.readTextFile(
- "cli/tests/testdata/tls/localhost.crt",
- ),
- privateKey: await Deno.readTextFile(
- "cli/tests/testdata/tls/localhost.key",
- ),
- caCerts: [Deno.readTextFileSync("cli/tests/testdata/tls/RootCA.pem")],
- });
- const result = decoder.decode(await readAll(conn));
- assertEquals(result, "PASS");
- conn.close();
- },
-);
-
-Deno.test(
- { permissions: { read: true, net: true } },
- async function connectTLSCaCerts() {
- const conn = await Deno.connectTls({
- hostname: "localhost",
- port: 4557,
- caCerts: [Deno.readTextFileSync("cli/tests/testdata/tls/RootCA.pem")],
- });
- const result = decoder.decode(await readAll(conn));
- assertEquals(result, "PASS");
- conn.close();
- },
-);
-
-Deno.test(
- { permissions: { read: true, net: true } },
- async function connectTLSCertFile() {
- const conn = await Deno.connectTls({
- hostname: "localhost",
- port: 4557,
- certFile: "cli/tests/testdata/tls/RootCA.pem",
- });
- const result = decoder.decode(await readAll(conn));
- assertEquals(result, "PASS");
- conn.close();
- },
-);
-
-Deno.test(
- { permissions: { read: true, net: true } },
- async function startTLSCaCerts() {
- const plainConn = await Deno.connect({
- hostname: "localhost",
- port: 4557,
- });
- const conn = await Deno.startTls(plainConn, {
- hostname: "localhost",
- caCerts: [Deno.readTextFileSync("cli/tests/testdata/tls/RootCA.pem")],
- });
- const result = decoder.decode(await readAll(conn));
- assertEquals(result, "PASS");
- conn.close();
- },
-);
-
-Deno.test(
- { permissions: { read: true, net: true } },
- async function tlsHandshakeSuccess() {
- const hostname = "localhost";
- const port = getPort();
-
- const listener = Deno.listenTls({
- hostname,
- port,
- cert: await Deno.readTextFile("cli/tests/testdata/tls/localhost.crt"),
- key: await Deno.readTextFile("cli/tests/testdata/tls/localhost.key"),
- });
- const acceptPromise = listener.accept();
- const connectPromise = Deno.connectTls({
- hostname,
- port,
- certFile: "cli/tests/testdata/tls/RootCA.crt",
- });
- const [conn1, conn2] = await Promise.all([acceptPromise, connectPromise]);
- listener.close();
-
- await Promise.all([conn1.handshake(), conn2.handshake()]);
-
- // Begin sending a 10mb blob over the TLS connection.
- const whole = new Uint8Array(10 << 20); // 10mb.
- whole.fill(42);
- const sendPromise = writeAll(conn1, whole);
- // Set up the other end to receive half of the large blob.
- const half = new Uint8Array(whole.byteLength / 2);
- const receivePromise = readFull(conn2, half);
-
- await conn1.handshake();
- await conn2.handshake();
-
- // Finish receiving the first 5mb.
- assertEquals(await receivePromise, half.length);
-
- // See that we can call `handshake()` in the middle of large reads and writes.
- await conn1.handshake();
- await conn2.handshake();
-
- // Receive second half of large blob. Wait for the send promise and check it.
- assertEquals(await readFull(conn2, half), half.length);
- await sendPromise;
-
- await conn1.handshake();
- await conn2.handshake();
-
- await conn1.closeWrite();
- await conn2.closeWrite();
-
- await conn1.handshake();
- await conn2.handshake();
-
- conn1.close();
- conn2.close();
-
- async function readFull(conn: Deno.Conn, buf: Uint8Array) {
- let offset, n;
- for (offset = 0; offset < buf.length; offset += n) {
- n = await conn.read(buf.subarray(offset, buf.length));
- assert(n != null && n > 0);
- }
- return offset;
- }
- },
-);
-
-Deno.test(
- { permissions: { read: true, net: true } },
- async function tlsHandshakeFailure() {
- const hostname = "localhost";
- const port = getPort();
-
- async function server() {
- const listener = Deno.listenTls({
- hostname,
- port,
- cert: Deno.readTextFileSync("cli/tests/testdata/tls/localhost.crt"),
- key: Deno.readTextFileSync("cli/tests/testdata/tls/localhost.key"),
- });
- for await (const conn of listener) {
- for (let i = 0; i < 10; i++) {
- // Handshake fails because the client rejects the server certificate.
- await assertRejects(
- () => conn.handshake(),
- Deno.errors.InvalidData,
- "received fatal alert",
- );
- }
- conn.close();
- break;
- }
- }
-
- async function connectTlsClient() {
- const conn = await Deno.connectTls({ hostname, port });
- // Handshake fails because the server presents a self-signed certificate.
- await assertRejects(
- () => conn.handshake(),
- Deno.errors.InvalidData,
- "invalid peer certificate: UnknownIssuer",
- );
- conn.close();
- }
-
- await Promise.all([server(), connectTlsClient()]);
-
- async function startTlsClient() {
- const tcpConn = await Deno.connect({ hostname, port });
- const tlsConn = await Deno.startTls(tcpConn, {
- hostname: "foo.land",
- caCerts: [Deno.readTextFileSync("cli/tests/testdata/tls/RootCA.pem")],
- });
- // Handshake fails because hostname doesn't match the certificate.
- await assertRejects(
- () => tlsConn.handshake(),
- Deno.errors.InvalidData,
- "NotValidForName",
- );
- tlsConn.close();
- }
-
- await Promise.all([server(), startTlsClient()]);
- },
-);
-
-Deno.test(
- { permissions: { net: true } },
- async function listenTlsWithReuseAddr() {
- const deferred1 = Promise.withResolvers<void>();
- const hostname = "localhost";
- const port = 3500;
-
- const listener1 = Deno.listenTls({ hostname, port, cert, key });
-
- listener1.accept().then((conn) => {
- conn.close();
- deferred1.resolve();
- });
-
- const conn1 = await Deno.connectTls({ hostname, port, caCerts });
- conn1.close();
- await deferred1.promise;
- listener1.close();
-
- const deferred2 = Promise.withResolvers<void>();
- const listener2 = Deno.listenTls({ hostname, port, cert, key });
-
- listener2.accept().then((conn) => {
- conn.close();
- deferred2.resolve();
- });
-
- const conn2 = await Deno.connectTls({ hostname, port, caCerts });
- conn2.close();
- await deferred2.promise;
- listener2.close();
- },
-);
-
-Deno.test({
- ignore: Deno.build.os !== "linux",
- permissions: { net: true },
-}, async function listenTlsReusePort() {
- const hostname = "localhost";
- const port = 4003;
- const listener1 = Deno.listenTls({
- hostname,
- port,
- cert,
- key,
- reusePort: true,
- });
- const listener2 = Deno.listenTls({
- hostname,
- port,
- cert,
- key,
- reusePort: true,
- });
- let p1;
- let p2;
- let listener1Recv = false;
- let listener2Recv = false;
- while (!listener1Recv || !listener2Recv) {
- if (!p1) {
- p1 = listener1.accept().then((conn) => {
- conn.close();
- listener1Recv = true;
- p1 = undefined;
- }).catch(() => {});
- }
- if (!p2) {
- p2 = listener2.accept().then((conn) => {
- conn.close();
- listener2Recv = true;
- p2 = undefined;
- }).catch(() => {});
- }
- const conn = await Deno.connectTls({ hostname, port, caCerts });
- conn.close();
- await Promise.race([p1, p2]);
- }
- listener1.close();
- listener2.close();
-});
-
-Deno.test({
- ignore: Deno.build.os === "linux",
- permissions: { net: true },
-}, function listenTlsReusePortDoesNothing() {
- const hostname = "localhost";
- const port = 4003;
- const listener1 = Deno.listenTls({
- hostname,
- port,
- cert,
- key,
- reusePort: true,
- });
- assertThrows(() => {
- Deno.listenTls({ hostname, port, cert, key, reusePort: true });
- }, Deno.errors.AddrInUse);
- listener1.close();
-});
-
-Deno.test({
- permissions: { net: true },
-}, function listenTlsDoesNotThrowOnStringPort() {
- const listener = Deno.listenTls({
- hostname: "localhost",
- // @ts-ignore String port is not allowed by typing, but it shouldn't throw
- // for backwards compatibility.
- port: "0",
- cert,
- key,
- });
- listener.close();
-});
-
-Deno.test(
- { permissions: { net: true, read: true } },
- function listenTLSInvalidCert() {
- assertThrows(() => {
- Deno.listenTls({
- hostname: "localhost",
- port: 3500,
- certFile: "cli/tests/testdata/tls/invalid.crt",
- keyFile: "cli/tests/testdata/tls/localhost.key",
- });
- }, Deno.errors.InvalidData);
- },
-);
-
-Deno.test(
- { permissions: { net: true, read: true } },
- function listenTLSInvalidKey() {
- assertThrows(() => {
- Deno.listenTls({
- hostname: "localhost",
- port: 3500,
- certFile: "cli/tests/testdata/tls/localhost.crt",
- keyFile: "cli/tests/testdata/tls/invalid.key",
- });
- }, Deno.errors.InvalidData);
- },
-);
diff --git a/cli/tests/unit/tty_test.ts b/cli/tests/unit/tty_test.ts
deleted file mode 100644
index 8ca9a5d5b..000000000
--- a/cli/tests/unit/tty_test.ts
+++ /dev/null
@@ -1,32 +0,0 @@
-// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
-import { assert } from "./test_util.ts";
-
-// Note tests for Deno.stdin.setRaw is in integration tests.
-
-Deno.test(function consoleSize() {
- if (!Deno.stdout.isTerminal()) {
- return;
- }
- const result = Deno.consoleSize();
- assert(typeof result.columns !== "undefined");
- assert(typeof result.rows !== "undefined");
-});
-
-Deno.test({ permissions: { read: true } }, function isatty() {
- // CI not under TTY, so cannot test stdin/stdout/stderr.
- const f = Deno.openSync("cli/tests/testdata/assets/hello.txt");
- assert(!Deno.isatty(f.rid));
- f.close();
-});
-
-Deno.test(function isattyError() {
- let caught = false;
- try {
- // Absurdly large rid.
- Deno.isatty(0x7fffffff);
- } catch (e) {
- caught = true;
- assert(e instanceof Deno.errors.BadResource);
- }
- assert(caught);
-});
diff --git a/cli/tests/unit/webcrypto_test.ts b/cli/tests/unit/webcrypto_test.ts
deleted file mode 100644
index 829330eba..000000000
--- a/cli/tests/unit/webcrypto_test.ts
+++ /dev/null
@@ -1,2047 +0,0 @@
-// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
-
-import {
- assert,
- assertEquals,
- assertNotEquals,
- assertRejects,
-} from "./test_util.ts";
-
-// https://github.com/denoland/deno/issues/11664
-Deno.test(async function testImportArrayBufferKey() {
- const subtle = window.crypto.subtle;
- assert(subtle);
-
- // deno-fmt-ignore
- const key = new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]);
-
- const cryptoKey = await subtle.importKey(
- "raw",
- key.buffer,
- { name: "HMAC", hash: "SHA-1" },
- true,
- ["sign"],
- );
- assert(cryptoKey);
-
- // Test key usage
- await subtle.sign({ name: "HMAC" }, cryptoKey, new Uint8Array(8));
-});
-
-Deno.test(async function testSignVerify() {
- const subtle = window.crypto.subtle;
- assert(subtle);
- for (const algorithm of ["RSA-PSS", "RSASSA-PKCS1-v1_5"]) {
- for (
- const hash of [
- "SHA-1",
- "SHA-256",
- "SHA-384",
- "SHA-512",
- ]
- ) {
- const keyPair = await subtle.generateKey(
- {
- name: algorithm,
- modulusLength: 2048,
- publicExponent: new Uint8Array([1, 0, 1]),
- hash,
- },
- true,
- ["sign", "verify"],
- );
-
- const data = new Uint8Array([1, 2, 3]);
-
- const signAlgorithm = { name: algorithm, saltLength: 32 };
-
- const signature = await subtle.sign(
- signAlgorithm,
- keyPair.privateKey,
- data,
- );
-
- assert(signature);
- assert(signature.byteLength > 0);
- assert(signature.byteLength % 8 == 0);
- assert(signature instanceof ArrayBuffer);
-
- const verified = await subtle.verify(
- signAlgorithm,
- keyPair.publicKey,
- signature,
- data,
- );
- assert(verified);
- }
- }
-});
-
-// deno-fmt-ignore
-const plainText = new Uint8Array([95, 77, 186, 79, 50, 12, 12, 232, 118, 114, 90, 252, 229, 251, 210, 91, 248, 62, 90, 113, 37, 160, 140, 175, 231, 60, 62, 186, 196, 33, 119, 157, 249, 213, 93, 24, 12, 58, 233, 148, 38, 69, 225, 216, 47, 238, 140, 157, 41, 75, 60, 177, 160, 138, 153, 49, 32, 27, 60, 14, 129, 252, 71, 202, 207, 131, 21, 162, 175, 102, 50, 65, 19, 195, 182, 98, 48, 195, 70, 8, 196, 244, 89, 54, 52, 206, 2, 178, 103, 54, 34, 119, 240, 168, 64, 202, 116, 188, 61, 26, 98, 54, 149, 44, 94, 215, 170, 248, 168, 254, 203, 221, 250, 117, 132, 230, 151, 140, 234, 93, 42, 91, 159, 183, 241, 180, 140, 139, 11, 229, 138, 48, 82, 2, 117, 77, 131, 118, 16, 115, 116, 121, 60, 240, 38, 170, 238, 83, 0, 114, 125, 131, 108, 215, 30, 113, 179, 69, 221, 178, 228, 68, 70, 255, 197, 185, 1, 99, 84, 19, 137, 13, 145, 14, 163, 128, 152, 74, 144, 25, 16, 49, 50, 63, 22, 219, 204, 157, 107, 225, 104, 184, 72, 133, 56, 76, 160, 62, 18, 96, 10, 193, 194, 72, 2, 138, 243, 114, 108, 201, 52, 99, 136, 46, 168, 192, 42, 171]);
-
-// Passing
-const hashPlainTextVector = [
- {
- hash: "SHA-1",
- plainText: plainText.slice(0, 214),
- },
- {
- hash: "SHA-256",
- plainText: plainText.slice(0, 190),
- },
- {
- hash: "SHA-384",
- plainText: plainText.slice(0, 158),
- },
- {
- hash: "SHA-512",
- plainText: plainText.slice(0, 126),
- },
-];
-
-Deno.test(async function testEncryptDecrypt() {
- const subtle = window.crypto.subtle;
- assert(subtle);
- for (
- const { hash, plainText } of hashPlainTextVector
- ) {
- const keyPair = await subtle.generateKey(
- {
- name: "RSA-OAEP",
- modulusLength: 2048,
- publicExponent: new Uint8Array([1, 0, 1]),
- hash,
- },
- true,
- ["encrypt", "decrypt"],
- );
-
- const encryptAlgorithm = { name: "RSA-OAEP" };
- const cipherText = await subtle.encrypt(
- encryptAlgorithm,
- keyPair.publicKey,
- plainText,
- );
-
- assert(cipherText);
- assert(cipherText.byteLength > 0);
- assertEquals(cipherText.byteLength * 8, 2048);
- assert(cipherText instanceof ArrayBuffer);
-
- const decrypted = await subtle.decrypt(
- encryptAlgorithm,
- keyPair.privateKey,
- cipherText,
- );
- assert(decrypted);
- assert(decrypted instanceof ArrayBuffer);
- assertEquals(new Uint8Array(decrypted), plainText);
-
- const badPlainText = new Uint8Array(plainText.byteLength + 1);
- badPlainText.set(plainText, 0);
- badPlainText.set(new Uint8Array([32]), plainText.byteLength);
- await assertRejects(async () => {
- // Should fail
- await subtle.encrypt(
- encryptAlgorithm,
- keyPair.publicKey,
- badPlainText,
- );
- throw new TypeError("unreachable");
- }, DOMException);
- }
-});
-
-Deno.test(async function testGenerateRSAKey() {
- const subtle = window.crypto.subtle;
- assert(subtle);
-
- const keyPair = await subtle.generateKey(
- {
- name: "RSA-PSS",
- modulusLength: 2048,
- publicExponent: new Uint8Array([1, 0, 1]),
- hash: "SHA-256",
- },
- true,
- ["sign", "verify"],
- );
-
- assert(keyPair.privateKey);
- assert(keyPair.publicKey);
- assertEquals(keyPair.privateKey.extractable, true);
- assert(keyPair.privateKey.usages.includes("sign"));
-});
-
-Deno.test(async function testGenerateHMACKey() {
- const key = await window.crypto.subtle.generateKey(
- {
- name: "HMAC",
- hash: "SHA-512",
- },
- true,
- ["sign", "verify"],
- );
-
- assert(key);
- assertEquals(key.extractable, true);
- assert(key.usages.includes("sign"));
-});
-
-Deno.test(async function testECDSASignVerify() {
- const key = await window.crypto.subtle.generateKey(
- {
- name: "ECDSA",
- namedCurve: "P-384",
- },
- true,
- ["sign", "verify"],
- );
-
- const encoder = new TextEncoder();
- const encoded = encoder.encode("Hello, World!");
- const signature = await window.crypto.subtle.sign(
- { name: "ECDSA", hash: "SHA-384" },
- key.privateKey,
- encoded,
- );
-
- assert(signature);
- assert(signature instanceof ArrayBuffer);
-
- const verified = await window.crypto.subtle.verify(
- { hash: { name: "SHA-384" }, name: "ECDSA" },
- key.publicKey,
- signature,
- encoded,
- );
- assert(verified);
-});
-
-// Tests the "bad paths" as a temporary replacement for sign_verify/ecdsa WPT.
-Deno.test(async function testECDSASignVerifyFail() {
- const key = await window.crypto.subtle.generateKey(
- {
- name: "ECDSA",
- namedCurve: "P-384",
- },
- true,
- ["sign", "verify"],
- );
-
- const encoded = new Uint8Array([1]);
- // Signing with a public key (InvalidAccessError)
- await assertRejects(async () => {
- await window.crypto.subtle.sign(
- { name: "ECDSA", hash: "SHA-384" },
- key.publicKey,
- new Uint8Array([1]),
- );
- throw new TypeError("unreachable");
- }, DOMException);
-
- // Do a valid sign for later verifying.
- const signature = await window.crypto.subtle.sign(
- { name: "ECDSA", hash: "SHA-384" },
- key.privateKey,
- encoded,
- );
-
- // Verifying with a private key (InvalidAccessError)
- await assertRejects(async () => {
- await window.crypto.subtle.verify(
- { hash: { name: "SHA-384" }, name: "ECDSA" },
- key.privateKey,
- signature,
- encoded,
- );
- throw new TypeError("unreachable");
- }, DOMException);
-});
-
-// https://github.com/denoland/deno/issues/11313
-Deno.test(async function testSignRSASSAKey() {
- const subtle = window.crypto.subtle;
- assert(subtle);
-
- const keyPair = await subtle.generateKey(
- {
- name: "RSASSA-PKCS1-v1_5",
- modulusLength: 2048,
- publicExponent: new Uint8Array([1, 0, 1]),
- hash: "SHA-256",
- },
- true,
- ["sign", "verify"],
- );
-
- assert(keyPair.privateKey);
- assert(keyPair.publicKey);
- assertEquals(keyPair.privateKey.extractable, true);
- assert(keyPair.privateKey.usages.includes("sign"));
-
- const encoder = new TextEncoder();
- const encoded = encoder.encode("Hello, World!");
-
- const signature = await window.crypto.subtle.sign(
- { name: "RSASSA-PKCS1-v1_5" },
- keyPair.privateKey,
- encoded,
- );
-
- assert(signature);
-});
-
-// deno-fmt-ignore
-const rawKey = new Uint8Array([
- 1, 2, 3, 4, 5, 6, 7, 8,
- 9, 10, 11, 12, 13, 14, 15, 16
-]);
-
-const jwk: JsonWebKey = {
- kty: "oct",
- // unpadded base64 for rawKey.
- k: "AQIDBAUGBwgJCgsMDQ4PEA",
- alg: "HS256",
- ext: true,
- "key_ops": ["sign"],
-};
-
-Deno.test(async function subtleCryptoHmacImportExport() {
- const key1 = await crypto.subtle.importKey(
- "raw",
- rawKey,
- { name: "HMAC", hash: "SHA-256" },
- true,
- ["sign"],
- );
- const key2 = await crypto.subtle.importKey(
- "jwk",
- jwk,
- { name: "HMAC", hash: "SHA-256" },
- true,
- ["sign"],
- );
- const actual1 = await crypto.subtle.sign(
- { name: "HMAC" },
- key1,
- new Uint8Array([1, 2, 3, 4]),
- );
-
- const actual2 = await crypto.subtle.sign(
- { name: "HMAC" },
- key2,
- new Uint8Array([1, 2, 3, 4]),
- );
- // deno-fmt-ignore
- const expected = new Uint8Array([
- 59, 170, 255, 216, 51, 141, 51, 194,
- 213, 48, 41, 191, 184, 40, 216, 47,
- 130, 165, 203, 26, 163, 43, 38, 71,
- 23, 122, 222, 1, 146, 46, 182, 87,
- ]);
- assertEquals(
- new Uint8Array(actual1),
- expected,
- );
- assertEquals(
- new Uint8Array(actual2),
- expected,
- );
-
- const exportedKey1 = await crypto.subtle.exportKey("raw", key1);
- assertEquals(new Uint8Array(exportedKey1), rawKey);
-
- const exportedKey2 = await crypto.subtle.exportKey("jwk", key2);
- assertEquals(exportedKey2, jwk);
-});
-
-// https://github.com/denoland/deno/issues/12085
-Deno.test(async function generateImportHmacJwk() {
- const key = await crypto.subtle.generateKey(
- {
- name: "HMAC",
- hash: "SHA-512",
- },
- true,
- ["sign"],
- );
- assert(key);
- assertEquals(key.type, "secret");
- assertEquals(key.extractable, true);
- assertEquals(key.usages, ["sign"]);
-
- const exportedKey = await crypto.subtle.exportKey("jwk", key);
- assertEquals(exportedKey.kty, "oct");
- assertEquals(exportedKey.alg, "HS512");
- assertEquals(exportedKey.key_ops, ["sign"]);
- assertEquals(exportedKey.ext, true);
- assert(typeof exportedKey.k == "string");
- assertEquals(exportedKey.k.length, 171);
-});
-
-// 2048-bits publicExponent=65537
-const pkcs8TestVectors = [
- // rsaEncryption
- { pem: "cli/tests/testdata/webcrypto/id_rsaEncryption.pem", hash: "SHA-256" },
-];
-
-Deno.test({ permissions: { read: true } }, async function importRsaPkcs8() {
- const pemHeader = "-----BEGIN PRIVATE KEY-----";
- const pemFooter = "-----END PRIVATE KEY-----";
- for (const { pem, hash } of pkcs8TestVectors) {
- const keyFile = await Deno.readTextFile(pem);
- const pemContents = keyFile.substring(
- pemHeader.length,
- keyFile.length - pemFooter.length,
- );
- const binaryDerString = atob(pemContents);
- const binaryDer = new Uint8Array(binaryDerString.length);
- for (let i = 0; i < binaryDerString.length; i++) {
- binaryDer[i] = binaryDerString.charCodeAt(i);
- }
-
- const key = await crypto.subtle.importKey(
- "pkcs8",
- binaryDer,
- { name: "RSA-PSS", hash },
- true,
- ["sign"],
- );
-
- assert(key);
- assertEquals(key.type, "private");
- assertEquals(key.extractable, true);
- assertEquals(key.usages, ["sign"]);
- const algorithm = key.algorithm as RsaHashedKeyAlgorithm;
- assertEquals(algorithm.name, "RSA-PSS");
- assertEquals(algorithm.hash.name, hash);
- assertEquals(algorithm.modulusLength, 2048);
- assertEquals(algorithm.publicExponent, new Uint8Array([1, 0, 1]));
- }
-});
-
-const nonInteroperableVectors = [
- // id-RSASSA-PSS (sha256)
- // `openssl genpkey -algorithm rsa-pss -pkeyopt rsa_pss_keygen_md:sha256 -out id_rsassaPss.pem`
- { pem: "cli/tests/testdata/webcrypto/id_rsassaPss.pem", hash: "SHA-256" },
- // id-RSASSA-PSS (default parameters)
- // `openssl genpkey -algorithm rsa-pss -out id_rsassaPss.pem`
- {
- pem: "cli/tests/testdata/webcrypto/id_rsassaPss_default.pem",
- hash: "SHA-1",
- },
- // id-RSASSA-PSS (default hash)
- // `openssl genpkey -algorithm rsa-pss -pkeyopt rsa_pss_keygen_saltlen:30 -out rsaPss_saltLen_30.pem`
- {
- pem: "cli/tests/testdata/webcrypto/id_rsassaPss_saltLen_30.pem",
- hash: "SHA-1",
- },
-];
-
-Deno.test(
- { permissions: { read: true } },
- async function importNonInteroperableRsaPkcs8() {
- const pemHeader = "-----BEGIN PRIVATE KEY-----";
- const pemFooter = "-----END PRIVATE KEY-----";
- for (const { pem, hash } of nonInteroperableVectors) {
- const keyFile = await Deno.readTextFile(pem);
- const pemContents = keyFile.substring(
- pemHeader.length,
- keyFile.length - pemFooter.length,
- );
- const binaryDerString = atob(pemContents);
- const binaryDer = new Uint8Array(binaryDerString.length);
- for (let i = 0; i < binaryDerString.length; i++) {
- binaryDer[i] = binaryDerString.charCodeAt(i);
- }
-
- await assertRejects(
- () =>
- crypto.subtle.importKey(
- "pkcs8",
- binaryDer,
- { name: "RSA-PSS", hash },
- true,
- ["sign"],
- ),
- DOMException,
- "unsupported algorithm",
- );
- }
- },
-);
-
-// deno-fmt-ignore
-const asn1AlgorithmIdentifier = new Uint8Array([
- 0x02, 0x01, 0x00, // INTEGER
- 0x30, 0x0d, // SEQUENCE (2 elements)
- 0x06, 0x09, // OBJECT IDENTIFIER
- 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, // 1.2.840.113549.1.1.1 (rsaEncryption)
- 0x05, 0x00, // NULL
-]);
-
-Deno.test(async function rsaExport() {
- for (const algorithm of ["RSASSA-PKCS1-v1_5", "RSA-PSS", "RSA-OAEP"]) {
- const keyPair = await crypto.subtle.generateKey(
- {
- name: algorithm,
- modulusLength: 2048,
- publicExponent: new Uint8Array([1, 0, 1]),
- hash: "SHA-256",
- },
- true,
- algorithm !== "RSA-OAEP" ? ["sign", "verify"] : ["encrypt", "decrypt"],
- );
-
- assert(keyPair.privateKey);
- assert(keyPair.publicKey);
- assertEquals(keyPair.privateKey.extractable, true);
-
- const exportedPrivateKey = await crypto.subtle.exportKey(
- "pkcs8",
- keyPair.privateKey,
- );
-
- assert(exportedPrivateKey);
- assert(exportedPrivateKey instanceof ArrayBuffer);
-
- const pkcs8 = new Uint8Array(exportedPrivateKey);
- assert(pkcs8.length > 0);
-
- assertEquals(
- pkcs8.slice(4, asn1AlgorithmIdentifier.byteLength + 4),
- asn1AlgorithmIdentifier,
- );
-
- const exportedPublicKey = await crypto.subtle.exportKey(
- "spki",
- keyPair.publicKey,
- );
-
- const spki = new Uint8Array(exportedPublicKey);
- assert(spki.length > 0);
-
- assertEquals(
- spki.slice(4, asn1AlgorithmIdentifier.byteLength + 1),
- asn1AlgorithmIdentifier.slice(3),
- );
- }
-});
-
-Deno.test(async function testHkdfDeriveBits() {
- const rawKey = crypto.getRandomValues(new Uint8Array(16));
- const key = await crypto.subtle.importKey(
- "raw",
- rawKey,
- { name: "HKDF", hash: "SHA-256" },
- false,
- ["deriveBits"],
- );
- const salt = crypto.getRandomValues(new Uint8Array(16));
- const info = crypto.getRandomValues(new Uint8Array(16));
- const result = await crypto.subtle.deriveBits(
- {
- name: "HKDF",
- hash: "SHA-256",
- salt: salt,
- info: info,
- },
- key,
- 128,
- );
- assertEquals(result.byteLength, 128 / 8);
-});
-
-Deno.test(async function testHkdfDeriveBitsWithLargeKeySize() {
- const key = await crypto.subtle.importKey(
- "raw",
- new Uint8Array([0x00]),
- "HKDF",
- false,
- ["deriveBits"],
- );
- await assertRejects(
- () =>
- crypto.subtle.deriveBits(
- {
- name: "HKDF",
- hash: "SHA-1",
- salt: new Uint8Array(),
- info: new Uint8Array(),
- },
- key,
- ((20 * 255) << 3) + 8,
- ),
- DOMException,
- "The length provided for HKDF is too large",
- );
-});
-
-Deno.test(async function testEcdhDeriveBitsWithShorterLength() {
- const keypair = await crypto.subtle.generateKey(
- {
- name: "ECDH",
- namedCurve: "P-384",
- },
- true,
- ["deriveBits", "deriveKey"],
- );
- const result = await crypto.subtle.deriveBits(
- {
- name: "ECDH",
- public: keypair.publicKey,
- },
- keypair.privateKey,
- 256,
- );
- assertEquals(result.byteLength * 8, 256);
-});
-
-Deno.test(async function testEcdhDeriveBitsWithLongerLength() {
- const keypair = await crypto.subtle.generateKey(
- {
- name: "ECDH",
- namedCurve: "P-384",
- },
- true,
- ["deriveBits", "deriveKey"],
- );
- await assertRejects(
- () =>
- crypto.subtle.deriveBits(
- {
- name: "ECDH",
- public: keypair.publicKey,
- },
- keypair.privateKey,
- 512,
- ),
- DOMException,
- "Invalid length",
- );
-});
-
-Deno.test(async function testEcdhDeriveBitsWithNullLength() {
- const keypair = await crypto.subtle.generateKey(
- {
- name: "ECDH",
- namedCurve: "P-384",
- },
- true,
- ["deriveBits", "deriveKey"],
- );
- const result = await crypto.subtle.deriveBits(
- {
- name: "ECDH",
- public: keypair.publicKey,
- },
- keypair.privateKey,
- // @ts-ignore: necessary until .d.ts file allows passing null (see https://github.com/microsoft/TypeScript-DOM-lib-generator/pull/1416)
- null,
- );
- assertEquals(result.byteLength * 8, 384);
-});
-
-Deno.test(async function testDeriveKey() {
- // Test deriveKey
- const rawKey = crypto.getRandomValues(new Uint8Array(16));
- const key = await crypto.subtle.importKey(
- "raw",
- rawKey,
- "PBKDF2",
- false,
- ["deriveKey", "deriveBits"],
- );
-
- const salt = crypto.getRandomValues(new Uint8Array(16));
- const derivedKey = await crypto.subtle.deriveKey(
- {
- name: "PBKDF2",
- salt,
- iterations: 1000,
- hash: "SHA-256",
- },
- key,
- { name: "HMAC", hash: "SHA-256" },
- true,
- ["sign"],
- );
-
- assert(derivedKey instanceof CryptoKey);
- assertEquals(derivedKey.type, "secret");
- assertEquals(derivedKey.extractable, true);
- assertEquals(derivedKey.usages, ["sign"]);
-
- const algorithm = derivedKey.algorithm as HmacKeyAlgorithm;
- assertEquals(algorithm.name, "HMAC");
- assertEquals(algorithm.hash.name, "SHA-256");
- assertEquals(algorithm.length, 512);
-});
-
-Deno.test(async function testAesCbcEncryptDecrypt() {
- const key = await crypto.subtle.generateKey(
- { name: "AES-CBC", length: 128 },
- true,
- ["encrypt", "decrypt"],
- );
-
- const iv = crypto.getRandomValues(new Uint8Array(16));
- const encrypted = await crypto.subtle.encrypt(
- {
- name: "AES-CBC",
- iv,
- },
- key as CryptoKey,
- new Uint8Array([1, 2, 3, 4, 5, 6]),
- );
-
- assert(encrypted instanceof ArrayBuffer);
- assertEquals(encrypted.byteLength, 16);
-
- const decrypted = await crypto.subtle.decrypt(
- {
- name: "AES-CBC",
- iv,
- },
- key as CryptoKey,
- encrypted,
- );
-
- assert(decrypted instanceof ArrayBuffer);
- assertEquals(decrypted.byteLength, 6);
- assertEquals(new Uint8Array(decrypted), new Uint8Array([1, 2, 3, 4, 5, 6]));
-});
-
-Deno.test(async function testAesCtrEncryptDecrypt() {
- async function aesCtrRoundTrip(
- key: CryptoKey,
- counter: Uint8Array,
- length: number,
- plainText: Uint8Array,
- ) {
- const cipherText = await crypto.subtle.encrypt(
- {
- name: "AES-CTR",
- counter,
- length,
- },
- key,
- plainText,
- );
-
- assert(cipherText instanceof ArrayBuffer);
- assertEquals(cipherText.byteLength, plainText.byteLength);
- assertNotEquals(new Uint8Array(cipherText), plainText);
-
- const decryptedText = await crypto.subtle.decrypt(
- {
- name: "AES-CTR",
- counter,
- length,
- },
- key,
- cipherText,
- );
-
- assert(decryptedText instanceof ArrayBuffer);
- assertEquals(decryptedText.byteLength, plainText.byteLength);
- assertEquals(new Uint8Array(decryptedText), plainText);
- }
- for (const keySize of [128, 192, 256]) {
- const key = await crypto.subtle.generateKey(
- { name: "AES-CTR", length: keySize },
- true,
- ["encrypt", "decrypt"],
- ) as CryptoKey;
-
- // test normal operation
- for (const length of [128 /*, 64, 128 */]) {
- const counter = crypto.getRandomValues(new Uint8Array(16));
-
- await aesCtrRoundTrip(
- key,
- counter,
- length,
- new Uint8Array([1, 2, 3, 4, 5, 6]),
- );
- }
-
- // test counter-wrapping
- for (const length of [32, 64, 128]) {
- const plaintext1 = crypto.getRandomValues(new Uint8Array(32));
- const counter = new Uint8Array(16);
-
- // fixed upper part
- for (let off = 0; off < 16 - (length / 8); ++off) {
- counter[off] = off;
- }
- const ciphertext1 = await crypto.subtle.encrypt(
- {
- name: "AES-CTR",
- counter,
- length,
- },
- key,
- plaintext1,
- );
-
- // Set lower [length] counter bits to all '1's
- for (let off = 16 - (length / 8); off < 16; ++off) {
- counter[off] = 0xff;
- }
-
- // = [ 1 block of 0x00 + plaintext1 ]
- const plaintext2 = new Uint8Array(48);
- plaintext2.set(plaintext1, 16);
-
- const ciphertext2 = await crypto.subtle.encrypt(
- {
- name: "AES-CTR",
- counter,
- length,
- },
- key,
- plaintext2,
- );
-
- // If counter wrapped, 2nd block of ciphertext2 should be equal to 1st block of ciphertext1
- // since ciphertext1 used counter = 0x00...00
- // and ciphertext2 used counter = 0xFF..FF which should wrap to 0x00..00 without affecting
- // higher bits
- assertEquals(
- new Uint8Array(ciphertext1),
- new Uint8Array(ciphertext2).slice(16),
- );
- }
- }
-});
-
-Deno.test(async function testECDH() {
- for (const keySize of [256, 384]) {
- const keyPair = await crypto.subtle.generateKey(
- {
- name: "ECDH",
- namedCurve: "P-" + keySize,
- },
- true,
- ["deriveBits"],
- );
-
- const derivedKey = await crypto.subtle.deriveBits(
- {
- name: "ECDH",
- public: keyPair.publicKey,
- },
- keyPair.privateKey,
- keySize,
- );
-
- assert(derivedKey instanceof ArrayBuffer);
- assertEquals(derivedKey.byteLength, keySize / 8);
- }
-});
-
-Deno.test(async function testWrapKey() {
- // Test wrapKey
- const key = await crypto.subtle.generateKey(
- {
- name: "RSA-OAEP",
- modulusLength: 4096,
- publicExponent: new Uint8Array([1, 0, 1]),
- hash: "SHA-256",
- },
- true,
- ["wrapKey", "unwrapKey"],
- );
-
- const hmacKey = await crypto.subtle.generateKey(
- {
- name: "HMAC",
- hash: "SHA-256",
- length: 128,
- },
- true,
- ["sign"],
- );
-
- const wrappedKey = await crypto.subtle.wrapKey(
- "raw",
- hmacKey,
- key.publicKey,
- {
- name: "RSA-OAEP",
- label: new Uint8Array(8),
- },
- );
-
- assert(wrappedKey instanceof ArrayBuffer);
- assertEquals(wrappedKey.byteLength, 512);
-});
-
-// Doesn't need to cover all cases.
-// Only for testing types.
-Deno.test(async function testAesKeyGen() {
- const key = await crypto.subtle.generateKey(
- {
- name: "AES-GCM",
- length: 256,
- },
- true,
- ["encrypt", "decrypt"],
- );
-
- assert(key);
- assertEquals(key.type, "secret");
- assertEquals(key.extractable, true);
- assertEquals(key.usages, ["encrypt", "decrypt"]);
- const algorithm = key.algorithm as AesKeyAlgorithm;
- assertEquals(algorithm.name, "AES-GCM");
- assertEquals(algorithm.length, 256);
-});
-
-Deno.test(async function testUnwrapKey() {
- const subtle = crypto.subtle;
-
- const AES_KEY: AesKeyAlgorithm & AesCbcParams = {
- name: "AES-CBC",
- length: 128,
- iv: new Uint8Array(16),
- };
-
- const RSA_KEY: RsaHashedKeyGenParams & RsaOaepParams = {
- name: "RSA-OAEP",
- modulusLength: 2048,
- publicExponent: new Uint8Array([1, 0, 1]),
- hash: "SHA-1",
- };
-
- const aesKey = await subtle.generateKey(AES_KEY, true, [
- "encrypt",
- "decrypt",
- ]);
-
- const rsaKeyPair = await subtle.generateKey(
- {
- name: "RSA-OAEP",
- hash: "SHA-1",
- publicExponent: new Uint8Array([1, 0, 1]),
- modulusLength: 2048,
- },
- false,
- ["wrapKey", "encrypt", "unwrapKey", "decrypt"],
- );
-
- const enc = await subtle.wrapKey(
- "raw",
- aesKey,
- rsaKeyPair.publicKey,
- RSA_KEY,
- );
- const unwrappedKey = await subtle.unwrapKey(
- "raw",
- enc,
- rsaKeyPair.privateKey,
- RSA_KEY,
- AES_KEY,
- false,
- ["encrypt", "decrypt"],
- );
-
- assert(unwrappedKey instanceof CryptoKey);
- assertEquals(unwrappedKey.type, "secret");
- assertEquals(unwrappedKey.extractable, false);
- assertEquals(unwrappedKey.usages, ["encrypt", "decrypt"]);
-});
-
-Deno.test(async function testDecryptWithInvalidIntializationVector() {
- // deno-fmt-ignore
- const data = new Uint8Array([42,42,42,42,42,42,42,42,42,42,42,42,42,42,42]);
- const key = await crypto.subtle.importKey(
- "raw",
- new Uint8Array(16),
- { name: "AES-CBC", length: 256 },
- true,
- ["encrypt", "decrypt"],
- );
- // deno-fmt-ignore
- const initVector = new Uint8Array([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]);
- const encrypted = await crypto.subtle.encrypt(
- { name: "AES-CBC", iv: initVector },
- key,
- data,
- );
- // deno-fmt-ignore
- const initVector2 = new Uint8Array([15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0]);
- await assertRejects(async () => {
- await crypto.subtle.decrypt(
- { name: "AES-CBC", iv: initVector2 },
- key,
- encrypted,
- );
- }, DOMException);
-});
-
-const jwtRSAKeys = {
- "1024": {
- size: 1024,
- publicJWK: {
- kty: "RSA",
- n: "zZn4sRGfjQos56yL_Qy1R9NI-THMnFynn94g5RxA6wGrJh4BJT3x6I9x0IbpS3q-d4ORA6R2vuDMh8dDFRr9RDH6XY-gUScc9U5Jz3UA2KmVfsCbnUPvcAmMV_ENA7_TF0ivVjuIFodyDTx7EKHNVTrHHSlrbt7spbmcivs23Zc",
- e: "AQAB",
- },
- privateJWK: {
- kty: "RSA",
- n: "zZn4sRGfjQos56yL_Qy1R9NI-THMnFynn94g5RxA6wGrJh4BJT3x6I9x0IbpS3q-d4ORA6R2vuDMh8dDFRr9RDH6XY-gUScc9U5Jz3UA2KmVfsCbnUPvcAmMV_ENA7_TF0ivVjuIFodyDTx7EKHNVTrHHSlrbt7spbmcivs23Zc",
- e: "AQAB",
- d: "YqIK_GdH85F-GWZdgfgmv15NE78gOaL5h2g4v7DeM9-JC7A5PHSLKNYn87HFGcC4vv0PBIBRtyCA_mJJfEaGWORVCOXSBpWNepMYpio52n3w5uj5UZEsBnbtZc0EtWhVF2Auqa7VbiKrWcQUEgEI8V0gE5D4tyBg8GXv9975dQE",
- p: "9BrAg5L1zfqGPuWJDuDCBX-TmtZdrOI3Ys4ZaN-yMPlTjwWSEPO0qnfjEZcw2VgXHgJJmbVco6TxckJCmEYqeQ",
- q: "157jDJ1Ya5nmQvTPbhKAPAeMWogxCyaQTkBrp30pEKd6mGSB385hqr4BIk8s3f7MdXpM-USpaZgUoT4o_2VEjw",
- dp:
- "qdd_QUzcaB-6jkKo1Ug-1xKIAgDLFsIjJUUfWt_iHL8ti2Kl2dOnTcCypgebPm5TT1bqHN-agGYAdK5zpX2UiQ",
- dq:
- "hNRfwOSplNfhLvxLUN7a2qA3yYm-1MSz_1DWQP7srlLORlUcYPht2FZmsnEeDcAqynBGPQUcbG2Av_hgHz2OZw",
- qi:
- "zbpJQAhinrxSbVKxBQ2EZGFUD2e3WCXbAJRYpk8HVQ5AA52OhKTicOye2hEHnrgpFKzC8iznTsCG3FMkvwcj4Q",
- },
- },
-
- "2048": {
- size: 2048,
- publicJWK: {
- kty: "RSA",
- // unpadded base64 for rawKey.
- n: "09eVwAhT9SPBxdEN-74BBeEANGaVGwqH-YglIc4VV7jfhR2by5ivzVq8NCeQ1_ACDIlTDY8CTMQ5E1c1SEXmo_T7q84XUGXf8U9mx6uRg46sV7fF-hkwJR80BFVsvWxp4ahPlVJYj__94ft7rIVvchb5tyalOjrYFCJoFnSgq-i3ZjU06csI9XnO5klINucD_Qq0vUhO23_Add2HSYoRjab8YiJJR_Eths7Pq6HHd2RSXmwYp5foRnwe0_U75XmesHWDJlJUHYbwCZo0kP9G8g4QbucwU-MSNBkZOO2x2ZtZNexpHd0ThkATbnNlpVG_z2AGNORp_Ve3rlXwrGIXXw",
- e: "AQAB",
- },
- privateJWK: {
- kty: "RSA",
- // unpadded base64 for rawKey.
- n: "09eVwAhT9SPBxdEN-74BBeEANGaVGwqH-YglIc4VV7jfhR2by5ivzVq8NCeQ1_ACDIlTDY8CTMQ5E1c1SEXmo_T7q84XUGXf8U9mx6uRg46sV7fF-hkwJR80BFVsvWxp4ahPlVJYj__94ft7rIVvchb5tyalOjrYFCJoFnSgq-i3ZjU06csI9XnO5klINucD_Qq0vUhO23_Add2HSYoRjab8YiJJR_Eths7Pq6HHd2RSXmwYp5foRnwe0_U75XmesHWDJlJUHYbwCZo0kP9G8g4QbucwU-MSNBkZOO2x2ZtZNexpHd0ThkATbnNlpVG_z2AGNORp_Ve3rlXwrGIXXw",
- e: "AQAB",
- d: "H4xboN2co0VP9kXL71G8lUOM5EDis8Q9u8uqu_4U75t4rjpamVeD1vFMVfgOehokM_m_hKVnkkcmuNqj9L90ObaiRFPM5QxG7YkFpXbHlPAKeoXD1hsqMF0VQg_2wb8DhberInHA_rEA_kaVhHvavQLu7Xez45gf1d_J4I4931vjlCB6cupbLL0H5hHsxbMsX_5nnmAJdL_U3gD-U7ZdQheUPhDBJR2KeGzvnTm3KVKpOnwn-1Cd45MU4-KDdP0FcBVEuBsSrsQHliTaciBgkbyj__BangPj3edDxTkb-fKkEvhkXRjAoJs1ixt8nfSGDce9cM_GqAX9XGb4s2QkAQ",
- dp:
- "mM82RBwzGzi9LAqjGbi-badLtHRRBoH9sfMrJuOtzxRnmwBFccg_lwy-qAhUTqnN9kvD0H1FzXWzoFPFJbyi-AOmumYGpWm_PvzQGldne5CPJ02pYaeg-t1BePsT3OpIq0Am8E2Kjf9polpRJwIjO7Kx8UJKkhg5bISnsy0V8wE",
- dq:
- "ZlM4AvrWIpXwqsH_5Q-6BsLJdbnN_GypFCXoT9VXniXncSBZIWCkgDndBdWkSzyzIN65NiMRBfZaf9yduTFj4kvOPwb3ch3J0OxGJk0Ary4OGSlS1zNwMl93ALGal1FzpWUuiia9L9RraGqXAUr13L7TIIMRobRjpAV-z7M-ruM",
- p: "7VwGt_tJcAFQHrmDw5dM1EBru6fidM45NDv6VVOEbxKuD5Sh2EfAHfm5c6oouA1gZqwvKH0sn_XpB1NsyYyHEQd3sBVdK0zRjTo-E9mRP-1s-LMd5YDXVq6HE339nxpXsmO25slQEF6zBrj1bSNNXBFc7fgDnlq-HIeleMvsY_E",
- q: "5HqMHLzb4IgXhUl4pLz7E4kjY8PH2YGzaQfK805zJMbOXzmlZK0hizKo34Qqd2nB9xos7QgzOYQrNfSWheARwVsSQzAE0vGvw3zHIPP_lTtChBlCTPctQcURjw4dXcnK1oQ-IT321FNOW3EO-YTsyGcypJqJujlZrLbxYjOjQE8",
- qi:
- "OQXzi9gypDnpdHatIi0FaUGP8LSzfVH0AUugURJXs4BTJpvA9y4hcpBQLrcl7H_vq6kbGmvC49V-9I5HNVX_AuxGIXKuLZr5WOxPq8gLTqHV7X5ZJDtWIP_nq2NNgCQQyNNRrxebiWlwGK9GnX_unewT6jopI_oFhwp0Q13rBR0",
- },
- },
- "4096": {
- size: 4096,
- publicJWK: {
- kty: "RSA",
- n: "2qr2TL2c2JmbsN0OLIRnaAB_ZKb1-Gh9H0qb4lrBuDaqkW_eFPwT-JIsvnNJvDT7BLJ57tTMIj56ZMtv6efSSTWSk9MOoW2J1K_iEretZ2cegB_aRX7qQVjnoFsz9U02BKfAIUT0o_K7b9G08d1rrAUohi_SVQhwObodg7BddMbKUmz70QNIS487LN44WUVnn9OgE9atTYUARNukT0DuQb3J-K20ksTuVujXbSelohDmLobqlGoi5sY_548Qs9BtFmQ2nGuEHNB2zdlZ5EvEqbUFVZ2QboG6jXdoos6qcwdgUvAhj1Hz10Ngic_RFqL7bNDoIOzNp66hdA35uxbwuaygZ16ikxoPj7eTYud1hrkyQCgeGw2YhCiKIE6eos_U5dL7WHRD5aSkkzsgXtnF8pVmStsuf0QcdAoC-eeCex0tSTgRw9AtGTz8Yr1tGQD9l_580zAXnE6jmrwRRQ68EEA7vohGov3tnG8pGyg_zcxeADLtPlfTc1tEwmh3SGrioDClioYCipm1JvkweEgP9eMPpEC8SgRU1VNDSVe1SF4uNsH8vA7PHFKfg6juqJEc5ht-l10FYER-Qq6bZXsU2oNcfE5SLDeLTWmxiHmxK00M8ABMFIV5gUkPoMiWcl87O6XwzA2chsIERp7Vb-Vn2O-EELiXzv7lPhc6fTGQ0Nc",
- e: "AQAB",
- },
- privateJWK: {
- kty: "RSA",
- n: "2qr2TL2c2JmbsN0OLIRnaAB_ZKb1-Gh9H0qb4lrBuDaqkW_eFPwT-JIsvnNJvDT7BLJ57tTMIj56ZMtv6efSSTWSk9MOoW2J1K_iEretZ2cegB_aRX7qQVjnoFsz9U02BKfAIUT0o_K7b9G08d1rrAUohi_SVQhwObodg7BddMbKUmz70QNIS487LN44WUVnn9OgE9atTYUARNukT0DuQb3J-K20ksTuVujXbSelohDmLobqlGoi5sY_548Qs9BtFmQ2nGuEHNB2zdlZ5EvEqbUFVZ2QboG6jXdoos6qcwdgUvAhj1Hz10Ngic_RFqL7bNDoIOzNp66hdA35uxbwuaygZ16ikxoPj7eTYud1hrkyQCgeGw2YhCiKIE6eos_U5dL7WHRD5aSkkzsgXtnF8pVmStsuf0QcdAoC-eeCex0tSTgRw9AtGTz8Yr1tGQD9l_580zAXnE6jmrwRRQ68EEA7vohGov3tnG8pGyg_zcxeADLtPlfTc1tEwmh3SGrioDClioYCipm1JvkweEgP9eMPpEC8SgRU1VNDSVe1SF4uNsH8vA7PHFKfg6juqJEc5ht-l10FYER-Qq6bZXsU2oNcfE5SLDeLTWmxiHmxK00M8ABMFIV5gUkPoMiWcl87O6XwzA2chsIERp7Vb-Vn2O-EELiXzv7lPhc6fTGQ0Nc",
- e: "AQAB",
- d: "uXPRXBhcE5-DWabBRKQuhxgU8ype5gTISWefeYP7U96ZHqu_sBByZ5ihdgyU9pgAZGVx4Ep9rnVKnH2lNr2zrP9Qhyqy99nM0aMxmypIWLAuP__DwLj4t99M4sU29c48CAq1egHfccSFjzpNuetOTCA71EJuokt70pm0OmGzgTyvjuR7VTLxd5PMXitBowSn8_cphmnFpT8tkTiuy8CH0R3DU7MOuINomDD1s8-yPBcVAVTPUnwJiauNuzestLQKMLlhT5wn-cAbYk36XRKdgkjSc2AkhHRl4WDqT1nzWYdh_DVIYSLiKSktkPO9ovMrRYiPtozfhl0m9SR9Ll0wXtcnnDlWXc_MSGpw18vmUBSJ4PIhkiFsvLn-db3wUkA8uve-iqqfk0sxlGWughWx03kGmZDmprWbXugCBHfsI4X93w4exznXH_tapxPnmjbhVUQR6p41MvO2lcHWPLwGJgLIoejBHpnn3TmMN0UjFZki7q9B_dJ3fXh0mX9DzAlC0sil1NgCPhMPq02393_giinQquMknrBvgKxGSfGUrDKuflCx611ZZlRM3R7YMX2OIy1g4DyhPzBVjxRMtm8PnIs3m3Hi-O-C_PHF93w9J8Wqd0yIw7SpavDqZXLPC6Cqi8K7MBZyVECXHtRj1bBqT-h_xZmFCDjSU0NqfOdgApE",
- p: "9NrXwq4kY9kBBOwLoFZVQc4kJI_NbKa_W9FLdQdRIbMsZZHXJ3XDUR9vJAcaaR75WwIC7X6N55nVtWTq28Bys9flJ9RrCTfciOntHEphBhYaL5ZTUl-6khYmsOf_psff2VaOOCvHGff5ejuOmBQxkw2E-cv7knRgWFHoLWpku2NJIMuGHt9ks7OAUfIZVYl9YJnw4FYUzhgaxemknjLeZ8XTkGW2zckzF-d95YI9i8zD80Umubsw-YxriSfqFQ0rGHBsbQ8ZOTd_KJju42BWnXIjNDYmjFUqdzVjI4XQ8EGrCEf_8_iwphGyXD7LOJ4fqd97B3bYpoRTPnCgY_SEHQ",
- q: "5J758_NeKr1XPZiLxXohYQQnh0Lb4QtGZ1xzCgjhBQLcIBeTOG_tYjCues9tmLt93LpJfypSJ-SjDLwkR2s069_IByYGpxyeGtV-ulqYhSw1nD2CXKMDGyO5jXDs9tJrS_UhfobXKQH03CRdFugyPkSNmXY-AafFynG7xLr7oYBC05FnhUXPm3VBTPt9K-BpqwYd_h9vkAWeprSPo83UlwcLMupSJY9LaHxhRdz2yi0ZKNwXXHRwcszGjDBvvzUcCYbqWqjzbEvFY6KtH8Jh4LhM46rHaoEOTernJsDF6a6W8Df88RthqTExcwnaQf0O_dlbjSxEIPfbxx8t1EQugw",
- dp:
- "4Y7Hu5tYAnLhMXuQqj9dgqU3PkcKYdCp7xc6f7Ah2P2JJHfYz4z4RD7Ez1eLyNKzulZ8A_PVHUjlSZiRkaYTBAEaJDrV70P6cFWuC6WpA0ZREQ1V7EgrQnANbGILa8QsPbYyhSQu4YlB1IwQq5_OmzyVBtgWA7AZIMMzMsMT0FuB_if-gWohBjmRN-vh0p45VUf6UW568-_YmgDFmMYbg1UFs7s_TwrNenPR0h7MO4CB8hP9vJLoZrooRczzIjljPbwy5bRG9CJfjTJ0vhj9MUT3kR1hHV1HJVGU5iBbfTfBKnvJGSI6-IDM4ZUm-B0R5hbs6s9cfOjhFmACIJIbMQ",
- dq:
- "gT4iPbfyHyVEwWyQb4X4grjvg7bXSKSwG1SXMDAOzV9tg7LwJjKYNy8gJAtJgNNVdsfVLs-E_Epzpoph1AIWO9YZZXkov6Yc9zyEVONMX9S7ReU74hTBd8E9b2lMfMg9ogYk9jtSPTt-6kigW4fOh4cHqZ6_tP3cgfLD3JZ8FDPHE4WaySvLDq49yUBO5dQKyIU_xV6OGhQjOUjP_yEoMmzn9tOittsIHTxbXTxqQ6c1FvU9O6YTv8Jl5_Cl66khfX1I1RG38xvurcHULyUbYgeuZ_Iuo9XreT73h9_owo9RguGT29XH4vcNZmRGf5GIvRb4e5lvtleIZkwJA3u78w",
- qi:
- "JHmVKb1zwW5iRR6RCeexYnh2fmY-3DrPSdM8Dxhr0F8dayi-tlRqEdnG0hvp45n8gLUskWWcB9EXlUJObZGKDfGuxgMa3g_xeLA2vmFQ12MxPsyH4iCNZvsgmGxx7TuOHrnDh5EBVnM4_de63crEJON2sYI8Ozi-xp2OEmAr2seWKq4sxkFni6exLhqb-NE4m9HMKlng1EtQh2rLBFG1VYD3SYYpMLc5fxzqGvSxn3Fa-Xgg-IZPY3ubrcm52KYgmLUGmnYStfVqGSWSdhDXHlNgI5pdAA0FzpyBk3ZX-JsxhwcnneKrYBBweq06kRMGWgvdbdAQ-7wSeGqqj5VPwA",
- },
- },
-};
-
-Deno.test(async function testImportRsaJwk() {
- const subtle = window.crypto.subtle;
- assert(subtle);
-
- for (const [_key, jwkData] of Object.entries(jwtRSAKeys)) {
- const { size, publicJWK, privateJWK } = jwkData;
- if (size < 2048) {
- continue;
- }
-
- // 1. Test import PSS
- for (const hash of ["SHA-1", "SHA-256", "SHA-384", "SHA-512"]) {
- const hashMapPSS: Record<string, string> = {
- "SHA-1": "PS1",
- "SHA-256": "PS256",
- "SHA-384": "PS384",
- "SHA-512": "PS512",
- };
-
- if (size == 1024 && hash == "SHA-512") {
- continue;
- }
-
- const privateKeyPSS = await crypto.subtle.importKey(
- "jwk",
- {
- alg: hashMapPSS[hash],
- ...privateJWK,
- ext: true,
- "key_ops": ["sign"],
- },
- { name: "RSA-PSS", hash },
- true,
- ["sign"],
- );
-
- const publicKeyPSS = await crypto.subtle.importKey(
- "jwk",
- {
- alg: hashMapPSS[hash],
- ...publicJWK,
- ext: true,
- "key_ops": ["verify"],
- },
- { name: "RSA-PSS", hash },
- true,
- ["verify"],
- );
-
- const signaturePSS = await crypto.subtle.sign(
- { name: "RSA-PSS", saltLength: 32 },
- privateKeyPSS,
- new Uint8Array([1, 2, 3, 4]),
- );
-
- const verifyPSS = await crypto.subtle.verify(
- { name: "RSA-PSS", saltLength: 32 },
- publicKeyPSS,
- signaturePSS,
- new Uint8Array([1, 2, 3, 4]),
- );
- assert(verifyPSS);
- }
-
- // 2. Test import PKCS1
- for (const hash of ["SHA-1", "SHA-256", "SHA-384", "SHA-512"]) {
- const hashMapPKCS1: Record<string, string> = {
- "SHA-1": "RS1",
- "SHA-256": "RS256",
- "SHA-384": "RS384",
- "SHA-512": "RS512",
- };
-
- if (size == 1024 && hash == "SHA-512") {
- continue;
- }
-
- const privateKeyPKCS1 = await crypto.subtle.importKey(
- "jwk",
- {
- alg: hashMapPKCS1[hash],
- ...privateJWK,
- ext: true,
- "key_ops": ["sign"],
- },
- { name: "RSASSA-PKCS1-v1_5", hash },
- true,
- ["sign"],
- );
-
- const publicKeyPKCS1 = await crypto.subtle.importKey(
- "jwk",
- {
- alg: hashMapPKCS1[hash],
- ...publicJWK,
- ext: true,
- "key_ops": ["verify"],
- },
- { name: "RSASSA-PKCS1-v1_5", hash },
- true,
- ["verify"],
- );
-
- const signaturePKCS1 = await crypto.subtle.sign(
- { name: "RSASSA-PKCS1-v1_5", saltLength: 32 },
- privateKeyPKCS1,
- new Uint8Array([1, 2, 3, 4]),
- );
-
- const verifyPKCS1 = await crypto.subtle.verify(
- { name: "RSASSA-PKCS1-v1_5", saltLength: 32 },
- publicKeyPKCS1,
- signaturePKCS1,
- new Uint8Array([1, 2, 3, 4]),
- );
- assert(verifyPKCS1);
- }
-
- // 3. Test import OAEP
- for (
- const { hash, plainText } of hashPlainTextVector
- ) {
- const hashMapOAEP: Record<string, string> = {
- "SHA-1": "RSA-OAEP",
- "SHA-256": "RSA-OAEP-256",
- "SHA-384": "RSA-OAEP-384",
- "SHA-512": "RSA-OAEP-512",
- };
-
- if (size == 1024 && hash == "SHA-512") {
- continue;
- }
-
- const encryptAlgorithm = { name: "RSA-OAEP" };
-
- const privateKeyOAEP = await crypto.subtle.importKey(
- "jwk",
- {
- alg: hashMapOAEP[hash],
- ...privateJWK,
- ext: true,
- "key_ops": ["decrypt"],
- },
- { ...encryptAlgorithm, hash },
- true,
- ["decrypt"],
- );
-
- const publicKeyOAEP = await crypto.subtle.importKey(
- "jwk",
- {
- alg: hashMapOAEP[hash],
- ...publicJWK,
- ext: true,
- "key_ops": ["encrypt"],
- },
- { ...encryptAlgorithm, hash },
- true,
- ["encrypt"],
- );
- const cipherText = await subtle.encrypt(
- encryptAlgorithm,
- publicKeyOAEP,
- plainText,
- );
-
- assert(cipherText);
- assert(cipherText.byteLength > 0);
- assertEquals(cipherText.byteLength * 8, size);
- assert(cipherText instanceof ArrayBuffer);
-
- const decrypted = await subtle.decrypt(
- encryptAlgorithm,
- privateKeyOAEP,
- cipherText,
- );
- assert(decrypted);
- assert(decrypted instanceof ArrayBuffer);
- assertEquals(new Uint8Array(decrypted), plainText);
- }
- }
-});
-
-const jwtECKeys = {
- "256": {
- size: 256,
- algo: "ES256",
- publicJWK: {
- kty: "EC",
- crv: "P-256",
- x: "0hCwpvnZ8BKGgFi0P6T0cQGFQ7ugDJJQ35JXwqyuXdE",
- y: "zgN1UtSBRQzjm00QlXAbF1v6s0uObAmeGPHBmDWDYeg",
- },
- privateJWK: {
- kty: "EC",
- crv: "P-256",
- x: "0hCwpvnZ8BKGgFi0P6T0cQGFQ7ugDJJQ35JXwqyuXdE",
- y: "zgN1UtSBRQzjm00QlXAbF1v6s0uObAmeGPHBmDWDYeg",
- d: "E9M6LVq_nPnrsh_4YNSu_m5W53eQ9N7ptAiE69M1ROo",
- },
- },
- "384": {
- size: 384,
- algo: "ES384",
- publicJWK: {
- kty: "EC",
- crv: "P-384",
- x: "IZwU1mYXs27G2IVrOFtzp000T9iude8EZDXdpU47RL1fvevR0I3Wni19wdwhjLQ1",
- y: "vSgTjMd4M3qEL2vWGyQOdCSfJGZ8KlgQp2v8KOAzX4imUB3sAZdtqFr7AIactqzo",
- },
- privateJWK: {
- kty: "EC",
- crv: "P-384",
- x: "IZwU1mYXs27G2IVrOFtzp000T9iude8EZDXdpU47RL1fvevR0I3Wni19wdwhjLQ1",
- y: "vSgTjMd4M3qEL2vWGyQOdCSfJGZ8KlgQp2v8KOAzX4imUB3sAZdtqFr7AIactqzo",
- d: "RTe1mQeE08LSLpao-S-hqkku6HPldqQVguFEGDyYiNEOa560ztSyzEAS5KxeqEBz",
- },
- },
-};
-
-type JWK = Record<string, string>;
-
-function equalJwk(expected: JWK, got: JWK): boolean {
- const fields = Object.keys(expected);
-
- for (let i = 0; i < fields.length; i++) {
- const fieldName = fields[i];
-
- if (!(fieldName in got)) {
- return false;
- }
- if (expected[fieldName] !== got[fieldName]) {
- return false;
- }
- }
-
- return true;
-}
-
-Deno.test(async function testImportExportEcDsaJwk() {
- const subtle = crypto.subtle;
- assert(subtle);
-
- for (
- const [_key, keyData] of Object.entries(jwtECKeys)
- ) {
- const { publicJWK, privateJWK, algo } = keyData;
-
- // 1. Test import EcDsa
- const privateKeyECDSA = await subtle.importKey(
- "jwk",
- {
- alg: algo,
- ...privateJWK,
- ext: true,
- "key_ops": ["sign"],
- },
- { name: "ECDSA", namedCurve: privateJWK.crv },
- true,
- ["sign"],
- );
- const expPrivateKeyJWK = await subtle.exportKey(
- "jwk",
- privateKeyECDSA,
- );
- assert(equalJwk(privateJWK, expPrivateKeyJWK as JWK));
-
- const publicKeyECDSA = await subtle.importKey(
- "jwk",
- {
- alg: algo,
- ...publicJWK,
- ext: true,
- "key_ops": ["verify"],
- },
- { name: "ECDSA", namedCurve: publicJWK.crv },
- true,
- ["verify"],
- );
-
- const expPublicKeyJWK = await subtle.exportKey(
- "jwk",
- publicKeyECDSA,
- );
-
- assert(equalJwk(publicJWK, expPublicKeyJWK as JWK));
-
- const signatureECDSA = await subtle.sign(
- { name: "ECDSA", hash: `SHA-${keyData.size}` },
- privateKeyECDSA,
- new Uint8Array([1, 2, 3, 4]),
- );
-
- const verifyECDSA = await subtle.verify(
- { name: "ECDSA", hash: `SHA-${keyData.size}` },
- publicKeyECDSA,
- signatureECDSA,
- new Uint8Array([1, 2, 3, 4]),
- );
- assert(verifyECDSA);
- }
-});
-
-Deno.test(async function testImportEcDhJwk() {
- const subtle = crypto.subtle;
- assert(subtle);
-
- for (
- const [_key, jwkData] of Object.entries(jwtECKeys)
- ) {
- const { size, publicJWK, privateJWK } = jwkData;
-
- // 1. Test import EcDsa
- const privateKeyECDH = await subtle.importKey(
- "jwk",
- {
- ...privateJWK,
- ext: true,
- "key_ops": ["deriveBits"],
- },
- { name: "ECDH", namedCurve: privateJWK.crv },
- true,
- ["deriveBits"],
- );
-
- const expPrivateKeyJWK = await subtle.exportKey(
- "jwk",
- privateKeyECDH,
- );
- assert(equalJwk(privateJWK, expPrivateKeyJWK as JWK));
-
- const publicKeyECDH = await subtle.importKey(
- "jwk",
- {
- ...publicJWK,
- ext: true,
- "key_ops": [],
- },
- { name: "ECDH", namedCurve: publicJWK.crv },
- true,
- [],
- );
- const expPublicKeyJWK = await subtle.exportKey(
- "jwk",
- publicKeyECDH,
- );
- assert(equalJwk(publicJWK, expPublicKeyJWK as JWK));
-
- const derivedKey = await subtle.deriveBits(
- {
- name: "ECDH",
- public: publicKeyECDH,
- },
- privateKeyECDH,
- size,
- );
-
- assert(derivedKey instanceof ArrayBuffer);
- assertEquals(derivedKey.byteLength, size / 8);
- }
-});
-
-const ecTestKeys = [
- {
- size: 256,
- namedCurve: "P-256",
- signatureLength: 64,
- // deno-fmt-ignore
- raw: new Uint8Array([
- 4, 210, 16, 176, 166, 249, 217, 240, 18, 134, 128, 88, 180, 63, 164, 244,
- 113, 1, 133, 67, 187, 160, 12, 146, 80, 223, 146, 87, 194, 172, 174, 93,
- 209, 206, 3, 117, 82, 212, 129, 69, 12, 227, 155, 77, 16, 149, 112, 27,
- 23, 91, 250, 179, 75, 142, 108, 9, 158, 24, 241, 193, 152, 53, 131, 97,
- 232,
- ]),
- // deno-fmt-ignore
- spki: new Uint8Array([
- 48, 89, 48, 19, 6, 7, 42, 134, 72, 206, 61, 2, 1, 6, 8, 42, 134, 72, 206,
- 61, 3, 1, 7, 3, 66, 0, 4, 210, 16, 176, 166, 249, 217, 240, 18, 134, 128,
- 88, 180, 63, 164, 244, 113, 1, 133, 67, 187, 160, 12, 146, 80, 223, 146,
- 87, 194, 172, 174, 93, 209, 206, 3, 117, 82, 212, 129, 69, 12, 227, 155,
- 77, 16, 149, 112, 27, 23, 91, 250, 179, 75, 142, 108, 9, 158, 24, 241,
- 193, 152, 53, 131, 97, 232,
- ]),
- // deno-fmt-ignore
- pkcs8: new Uint8Array([
- 48, 129, 135, 2, 1, 0, 48, 19, 6, 7, 42, 134, 72, 206, 61, 2, 1, 6, 8, 42,
- 134, 72, 206, 61, 3, 1, 7, 4, 109, 48, 107, 2, 1, 1, 4, 32, 19, 211, 58,
- 45, 90, 191, 156, 249, 235, 178, 31, 248, 96, 212, 174, 254, 110, 86, 231,
- 119, 144, 244, 222, 233, 180, 8, 132, 235, 211, 53, 68, 234, 161, 68, 3,
- 66, 0, 4, 210, 16, 176, 166, 249, 217, 240, 18, 134, 128, 88, 180, 63,
- 164, 244, 113, 1, 133, 67, 187, 160, 12, 146, 80, 223, 146, 87, 194, 172,
- 174, 93, 209, 206, 3, 117, 82, 212, 129, 69, 12, 227, 155, 77, 16, 149,
- 112, 27, 23, 91, 250, 179, 75, 142, 108, 9, 158, 24, 241, 193, 152, 53,
- 131, 97, 232,
- ]),
- },
- {
- size: 384,
- namedCurve: "P-384",
- signatureLength: 96,
- // deno-fmt-ignore
- raw: new Uint8Array([
- 4, 118, 64, 176, 165, 100, 177, 112, 49, 254, 58, 53, 158, 63, 73, 200,
- 148, 248, 242, 216, 186, 80, 92, 160, 53, 64, 232, 157, 19, 1, 12, 226,
- 115, 51, 42, 143, 98, 206, 55, 220, 108, 78, 24, 71, 157, 21, 120, 126,
- 104, 157, 86, 48, 226, 110, 96, 52, 48, 77, 170, 9, 231, 159, 26, 165,
- 200, 26, 164, 99, 46, 227, 169, 105, 172, 225, 60, 102, 141, 145, 139,
- 165, 47, 72, 53, 17, 17, 246, 161, 220, 26, 21, 23, 219, 1, 107, 185,
- 163, 215,
- ]),
- // deno-fmt-ignore
- spki: new Uint8Array([
- 48, 118, 48, 16, 6, 7, 42, 134, 72, 206, 61, 2, 1, 6, 5, 43, 129, 4, 0,
- 34, 3, 98, 0, 4, 118, 64, 176, 165, 100, 177, 112, 49, 254, 58, 53, 158,
- 63, 73, 200, 148, 248, 242, 216, 186, 80, 92, 160, 53, 64, 232, 157, 19,
- 1, 12, 226, 115, 51, 42, 143, 98, 206, 55, 220, 108, 78, 24, 71, 157, 21,
- 120, 126, 104, 157, 86, 48, 226, 110, 96, 52, 48, 77, 170, 9, 231, 159,
- 26, 165, 200, 26, 164, 99, 46, 227, 169, 105, 172, 225, 60, 102, 141,
- 145, 139, 165, 47, 72, 53, 17, 17, 246, 161, 220, 26, 21, 23, 219, 1,
- 107, 185, 163, 215,
- ]),
- // deno-fmt-ignore
- pkcs8: new Uint8Array([
- 48, 129, 182, 2, 1, 0, 48, 16, 6, 7, 42, 134, 72, 206, 61, 2, 1, 6, 5, 43,
- 129, 4, 0, 34, 4, 129, 158, 48, 129, 155, 2, 1, 1, 4, 48, 202, 7, 195,
- 169, 124, 170, 81, 169, 253, 127, 56, 28, 98, 90, 255, 165, 72, 142, 133,
- 138, 237, 200, 176, 92, 179, 192, 83, 28, 47, 118, 157, 152, 47, 65, 133,
- 140, 50, 83, 182, 191, 224, 96, 216, 179, 59, 150, 15, 233, 161, 100, 3,
- 98, 0, 4, 118, 64, 176, 165, 100, 177, 112, 49, 254, 58, 53, 158, 63, 73,
- 200, 148, 248, 242, 216, 186, 80, 92, 160, 53, 64, 232, 157, 19, 1, 12,
- 226, 115, 51, 42, 143, 98, 206, 55, 220, 108, 78, 24, 71, 157, 21, 120,
- 126, 104, 157, 86, 48, 226, 110, 96, 52, 48, 77, 170, 9, 231, 159, 26,
- 165, 200, 26, 164, 99, 46, 227, 169, 105, 172, 225, 60, 102, 141, 145,
- 139, 165, 47, 72, 53, 17, 17, 246, 161, 220, 26, 21, 23, 219, 1, 107,
- 185, 163, 215,
- ]),
- },
-];
-
-Deno.test(async function testImportEcSpkiPkcs8() {
- const subtle = window.crypto.subtle;
- assert(subtle);
-
- for (
- const { namedCurve, raw, spki, pkcs8, signatureLength } of ecTestKeys
- ) {
- const rawPublicKeyECDSA = await subtle.importKey(
- "raw",
- raw,
- { name: "ECDSA", namedCurve },
- true,
- ["verify"],
- );
-
- const expPublicKeyRaw = await subtle.exportKey(
- "raw",
- rawPublicKeyECDSA,
- );
-
- assertEquals(new Uint8Array(expPublicKeyRaw), raw);
-
- const privateKeyECDSA = await subtle.importKey(
- "pkcs8",
- pkcs8,
- { name: "ECDSA", namedCurve },
- true,
- ["sign"],
- );
-
- const expPrivateKeyPKCS8 = await subtle.exportKey(
- "pkcs8",
- privateKeyECDSA,
- );
-
- assertEquals(new Uint8Array(expPrivateKeyPKCS8), pkcs8);
-
- const expPrivateKeyJWK = await subtle.exportKey(
- "jwk",
- privateKeyECDSA,
- );
-
- assertEquals(expPrivateKeyJWK.crv, namedCurve);
-
- const publicKeyECDSA = await subtle.importKey(
- "spki",
- spki,
- { name: "ECDSA", namedCurve },
- true,
- ["verify"],
- );
-
- const expPublicKeySPKI = await subtle.exportKey(
- "spki",
- publicKeyECDSA,
- );
-
- assertEquals(new Uint8Array(expPublicKeySPKI), spki);
-
- const expPublicKeyJWK = await subtle.exportKey(
- "jwk",
- publicKeyECDSA,
- );
-
- assertEquals(expPublicKeyJWK.crv, namedCurve);
-
- for (
- const hash of ["SHA-1", "SHA-256", "SHA-384", "SHA-512"]
- ) {
- if (
- (hash == "SHA-256" && namedCurve == "P-256") ||
- (hash == "SHA-384" && namedCurve == "P-384")
- ) {
- const signatureECDSA = await subtle.sign(
- { name: "ECDSA", hash },
- privateKeyECDSA,
- new Uint8Array([1, 2, 3, 4]),
- );
-
- const verifyECDSA = await subtle.verify(
- { name: "ECDSA", hash },
- publicKeyECDSA,
- signatureECDSA,
- new Uint8Array([1, 2, 3, 4]),
- );
- assert(verifyECDSA);
- } else {
- await assertRejects(
- async () => {
- await subtle.sign(
- { name: "ECDSA", hash },
- privateKeyECDSA,
- new Uint8Array([1, 2, 3, 4]),
- );
- },
- DOMException,
- "Not implemented",
- );
- await assertRejects(
- async () => {
- await subtle.verify(
- { name: "ECDSA", hash },
- publicKeyECDSA,
- new Uint8Array(signatureLength),
- new Uint8Array([1, 2, 3, 4]),
- );
- },
- DOMException,
- "Not implemented",
- );
- }
- }
- }
-});
-
-Deno.test(async function testAesGcmEncrypt() {
- const key = await crypto.subtle.importKey(
- "raw",
- new Uint8Array(16),
- { name: "AES-GCM", length: 256 },
- true,
- ["encrypt", "decrypt"],
- );
-
- const nonces = [{
- iv: new Uint8Array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]),
- ciphertext: new Uint8Array([
- 50,
- 223,
- 112,
- 178,
- 166,
- 156,
- 255,
- 110,
- 125,
- 138,
- 95,
- 141,
- 82,
- 47,
- 14,
- 164,
- 134,
- 247,
- 22,
- ]),
- }, {
- iv: new Uint8Array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]),
- ciphertext: new Uint8Array([
- 210,
- 101,
- 81,
- 216,
- 151,
- 9,
- 192,
- 197,
- 62,
- 254,
- 28,
- 132,
- 89,
- 106,
- 40,
- 29,
- 175,
- 232,
- 201,
- ]),
- }];
- for (const { iv, ciphertext: fixture } of nonces) {
- const data = new Uint8Array([1, 2, 3]);
-
- const cipherText = await crypto.subtle.encrypt(
- { name: "AES-GCM", iv },
- key,
- data,
- );
-
- assert(cipherText instanceof ArrayBuffer);
- assertEquals(cipherText.byteLength, 19);
- assertEquals(
- new Uint8Array(cipherText),
- fixture,
- );
-
- const plainText = await crypto.subtle.decrypt(
- { name: "AES-GCM", iv },
- key,
- cipherText,
- );
- assert(plainText instanceof ArrayBuffer);
- assertEquals(plainText.byteLength, 3);
- assertEquals(new Uint8Array(plainText), data);
- }
-});
-
-async function roundTripSecretJwk(
- jwk: JsonWebKey,
- algId: AlgorithmIdentifier | HmacImportParams,
- ops: KeyUsage[],
- validateKeys: (
- key: CryptoKey,
- originalJwk: JsonWebKey,
- exportedJwk: JsonWebKey,
- ) => void,
-) {
- const key = await crypto.subtle.importKey(
- "jwk",
- jwk,
- algId,
- true,
- ops,
- );
-
- assert(key instanceof CryptoKey);
- assertEquals(key.type, "secret");
-
- const exportedKey = await crypto.subtle.exportKey("jwk", key);
-
- validateKeys(key, jwk, exportedKey);
-}
-
-Deno.test(async function testSecretJwkBase64Url() {
- // Test 16bits with "overflow" in 3rd pos of 'quartet', no padding
- const keyData = `{
- "kty": "oct",
- "k": "xxx",
- "alg": "HS512",
- "key_ops": ["sign", "verify"],
- "ext": true
- }`;
-
- await roundTripSecretJwk(
- JSON.parse(keyData),
- { name: "HMAC", hash: "SHA-512" },
- ["sign", "verify"],
- (key, _orig, exp) => {
- assertEquals((key.algorithm as HmacKeyAlgorithm).length, 16);
-
- assertEquals(exp.k, "xxw");
- },
- );
-
- // HMAC 128bits with base64url characters (-_)
- await roundTripSecretJwk(
- {
- kty: "oct",
- k: "HnZXRyDKn-_G5Fx4JWR1YA",
- alg: "HS256",
- "key_ops": ["sign", "verify"],
- ext: true,
- },
- { name: "HMAC", hash: "SHA-256" },
- ["sign", "verify"],
- (key, orig, exp) => {
- assertEquals((key.algorithm as HmacKeyAlgorithm).length, 128);
-
- assertEquals(orig.k, exp.k);
- },
- );
-
- // HMAC 104bits/(12+1) bytes with base64url characters (-_), padding and overflow in 2rd pos of "quartet"
- await roundTripSecretJwk(
- {
- kty: "oct",
- k: "a-_AlFa-2-OmEGa_-z==",
- alg: "HS384",
- "key_ops": ["sign", "verify"],
- ext: true,
- },
- { name: "HMAC", hash: "SHA-384" },
- ["sign", "verify"],
- (key, _orig, exp) => {
- assertEquals((key.algorithm as HmacKeyAlgorithm).length, 104);
-
- assertEquals("a-_AlFa-2-OmEGa_-w", exp.k);
- },
- );
-
- // AES-CBC 128bits with base64url characters (-_) no padding
- await roundTripSecretJwk(
- {
- kty: "oct",
- k: "_u3K_gEjRWf-7cr-ASNFZw",
- alg: "A128CBC",
- "key_ops": ["encrypt", "decrypt"],
- ext: true,
- },
- { name: "AES-CBC" },
- ["encrypt", "decrypt"],
- (_key, orig, exp) => {
- assertEquals(orig.k, exp.k);
- },
- );
-
- // AES-CBC 128bits of '1' with padding chars
- await roundTripSecretJwk(
- {
- kty: "oct",
- k: "_____________________w==",
- alg: "A128CBC",
- "key_ops": ["encrypt", "decrypt"],
- ext: true,
- },
- { name: "AES-CBC" },
- ["encrypt", "decrypt"],
- (_key, _orig, exp) => {
- assertEquals(exp.k, "_____________________w");
- },
- );
-});
-
-Deno.test(async function testAESWrapKey() {
- const key = await crypto.subtle.generateKey(
- {
- name: "AES-KW",
- length: 128,
- },
- true,
- ["wrapKey", "unwrapKey"],
- );
-
- const hmacKey = await crypto.subtle.generateKey(
- {
- name: "HMAC",
- hash: "SHA-256",
- length: 128,
- },
- true,
- ["sign"],
- );
-
- //round-trip
- // wrap-unwrap-export compare
- const wrappedKey = await crypto.subtle.wrapKey(
- "raw",
- hmacKey,
- key,
- {
- name: "AES-KW",
- },
- );
-
- assert(wrappedKey instanceof ArrayBuffer);
- assertEquals(wrappedKey.byteLength, 16 + 8); // 8 = 'auth tag'
-
- const unwrappedKey = await crypto.subtle.unwrapKey(
- "raw",
- wrappedKey,
- key,
- {
- name: "AES-KW",
- },
- {
- name: "HMAC",
- hash: "SHA-256",
- },
- true,
- ["sign"],
- );
-
- assert(unwrappedKey instanceof CryptoKey);
- assertEquals((unwrappedKey.algorithm as HmacKeyAlgorithm).length, 128);
-
- const hmacKeyBytes = await crypto.subtle.exportKey("raw", hmacKey);
- const unwrappedKeyBytes = await crypto.subtle.exportKey("raw", unwrappedKey);
-
- assertEquals(new Uint8Array(hmacKeyBytes), new Uint8Array(unwrappedKeyBytes));
-});
-
-// https://github.com/denoland/deno/issues/13534
-Deno.test(async function testAesGcmTagLength() {
- const key = await crypto.subtle.importKey(
- "raw",
- new Uint8Array(32),
- "AES-GCM",
- false,
- ["encrypt", "decrypt"],
- );
-
- const iv = crypto.getRandomValues(new Uint8Array(12));
-
- // encrypt won't fail, it will simply truncate the tag
- // as expected.
- const encrypted = await crypto.subtle.encrypt(
- { name: "AES-GCM", iv, tagLength: 96 },
- key,
- new Uint8Array(32),
- );
-
- await assertRejects(async () => {
- await crypto.subtle.decrypt(
- { name: "AES-GCM", iv, tagLength: 96 },
- key,
- encrypted,
- );
- });
-});
-
-Deno.test(async function ecPrivateKeyMaterialExportSpki() {
- // `generateKey` generates a key pair internally stored as "private" key.
- const keys = await crypto.subtle.generateKey(
- { name: "ECDSA", namedCurve: "P-256" },
- true,
- ["sign", "verify"],
- );
-
- assert(keys.privateKey instanceof CryptoKey);
- assert(keys.publicKey instanceof CryptoKey);
-
- // `exportKey` should be able to perform necessary conversion to export spki.
- const spki = await crypto.subtle.exportKey("spki", keys.publicKey);
- assert(spki instanceof ArrayBuffer);
-});
-
-// https://github.com/denoland/deno/issues/13911
-Deno.test(async function importJwkWithUse() {
- const jwk = {
- "kty": "EC",
- "use": "sig",
- "crv": "P-256",
- "x": "FWZ9rSkLt6Dx9E3pxLybhdM6xgR5obGsj5_pqmnz5J4",
- "y": "_n8G69C-A2Xl4xUW2lF0i8ZGZnk_KPYrhv4GbTGu5G4",
- };
-
- const algorithm = { name: "ECDSA", namedCurve: "P-256" };
-
- const key = await crypto.subtle.importKey(
- "jwk",
- jwk,
- algorithm,
- true,
- ["verify"],
- );
-
- assert(key instanceof CryptoKey);
-});
-
-// https://github.com/denoland/deno/issues/14215
-Deno.test(async function exportKeyNotExtractable() {
- const key = await crypto.subtle.generateKey(
- {
- name: "HMAC",
- hash: "SHA-512",
- },
- false,
- ["sign", "verify"],
- );
-
- assert(key);
- assertEquals(key.extractable, false);
-
- await assertRejects(async () => {
- // Should fail
- await crypto.subtle.exportKey("raw", key);
- }, DOMException);
-});
-
-// https://github.com/denoland/deno/issues/15126
-Deno.test(async function testImportLeadingZeroesKey() {
- const alg = { name: "ECDSA", namedCurve: "P-256" };
-
- const jwk = {
- kty: "EC",
- crv: "P-256",
- alg: "ES256",
- x: "EvidcdFB1xC6tgfakqZsU9aIURxAJkcX62zHe1Nt6xU",
- y: "AHsk6BioGM7MZWeXOE_49AGmtuaXFT3Ill3DYtz9uYg",
- d: "WDeYo4o1heCF9l_2VIaClRyIeO16zsMlN8UG6Le9dU8",
- "key_ops": ["sign"],
- ext: true,
- };
-
- const key = await crypto.subtle.importKey(
- "jwk",
- jwk,
- alg,
- true,
- ["sign"],
- );
-
- assert(key instanceof CryptoKey);
- assertEquals(key.type, "private");
-});
-
-// https://github.com/denoland/deno/issues/15523
-Deno.test(async function testECspkiRoundTrip() {
- const alg = { name: "ECDH", namedCurve: "P-256" };
- const { publicKey } = await crypto.subtle.generateKey(alg, true, [
- "deriveBits",
- ]);
- const spki = await crypto.subtle.exportKey("spki", publicKey);
- await crypto.subtle.importKey("spki", spki, alg, true, []);
-});
-
-Deno.test(async function testHmacJwkImport() {
- await crypto.subtle.importKey(
- "jwk",
- {
- kty: "oct",
- use: "sig",
- alg: "HS256",
- k: "hJtXIZ2uSN5kbQfbtTNWbpdmhkV8FJG-Onbc6mxCcYg",
- },
- { name: "HMAC", hash: "SHA-256" },
- false,
- ["sign", "verify"],
- );
-});
-
-Deno.test(async function p521Import() {
- const jwk = {
- "crv": "P-521",
- "ext": true,
- "key_ops": [
- "verify",
- ],
- "kty": "EC",
- "x":
- "AXkSI8nfkc6bu3fifXGuKKbu08g5LKPfxUNQJJYzzPgmN8XLDzx0C9Sdeejl1XoWGrheKPHl0k4tUmHw0cdInpfj",
- "y":
- "AT4vjsO0bzVRlN3Wthv9DewncDXS2tlTob5QojV8WX1GzOAikRfWFEP3nspoSv88U447acZAsk5IvgGJuVjgMDlx",
- };
- const algorithm = { name: "ECDSA", namedCurve: "P-521" };
-
- const key = await crypto.subtle.importKey(
- "jwk",
- jwk,
- algorithm,
- true,
- ["verify"],
- );
-
- assert(key instanceof CryptoKey);
-});
-
-Deno.test(async function p521Generate() {
- const algorithm = { name: "ECDSA", namedCurve: "P-521" };
-
- const key = await crypto.subtle.generateKey(
- algorithm,
- true,
- ["sign", "verify"],
- );
-
- assert(key.privateKey instanceof CryptoKey);
- assert(key.publicKey instanceof CryptoKey);
-});
diff --git a/cli/tests/unit/webgpu_test.ts b/cli/tests/unit/webgpu_test.ts
deleted file mode 100644
index 75ae34981..000000000
--- a/cli/tests/unit/webgpu_test.ts
+++ /dev/null
@@ -1,267 +0,0 @@
-// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
-
-import { assert, assertEquals, assertThrows } from "./test_util.ts";
-
-let isCI: boolean;
-try {
- isCI = (Deno.env.get("CI")?.length ?? 0) > 0;
-} catch {
- isCI = true;
-}
-
-// Skip these tests on linux CI, because the vulkan emulator is not good enough
-// yet, and skip on macOS CI because these do not have virtual GPUs.
-const isLinuxOrMacCI =
- (Deno.build.os === "linux" || Deno.build.os === "darwin") && isCI;
-// Skip these tests in WSL because it doesn't have good GPU support.
-const isWsl = await checkIsWsl();
-
-Deno.test({
- permissions: { read: true, env: true },
- ignore: isWsl || isLinuxOrMacCI,
-}, async function webgpuComputePass() {
- const adapter = await navigator.gpu.requestAdapter();
- assert(adapter);
-
- const numbers = [1, 4, 3, 295];
-
- const device = await adapter.requestDevice();
- assert(device);
-
- const shaderCode = await Deno.readTextFile(
- "cli/tests/testdata/webgpu/computepass_shader.wgsl",
- );
-
- const shaderModule = device.createShaderModule({
- code: shaderCode,
- });
-
- const size = new Uint32Array(numbers).byteLength;
-
- const stagingBuffer = device.createBuffer({
- size: size,
- usage: GPUBufferUsage.MAP_READ | GPUBufferUsage.COPY_DST,
- });
-
- const storageBuffer = device.createBuffer({
- label: "Storage Buffer",
- size: size,
- usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST |
- GPUBufferUsage.COPY_SRC,
- mappedAtCreation: true,
- });
-
- const buf = new Uint32Array(storageBuffer.getMappedRange());
-
- buf.set(numbers);
-
- storageBuffer.unmap();
-
- const computePipeline = device.createComputePipeline({
- layout: "auto",
- compute: {
- module: shaderModule,
- entryPoint: "main",
- },
- });
- const bindGroupLayout = computePipeline.getBindGroupLayout(0);
-
- const bindGroup = device.createBindGroup({
- layout: bindGroupLayout,
- entries: [
- {
- binding: 0,
- resource: {
- buffer: storageBuffer,
- },
- },
- ],
- });
-
- const encoder = device.createCommandEncoder();
-
- const computePass = encoder.beginComputePass();
- computePass.setPipeline(computePipeline);
- computePass.setBindGroup(0, bindGroup);
- computePass.insertDebugMarker("compute collatz iterations");
- computePass.dispatchWorkgroups(numbers.length);
- computePass.end();
-
- encoder.copyBufferToBuffer(storageBuffer, 0, stagingBuffer, 0, size);
-
- device.queue.submit([encoder.finish()]);
-
- await stagingBuffer.mapAsync(1);
-
- const data = stagingBuffer.getMappedRange();
-
- assertEquals(new Uint32Array(data), new Uint32Array([0, 2, 7, 55]));
-
- stagingBuffer.unmap();
-
- device.destroy();
-
- // TODO(lucacasonato): webgpu spec should add a explicit destroy method for
- // adapters.
- const resources = Object.keys(Deno.resources());
- Deno.close(Number(resources[resources.length - 1]));
-});
-
-Deno.test({
- permissions: { read: true, env: true },
- ignore: isWsl || isLinuxOrMacCI,
-}, async function webgpuHelloTriangle() {
- const adapter = await navigator.gpu.requestAdapter();
- assert(adapter);
-
- const device = await adapter.requestDevice();
- assert(device);
-
- const shaderCode = await Deno.readTextFile(
- "cli/tests/testdata/webgpu/hellotriangle_shader.wgsl",
- );
-
- const shaderModule = device.createShaderModule({
- code: shaderCode,
- });
-
- const pipelineLayout = device.createPipelineLayout({
- bindGroupLayouts: [],
- });
-
- const renderPipeline = device.createRenderPipeline({
- layout: pipelineLayout,
- vertex: {
- module: shaderModule,
- entryPoint: "vs_main",
- },
- fragment: {
- module: shaderModule,
- entryPoint: "fs_main",
- targets: [
- {
- format: "rgba8unorm-srgb",
- },
- ],
- },
- });
-
- const dimensions = {
- width: 200,
- height: 200,
- };
- const unpaddedBytesPerRow = dimensions.width * 4;
- const align = 256;
- const paddedBytesPerRowPadding = (align - unpaddedBytesPerRow % align) %
- align;
- const paddedBytesPerRow = unpaddedBytesPerRow + paddedBytesPerRowPadding;
-
- const outputBuffer = device.createBuffer({
- label: "Capture",
- size: paddedBytesPerRow * dimensions.height,
- usage: GPUBufferUsage.MAP_READ | GPUBufferUsage.COPY_DST,
- });
- const texture = device.createTexture({
- label: "Capture",
- size: dimensions,
- format: "rgba8unorm-srgb",
- usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.COPY_SRC,
- });
-
- const encoder = device.createCommandEncoder();
- const view = texture.createView();
- const renderPass = encoder.beginRenderPass({
- colorAttachments: [
- {
- view,
- storeOp: "store",
- loadOp: "clear",
- clearValue: [0, 1, 0, 1],
- },
- ],
- });
- renderPass.setPipeline(renderPipeline);
- renderPass.draw(3, 1);
- renderPass.end();
-
- encoder.copyTextureToBuffer(
- {
- texture,
- },
- {
- buffer: outputBuffer,
- bytesPerRow: paddedBytesPerRow,
- rowsPerImage: 0,
- },
- dimensions,
- );
-
- const bundle = encoder.finish();
- device.queue.submit([bundle]);
-
- await outputBuffer.mapAsync(1);
- const data = new Uint8Array(outputBuffer.getMappedRange());
-
- assertEquals(
- data,
- await Deno.readFile("cli/tests/testdata/webgpu/hellotriangle.out"),
- );
-
- outputBuffer.unmap();
-
- device.destroy();
-
- // TODO(lucacasonato): webgpu spec should add a explicit destroy method for
- // adapters.
- const resources = Object.keys(Deno.resources());
- Deno.close(Number(resources[resources.length - 1]));
-});
-
-Deno.test({
- ignore: isWsl || isLinuxOrMacCI,
-}, async function webgpuAdapterHasFeatures() {
- const adapter = await navigator.gpu.requestAdapter();
- assert(adapter);
- assert(adapter.features);
- const resources = Object.keys(Deno.resources());
- Deno.close(Number(resources[resources.length - 1]));
-});
-
-Deno.test({
- ignore: isWsl || isLinuxOrMacCI,
-}, async function webgpuNullWindowSurfaceThrows() {
- const adapter = await navigator.gpu.requestAdapter();
- assert(adapter);
-
- const device = await adapter.requestDevice();
- assert(device);
-
- assertThrows(
- () => {
- new Deno.UnsafeWindowSurface("cocoa", null, null);
- },
- );
-
- device.destroy();
- const resources = Object.keys(Deno.resources());
- Deno.close(Number(resources[resources.length - 1]));
-});
-
-Deno.test(function getPreferredCanvasFormat() {
- const preferredFormat = navigator.gpu.getPreferredCanvasFormat();
- assert(preferredFormat === "bgra8unorm" || preferredFormat === "rgba8unorm");
-});
-
-async function checkIsWsl() {
- return Deno.build.os === "linux" && await hasMicrosoftProcVersion();
-
- async function hasMicrosoftProcVersion() {
- // https://github.com/microsoft/WSL/issues/423#issuecomment-221627364
- try {
- const procVersion = await Deno.readTextFile("/proc/version");
- return /microsoft/i.test(procVersion);
- } catch {
- return false;
- }
- }
-}
diff --git a/cli/tests/unit/websocket_test.ts b/cli/tests/unit/websocket_test.ts
deleted file mode 100644
index 42681c187..000000000
--- a/cli/tests/unit/websocket_test.ts
+++ /dev/null
@@ -1,738 +0,0 @@
-// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
-import { assert, assertEquals, assertThrows, fail } from "./test_util.ts";
-
-const servePort = 4248;
-const serveUrl = `ws://localhost:${servePort}/`;
-
-Deno.test({ permissions: "none" }, function websocketPermissionless() {
- assertThrows(
- () => new WebSocket("ws://localhost"),
- Deno.errors.PermissionDenied,
- );
-});
-
-Deno.test(async function websocketConstructorTakeURLObjectAsParameter() {
- const { promise, resolve, reject } = Promise.withResolvers<void>();
- const ws = new WebSocket(new URL("ws://localhost:4242/"));
- assertEquals(ws.url, "ws://localhost:4242/");
- ws.onerror = (e) => reject(e);
- ws.onopen = () => ws.close();
- ws.onclose = () => {
- resolve();
- };
- await promise;
-});
-
-Deno.test(async function websocketH2SendSmallPacket() {
- const { promise, resolve, reject } = Promise.withResolvers<void>();
- const ws = new WebSocket(new URL("wss://localhost:4249/"));
- assertEquals(ws.url, "wss://localhost:4249/");
- let messageCount = 0;
- ws.onerror = (e) => reject(e);
- ws.onopen = () => {
- ws.send("a".repeat(16));
- ws.send("a".repeat(16));
- ws.send("a".repeat(16));
- };
- ws.onmessage = () => {
- if (++messageCount == 3) {
- ws.close();
- }
- };
- ws.onclose = () => {
- resolve();
- };
- await promise;
-});
-
-Deno.test(async function websocketH2SendLargePacket() {
- const { promise, resolve, reject } = Promise.withResolvers<void>();
- const ws = new WebSocket(new URL("wss://localhost:4249/"));
- assertEquals(ws.url, "wss://localhost:4249/");
- let messageCount = 0;
- ws.onerror = (e) => reject(e);
- ws.onopen = () => {
- ws.send("a".repeat(65000));
- ws.send("a".repeat(65000));
- ws.send("a".repeat(65000));
- };
- ws.onmessage = () => {
- if (++messageCount == 3) {
- ws.close();
- }
- };
- ws.onclose = () => {
- resolve();
- };
- await promise;
-});
-
-Deno.test(async function websocketSendLargePacket() {
- const { promise, resolve, reject } = Promise.withResolvers<void>();
- const ws = new WebSocket(new URL("wss://localhost:4243/"));
- assertEquals(ws.url, "wss://localhost:4243/");
- ws.onerror = (e) => reject(e);
- ws.onopen = () => {
- ws.send("a".repeat(65000));
- };
- ws.onmessage = () => {
- ws.close();
- };
- ws.onclose = () => {
- resolve();
- };
- await promise;
-});
-
-Deno.test(async function websocketSendLargeBinaryPacket() {
- const { promise, resolve, reject } = Promise.withResolvers<void>();
- const ws = new WebSocket(new URL("wss://localhost:4243/"));
- ws.binaryType = "arraybuffer";
- assertEquals(ws.url, "wss://localhost:4243/");
- ws.onerror = (e) => reject(e);
- ws.onopen = () => {
- ws.send(new Uint8Array(65000));
- };
- ws.onmessage = (msg: MessageEvent) => {
- assertEquals(msg.data.byteLength, 65000);
- ws.close();
- };
- ws.onclose = () => {
- resolve();
- };
- await promise;
-});
-
-Deno.test(async function websocketSendLargeBlobPacket() {
- const { promise, resolve, reject } = Promise.withResolvers<void>();
- const ws = new WebSocket(new URL("wss://localhost:4243/"));
- ws.binaryType = "arraybuffer";
- assertEquals(ws.url, "wss://localhost:4243/");
- ws.onerror = (e) => reject(e);
- ws.onopen = () => {
- ws.send(new Blob(["a".repeat(65000)]));
- };
- ws.onmessage = (msg: MessageEvent) => {
- assertEquals(msg.data.byteLength, 65000);
- ws.close();
- };
- ws.onclose = () => {
- resolve();
- };
- await promise;
-});
-
-// https://github.com/denoland/deno/pull/17762
-// https://github.com/denoland/deno/issues/17761
-Deno.test(async function websocketPingPong() {
- const { promise, resolve, reject } = Promise.withResolvers<void>();
- const ws = new WebSocket("ws://localhost:4245/");
- assertEquals(ws.url, "ws://localhost:4245/");
- ws.onerror = (e) => reject(e);
- ws.onmessage = (e) => {
- ws.send(e.data);
- };
- ws.onclose = () => {
- resolve();
- };
- await promise;
- ws.close();
-});
-
-// TODO(mmastrac): This requires us to ignore bad certs
-// Deno.test(async function websocketSecureConnect() {
-// const { promise, resolve } = Promise.withResolvers<void>();
-// const ws = new WebSocket("wss://localhost:4243/");
-// assertEquals(ws.url, "wss://localhost:4243/");
-// ws.onerror = (error) => {
-// console.log(error);
-// fail();
-// };
-// ws.onopen = () => ws.close();
-// ws.onclose = () => {
-// resolve();
-// };
-// await promise;
-// });
-
-// https://github.com/denoland/deno/issues/18700
-Deno.test(
- { sanitizeOps: false, sanitizeResources: false },
- async function websocketWriteLock() {
- const ac = new AbortController();
- const listeningDeferred = Promise.withResolvers<void>();
-
- const server = Deno.serve({
- handler: (req) => {
- const { socket, response } = Deno.upgradeWebSocket(req);
- socket.onopen = function () {
- setTimeout(() => socket.send("Hello"), 500);
- };
- socket.onmessage = function (e) {
- assertEquals(e.data, "Hello");
- ac.abort();
- };
- return response;
- },
- signal: ac.signal,
- onListen: () => listeningDeferred.resolve(),
- hostname: "localhost",
- port: servePort,
- });
-
- await listeningDeferred.promise;
- const deferred = Promise.withResolvers<void>();
- const ws = new WebSocket(serveUrl);
- assertEquals(ws.url, serveUrl);
- ws.onerror = () => fail();
- ws.onmessage = (e) => {
- assertEquals(e.data, "Hello");
- setTimeout(() => {
- ws.send(e.data);
- }, 1000);
- deferred.resolve();
- };
- ws.onclose = () => {
- deferred.resolve();
- };
-
- await Promise.all([deferred.promise, server.finished]);
- ws.close();
- },
-);
-
-// https://github.com/denoland/deno/issues/18775
-Deno.test({
- sanitizeOps: false,
- sanitizeResources: false,
-}, async function websocketDoubleClose() {
- const deferred = Promise.withResolvers<void>();
-
- const ac = new AbortController();
- const listeningDeferred = Promise.withResolvers<void>();
-
- const server = Deno.serve({
- handler: (req) => {
- const { response, socket } = Deno.upgradeWebSocket(req);
- let called = false;
- socket.onopen = () => socket.send("Hello");
- socket.onmessage = () => {
- assert(!called);
- called = true;
- socket.send("bye");
- socket.close();
- };
- socket.onclose = () => ac.abort();
- socket.onerror = () => fail();
- return response;
- },
- signal: ac.signal,
- onListen: () => listeningDeferred.resolve(),
- hostname: "localhost",
- port: servePort,
- });
-
- await listeningDeferred.promise;
-
- const ws = new WebSocket(serveUrl);
- assertEquals(ws.url, serveUrl);
- ws.onerror = () => fail();
- ws.onmessage = (m: MessageEvent) => {
- if (m.data == "Hello") ws.send("bye");
- };
- ws.onclose = () => {
- deferred.resolve();
- };
- await Promise.all([deferred.promise, server.finished]);
-});
-
-// https://github.com/denoland/deno/issues/19483
-Deno.test({
- sanitizeOps: false,
- sanitizeResources: false,
-}, async function websocketCloseFlushes() {
- const deferred = Promise.withResolvers<void>();
-
- const ac = new AbortController();
- const listeningDeferred = Promise.withResolvers<void>();
-
- const server = Deno.serve({
- handler: (req) => {
- const { response, socket } = Deno.upgradeWebSocket(req);
- socket.onopen = () => socket.send("Hello");
- socket.onmessage = () => {
- socket.send("Bye");
- socket.close();
- };
- socket.onclose = () => ac.abort();
- socket.onerror = () => fail();
- return response;
- },
- signal: ac.signal,
- onListen: () => listeningDeferred.resolve(),
- hostname: "localhost",
- port: servePort,
- });
-
- await listeningDeferred.promise;
-
- const ws = new WebSocket(serveUrl);
- assertEquals(ws.url, serveUrl);
- let seenBye = false;
- ws.onerror = () => fail();
- ws.onmessage = ({ data }) => {
- if (data == "Hello") {
- ws.send("Hello!");
- } else {
- assertEquals(data, "Bye");
- seenBye = true;
- }
- };
- ws.onclose = () => {
- deferred.resolve();
- };
- await Promise.all([deferred.promise, server.finished]);
-
- assert(seenBye);
-});
-
-Deno.test(
- { sanitizeOps: false },
- function websocketConstructorWithPrototypePollution() {
- const originalSymbolIterator = Array.prototype[Symbol.iterator];
- try {
- Array.prototype[Symbol.iterator] = () => {
- throw Error("unreachable");
- };
- assertThrows(() => {
- new WebSocket(
- new URL("ws://localhost:4242/"),
- // Allow `Symbol.iterator` to be called in WebIDL conversion to `sequence<DOMString>`
- // deno-lint-ignore no-explicit-any
- ["soap", "soap"].values() as any,
- );
- }, DOMException);
- } finally {
- Array.prototype[Symbol.iterator] = originalSymbolIterator;
- }
- },
-);
-
-Deno.test(async function websocketTlsSocketWorks() {
- const cert = await Deno.readTextFile("cli/tests/testdata/tls/localhost.crt");
- const key = await Deno.readTextFile("cli/tests/testdata/tls/localhost.key");
-
- const messages: string[] = [],
- errors: { server?: Event; client?: Event }[] = [];
- const promise = new Promise((okay, nope) => {
- const ac = new AbortController();
- const server = Deno.serve({
- handler: (req) => {
- const { response, socket } = Deno.upgradeWebSocket(req);
- socket.onopen = () => socket.send("ping");
- socket.onmessage = (e) => {
- messages.push(e.data);
- socket.close();
- };
- socket.onerror = (e) => errors.push({ server: e });
- socket.onclose = () => ac.abort();
- return response;
- },
- signal: ac.signal,
- hostname: "localhost",
- port: servePort,
- cert,
- key,
- });
- setTimeout(() => {
- const ws = new WebSocket(`wss://localhost:${servePort}`);
- ws.onmessage = (e) => {
- messages.push(e.data);
- ws.send("pong");
- };
- ws.onerror = (e) => {
- errors.push({ client: e });
- nope();
- };
- ws.onclose = () => okay(server.finished);
- }, 1000);
- });
-
- const finished = await promise;
-
- assertEquals(errors, []);
- assertEquals(messages, ["ping", "pong"]);
-
- await finished;
-});
-
-// https://github.com/denoland/deno/issues/15340
-Deno.test(
- async function websocketServerFieldInit() {
- const ac = new AbortController();
- const listeningDeferred = Promise.withResolvers<void>();
-
- const server = Deno.serve({
- handler: (req) => {
- const { socket, response } = Deno.upgradeWebSocket(req, {
- idleTimeout: 0,
- });
- socket.onopen = function () {
- assert(typeof socket.url == "string");
- assert(socket.readyState == WebSocket.OPEN);
- assert(socket.protocol == "");
- assert(socket.binaryType == "arraybuffer");
- socket.close();
- };
- socket.onclose = () => ac.abort();
- return response;
- },
- signal: ac.signal,
- onListen: () => listeningDeferred.resolve(),
- hostname: "localhost",
- port: servePort,
- });
-
- await listeningDeferred.promise;
- const deferred = Promise.withResolvers<void>();
- const ws = new WebSocket(serveUrl);
- assertEquals(ws.url, serveUrl);
- ws.onerror = () => fail();
- ws.onclose = () => {
- deferred.resolve();
- };
-
- await Promise.all([deferred.promise, server.finished]);
- },
-);
-
-Deno.test(
- { sanitizeOps: false },
- async function websocketServerGetsGhosted() {
- const ac = new AbortController();
- const listeningDeferred = Promise.withResolvers<void>();
-
- const server = Deno.serve({
- handler: (req) => {
- const { socket, response } = Deno.upgradeWebSocket(req, {
- idleTimeout: 2,
- });
- socket.onerror = () => socket.close();
- socket.onclose = () => ac.abort();
- return response;
- },
- signal: ac.signal,
- onListen: () => listeningDeferred.resolve(),
- hostname: "localhost",
- port: servePort,
- });
-
- await listeningDeferred.promise;
- const r = await fetch("http://localhost:4545/ghost_ws_client");
- assertEquals(r.status, 200);
- await r.body?.cancel();
-
- await server.finished;
- },
-);
-
-Deno.test("invalid scheme", () => {
- assertThrows(() => new WebSocket("foo://localhost:4242"));
-});
-
-Deno.test("fragment", () => {
- assertThrows(() => new WebSocket("ws://localhost:4242/#"));
- assertThrows(() => new WebSocket("ws://localhost:4242/#foo"));
-});
-
-Deno.test("duplicate protocols", () => {
- assertThrows(() => new WebSocket("ws://localhost:4242", ["foo", "foo"]));
-});
-
-Deno.test("invalid server", async () => {
- const { promise, resolve } = Promise.withResolvers<void>();
- const ws = new WebSocket("ws://localhost:2121");
- let err = false;
- ws.onerror = () => {
- err = true;
- };
- ws.onclose = () => {
- if (err) {
- resolve();
- } else {
- fail();
- }
- };
- ws.onopen = () => fail();
- await promise;
-});
-
-Deno.test("connect & close", async () => {
- const { promise, resolve } = Promise.withResolvers<void>();
- const ws = new WebSocket("ws://localhost:4242");
- ws.onerror = () => fail();
- ws.onopen = () => {
- ws.close();
- };
- ws.onclose = () => {
- resolve();
- };
- await promise;
-});
-
-Deno.test("connect & abort", async () => {
- const { promise, resolve } = Promise.withResolvers<void>();
- const ws = new WebSocket("ws://localhost:4242");
- ws.close();
- let err = false;
- ws.onerror = () => {
- err = true;
- };
- ws.onclose = () => {
- if (err) {
- resolve();
- } else {
- fail();
- }
- };
- ws.onopen = () => fail();
- await promise;
-});
-
-Deno.test("connect & close custom valid code", async () => {
- const { promise, resolve } = Promise.withResolvers<void>();
- const ws = new WebSocket("ws://localhost:4242");
- ws.onerror = () => fail();
- ws.onopen = () => ws.close(1000);
- ws.onclose = () => {
- resolve();
- };
- await promise;
-});
-
-Deno.test("connect & close custom invalid code", async () => {
- const { promise, resolve } = Promise.withResolvers<void>();
- const ws = new WebSocket("ws://localhost:4242");
- ws.onerror = () => fail();
- ws.onopen = () => {
- assertThrows(() => ws.close(1001));
- ws.close();
- };
- ws.onclose = () => {
- resolve();
- };
- await promise;
-});
-
-Deno.test("connect & close custom valid reason", async () => {
- const { promise, resolve } = Promise.withResolvers<void>();
- const ws = new WebSocket("ws://localhost:4242");
- ws.onerror = () => fail();
- ws.onopen = () => ws.close(1000, "foo");
- ws.onclose = () => {
- resolve();
- };
- await promise;
-});
-
-Deno.test("connect & close custom invalid reason", async () => {
- const { promise, resolve } = Promise.withResolvers<void>();
- const ws = new WebSocket("ws://localhost:4242");
- ws.onerror = () => fail();
- ws.onopen = () => {
- assertThrows(() => ws.close(1000, "".padEnd(124, "o")));
- ws.close();
- };
- ws.onclose = () => {
- resolve();
- };
- await promise;
-});
-
-Deno.test("echo string", async () => {
- const { promise, resolve } = Promise.withResolvers<void>();
- const ws = new WebSocket("ws://localhost:4242");
- ws.onerror = () => fail();
- ws.onopen = () => ws.send("foo");
- ws.onmessage = (e) => {
- assertEquals(e.data, "foo");
- ws.close();
- };
- ws.onclose = () => {
- resolve();
- };
- await promise;
-});
-
-Deno.test("echo string tls", async () => {
- const deferred1 = Promise.withResolvers<void>();
- const deferred2 = Promise.withResolvers<void>();
- const ws = new WebSocket("wss://localhost:4243");
- ws.onerror = () => fail();
- ws.onopen = () => ws.send("foo");
- ws.onmessage = (e) => {
- assertEquals(e.data, "foo");
- ws.close();
- deferred1.resolve();
- };
- ws.onclose = () => {
- deferred2.resolve();
- };
- await deferred1.promise;
- await deferred2.promise;
-});
-
-Deno.test("websocket error", async () => {
- const { promise, resolve } = Promise.withResolvers<void>();
- const ws = new WebSocket("wss://localhost:4242");
- ws.onopen = () => fail();
- ws.onerror = (err) => {
- assert(err instanceof ErrorEvent);
- assertEquals(
- err.message,
- "NetworkError: failed to connect to WebSocket: received corrupt message of type InvalidContentType",
- );
- resolve();
- };
- await promise;
-});
-
-Deno.test("echo blob with binaryType blob", async () => {
- const { promise, resolve } = Promise.withResolvers<void>();
- const ws = new WebSocket("ws://localhost:4242");
- const blob = new Blob(["foo"]);
- ws.onerror = () => fail();
- ws.onopen = () => ws.send(blob);
- ws.onmessage = (e) => {
- e.data.text().then((actual: string) => {
- blob.text().then((expected) => {
- assertEquals(actual, expected);
- });
- });
- ws.close();
- };
- ws.onclose = () => {
- resolve();
- };
- await promise;
-});
-
-Deno.test("echo blob with binaryType arraybuffer", async () => {
- const { promise, resolve } = Promise.withResolvers<void>();
- const ws = new WebSocket("ws://localhost:4242");
- ws.binaryType = "arraybuffer";
- const blob = new Blob(["foo"]);
- ws.onerror = () => fail();
- ws.onopen = () => ws.send(blob);
- ws.onmessage = (e) => {
- blob.arrayBuffer().then((expected) => {
- assertEquals(e.data, expected);
- });
- ws.close();
- };
- ws.onclose = () => {
- resolve();
- };
- await promise;
-});
-
-Deno.test("echo uint8array with binaryType blob", async () => {
- const { promise, resolve } = Promise.withResolvers<void>();
- const ws = new WebSocket("ws://localhost:4242");
- const uint = new Uint8Array([102, 111, 111]);
- ws.onerror = () => fail();
- ws.onopen = () => ws.send(uint);
- ws.onmessage = (e) => {
- e.data.arrayBuffer().then((actual: ArrayBuffer) => {
- assertEquals(actual, uint.buffer);
- });
- ws.close();
- };
- ws.onclose = () => {
- resolve();
- };
- await promise;
-});
-
-Deno.test("echo uint8array with binaryType arraybuffer", async () => {
- const { promise, resolve } = Promise.withResolvers<void>();
- const ws = new WebSocket("ws://localhost:4242");
- ws.binaryType = "arraybuffer";
- const uint = new Uint8Array([102, 111, 111]);
- ws.onerror = () => fail();
- ws.onopen = () => ws.send(uint);
- ws.onmessage = (e) => {
- assertEquals(e.data, uint.buffer);
- ws.close();
- };
- ws.onclose = () => {
- resolve();
- };
- await promise;
-});
-
-Deno.test("echo arraybuffer with binaryType blob", async () => {
- const { promise, resolve } = Promise.withResolvers<void>();
- const ws = new WebSocket("ws://localhost:4242");
- const buffer = new ArrayBuffer(3);
- ws.onerror = () => fail();
- ws.onopen = () => ws.send(buffer);
- ws.onmessage = (e) => {
- e.data.arrayBuffer().then((actual: ArrayBuffer) => {
- assertEquals(actual, buffer);
- });
- ws.close();
- };
- ws.onclose = () => {
- resolve();
- };
- await promise;
-});
-
-Deno.test("echo arraybuffer with binaryType arraybuffer", async () => {
- const { promise, resolve } = Promise.withResolvers<void>();
- const ws = new WebSocket("ws://localhost:4242");
- ws.binaryType = "arraybuffer";
- const buffer = new ArrayBuffer(3);
- ws.onerror = () => fail();
- ws.onopen = () => ws.send(buffer);
- ws.onmessage = (e) => {
- assertEquals(e.data, buffer);
- ws.close();
- };
- ws.onclose = () => {
- resolve();
- };
- await promise;
-});
-
-Deno.test("Event Handlers order", async () => {
- const { promise, resolve } = Promise.withResolvers<void>();
- const ws = new WebSocket("ws://localhost:4242");
- const arr: number[] = [];
- ws.onerror = () => fail();
- ws.addEventListener("message", () => arr.push(1));
- ws.onmessage = () => fail();
- ws.addEventListener("message", () => {
- arr.push(3);
- ws.close();
- assertEquals(arr, [1, 2, 3]);
- });
- ws.onmessage = () => arr.push(2);
- ws.onopen = () => ws.send("Echo");
- ws.onclose = () => {
- resolve();
- };
- await promise;
-});
-
-Deno.test("Close without frame", async () => {
- const { promise, resolve } = Promise.withResolvers<void>();
- const ws = new WebSocket("ws://localhost:4244");
- ws.onerror = () => fail();
- ws.onclose = (e) => {
- assertEquals(e.code, 1005);
- resolve();
- };
- await promise;
-});
diff --git a/cli/tests/unit_node/fs_test.ts b/cli/tests/unit_node/fs_test.ts
deleted file mode 100644
index c7698cb7d..000000000
--- a/cli/tests/unit_node/fs_test.ts
+++ /dev/null
@@ -1,116 +0,0 @@
-// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
-
-import {
- assert,
- assertEquals,
- assertThrows,
-} from "@test_util/std/assert/mod.ts";
-import { join } from "node:path";
-import { tmpdir } from "node:os";
-import {
- constants,
- existsSync,
- mkdtempSync,
- promises,
- readFileSync,
- writeFileSync,
-} from "node:fs";
-import { constants as fsPromiseConstants, cp } from "node:fs/promises";
-import { pathToAbsoluteFileUrl } from "../unit/test_util.ts";
-
-Deno.test(
- "[node/fs writeFileSync] write file without option",
- () => {
- const data = "Hello";
- const filename = mkdtempSync(join(tmpdir(), "foo-")) + "/test.txt";
-
- writeFileSync(filename, data);
- const dataRead = readFileSync(filename, "utf8");
-
- assert(dataRead === "Hello");
- },
-);
-
-Deno.test(
- "[node/fs writeFileSync] write file with option ASCII",
- () => {
- const data = "Hello";
- const filename = mkdtempSync(join(tmpdir(), "foo-")) + "/test.txt";
-
- writeFileSync(filename, data, { encoding: "ascii" });
- const dataRead = readFileSync(filename, "utf8");
-
- assert(dataRead === "Hello");
- },
-);
-
-Deno.test(
- "[node/fs writeFileSync] write file throws error when encoding is not implemented",
- () => {
- const data = "Hello";
- const filename = mkdtempSync(join(tmpdir(), "foo-")) + "/test.txt";
-
- assertThrows(
- () => writeFileSync(filename, data, { encoding: "utf16le" }),
- 'The value "utf16le" is invalid for option "encoding"',
- );
- },
-);
-
-Deno.test(
- "[node/fs existsSync] path",
- { permissions: { read: true } },
- () => {
- assert(existsSync("cli/tests/testdata/assets/fixture.json"));
- },
-);
-
-Deno.test(
- "[node/fs existsSync] url",
- { permissions: { read: true } },
- () => {
- assert(existsSync(
- pathToAbsoluteFileUrl("cli/tests/testdata/assets/fixture.json"),
- ));
- },
-);
-
-Deno.test(
- "[node/fs existsSync] no permission",
- { permissions: { read: false } },
- () => {
- assertThrows(() => {
- existsSync("cli/tests/testdata/assets/fixture.json");
- }, Deno.errors.PermissionDenied);
- },
-);
-
-Deno.test(
- "[node/fs existsSync] not exists",
- { permissions: { read: true } },
- () => {
- assert(!existsSync("bad_filename"));
- },
-);
-
-Deno.test(
- "[node/fs/promises constants] is the same as from node:fs",
- () => {
- assertEquals(constants, fsPromiseConstants);
- assertEquals(constants, promises.constants);
- },
-);
-
-Deno.test(
- "[node/fs/promises cp] copy file",
- async () => {
- const src = mkdtempSync(join(tmpdir(), "foo-")) + "/test.txt";
- const dest = mkdtempSync(join(tmpdir(), "foo-")) + "/test.txt";
- writeFileSync(src, "Hello");
-
- await cp(src, dest);
-
- const dataRead = readFileSync(dest, "utf8");
- assert(dataRead === "Hello");
- },
-);
diff --git a/cli/tests/unit_node/http_test.ts b/cli/tests/unit_node/http_test.ts
deleted file mode 100644
index c94d05ad9..000000000
--- a/cli/tests/unit_node/http_test.ts
+++ /dev/null
@@ -1,940 +0,0 @@
-// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
-
-import EventEmitter from "node:events";
-import http, { type RequestOptions } from "node:http";
-import https from "node:https";
-import { assert, assertEquals, fail } from "@test_util/std/assert/mod.ts";
-import { assertSpyCalls, spy } from "@test_util/std/testing/mock.ts";
-
-import { gzip } from "node:zlib";
-import { Buffer } from "node:buffer";
-import { serve } from "@test_util/std/http/server.ts";
-import { execCode } from "../unit/test_util.ts";
-
-Deno.test("[node/http listen]", async () => {
- {
- const server = http.createServer();
- assertEquals(0, EventEmitter.listenerCount(server, "request"));
- }
-
- {
- const server = http.createServer(() => {});
- assertEquals(1, EventEmitter.listenerCount(server, "request"));
- }
-
- {
- const { promise, resolve } = Promise.withResolvers<void>();
- const server = http.createServer();
-
- server.listen(() => {
- server.close();
- });
- server.on("close", () => {
- resolve();
- });
-
- await promise;
- }
-
- {
- const { promise, resolve } = Promise.withResolvers<void>();
- const server = http.createServer();
-
- server.listen().on("listening", () => {
- server.close();
- });
- server.on("close", () => {
- resolve();
- });
-
- await promise;
- }
-
- for (const port of [0, -0, 0.0, "0", null, undefined]) {
- const { promise, resolve } = Promise.withResolvers<void>();
- const server = http.createServer();
-
- server.listen(port, () => {
- server.close();
- });
- server.on("close", () => {
- resolve();
- });
-
- await promise;
- }
-});
-
-Deno.test("[node/http close]", async () => {
- {
- const deferred1 = Promise.withResolvers<void>();
- const deferred2 = Promise.withResolvers<void>();
- // Node quirk: callback gets exception object, event listener does not.
- // deno-lint-ignore no-explicit-any
- const server = http.createServer().close((err: any) => {
- assertEquals(err.code, "ERR_SERVER_NOT_RUNNING");
- deferred1.resolve();
- });
- // deno-lint-ignore no-explicit-any
- server.on("close", (err: any) => {
- assertEquals(err, undefined);
- deferred2.resolve();
- });
- server.on("listening", () => {
- throw Error("unreachable");
- });
- await deferred1.promise;
- await deferred2.promise;
- }
-
- {
- const deferred1 = Promise.withResolvers<void>();
- const deferred2 = Promise.withResolvers<void>();
- const server = http.createServer().listen().close((err) => {
- assertEquals(err, undefined);
- deferred1.resolve();
- });
- // deno-lint-ignore no-explicit-any
- server.on("close", (err: any) => {
- assertEquals(err, undefined);
- deferred2.resolve();
- });
- server.on("listening", () => {
- throw Error("unreachable");
- });
- await deferred1.promise;
- await deferred2.promise;
- }
-});
-
-Deno.test("[node/http] chunked response", async () => {
- for (
- const body of [undefined, "", "ok"]
- ) {
- const expected = body ?? "";
- const { promise, resolve } = Promise.withResolvers<void>();
-
- const server = http.createServer((_req, res) => {
- res.writeHead(200, { "transfer-encoding": "chunked" });
- res.end(body);
- });
-
- server.listen(async () => {
- const res = await fetch(
- // deno-lint-ignore no-explicit-any
- `http://127.0.0.1:${(server.address() as any).port}/`,
- );
- assert(res.ok);
-
- const actual = await res.text();
- assertEquals(actual, expected);
-
- server.close(() => resolve());
- });
-
- await promise;
- }
-});
-
-// Test empty chunks: https://github.com/denoland/deno/issues/17194
-Deno.test("[node/http] empty chunk in the middle of response", async () => {
- const { promise, resolve } = Promise.withResolvers<void>();
-
- const server = http.createServer((_req, res) => {
- res.write("a");
- res.write("");
- res.write("b");
- res.end();
- });
-
- server.listen(async () => {
- const res = await fetch(
- // deno-lint-ignore no-explicit-any
- `http://127.0.0.1:${(server.address() as any).port}/`,
- );
- const actual = await res.text();
- assertEquals(actual, "ab");
- server.close(() => resolve());
- });
-
- await promise;
-});
-
-Deno.test("[node/http] server can respond with 101, 204, 205, 304 status", async () => {
- for (const status of [101, 204, 205, 304]) {
- const { promise, resolve } = Promise.withResolvers<void>();
- const server = http.createServer((_req, res) => {
- res.statusCode = status;
- res.end("");
- });
- server.listen(async () => {
- const res = await fetch(
- // deno-lint-ignore no-explicit-any
- `http://127.0.0.1:${(server.address() as any).port}/`,
- );
- await res.arrayBuffer();
- assertEquals(res.status, status);
- server.close(() => resolve());
- });
- await promise;
- }
-});
-
-Deno.test("[node/http] IncomingRequest socket has remoteAddress + remotePort", async () => {
- const { promise, resolve } = Promise.withResolvers<void>();
-
- let remoteAddress: string | undefined;
- let remotePort: number | undefined;
- const server = http.createServer((req, res) => {
- remoteAddress = req.socket.remoteAddress;
- remotePort = req.socket.remotePort;
- res.end();
- });
- server.listen(async () => {
- // deno-lint-ignore no-explicit-any
- const port = (server.address() as any).port;
- const res = await fetch(
- `http://127.0.0.1:${port}/`,
- );
- await res.arrayBuffer();
- assertEquals(remoteAddress, "127.0.0.1");
- assertEquals(typeof remotePort, "number");
- server.close(() => resolve());
- });
- await promise;
-});
-
-Deno.test("[node/http] request default protocol", async () => {
- const deferred1 = Promise.withResolvers<void>();
- const deferred2 = Promise.withResolvers<void>();
- const server = http.createServer((_, res) => {
- res.end("ok");
- });
-
- // @ts-ignore IncomingMessageForClient
- // deno-lint-ignore no-explicit-any
- let clientRes: any;
- // deno-lint-ignore no-explicit-any
- let clientReq: any;
- server.listen(() => {
- clientReq = http.request(
- // deno-lint-ignore no-explicit-any
- { host: "localhost", port: (server.address() as any).port },
- (res) => {
- assert(res.socket instanceof EventEmitter);
- assertEquals(res.complete, false);
- res.on("data", () => {});
- res.on("end", () => {
- server.close();
- });
- clientRes = res;
- assertEquals(res.statusCode, 200);
- deferred2.resolve();
- },
- );
- clientReq.end();
- });
- server.on("close", () => {
- deferred1.resolve();
- });
- await deferred1.promise;
- await deferred2.promise;
- assert(clientReq.socket instanceof EventEmitter);
- assertEquals(clientRes!.complete, true);
-});
-
-Deno.test("[node/http] request with headers", async () => {
- const { promise, resolve } = Promise.withResolvers<void>();
- const server = http.createServer((req, res) => {
- assertEquals(req.headers["x-foo"], "bar");
- res.end("ok");
- });
- server.listen(() => {
- const req = http.request(
- {
- host: "localhost",
- // deno-lint-ignore no-explicit-any
- port: (server.address() as any).port,
- headers: { "x-foo": "bar" },
- },
- (res) => {
- res.on("data", () => {});
- res.on("end", () => {
- server.close();
- });
- assertEquals(res.statusCode, 200);
- },
- );
- req.end();
- });
- server.on("close", () => {
- resolve();
- });
- await promise;
-});
-
-Deno.test("[node/http] non-string buffer response", {
- // TODO(kt3k): Enable sanitizer. A "zlib" resource is leaked in this test case.
- sanitizeResources: false,
-}, async () => {
- const { promise, resolve } = Promise.withResolvers<void>();
- const server = http.createServer((_, res) => {
- res.socket!.end();
- gzip(
- Buffer.from("a".repeat(100), "utf8"),
- {},
- (_err: Error | null, data: Buffer) => {
- res.setHeader("Content-Encoding", "gzip");
- res.end(data);
- },
- );
- });
- server.listen(async () => {
- const res = await fetch(
- // deno-lint-ignore no-explicit-any
- `http://localhost:${(server.address() as any).port}`,
- );
- try {
- const text = await res.text();
- assertEquals(text, "a".repeat(100));
- } catch (e) {
- server.emit("error", e);
- } finally {
- server.close(() => resolve());
- }
- });
- await promise;
-});
-
-// TODO(kt3k): Enable this test
-// Currently IncomingMessage constructor has incompatible signature.
-/*
-Deno.test("[node/http] http.IncomingMessage can be created without url", () => {
- const message = new http.IncomingMessage(
- // adapted from https://github.com/dougmoscrop/serverless-http/blob/80bfb3e940057d694874a8b0bc12ad96d2abe7ab/lib/request.js#L7
- {
- // @ts-expect-error - non-request properties will also be passed in, e.g. by serverless-http
- encrypted: true,
- readable: false,
- remoteAddress: "foo",
- address: () => ({ port: 443 }),
- // deno-lint-ignore no-explicit-any
- end: Function.prototype as any,
- // deno-lint-ignore no-explicit-any
- destroy: Function.prototype as any,
- },
- );
- message.url = "https://example.com";
-});
-*/
-
-Deno.test("[node/http] send request with non-chunked body", async () => {
- let requestHeaders: Headers;
- let requestBody = "";
-
- const hostname = "localhost";
- const port = 4505;
-
- // NOTE: Instead of node/http.createServer(), serve() in std/http/server.ts is used.
- // https://github.com/denoland/deno_std/pull/2755#discussion_r1005592634
- const handler = async (req: Request) => {
- requestHeaders = req.headers;
- requestBody = await req.text();
- return new Response("ok");
- };
- const abortController = new AbortController();
- const servePromise = serve(handler, {
- hostname,
- port,
- signal: abortController.signal,
- onListen: undefined,
- });
-
- const opts: RequestOptions = {
- host: hostname,
- port,
- method: "POST",
- headers: {
- "Content-Type": "text/plain; charset=utf-8",
- "Content-Length": "11",
- },
- };
- const req = http.request(opts, (res) => {
- res.on("data", () => {});
- res.on("end", () => {
- abortController.abort();
- });
- assertEquals(res.statusCode, 200);
- assertEquals(requestHeaders.get("content-length"), "11");
- assertEquals(requestHeaders.has("transfer-encoding"), false);
- assertEquals(requestBody, "hello world");
- });
- req.on("socket", (socket) => {
- assert(socket.writable);
- assert(socket.readable);
- socket.setKeepAlive();
- socket.destroy();
- socket.setTimeout(100);
- });
- req.write("hello ");
- req.write("world");
- req.end();
-
- await servePromise;
-});
-
-Deno.test("[node/http] send request with chunked body", async () => {
- let requestHeaders: Headers;
- let requestBody = "";
-
- const hostname = "localhost";
- const port = 4505;
-
- // NOTE: Instead of node/http.createServer(), serve() in std/http/server.ts is used.
- // https://github.com/denoland/deno_std/pull/2755#discussion_r1005592634
- const handler = async (req: Request) => {
- requestHeaders = req.headers;
- requestBody = await req.text();
- return new Response("ok");
- };
- const abortController = new AbortController();
- const servePromise = serve(handler, {
- hostname,
- port,
- signal: abortController.signal,
- onListen: undefined,
- });
-
- const opts: RequestOptions = {
- host: hostname,
- port,
- method: "POST",
- headers: {
- "Content-Type": "text/plain; charset=utf-8",
- "Content-Length": "11",
- "Transfer-Encoding": "chunked",
- },
- };
- const req = http.request(opts, (res) => {
- res.on("data", () => {});
- res.on("end", () => {
- abortController.abort();
- });
- assertEquals(res.statusCode, 200);
- assertEquals(requestHeaders.has("content-length"), false);
- assertEquals(requestHeaders.get("transfer-encoding"), "chunked");
- assertEquals(requestBody, "hello world");
- });
- req.write("hello ");
- req.write("world");
- req.end();
-
- await servePromise;
-});
-
-Deno.test("[node/http] send request with chunked body as default", async () => {
- let requestHeaders: Headers;
- let requestBody = "";
-
- const hostname = "localhost";
- const port = 4505;
-
- // NOTE: Instead of node/http.createServer(), serve() in std/http/server.ts is used.
- // https://github.com/denoland/deno_std/pull/2755#discussion_r1005592634
- const handler = async (req: Request) => {
- requestHeaders = req.headers;
- requestBody = await req.text();
- return new Response("ok");
- };
- const abortController = new AbortController();
- const servePromise = serve(handler, {
- hostname,
- port,
- signal: abortController.signal,
- onListen: undefined,
- });
-
- const opts: RequestOptions = {
- host: hostname,
- port,
- method: "POST",
- headers: {
- "Content-Type": "text/plain; charset=utf-8",
- },
- };
- const req = http.request(opts, (res) => {
- res.on("data", () => {});
- res.on("end", () => {
- abortController.abort();
- });
- assertEquals(res.statusCode, 200);
- assertEquals(requestHeaders.has("content-length"), false);
- assertEquals(requestHeaders.get("transfer-encoding"), "chunked");
- assertEquals(requestBody, "hello world");
- });
- req.write("hello ");
- req.write("world");
- req.end();
-
- await servePromise;
-});
-
-Deno.test("[node/http] ServerResponse _implicitHeader", async () => {
- const { promise, resolve } = Promise.withResolvers<void>();
- const server = http.createServer((_req, res) => {
- const writeHeadSpy = spy(res, "writeHead");
- // deno-lint-ignore no-explicit-any
- (res as any)._implicitHeader();
- assertSpyCalls(writeHeadSpy, 1);
- writeHeadSpy.restore();
- res.end("Hello World");
- });
-
- server.listen(async () => {
- const { port } = server.address() as { port: number };
- const res = await fetch(`http://localhost:${port}`);
- assertEquals(await res.text(), "Hello World");
- server.close(() => {
- resolve();
- });
- });
-
- await promise;
-});
-
-// https://github.com/denoland/deno/issues/21509
-Deno.test("[node/http] ServerResponse flushHeaders", async () => {
- const { promise, resolve } = Promise.withResolvers<void>();
- const server = http.createServer((_req, res) => {
- res.flushHeaders(); // no-op
- res.end("Hello World");
- });
-
- server.listen(async () => {
- const { port } = server.address() as { port: number };
- const res = await fetch(`http://localhost:${port}`);
- assertEquals(await res.text(), "Hello World");
- server.close(() => {
- resolve();
- });
- });
-
- await promise;
-});
-
-Deno.test("[node/http] server unref", async () => {
- const [statusCode, _output] = await execCode(`
- import http from "node:http";
- const server = http.createServer((_req, res) => {
- res.statusCode = status;
- res.end("");
- });
-
- // This should let the program to exit without waiting for the
- // server to close.
- server.unref();
-
- server.listen(async () => {
- });
- `);
- assertEquals(statusCode, 0);
-});
-
-Deno.test("[node/http] ClientRequest handle non-string headers", async () => {
- // deno-lint-ignore no-explicit-any
- let headers: any;
- const { promise, resolve, reject } = Promise.withResolvers<void>();
- const req = http.request("http://localhost:4545/echo_server", {
- method: "POST",
- headers: { 1: 2 },
- }, (resp) => {
- headers = resp.headers;
-
- resp.on("data", () => {});
-
- resp.on("end", () => {
- resolve();
- });
- });
- req.once("error", (e) => reject(e));
- req.end();
- await promise;
- assertEquals(headers!["1"], "2");
-});
-
-Deno.test("[node/http] ClientRequest uses HTTP/1.1", async () => {
- let body = "";
- const { promise, resolve, reject } = Promise.withResolvers<void>();
- const req = https.request("https://localhost:5545/http_version", {
- method: "POST",
- headers: { 1: 2 },
- }, (resp) => {
- resp.on("data", (chunk) => {
- body += chunk;
- });
-
- resp.on("end", () => {
- resolve();
- });
- });
- req.once("error", (e) => reject(e));
- req.end();
- await promise;
- assertEquals(body, "HTTP/1.1");
-});
-
-Deno.test("[node/http] ClientRequest setTimeout", async () => {
- let body = "";
- const { promise, resolve, reject } = Promise.withResolvers<void>();
- const timer = setTimeout(() => reject("timed out"), 50000);
- const req = http.request("http://localhost:4545/http_version", (resp) => {
- resp.on("data", (chunk) => {
- body += chunk;
- });
-
- resp.on("end", () => {
- resolve();
- });
- });
- req.setTimeout(120000);
- req.once("error", (e) => reject(e));
- req.end();
- await promise;
- clearTimeout(timer);
- assertEquals(body, "HTTP/1.1");
-});
-
-Deno.test("[node/http] ClientRequest setNoDelay", async () => {
- let body = "";
- const { promise, resolve, reject } = Promise.withResolvers<void>();
- const timer = setTimeout(() => reject("timed out"), 50000);
- const req = http.request("http://localhost:4545/http_version", (resp) => {
- resp.on("data", (chunk) => {
- body += chunk;
- });
-
- resp.on("end", () => {
- resolve();
- });
- });
- req.setNoDelay(true);
- req.once("error", (e) => reject(e));
- req.end();
- await promise;
- clearTimeout(timer);
- assertEquals(body, "HTTP/1.1");
-});
-
-Deno.test("[node/http] ClientRequest PATCH", async () => {
- let body = "";
- const { promise, resolve, reject } = Promise.withResolvers<void>();
- const req = http.request("http://localhost:4545/echo_server", {
- method: "PATCH",
- }, (resp) => {
- resp.on("data", (chunk) => {
- body += chunk;
- });
-
- resp.on("end", () => {
- resolve();
- });
- });
- req.write("hello ");
- req.write("world");
- req.once("error", (e) => reject(e));
- req.end();
- await promise;
- assertEquals(body, "hello world");
-});
-
-Deno.test("[node/http] ClientRequest PUT", async () => {
- let body = "";
- const { promise, resolve, reject } = Promise.withResolvers<void>();
- const req = http.request("http://localhost:4545/echo_server", {
- method: "PUT",
- }, (resp) => {
- resp.on("data", (chunk) => {
- body += chunk;
- });
-
- resp.on("end", () => {
- resolve();
- });
- });
- req.write("hello ");
- req.write("world");
- req.once("error", (e) => reject(e));
- req.end();
- await promise;
- assertEquals(body, "hello world");
-});
-
-Deno.test("[node/http] ClientRequest search params", async () => {
- let body = "";
- const { promise, resolve, reject } = Promise.withResolvers<void>();
- const req = http.request({
- host: "localhost:4545",
- path: "search_params?foo=bar",
- }, (resp) => {
- resp.on("data", (chunk) => {
- body += chunk;
- });
-
- resp.on("end", () => {
- resolve();
- });
- });
- req.once("error", (e) => reject(e));
- req.end();
- await promise;
- assertEquals(body, "foo=bar");
-});
-
-Deno.test("[node/http] HTTPS server", async () => {
- const deferred = Promise.withResolvers<void>();
- const deferred2 = Promise.withResolvers<void>();
- const client = Deno.createHttpClient({
- caCerts: [Deno.readTextFileSync("cli/tests/testdata/tls/RootCA.pem")],
- });
- const server = https.createServer({
- cert: Deno.readTextFileSync("cli/tests/testdata/tls/localhost.crt"),
- key: Deno.readTextFileSync("cli/tests/testdata/tls/localhost.key"),
- }, (req, res) => {
- // @ts-ignore: It exists on TLSSocket
- assert(req.socket.encrypted);
- res.end("success!");
- });
- server.listen(() => {
- // deno-lint-ignore no-explicit-any
- fetch(`https://localhost:${(server.address() as any).port}`, {
- client,
- }).then(async (res) => {
- assertEquals(res.status, 200);
- assertEquals(await res.text(), "success!");
- server.close();
- deferred2.resolve();
- });
- })
- .on("error", () => fail());
- server.on("close", () => {
- deferred.resolve();
- });
- await Promise.all([deferred.promise, deferred2.promise]);
- client.close();
-});
-
-Deno.test(
- "[node/http] client upgrade",
- { permissions: { net: true } },
- async () => {
- const { promise, resolve } = Promise.withResolvers<void>();
- const server = http.createServer((req, res) => {
- // @ts-ignore: It exists on TLSSocket
- assert(!req.socket.encrypted);
- res.writeHead(200, { "Content-Type": "text/plain" });
- res.end("okay");
- });
- // @ts-ignore it's a socket for real
- let serverSocket;
- server.on("upgrade", (req, socket, _head) => {
- // https://github.com/denoland/deno/issues/21979
- assert(req.socket?.write);
- socket.write(
- "HTTP/1.1 101 Web Socket Protocol Handshake\r\n" +
- "Upgrade: WebSocket\r\n" +
- "Connection: Upgrade\r\n" +
- "\r\n",
- );
- serverSocket = socket;
- });
-
- // Now that server is running
- server.listen(1337, "127.0.0.1", () => {
- // make a request
- const options = {
- port: 1337,
- host: "127.0.0.1",
- headers: {
- "Connection": "Upgrade",
- "Upgrade": "websocket",
- },
- };
-
- const req = http.request(options);
- req.end();
-
- req.on("upgrade", (_res, socket, _upgradeHead) => {
- socket.end();
- // @ts-ignore it's a socket for real
- serverSocket!.end();
- server.close(() => {
- resolve();
- });
- });
- });
-
- await promise;
- },
-);
-
-Deno.test(
- "[node/http] client end with callback",
- { permissions: { net: true } },
- async () => {
- let received = false;
- const ac = new AbortController();
- const server = Deno.serve({ port: 5928, signal: ac.signal }, (_req) => {
- received = true;
- return new Response("hello");
- });
- const { promise, resolve, reject } = Promise.withResolvers<void>();
- let body = "";
-
- const request = http.request(
- "http://localhost:5928/",
- (resp) => {
- resp.on("data", (chunk) => {
- body += chunk;
- });
-
- resp.on("end", () => {
- resolve();
- });
- },
- );
- request.on("error", reject);
- request.end(() => {
- assert(received);
- });
-
- await promise;
- ac.abort();
- await server.finished;
-
- assertEquals(body, "hello");
- },
-);
-
-Deno.test("[node/http] server emits error if addr in use", async () => {
- const deferred1 = Promise.withResolvers<void>();
- const deferred2 = Promise.withResolvers<Error>();
-
- const server = http.createServer();
- server.listen(9001);
-
- const server2 = http.createServer();
- server2.on("error", (e) => {
- deferred2.resolve(e);
- });
- server2.listen(9001);
-
- const err = await deferred2.promise;
- server.close(() => deferred1.resolve());
- server2.close();
- await deferred1.promise;
- const expectedMsg = Deno.build.os === "windows"
- ? "Only one usage of each socket address"
- : "Address already in use";
- assert(
- err.message.startsWith(expectedMsg),
- `Wrong error: ${err.message}`,
- );
-});
-
-Deno.test(
- "[node/http] client destroy doesn't leak",
- { permissions: { net: true } },
- async () => {
- const ac = new AbortController();
- let timerId;
-
- const server = Deno.serve(
- { port: 5929, signal: ac.signal },
- async (_req) => {
- await new Promise((resolve) => {
- timerId = setTimeout(resolve, 5000);
- });
- return new Response("hello");
- },
- );
- const { promise, resolve, reject } = Promise.withResolvers<void>();
-
- const request = http.request("http://localhost:5929/");
- request.on("error", reject);
- request.on("close", () => {});
- request.end();
- setTimeout(() => {
- request.destroy(new Error());
- resolve();
- }, 100);
-
- await promise;
- clearTimeout(timerId);
- ac.abort();
- await server.finished;
- },
-);
-
-Deno.test("[node/http] node:http exports globalAgent", async () => {
- const http = await import("node:http");
- assert(
- http.globalAgent,
- "node:http must export 'globalAgent' on module namespace",
- );
- assert(
- http.default.globalAgent,
- "node:http must export 'globalAgent' on module default export",
- );
-});
-
-Deno.test("[node/https] node:https exports globalAgent", async () => {
- const https = await import("node:https");
- assert(
- https.globalAgent,
- "node:https must export 'globalAgent' on module namespace",
- );
- assert(
- https.default.globalAgent,
- "node:https must export 'globalAgent' on module default export",
- );
-});
-
-Deno.test("[node/http] node:http request.setHeader(header, null) doesn't throw", () => {
- {
- const req = http.request("http://localhost:4545/");
- req.on("error", () => {});
- // @ts-expect-error - null is not a valid header value
- req.setHeader("foo", null);
- req.end();
- req.destroy();
- }
- {
- const req = https.request("https://localhost:4545/");
- req.on("error", () => {});
- // @ts-expect-error - null is not a valid header value
- req.setHeader("foo", null);
- req.end();
- req.destroy();
- }
-});
-
-Deno.test("[node/http] ServerResponse getHeader", async () => {
- const { promise, resolve } = Promise.withResolvers<void>();
- const server = http.createServer((_req, res) => {
- res.setHeader("foo", "bar");
- assertEquals(res.getHeader("foo"), "bar");
- assertEquals(res.getHeader("ligma"), undefined);
- res.end("Hello World");
- });
-
- server.listen(async () => {
- const { port } = server.address() as { port: number };
- const res = await fetch(`http://localhost:${port}`);
- assertEquals(await res.text(), "Hello World");
- server.close(() => {
- resolve();
- });
- });
-
- await promise;
-});
diff --git a/cli/tests/unit_node/module_test.ts b/cli/tests/unit_node/module_test.ts
deleted file mode 100644
index a27fccd7c..000000000
--- a/cli/tests/unit_node/module_test.ts
+++ /dev/null
@@ -1,72 +0,0 @@
-// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
-
-import { createRequire, Module } from "node:module";
-import { assert, assertEquals } from "@test_util/std/assert/mod.ts";
-import process from "node:process";
-import * as path from "node:path";
-
-Deno.test("[node/module _preloadModules] has internal require hook", () => {
- // Check if it's there
- // deno-lint-ignore no-explicit-any
- (Module as any)._preloadModules([
- "./cli/tests/unit_node/testdata/add_global_property.js",
- ]);
- // deno-lint-ignore no-explicit-any
- assertEquals((globalThis as any).foo, "Hello");
-});
-
-Deno.test("[node/module runMain] loads module using the current process.argv", () => {
- process.argv = [
- process.argv[0],
- "./cli/tests/unit_node/testdata/add_global_property_run_main.js",
- ];
-
- // deno-lint-ignore no-explicit-any
- (Module as any).runMain();
- // deno-lint-ignore no-explicit-any
- assertEquals((globalThis as any).calledViaRunMain, true);
-});
-
-Deno.test("[node/module _nodeModulePaths] prevents duplicate /node_modules/node_modules suffix", () => {
- // deno-lint-ignore no-explicit-any
- const actual: string[] = (Module as any)._nodeModulePaths(
- path.join(process.cwd(), "testdata", "node_modules", "foo"),
- );
-
- assert(
- !actual.some((dir) => /node_modules[/\\]node_modules/g.test(dir)),
- "Duplicate 'node_modules/node_modules' suffix found",
- );
-});
-
-Deno.test("[node/module _nodeModulePaths] prevents duplicate root /node_modules", () => {
- // deno-lint-ignore no-explicit-any
- const actual: string[] = (Module as any)._nodeModulePaths(
- path.join(process.cwd(), "testdata", "node_modules", "foo"),
- );
-
- assert(
- new Set(actual).size === actual.length,
- "Duplicate path entries found",
- );
- const root = path.parse(actual[0]).root;
- assert(
- actual.includes(path.join(root, "node_modules")),
- "Missing root 'node_modules' directory",
- );
-});
-
-Deno.test("Built-in Node modules have `node:` prefix", () => {
- let thrown = false;
- try {
- // @ts-ignore We want to explicitly test wrong call signature
- createRequire();
- } catch (e) {
- thrown = true;
- const stackLines = e.stack.split("\n");
- // Assert that built-in node modules have `node:<mod_name>` specifiers.
- assert(stackLines.some((line: string) => line.includes("(node:module:")));
- }
-
- assert(thrown);
-});
diff --git a/test_util/src/lib.rs b/test_util/src/lib.rs
index dda62a591..eda386a82 100644
--- a/test_util/src/lib.rs
+++ b/test_util/src/lib.rs
@@ -76,7 +76,7 @@ pub fn prebuilt_path() -> PathRef {
}
pub fn tests_path() -> PathRef {
- root_path().join("cli").join("tests")
+ root_path().join("tests")
}
pub fn testdata_path() -> PathRef {
diff --git a/test_util/src/servers/mod.rs b/test_util/src/servers/mod.rs
index e6084dd81..f828f1bd4 100644
--- a/test_util/src/servers/mod.rs
+++ b/test_util/src/servers/mod.rs
@@ -327,9 +327,9 @@ async fn get_tcp_listener_stream(
/// This server responds with 'PASS' if client authentication was successful. Try it by running
/// test_server and
-/// curl --key cli/tests/testdata/tls/localhost.key \
+/// curl --key tests/testdata/tls/localhost.key \
/// --cert cli/tests/testsdata/tls/localhost.crt \
-/// --cacert cli/tests/testdata/tls/RootCA.crt https://localhost:4552/
+/// --cacert tests/testdata/tls/RootCA.crt https://localhost:4552/
async fn run_tls_client_auth_server(port: u16) {
let mut tls =
get_tls_listener_stream("tls client auth", port, Default::default()).await;
@@ -352,7 +352,7 @@ async fn run_tls_client_auth_server(port: u16) {
/// This server responds with 'PASS' if client authentication was successful. Try it by running
/// test_server and
-/// curl --cacert cli/tests/testdata/tls/RootCA.crt https://localhost:4553/
+/// curl --cacert tests/testdata/tls/RootCA.crt https://localhost:4553/
async fn run_tls_server(port: u16) {
let mut tls = get_tls_listener_stream("tls", port, Default::default()).await;
while let Some(Ok(mut tls_stream)) = tls.next().await {
diff --git a/cli/tests/Cargo.toml b/tests/Cargo.toml
index 578aaf47b..578aaf47b 100644
--- a/cli/tests/Cargo.toml
+++ b/tests/Cargo.toml
diff --git a/tests/config/deno.json b/tests/config/deno.json
new file mode 100644
index 000000000..ec93111fd
--- /dev/null
+++ b/tests/config/deno.json
@@ -0,0 +1,5 @@
+{
+ "imports": {
+ "@test_util/": "../../test_util/"
+ }
+}
diff --git a/cli/tests/integration/bench_tests.rs b/tests/integration/bench_tests.rs
index f92006eb9..f92006eb9 100644
--- a/cli/tests/integration/bench_tests.rs
+++ b/tests/integration/bench_tests.rs
diff --git a/cli/tests/integration/bundle_tests.rs b/tests/integration/bundle_tests.rs
index 08e3fb06a..08e3fb06a 100644
--- a/cli/tests/integration/bundle_tests.rs
+++ b/tests/integration/bundle_tests.rs
diff --git a/cli/tests/integration/cache_tests.rs b/tests/integration/cache_tests.rs
index 2aa0f9d8b..2aa0f9d8b 100644
--- a/cli/tests/integration/cache_tests.rs
+++ b/tests/integration/cache_tests.rs
diff --git a/cli/tests/integration/cert_tests.rs b/tests/integration/cert_tests.rs
index 9e89a9f3e..9e89a9f3e 100644
--- a/cli/tests/integration/cert_tests.rs
+++ b/tests/integration/cert_tests.rs
diff --git a/cli/tests/integration/check_tests.rs b/tests/integration/check_tests.rs
index f836957ce..f836957ce 100644
--- a/cli/tests/integration/check_tests.rs
+++ b/tests/integration/check_tests.rs
diff --git a/tests/integration/compile_tests.rs b/tests/integration/compile_tests.rs
new file mode 100644
index 000000000..fbf924fbb
--- /dev/null
+++ b/tests/integration/compile_tests.rs
@@ -0,0 +1,1180 @@
+// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
+
+use test_util as util;
+use util::assert_contains;
+use util::assert_not_contains;
+use util::testdata_path;
+use util::TestContext;
+use util::TestContextBuilder;
+
+#[test]
+fn compile_basic() {
+ let context = TestContextBuilder::new().build();
+ let dir = context.temp_dir();
+ let exe = if cfg!(windows) {
+ dir.path().join("welcome.exe")
+ } else {
+ dir.path().join("welcome")
+ };
+ // try this twice to ensure it works with the cache
+ for _ in 0..2 {
+ let output = context
+ .new_command()
+ .args_vec([
+ "compile",
+ "--output",
+ &exe.to_string_lossy(),
+ "../../tests/testdata/welcome.ts",
+ ])
+ .run();
+ output.assert_exit_code(0);
+ output.skip_output_check();
+ let output = context.new_command().name(&exe).run();
+ output.assert_matches_text("Welcome to Deno!\n");
+ }
+
+ // now ensure this works when the deno_dir is readonly
+ let readonly_dir = dir.path().join("readonly");
+ readonly_dir.make_dir_readonly();
+ let readonly_sub_dir = readonly_dir.join("sub");
+
+ let output = context
+ .new_command()
+ // it should fail creating this, but still work
+ .env("DENO_DIR", readonly_sub_dir)
+ .name(exe)
+ .run();
+ output.assert_matches_text("Welcome to Deno!\n");
+}
+
+#[test]
+fn standalone_args() {
+ let context = TestContextBuilder::new().build();
+ let dir = context.temp_dir();
+ let exe = if cfg!(windows) {
+ dir.path().join("args.exe")
+ } else {
+ dir.path().join("args")
+ };
+ context
+ .new_command()
+ .args_vec([
+ "compile",
+ "--output",
+ &exe.to_string_lossy(),
+ "./compile/args.ts",
+ "a",
+ "b",
+ ])
+ .run()
+ .skip_output_check()
+ .assert_exit_code(0);
+ context
+ .new_command()
+ .name(&exe)
+ .args("foo --bar --unstable")
+ .run()
+ .assert_matches_text("a\nb\nfoo\n--bar\n--unstable\n")
+ .assert_exit_code(0);
+}
+
+#[test]
+fn standalone_error() {
+ let context = TestContextBuilder::new().build();
+ let dir = context.temp_dir();
+ let exe = if cfg!(windows) {
+ dir.path().join("error.exe")
+ } else {
+ dir.path().join("error")
+ };
+ context
+ .new_command()
+ .args_vec([
+ "compile",
+ "--output",
+ &exe.to_string_lossy(),
+ "./compile/standalone_error.ts",
+ ])
+ .run()
+ .skip_output_check()
+ .assert_exit_code(0);
+
+ let output = context.new_command().name(&exe).split_output().run();
+ output.assert_exit_code(1);
+ output.assert_stdout_matches_text("");
+ let stderr = output.stderr();
+ // On Windows, we cannot assert the file path (because '\').
+ // Instead we just check for relevant output.
+ assert_contains!(stderr, "error: Uncaught (in promise) Error: boom!");
+ assert_contains!(stderr, "throw new Error(\"boom!\");");
+ assert_contains!(stderr, "\n at boom (file://");
+ assert_contains!(stderr, "standalone_error.ts:2:9");
+ assert_contains!(stderr, "at foo (file://");
+ assert_contains!(stderr, "standalone_error.ts:5:3");
+ assert_contains!(stderr, "standalone_error.ts:7:1");
+}
+
+#[test]
+fn standalone_error_module_with_imports() {
+ let context = TestContextBuilder::new().build();
+ let dir = context.temp_dir();
+ let exe = if cfg!(windows) {
+ dir.path().join("error.exe")
+ } else {
+ dir.path().join("error")
+ };
+ context
+ .new_command()
+ .args_vec([
+ "compile",
+ "--output",
+ &exe.to_string_lossy(),
+ "./compile/standalone_error_module_with_imports_1.ts",
+ ])
+ .run()
+ .skip_output_check()
+ .assert_exit_code(0);
+
+ let output = context
+ .new_command()
+ .name(&exe)
+ .env("NO_COLOR", "1")
+ .split_output()
+ .run();
+ output.assert_stdout_matches_text("hello\n");
+ let stderr = output.stderr();
+ // On Windows, we cannot assert the file path (because '\').
+ // Instead we just check for relevant output.
+ assert_contains!(stderr, "error: Uncaught (in promise) Error: boom!");
+ assert_contains!(stderr, "throw new Error(\"boom!\");");
+ assert_contains!(stderr, "\n at file://");
+ assert_contains!(stderr, "standalone_error_module_with_imports_2.ts:2:7");
+ output.assert_exit_code(1);
+}
+
+#[test]
+fn standalone_load_datauri() {
+ let context = TestContextBuilder::new().build();
+ let dir = context.temp_dir();
+ let exe = if cfg!(windows) {
+ dir.path().join("load_datauri.exe")
+ } else {
+ dir.path().join("load_datauri")
+ };
+ context
+ .new_command()
+ .args_vec([
+ "compile",
+ "--output",
+ &exe.to_string_lossy(),
+ "./compile/standalone_import_datauri.ts",
+ ])
+ .run()
+ .skip_output_check()
+ .assert_exit_code(0);
+ context
+ .new_command()
+ .name(&exe)
+ .run()
+ .assert_matches_text("Hello Deno!\n")
+ .assert_exit_code(0);
+}
+
+// https://github.com/denoland/deno/issues/13704
+#[test]
+fn standalone_follow_redirects() {
+ let context = TestContextBuilder::new().build();
+ let dir = context.temp_dir();
+ let exe = if cfg!(windows) {
+ dir.path().join("follow_redirects.exe")
+ } else {
+ dir.path().join("follow_redirects")
+ };
+ context
+ .new_command()
+ .args_vec([
+ "compile",
+ "--output",
+ &exe.to_string_lossy(),
+ "./compile/standalone_follow_redirects.ts",
+ ])
+ .run()
+ .skip_output_check()
+ .assert_exit_code(0);
+ context
+ .new_command()
+ .name(&exe)
+ .run()
+ .assert_matches_text("Hello\n")
+ .assert_exit_code(0);
+}
+
+#[test]
+fn compile_with_file_exists_error() {
+ let context = TestContextBuilder::new().build();
+ let dir = context.temp_dir();
+ let output_path = if cfg!(windows) {
+ dir.path().join(r"args\")
+ } else {
+ dir.path().join("args/")
+ };
+ let file_path = dir.path().join("args");
+ file_path.write("");
+ context
+ .new_command()
+ .args_vec([
+ "compile",
+ "--output",
+ &output_path.to_string_lossy(),
+ "./compile/args.ts",
+ ])
+ .run()
+ .assert_matches_text(&format!(
+ concat!(
+ "[WILDCARD]error: Could not compile to file '{}' because its parent directory ",
+ "is an existing file. You can use the `--output <file-path>` flag to ",
+ "provide an alternative name.\n",
+ ),
+ file_path,
+ ))
+ .assert_exit_code(1);
+}
+
+#[test]
+fn compile_with_directory_exists_error() {
+ let context = TestContextBuilder::new().build();
+ let dir = context.temp_dir();
+ let exe = if cfg!(windows) {
+ dir.path().join("args.exe")
+ } else {
+ dir.path().join("args")
+ };
+ std::fs::create_dir(&exe).unwrap();
+ context.new_command()
+ .args_vec([
+ "compile",
+ "--output",
+ &exe.to_string_lossy(),
+ "./compile/args.ts"
+ ]).run()
+ .assert_matches_text(&format!(
+ concat!(
+ "[WILDCARD]error: Could not compile to file '{}' because a directory exists with ",
+ "the same name. You can use the `--output <file-path>` flag to ",
+ "provide an alternative name.\n"
+ ),
+ exe
+ ))
+ .assert_exit_code(1);
+}
+
+#[test]
+fn compile_with_conflict_file_exists_error() {
+ let context = TestContextBuilder::new().build();
+ let dir = context.temp_dir();
+ let exe = if cfg!(windows) {
+ dir.path().join("args.exe")
+ } else {
+ dir.path().join("args")
+ };
+ std::fs::write(&exe, b"SHOULD NOT BE OVERWRITTEN").unwrap();
+ context.new_command()
+ .args_vec([
+ "compile",
+ "--output",
+ &exe.to_string_lossy(),
+ "./compile/args.ts"
+ ]).run()
+ .assert_matches_text(&format!(
+ concat!(
+ "[WILDCARD]error: Could not compile to file '{}' because the file already exists ",
+ "and cannot be overwritten. Please delete the existing file or ",
+ "use the `--output <file-path>` flag to provide an alternative name.\n"
+ ),
+ exe
+ ))
+ .assert_exit_code(1);
+ exe.assert_matches_text("SHOULD NOT BE OVERWRITTEN");
+}
+
+#[test]
+fn compile_and_overwrite_file() {
+ let context = TestContextBuilder::new().build();
+ let dir = context.temp_dir();
+ let exe = if cfg!(windows) {
+ dir.path().join("args.exe")
+ } else {
+ dir.path().join("args")
+ };
+
+ // do this twice
+ for _ in 0..2 {
+ context
+ .new_command()
+ .args_vec([
+ "compile",
+ "--output",
+ &exe.to_string_lossy(),
+ "./compile/args.ts",
+ ])
+ .run()
+ .skip_output_check()
+ .assert_exit_code(0);
+ assert!(&exe.exists());
+ }
+}
+
+#[test]
+fn standalone_runtime_flags() {
+ let context = TestContextBuilder::new().build();
+ let dir = context.temp_dir();
+ let exe = if cfg!(windows) {
+ dir.path().join("flags.exe")
+ } else {
+ dir.path().join("flags")
+ };
+ context
+ .new_command()
+ .args_vec([
+ "compile",
+ "--allow-read",
+ "--seed",
+ "1",
+ "--output",
+ &exe.to_string_lossy(),
+ "./compile/standalone_runtime_flags.ts",
+ ])
+ .run()
+ .skip_output_check()
+ .assert_exit_code(0);
+ context
+ .new_command()
+ .env("NO_COLOR", "1")
+ .name(&exe)
+ .split_output()
+ .run()
+ .assert_stdout_matches_text("0.147205063401058\n")
+ .assert_stderr_matches_text(
+ "[WILDCARD]PermissionDenied: Requires write access to[WILDCARD]",
+ )
+ .assert_exit_code(1);
+}
+
+#[test]
+fn standalone_ext_flag_ts() {
+ let context = TestContextBuilder::new().build();
+ let dir = context.temp_dir();
+ let exe = if cfg!(windows) {
+ dir.path().join("ext_flag_ts.exe")
+ } else {
+ dir.path().join("ext_flag_ts")
+ };
+ context
+ .new_command()
+ .args_vec([
+ "compile",
+ "--ext",
+ "ts",
+ "--output",
+ &exe.to_string_lossy(),
+ "./file_extensions/ts_without_extension",
+ ])
+ .run()
+ .skip_output_check()
+ .assert_exit_code(0);
+ context
+ .new_command()
+ .env("NO_COLOR", "1")
+ .name(&exe)
+ .run()
+ .assert_matches_text("executing typescript with no extension\n")
+ .assert_exit_code(0);
+}
+
+#[test]
+fn standalone_ext_flag_js() {
+ let context = TestContextBuilder::new().build();
+ let dir = context.temp_dir();
+ let exe = if cfg!(windows) {
+ dir.path().join("ext_flag_js.exe")
+ } else {
+ dir.path().join("ext_flag_js")
+ };
+ context
+ .new_command()
+ .args_vec([
+ "compile",
+ "--ext",
+ "js",
+ "--output",
+ &exe.to_string_lossy(),
+ "./file_extensions/js_without_extension",
+ ])
+ .run()
+ .skip_output_check()
+ .assert_exit_code(0);
+ context
+ .new_command()
+ .env("NO_COLOR", "1")
+ .name(&exe)
+ .run()
+ .assert_matches_text("executing javascript with no extension\n");
+}
+
+#[test]
+fn standalone_import_map() {
+ let context = TestContextBuilder::new().build();
+ let dir = context.temp_dir();
+ let exe = if cfg!(windows) {
+ dir.path().join("import_map.exe")
+ } else {
+ dir.path().join("import_map")
+ };
+ context
+ .new_command()
+ .args_vec([
+ "compile",
+ "--allow-read",
+ "--import-map",
+ "compile/standalone_import_map.json",
+ "--output",
+ &exe.to_string_lossy(),
+ "./compile/standalone_import_map.ts",
+ ])
+ .run()
+ .skip_output_check()
+ .assert_exit_code(0);
+ context
+ .new_command()
+ .name(&exe)
+ .run()
+ .skip_output_check()
+ .assert_exit_code(0);
+}
+
+#[test]
+fn standalone_import_map_config_file() {
+ let context = TestContextBuilder::new().build();
+ let dir = context.temp_dir();
+ let exe = if cfg!(windows) {
+ dir.path().join("import_map.exe")
+ } else {
+ dir.path().join("import_map")
+ };
+ context
+ .new_command()
+ .args_vec([
+ "compile",
+ "--allow-read",
+ "--config",
+ "compile/standalone_import_map_config.json",
+ "--output",
+ &exe.to_string_lossy(),
+ "./compile/standalone_import_map.ts",
+ ])
+ .run()
+ .skip_output_check()
+ .assert_exit_code(0);
+ context
+ .new_command()
+ .name(&exe)
+ .run()
+ .skip_output_check()
+ .assert_exit_code(0);
+}
+
+#[test]
+// https://github.com/denoland/deno/issues/12670
+fn skip_rebundle() {
+ let context = TestContextBuilder::new().build();
+ let dir = context.temp_dir();
+ let exe = if cfg!(windows) {
+ dir.path().join("hello_world.exe")
+ } else {
+ dir.path().join("hello_world")
+ };
+ let output = context
+ .new_command()
+ .args_vec([
+ "compile",
+ "--output",
+ &exe.to_string_lossy(),
+ "./run/001_hello.js",
+ ])
+ .run();
+
+ //no "Bundle testdata_path/run/001_hello.js" in output
+ assert_not_contains!(output.combined_output(), "Bundle");
+
+ context
+ .new_command()
+ .name(&exe)
+ .run()
+ .assert_matches_text("Hello World\n")
+ .assert_exit_code(0);
+}
+
+#[test]
+fn check_local_by_default() {
+ let context = TestContext::with_http_server();
+ let dir = context.temp_dir();
+ let exe = if cfg!(windows) {
+ dir.path().join("welcome.exe")
+ } else {
+ dir.path().join("welcome")
+ };
+ context
+ .new_command()
+ .args_vec([
+ "compile",
+ "--output",
+ &exe.to_string_lossy(),
+ "./compile/check_local_by_default.ts",
+ ])
+ .run()
+ .skip_output_check()
+ .assert_exit_code(0);
+}
+
+#[test]
+fn check_local_by_default2() {
+ let context = TestContext::with_http_server();
+ let dir = context.temp_dir();
+ let exe = if cfg!(windows) {
+ dir.path().join("welcome.exe")
+ } else {
+ dir.path().join("welcome")
+ };
+ context
+ .new_command()
+ .args_vec([
+ "compile",
+ "--output",
+ &exe.to_string_lossy(),
+ "./compile/check_local_by_default2.ts"
+ ])
+ .run()
+ .assert_matches_text(
+ r#"[WILDCARD]error: TS2322 [ERROR]: Type '12' is not assignable to type '"b"'.[WILDCARD]"#,
+ )
+ .assert_exit_code(1);
+}
+
+#[test]
+fn workers_basic() {
+ let context = TestContext::with_http_server();
+ let dir = context.temp_dir();
+ let exe = if cfg!(windows) {
+ dir.path().join("basic.exe")
+ } else {
+ dir.path().join("basic")
+ };
+ context
+ .new_command()
+ .args_vec([
+ "compile",
+ "--no-check",
+ "--output",
+ &exe.to_string_lossy(),
+ "./compile/workers/basic.ts",
+ ])
+ .run()
+ .skip_output_check()
+ .assert_exit_code(0);
+
+ context
+ .new_command()
+ .name(&exe)
+ .run()
+ .assert_matches_file("./compile/workers/basic.out")
+ .assert_exit_code(0);
+}
+
+#[test]
+fn workers_not_in_module_map() {
+ let context = TestContext::with_http_server();
+ let temp_dir = context.temp_dir();
+ let exe = if cfg!(windows) {
+ temp_dir.path().join("not_in_module_map.exe")
+ } else {
+ temp_dir.path().join("not_in_module_map")
+ };
+ let output = context
+ .new_command()
+ .args_vec([
+ "compile",
+ "--output",
+ &exe.to_string_lossy(),
+ "./compile/workers/not_in_module_map.ts",
+ ])
+ .run();
+ output.assert_exit_code(0);
+ output.skip_output_check();
+
+ let output = context.new_command().name(exe).env("NO_COLOR", "").run();
+ output.assert_exit_code(1);
+ output.assert_matches_text(concat!(
+ "error: Uncaught (in worker \"\") Module not found: [WILDCARD]",
+ "error: Uncaught (in promise) Error: Unhandled error in child worker.\n[WILDCARD]"
+ ));
+}
+
+#[test]
+fn workers_with_include_flag() {
+ let context = TestContext::with_http_server();
+ let dir = context.temp_dir();
+ let exe = if cfg!(windows) {
+ dir.path().join("workers_with_include_flag.exe")
+ } else {
+ dir.path().join("workers_with_include_flag")
+ };
+ context
+ .new_command()
+ .args_vec([
+ "compile",
+ "--output",
+ &exe.to_string_lossy(),
+ "--include",
+ "./compile/workers/worker.ts",
+ "./compile/workers/not_in_module_map.ts",
+ ])
+ .run()
+ .skip_output_check()
+ .assert_exit_code(0);
+
+ context
+ .new_command()
+ .name(&exe)
+ .env("NO_COLOR", "")
+ .run()
+ .assert_matches_text("Hello from worker!\nReceived 42\nClosing\n");
+}
+
+#[test]
+fn dynamic_import() {
+ let context = TestContext::with_http_server();
+ let dir = context.temp_dir();
+ let exe = if cfg!(windows) {
+ dir.path().join("dynamic_import.exe")
+ } else {
+ dir.path().join("dynamic_import")
+ };
+ context
+ .new_command()
+ .args_vec([
+ "compile",
+ "--output",
+ &exe.to_string_lossy(),
+ "./compile/dynamic_imports/main.ts",
+ ])
+ .run()
+ .skip_output_check()
+ .assert_exit_code(0);
+
+ context
+ .new_command()
+ .name(&exe)
+ .env("NO_COLOR", "")
+ .run()
+ .assert_matches_file("./compile/dynamic_imports/main.out")
+ .assert_exit_code(0);
+}
+
+#[test]
+fn dynamic_import_unanalyzable() {
+ let context = TestContext::with_http_server();
+ let dir = context.temp_dir();
+ let exe = if cfg!(windows) {
+ dir.path().join("dynamic_import_unanalyzable.exe")
+ } else {
+ dir.path().join("dynamic_import_unanalyzable")
+ };
+ context
+ .new_command()
+ .args_vec([
+ "compile",
+ "--allow-read",
+ "--include",
+ "./compile/dynamic_imports/import1.ts",
+ "--output",
+ &exe.to_string_lossy(),
+ "./compile/dynamic_imports/main_unanalyzable.ts",
+ ])
+ .run()
+ .skip_output_check()
+ .assert_exit_code(0);
+
+ context
+ .new_command()
+ .current_dir(util::root_path())
+ .name(&exe)
+ .env("NO_COLOR", "")
+ .run()
+ .assert_matches_file("./compile/dynamic_imports/main.out")
+ .assert_exit_code(0);
+}
+
+#[test]
+fn compile_npm_specifiers() {
+ let context = TestContextBuilder::for_npm().use_temp_cwd().build();
+
+ let temp_dir = context.temp_dir();
+ temp_dir.write(
+ "main.ts",
+ concat!(
+ "import path from 'node:path';\n",
+ "import { getValue, setValue } from 'npm:@denotest/esm-basic';\n",
+ "import getValueDefault from 'npm:@denotest/esm-import-cjs-default';\n",
+ "setValue(2);\n",
+ "console.log(path.join('testing', 'this'));",
+ "console.log(getValue());",
+ "console.log(getValueDefault());",
+ ),
+ );
+
+ let binary_path = if cfg!(windows) {
+ temp_dir.path().join("binary.exe")
+ } else {
+ temp_dir.path().join("binary")
+ };
+
+ // try with and without --node-modules-dir
+ let compile_commands = &[
+ "compile --output binary main.ts",
+ "compile --node-modules-dir --output binary main.ts",
+ ];
+
+ for compile_command in compile_commands {
+ let output = context.new_command().args(compile_command).run();
+ output.assert_exit_code(0);
+ output.skip_output_check();
+
+ let output = context.new_command().name(&binary_path).run();
+ output.assert_matches_text(
+ r#"Node esm importing node cjs
+===========================
+{
+ default: [Function (anonymous)],
+ named: [Function (anonymous)],
+ MyClass: [class MyClass]
+}
+{ default: [Function (anonymous)], named: [Function (anonymous)] }
+[Module: null prototype] {
+ MyClass: [class MyClass],
+ __esModule: true,
+ default: {
+ default: [Function (anonymous)],
+ named: [Function (anonymous)],
+ MyClass: [class MyClass]
+ },
+ named: [Function (anonymous)]
+}
+[Module: null prototype] {
+ __esModule: true,
+ default: { default: [Function (anonymous)], named: [Function (anonymous)] },
+ named: [Function (anonymous)]
+}
+===========================
+static method
+testing[WILDCARD]this
+2
+5
+"#,
+ );
+ }
+
+ // try with a package.json
+ temp_dir.remove_dir_all("node_modules");
+ temp_dir.write(
+ "main.ts",
+ concat!(
+ "import { getValue, setValue } from '@denotest/esm-basic';\n",
+ "setValue(2);\n",
+ "console.log(getValue());",
+ ),
+ );
+ temp_dir.write(
+ "package.json",
+ r#"{ "dependencies": { "@denotest/esm-basic": "1" } }"#,
+ );
+
+ context
+ .new_command()
+ .args("compile --output binary main.ts")
+ .run()
+ .assert_exit_code(0)
+ .skip_output_check();
+
+ context
+ .new_command()
+ .name(&binary_path)
+ .run()
+ .assert_matches_text("2\n");
+
+ // now try with byonm
+ temp_dir.remove_dir_all("node_modules");
+ temp_dir.write("deno.json", r#"{"unstable":["byonm"]}"#);
+ context.run_npm("install");
+
+ context
+ .new_command()
+ .args("compile --output binary main.ts")
+ .run()
+ .assert_exit_code(0)
+ .assert_matches_text("Check file:///[WILDCARD]/main.ts\nCompile file:///[WILDCARD]/main.ts to binary[WILDCARD]\n");
+
+ context
+ .new_command()
+ .name(&binary_path)
+ .run()
+ .assert_matches_text("2\n");
+}
+
+#[test]
+fn compile_npm_file_system() {
+ run_npm_bin_compile_test(RunNpmBinCompileOptions {
+ input_specifier: "compile/npm_fs/main.ts",
+ compile_args: vec!["-A"],
+ run_args: vec![],
+ output_file: "compile/npm_fs/main.out",
+ node_modules_dir: true,
+ input_name: Some("binary"),
+ expected_name: "binary",
+ exit_code: 0,
+ });
+}
+
+#[test]
+fn compile_npm_bin_esm() {
+ run_npm_bin_compile_test(RunNpmBinCompileOptions {
+ input_specifier: "npm:@denotest/bin/cli-esm",
+ compile_args: vec![],
+ run_args: vec!["this", "is", "a", "test"],
+ output_file: "npm/deno_run_esm.out",
+ node_modules_dir: false,
+ input_name: None,
+ expected_name: "cli-esm",
+ exit_code: 0,
+ });
+}
+
+#[test]
+fn compile_npm_bin_cjs() {
+ run_npm_bin_compile_test(RunNpmBinCompileOptions {
+ input_specifier: "npm:@denotest/bin/cli-cjs",
+ compile_args: vec![],
+ run_args: vec!["this", "is", "a", "test"],
+ output_file: "npm/deno_run_cjs.out",
+ node_modules_dir: false,
+ input_name: None,
+ expected_name: "cli-cjs",
+ exit_code: 0,
+ });
+}
+
+#[test]
+fn compile_npm_cowsay_main() {
+ run_npm_bin_compile_test(RunNpmBinCompileOptions {
+ input_specifier: "npm:cowsay@1.5.0",
+ compile_args: vec!["--allow-read"],
+ run_args: vec!["Hello"],
+ output_file: "npm/deno_run_cowsay.out",
+ node_modules_dir: false,
+ input_name: None,
+ expected_name: "cowsay",
+ exit_code: 0,
+ });
+}
+
+#[test]
+fn compile_npm_vfs_implicit_read_permissions() {
+ run_npm_bin_compile_test(RunNpmBinCompileOptions {
+ input_specifier: "compile/vfs_implicit_read_permission/main.ts",
+ compile_args: vec![],
+ run_args: vec![],
+ output_file: "compile/vfs_implicit_read_permission/main.out",
+ node_modules_dir: false,
+ input_name: Some("binary"),
+ expected_name: "binary",
+ exit_code: 0,
+ });
+}
+
+#[test]
+fn compile_npm_no_permissions() {
+ run_npm_bin_compile_test(RunNpmBinCompileOptions {
+ input_specifier: "npm:cowsay@1.5.0",
+ compile_args: vec![],
+ run_args: vec!["Hello"],
+ output_file: "npm/deno_run_cowsay_no_permissions.out",
+ node_modules_dir: false,
+ input_name: None,
+ expected_name: "cowsay",
+ exit_code: 1,
+ });
+}
+
+#[test]
+fn compile_npm_cowsay_explicit() {
+ run_npm_bin_compile_test(RunNpmBinCompileOptions {
+ input_specifier: "npm:cowsay@1.5.0/cowsay",
+ compile_args: vec!["--allow-read"],
+ run_args: vec!["Hello"],
+ output_file: "npm/deno_run_cowsay.out",
+ node_modules_dir: false,
+ input_name: None,
+ expected_name: "cowsay",
+ exit_code: 0,
+ });
+}
+
+#[test]
+fn compile_npm_cowthink() {
+ run_npm_bin_compile_test(RunNpmBinCompileOptions {
+ input_specifier: "npm:cowsay@1.5.0/cowthink",
+ compile_args: vec!["--allow-read"],
+ run_args: vec!["Hello"],
+ output_file: "npm/deno_run_cowthink.out",
+ node_modules_dir: false,
+ input_name: None,
+ expected_name: "cowthink",
+ exit_code: 0,
+ });
+}
+
+struct RunNpmBinCompileOptions<'a> {
+ input_specifier: &'a str,
+ node_modules_dir: bool,
+ output_file: &'a str,
+ input_name: Option<&'a str>,
+ expected_name: &'a str,
+ run_args: Vec<&'a str>,
+ compile_args: Vec<&'a str>,
+ exit_code: i32,
+}
+
+fn run_npm_bin_compile_test(opts: RunNpmBinCompileOptions) {
+ let context = TestContextBuilder::for_npm().use_temp_cwd().build();
+
+ let temp_dir = context.temp_dir();
+ let main_specifier = if opts.input_specifier.starts_with("npm:") {
+ opts.input_specifier.to_string()
+ } else {
+ testdata_path().join(opts.input_specifier).to_string()
+ };
+
+ let mut args = vec!["compile".to_string()];
+
+ args.extend(opts.compile_args.iter().map(|s| s.to_string()));
+
+ if opts.node_modules_dir {
+ args.push("--node-modules-dir".to_string());
+ }
+
+ if let Some(bin_name) = opts.input_name {
+ args.push("--output".to_string());
+ args.push(bin_name.to_string());
+ }
+
+ args.push(main_specifier);
+
+ // compile
+ let output = context.new_command().args_vec(args).run();
+ output.assert_exit_code(0);
+ output.skip_output_check();
+
+ // delete the npm folder in the DENO_DIR to ensure it's not using it
+ context.deno_dir().remove_dir_all("./npm");
+
+ // run
+ let binary_path = if cfg!(windows) {
+ temp_dir.path().join(format!("{}.exe", opts.expected_name))
+ } else {
+ temp_dir.path().join(opts.expected_name)
+ };
+ let output = context
+ .new_command()
+ .name(binary_path)
+ .args_vec(opts.run_args)
+ .run();
+ output.assert_matches_file(opts.output_file);
+ output.assert_exit_code(opts.exit_code);
+}
+
+#[test]
+fn compile_node_modules_symlink_outside() {
+ let context = TestContextBuilder::for_npm()
+ .use_copy_temp_dir("compile/node_modules_symlink_outside")
+ .cwd("compile/node_modules_symlink_outside")
+ .build();
+
+ let temp_dir = context.temp_dir();
+ let project_dir = temp_dir
+ .path()
+ .join("compile")
+ .join("node_modules_symlink_outside");
+ temp_dir.create_dir_all(project_dir.join("node_modules"));
+ temp_dir.create_dir_all(project_dir.join("some_folder"));
+ temp_dir.write(project_dir.join("test.txt"), "5");
+
+ // create a symlink in the node_modules directory that points to a folder in the cwd
+ temp_dir.symlink_dir(
+ project_dir.join("some_folder"),
+ project_dir.join("node_modules").join("some_folder"),
+ );
+ // compile folder
+ let output = context
+ .new_command()
+ .args("compile --allow-read --node-modules-dir --output bin main.ts")
+ .run();
+ output.assert_exit_code(0);
+ output.assert_matches_file(
+ "compile/node_modules_symlink_outside/main_compile_folder.out",
+ );
+ assert!(project_dir.join("node_modules/some_folder").exists());
+
+ // Cleanup and remove the folder. The folder test is done separately from
+ // the file symlink test because different systems would traverse
+ // the directory items in different order.
+ temp_dir.remove_dir_all(project_dir.join("node_modules/some_folder"));
+
+ // create a symlink in the node_modules directory that points to a file in the cwd
+ temp_dir.symlink_file(
+ project_dir.join("test.txt"),
+ project_dir.join("node_modules").join("test.txt"),
+ );
+ assert!(project_dir.join("node_modules/test.txt").exists());
+
+ // compile
+ let output = context
+ .new_command()
+ .args("compile --allow-read --node-modules-dir --output bin main.ts")
+ .run();
+ output.assert_exit_code(0);
+ output.assert_matches_file(
+ "compile/node_modules_symlink_outside/main_compile_file.out",
+ );
+
+ // run
+ let binary_path =
+ project_dir.join(if cfg!(windows) { "bin.exe" } else { "bin" });
+ let output = context.new_command().name(binary_path).run();
+ output.assert_matches_file("compile/node_modules_symlink_outside/main.out");
+}
+
+#[test]
+fn compile_node_modules_symlink_non_existent() {
+ let context = TestContextBuilder::for_npm().use_temp_cwd().build();
+ let temp_dir = context.temp_dir().path();
+ temp_dir.join("main.ts").write(
+ r#"import { getValue, setValue } from "npm:@denotest/esm-basic";
+setValue(4);
+console.log(getValue());"#,
+ );
+ let node_modules_dir = temp_dir.join("node_modules");
+ node_modules_dir.create_dir_all();
+ // create a symlink that points to a non_existent file
+ node_modules_dir.symlink_dir("non_existent", "folder");
+ // compile folder
+ let output = context
+ .new_command()
+ .args("compile --allow-read --node-modules-dir --output bin main.ts")
+ .run();
+ output.assert_exit_code(0);
+ output.assert_matches_text(
+ r#"Download http://localhost:4545/npm/registry/@denotest/esm-basic
+Download http://localhost:4545/npm/registry/@denotest/esm-basic/1.0.0.tgz
+Initialize @denotest/esm-basic@1.0.0
+Check file:///[WILDCARD]/main.ts
+Compile file:///[WILDCARD]/main.ts to [WILDCARD]
+Warning Failed resolving symlink. Ignoring.
+ Path: [WILDCARD]
+ Message: [WILDCARD])
+"#,
+ );
+
+ // run
+ let binary_path =
+ temp_dir.join(if cfg!(windows) { "bin.exe" } else { "bin" });
+ let output = context.new_command().name(binary_path).run();
+ output.assert_matches_text("4\n");
+}
+
+#[test]
+fn dynamic_imports_tmp_lit() {
+ let context = TestContextBuilder::new().build();
+ let dir = context.temp_dir();
+ let exe = if cfg!(windows) {
+ dir.path().join("app.exe")
+ } else {
+ dir.path().join("app")
+ };
+ let output = context
+ .new_command()
+ .args_vec([
+ "compile",
+ "--output",
+ &exe.to_string_lossy(),
+ "./compile/dynamic_imports_tmp_lit/main.js",
+ ])
+ .run();
+ output.assert_exit_code(0);
+ output.skip_output_check();
+ let output = context.new_command().name(&exe).run();
+ output.assert_matches_text("a\nb\n{ data: 5 }\n{ data: 1 }\n");
+}
+
+#[test]
+fn granular_unstable_features() {
+ let context = TestContextBuilder::new().build();
+ let dir = context.temp_dir();
+ let exe = if cfg!(windows) {
+ dir.path().join("app.exe")
+ } else {
+ dir.path().join("app")
+ };
+ let output = context
+ .new_command()
+ .args_vec([
+ "compile",
+ "--output",
+ &exe.to_string_lossy(),
+ "--unstable-kv",
+ "./compile/unstable_features.ts",
+ ])
+ .run();
+ output.assert_exit_code(0);
+ output.skip_output_check();
+ let output = context.new_command().name(&exe).run();
+ output.assert_exit_code(0);
+ output.assert_matches_text("Kv {}\n");
+}
+
+#[test]
+fn dynamic_import_bad_data_uri() {
+ let context = TestContextBuilder::new().build();
+ let dir = context.temp_dir();
+ let exe = if cfg!(windows) {
+ dir.path().join("app.exe")
+ } else {
+ dir.path().join("app")
+ };
+ let file = dir.path().join("bad_data_uri.ts");
+ file.write("await import('data:application/')");
+ let output = context
+ .new_command()
+ .args_vec([
+ "compile",
+ "--output",
+ &exe.to_string_lossy(),
+ &file.to_string_lossy(),
+ ])
+ .run();
+ output.assert_exit_code(0);
+ output.skip_output_check();
+ let output = context.new_command().name(&exe).run();
+ output.assert_exit_code(1);
+ output.assert_matches_text(
+ "[WILDCARD]TypeError: Unable to decode data url.[WILDCARD]",
+ );
+}
diff --git a/cli/tests/integration/coverage_tests.rs b/tests/integration/coverage_tests.rs
index 804f9b578..804f9b578 100644
--- a/cli/tests/integration/coverage_tests.rs
+++ b/tests/integration/coverage_tests.rs
diff --git a/cli/tests/integration/doc_tests.rs b/tests/integration/doc_tests.rs
index 62fd2a5b4..62fd2a5b4 100644
--- a/cli/tests/integration/doc_tests.rs
+++ b/tests/integration/doc_tests.rs
diff --git a/cli/tests/integration/eval_tests.rs b/tests/integration/eval_tests.rs
index 1ae65e49e..1ae65e49e 100644
--- a/cli/tests/integration/eval_tests.rs
+++ b/tests/integration/eval_tests.rs
diff --git a/cli/tests/integration/flags_tests.rs b/tests/integration/flags_tests.rs
index a22cb0548..a22cb0548 100644
--- a/cli/tests/integration/flags_tests.rs
+++ b/tests/integration/flags_tests.rs
diff --git a/cli/tests/integration/fmt_tests.rs b/tests/integration/fmt_tests.rs
index 94eca295e..94eca295e 100644
--- a/cli/tests/integration/fmt_tests.rs
+++ b/tests/integration/fmt_tests.rs
diff --git a/cli/tests/integration/info_tests.rs b/tests/integration/info_tests.rs
index 922fcee06..922fcee06 100644
--- a/cli/tests/integration/info_tests.rs
+++ b/tests/integration/info_tests.rs
diff --git a/cli/tests/integration/init_tests.rs b/tests/integration/init_tests.rs
index d3908eae4..d3908eae4 100644
--- a/cli/tests/integration/init_tests.rs
+++ b/tests/integration/init_tests.rs
diff --git a/cli/tests/integration/inspector_tests.rs b/tests/integration/inspector_tests.rs
index bbe70ae5e..bbe70ae5e 100644
--- a/cli/tests/integration/inspector_tests.rs
+++ b/tests/integration/inspector_tests.rs
diff --git a/cli/tests/integration/install_tests.rs b/tests/integration/install_tests.rs
index 54df82549..54df82549 100644
--- a/cli/tests/integration/install_tests.rs
+++ b/tests/integration/install_tests.rs
diff --git a/tests/integration/js_unit_tests.rs b/tests/integration/js_unit_tests.rs
new file mode 100644
index 000000000..16aebd8c4
--- /dev/null
+++ b/tests/integration/js_unit_tests.rs
@@ -0,0 +1,201 @@
+// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
+use std::io::BufRead;
+use std::io::BufReader;
+use std::time::Duration;
+use std::time::Instant;
+use test_util as util;
+
+util::unit_test_factory!(
+ js_unit_test,
+ "../tests/unit",
+ "*.ts",
+ [
+ abort_controller_test,
+ blob_test,
+ body_test,
+ broadcast_channel_test,
+ buffer_test,
+ build_test,
+ cache_api_test,
+ chmod_test,
+ chown_test,
+ command_test,
+ console_test,
+ copy_file_test,
+ custom_event_test,
+ cron_test,
+ dir_test,
+ dom_exception_test,
+ error_stack_test,
+ error_test,
+ esnext_test,
+ event_target_test,
+ event_test,
+ fetch_test,
+ ffi_test,
+ file_test,
+ filereader_test,
+ files_test,
+ flock_test,
+ fs_events_test,
+ get_random_values_test,
+ globals_test,
+ headers_test,
+ http_test,
+ image_bitmap_test,
+ image_data_test,
+ internals_test,
+ intl_test,
+ io_test,
+ jupyter_test,
+ kv_test,
+ kv_queue_test_no_db_close,
+ kv_queue_test,
+ kv_queue_undelivered_test,
+ link_test,
+ make_temp_test,
+ message_channel_test,
+ mkdir_test,
+ navigator_test,
+ net_test,
+ network_interfaces_test,
+ os_test,
+ ops_test,
+ path_from_url_test,
+ performance_test,
+ permissions_test,
+ process_test,
+ progressevent_test,
+ promise_hooks_test,
+ read_dir_test,
+ read_file_test,
+ read_link_test,
+ read_text_file_test,
+ real_path_test,
+ ref_unref_test,
+ remove_test,
+ rename_test,
+ request_test,
+ resources_test,
+ response_test,
+ serve_test,
+ signal_test,
+ stat_test,
+ stdio_test,
+ streams_test,
+ structured_clone_test,
+ symbol_test,
+ symlink_test,
+ sync_test,
+ test_util,
+ testing_test,
+ text_encoding_test,
+ timers_test,
+ tls_test,
+ truncate_test,
+ tty_color_test,
+ tty_test,
+ umask_test,
+ url_search_params_test,
+ url_test,
+ urlpattern_test,
+ utime_test,
+ version_test,
+ wasm_test,
+ webcrypto_test,
+ webgpu_test,
+ websocket_test,
+ webstorage_test,
+ worker_permissions_test,
+ worker_test,
+ write_file_test,
+ write_text_file_test,
+ ]
+);
+
+fn js_unit_test(test: String) {
+ let _g = util::http_server();
+
+ let deno = util::deno_cmd()
+ .current_dir(util::root_path())
+ .arg("test")
+ .arg("--config")
+ .arg("tests/config/deno.json")
+ .arg("--no-lock")
+ .arg("--unstable")
+ .arg("--location=http://127.0.0.1:4545/")
+ .arg("--no-prompt");
+
+ // TODO(mmastrac): it would be better to just load a test CA for all tests
+ let deno = if test == "websocket_test" {
+ deno.arg("--unsafely-ignore-certificate-errors")
+ } else {
+ deno
+ };
+
+ let mut deno = deno
+ .arg("-A")
+ .arg(util::tests_path().join("unit").join(format!("{test}.ts")))
+ .piped_output()
+ .spawn()
+ .expect("failed to spawn script");
+
+ let now = Instant::now();
+ let stdout = deno.stdout.take().unwrap();
+ let test_name = test.clone();
+ let stdout = std::thread::spawn(move || {
+ let reader = BufReader::new(stdout);
+ for line in reader.lines() {
+ if let Ok(line) = line {
+ println!("[{test_name} {:0>6.2}] {line}", now.elapsed().as_secs_f32());
+ } else {
+ break;
+ }
+ }
+ });
+
+ let now = Instant::now();
+ let stderr = deno.stderr.take().unwrap();
+ let test_name = test.clone();
+ let stderr = std::thread::spawn(move || {
+ let reader = BufReader::new(stderr);
+ for line in reader.lines() {
+ if let Ok(line) = line {
+ eprintln!("[{test_name} {:0>6.2}] {line}", now.elapsed().as_secs_f32());
+ } else {
+ break;
+ }
+ }
+ });
+
+ const PER_TEST_TIMEOUT: Duration = Duration::from_secs(3 * 60);
+
+ let now = Instant::now();
+ let status = loop {
+ if now.elapsed() > PER_TEST_TIMEOUT {
+ // Last-ditch kill
+ _ = deno.kill();
+ panic!("Test {test} failed to complete in time");
+ }
+ if let Some(status) = deno
+ .try_wait()
+ .expect("failed to wait for the child process")
+ {
+ break status;
+ }
+ std::thread::sleep(Duration::from_millis(100));
+ };
+
+ #[cfg(unix)]
+ assert_eq!(
+ std::os::unix::process::ExitStatusExt::signal(&status),
+ None,
+ "Deno should not have died with a signal"
+ );
+ assert_eq!(Some(0), status.code(), "Deno should have exited cleanly");
+
+ stdout.join().unwrap();
+ stderr.join().unwrap();
+
+ assert!(status.success());
+}
diff --git a/cli/tests/integration/jsr_tests.rs b/tests/integration/jsr_tests.rs
index 2de4f0056..2de4f0056 100644
--- a/cli/tests/integration/jsr_tests.rs
+++ b/tests/integration/jsr_tests.rs
diff --git a/cli/tests/integration/jupyter_tests.rs b/tests/integration/jupyter_tests.rs
index 59c247e5d..59c247e5d 100644
--- a/cli/tests/integration/jupyter_tests.rs
+++ b/tests/integration/jupyter_tests.rs
diff --git a/cli/tests/integration/lint_tests.rs b/tests/integration/lint_tests.rs
index b266fb5b7..b266fb5b7 100644
--- a/cli/tests/integration/lint_tests.rs
+++ b/tests/integration/lint_tests.rs
diff --git a/cli/tests/integration/lsp_tests.rs b/tests/integration/lsp_tests.rs
index c9abae241..c9abae241 100644
--- a/cli/tests/integration/lsp_tests.rs
+++ b/tests/integration/lsp_tests.rs
diff --git a/cli/tests/integration/mod.rs b/tests/integration/mod.rs
index 19796f245..19796f245 100644
--- a/cli/tests/integration/mod.rs
+++ b/tests/integration/mod.rs
diff --git a/tests/integration/node_compat_tests.rs b/tests/integration/node_compat_tests.rs
new file mode 100644
index 000000000..d592c75a5
--- /dev/null
+++ b/tests/integration/node_compat_tests.rs
@@ -0,0 +1,31 @@
+// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
+
+use test_util as util;
+use util::env_vars_for_npm_tests;
+
+#[test]
+fn node_compat_tests() {
+ let mut deno = util::deno_cmd()
+ .current_dir(util::root_path())
+ .arg("test")
+ .arg("--config")
+ .arg("tests/config/deno.json")
+ .arg("--no-lock")
+ .arg("--unstable")
+ .arg("-A")
+ .arg(util::tests_path().join("node_compat"))
+ .spawn()
+ .expect("failed to spawn script");
+
+ let status = deno.wait().expect("failed to wait for the child process");
+ assert_eq!(Some(0), status.code());
+ assert!(status.success());
+}
+
+itest!(node_test_module {
+ args: "test node/test.js",
+ output: "node/test.out",
+ envs: env_vars_for_npm_tests(),
+ exit_code: 1,
+ http_server: true,
+});
diff --git a/tests/integration/node_unit_tests.rs b/tests/integration/node_unit_tests.rs
new file mode 100644
index 000000000..c99586fa1
--- /dev/null
+++ b/tests/integration/node_unit_tests.rs
@@ -0,0 +1,207 @@
+// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
+use std::io::BufRead;
+use std::io::BufReader;
+use std::time::Duration;
+use std::time::Instant;
+use test_util as util;
+use util::env_vars_for_npm_tests;
+
+util::unit_test_factory!(
+ node_unit_test,
+ "../tests/unit_node",
+ "**/*_test.ts",
+ [
+ _fs_access_test = _fs / _fs_access_test,
+ _fs_appendFile_test = _fs / _fs_appendFile_test,
+ _fs_chmod_test = _fs / _fs_chmod_test,
+ _fs_chown_test = _fs / _fs_chown_test,
+ _fs_close_test = _fs / _fs_close_test,
+ _fs_copy_test = _fs / _fs_copy_test,
+ _fs_dir_test = _fs / _fs_dir_test,
+ _fs_dirent_test = _fs / _fs_dirent_test,
+ _fs_open_test = _fs / _fs_open_test,
+ _fs_read_test = _fs / _fs_read_test,
+ _fs_exists_test = _fs / _fs_exists_test,
+ _fs_fdatasync_test = _fs / _fs_fdatasync_test,
+ _fs_fstat_test = _fs / _fs_fstat_test,
+ _fs_fsync_test = _fs / _fs_fsync_test,
+ _fs_ftruncate_test = _fs / _fs_ftruncate_test,
+ _fs_futimes_test = _fs / _fs_futimes_test,
+ _fs_handle_test = _fs / _fs_handle_test,
+ _fs_link_test = _fs / _fs_link_test,
+ _fs_lstat_test = _fs / _fs_lstat_test,
+ _fs_mkdir_test = _fs / _fs_mkdir_test,
+ _fs_mkdtemp_test = _fs / _fs_mkdtemp_test,
+ _fs_opendir_test = _fs / _fs_opendir_test,
+ _fs_readFile_test = _fs / _fs_readFile_test,
+ _fs_readdir_test = _fs / _fs_readdir_test,
+ _fs_readlink_test = _fs / _fs_readlink_test,
+ _fs_realpath_test = _fs / _fs_realpath_test,
+ _fs_rename_test = _fs / _fs_rename_test,
+ _fs_rm_test = _fs / _fs_rm_test,
+ _fs_rmdir_test = _fs / _fs_rmdir_test,
+ _fs_stat_test = _fs / _fs_stat_test,
+ _fs_symlink_test = _fs / _fs_symlink_test,
+ _fs_truncate_test = _fs / _fs_truncate_test,
+ _fs_unlink_test = _fs / _fs_unlink_test,
+ _fs_utimes_test = _fs / _fs_utimes_test,
+ _fs_watch_test = _fs / _fs_watch_test,
+ _fs_writeFile_test = _fs / _fs_writeFile_test,
+ _fs_write_test = _fs / _fs_write_test,
+ async_hooks_test,
+ assertion_error_test,
+ buffer_test,
+ child_process_test,
+ console_test,
+ crypto_cipher_test = crypto / crypto_cipher_test,
+ crypto_cipher_gcm_test = crypto / crypto_cipher_gcm_test,
+ crypto_hash_test = crypto / crypto_hash_test,
+ crypto_key_test = crypto / crypto_key_test,
+ crypto_sign_test = crypto / crypto_sign_test,
+ events_test,
+ dgram_test,
+ fs_test,
+ http_test,
+ http2_test,
+ _randomBytes_test = internal / _randomBytes_test,
+ _randomFill_test = internal / _randomFill_test,
+ _randomInt_test = internal / _randomInt_test,
+ pbkdf2_test = internal / pbkdf2_test,
+ scrypt_test = internal / scrypt_test,
+ module_test,
+ net_test,
+ os_test,
+ path_test,
+ perf_hooks_test,
+ process_test,
+ querystring_test,
+ readline_test,
+ repl_test,
+ stream_test,
+ string_decoder_test,
+ timers_test,
+ tls_test,
+ tty_test,
+ util_test,
+ v8_test,
+ vm_test,
+ worker_threads_test,
+ zlib_test
+ ]
+);
+
+fn node_unit_test(test: String) {
+ let _g = util::http_server();
+
+ let mut deno = util::deno_cmd()
+ .current_dir(util::root_path())
+ .arg("test")
+ .arg("--config")
+ .arg("tests/config/deno.json")
+ .arg("--no-lock")
+ .arg("--unstable")
+ // TODO(kt3k): This option is required to pass tls_test.ts,
+ // but this shouldn't be necessary. tls.connect currently doesn't
+ // pass hostname option correctly and it causes cert errors.
+ .arg("--unsafely-ignore-certificate-errors")
+ .arg("-A");
+ // Parallel tests for crypto
+ if test.starts_with("crypto/") {
+ deno = deno.arg("--parallel");
+ }
+ let mut deno = deno
+ .arg(
+ util::tests_path()
+ .join("unit_node")
+ .join(format!("{test}.ts")),
+ )
+ .envs(env_vars_for_npm_tests())
+ .piped_output()
+ .spawn()
+ .expect("failed to spawn script");
+
+ let now = Instant::now();
+ let stdout = deno.stdout.take().unwrap();
+ let test_name = test.clone();
+ let stdout = std::thread::spawn(move || {
+ let reader = BufReader::new(stdout);
+ for line in reader.lines() {
+ if let Ok(line) = line {
+ println!("[{test_name} {:0>6.2}] {line}", now.elapsed().as_secs_f32());
+ } else {
+ break;
+ }
+ }
+ });
+
+ let now = Instant::now();
+ let stderr = deno.stderr.take().unwrap();
+ let test_name = test.clone();
+ let stderr = std::thread::spawn(move || {
+ let reader = BufReader::new(stderr);
+ for line in reader.lines() {
+ if let Ok(line) = line {
+ eprintln!("[{test_name} {:0>6.2}] {line}", now.elapsed().as_secs_f32());
+ } else {
+ break;
+ }
+ }
+ });
+
+ const PER_TEST_TIMEOUT: Duration = Duration::from_secs(5 * 60);
+
+ let now = Instant::now();
+ let status = loop {
+ if now.elapsed() > PER_TEST_TIMEOUT {
+ // Last-ditch kill
+ _ = deno.kill();
+ panic!("Test {test} failed to complete in time");
+ }
+ if let Some(status) = deno
+ .try_wait()
+ .expect("failed to wait for the child process")
+ {
+ break status;
+ }
+ std::thread::sleep(Duration::from_millis(100));
+ };
+
+ #[cfg(unix)]
+ assert_eq!(
+ std::os::unix::process::ExitStatusExt::signal(&status),
+ None,
+ "Deno should not have died with a signal"
+ );
+ assert_eq!(Some(0), status.code(), "Deno should have exited cleanly");
+
+ stdout.join().unwrap();
+ stderr.join().unwrap();
+
+ assert!(status.success());
+}
+
+// Regression test for https://github.com/denoland/deno/issues/16928
+itest!(unhandled_rejection_web {
+ args: "run -A node/unhandled_rejection_web.ts",
+ output: "node/unhandled_rejection_web.ts.out",
+ envs: env_vars_for_npm_tests(),
+ http_server: true,
+});
+
+// Ensure that Web `onunhandledrejection` is fired before
+// Node's `process.on('unhandledRejection')`.
+itest!(unhandled_rejection_web_process {
+ args: "run -A node/unhandled_rejection_web_process.ts",
+ output: "node/unhandled_rejection_web_process.ts.out",
+ envs: env_vars_for_npm_tests(),
+ http_server: true,
+});
+
+// Ensure that Web `onrejectionhandled` is fired before
+// Node's `process.on('rejectionHandled')`.
+itest!(rejection_handled_web_process {
+ args: "run -A --quiet node/rejection_handled_web_process.ts",
+ output: "node/rejection_handled_web_process.ts.out",
+ envs: env_vars_for_npm_tests(),
+ http_server: true,
+});
diff --git a/cli/tests/integration/npm_tests.rs b/tests/integration/npm_tests.rs
index a63253260..a63253260 100644
--- a/cli/tests/integration/npm_tests.rs
+++ b/tests/integration/npm_tests.rs
diff --git a/cli/tests/integration/publish_tests.rs b/tests/integration/publish_tests.rs
index 330a7692b..330a7692b 100644
--- a/cli/tests/integration/publish_tests.rs
+++ b/tests/integration/publish_tests.rs
diff --git a/cli/tests/integration/repl_tests.rs b/tests/integration/repl_tests.rs
index 0e63f1589..0e63f1589 100644
--- a/cli/tests/integration/repl_tests.rs
+++ b/tests/integration/repl_tests.rs
diff --git a/cli/tests/integration/run_tests.rs b/tests/integration/run_tests.rs
index 298ce1715..298ce1715 100644
--- a/cli/tests/integration/run_tests.rs
+++ b/tests/integration/run_tests.rs
diff --git a/cli/tests/integration/shared_library_tests.rs b/tests/integration/shared_library_tests.rs
index 4d33e6584..4d33e6584 100644
--- a/cli/tests/integration/shared_library_tests.rs
+++ b/tests/integration/shared_library_tests.rs
diff --git a/cli/tests/integration/task_tests.rs b/tests/integration/task_tests.rs
index c8531c13f..c8531c13f 100644
--- a/cli/tests/integration/task_tests.rs
+++ b/tests/integration/task_tests.rs
diff --git a/cli/tests/integration/test_tests.rs b/tests/integration/test_tests.rs
index 27bef8007..27bef8007 100644
--- a/cli/tests/integration/test_tests.rs
+++ b/tests/integration/test_tests.rs
diff --git a/cli/tests/integration/upgrade_tests.rs b/tests/integration/upgrade_tests.rs
index c016b61fc..c016b61fc 100644
--- a/cli/tests/integration/upgrade_tests.rs
+++ b/tests/integration/upgrade_tests.rs
diff --git a/cli/tests/integration/vendor_tests.rs b/tests/integration/vendor_tests.rs
index c38fb653a..c38fb653a 100644
--- a/cli/tests/integration/vendor_tests.rs
+++ b/tests/integration/vendor_tests.rs
diff --git a/cli/tests/integration/watcher_tests.rs b/tests/integration/watcher_tests.rs
index 6a2cab08a..6a2cab08a 100644
--- a/cli/tests/integration/watcher_tests.rs
+++ b/tests/integration/watcher_tests.rs
diff --git a/cli/tests/integration/worker_tests.rs b/tests/integration/worker_tests.rs
index e2d1ef868..e2d1ef868 100644
--- a/cli/tests/integration/worker_tests.rs
+++ b/tests/integration/worker_tests.rs
diff --git a/cli/tests/integration_tests.rs b/tests/integration_tests.rs
index 8469b5416..8469b5416 100644
--- a/cli/tests/integration_tests.rs
+++ b/tests/integration_tests.rs
diff --git a/cli/tests/integration_tests_runner.rs b/tests/integration_tests_runner.rs
index 12e83a019..12e83a019 100644
--- a/cli/tests/integration_tests_runner.rs
+++ b/tests/integration_tests_runner.rs
diff --git a/cli/tests/lib.rs b/tests/lib.rs
index 0a39b9f87..0a39b9f87 100644
--- a/cli/tests/lib.rs
+++ b/tests/lib.rs
diff --git a/cli/tests/node_compat/common.ts b/tests/node_compat/common.ts
index e079c6aaf..e079c6aaf 100644
--- a/cli/tests/node_compat/common.ts
+++ b/tests/node_compat/common.ts
diff --git a/cli/tests/node_compat/config.jsonc b/tests/node_compat/config.jsonc
index d84cc4dd2..d84cc4dd2 100644
--- a/cli/tests/node_compat/config.jsonc
+++ b/tests/node_compat/config.jsonc
diff --git a/tests/node_compat/deno.json b/tests/node_compat/deno.json
new file mode 100644
index 000000000..ec93111fd
--- /dev/null
+++ b/tests/node_compat/deno.json
@@ -0,0 +1,5 @@
+{
+ "imports": {
+ "@test_util/": "../../test_util/"
+ }
+}
diff --git a/cli/tests/node_compat/polyfill_globals.js b/tests/node_compat/polyfill_globals.js
index 93246d2ef..93246d2ef 100644
--- a/cli/tests/node_compat/polyfill_globals.js
+++ b/tests/node_compat/polyfill_globals.js
diff --git a/cli/tests/node_compat/runner.ts b/tests/node_compat/runner.ts
index 4695037cc..4695037cc 100644
--- a/cli/tests/node_compat/runner.ts
+++ b/tests/node_compat/runner.ts
diff --git a/cli/tests/node_compat/test.ts b/tests/node_compat/test.ts
index 13ff429b5..13ff429b5 100644
--- a/cli/tests/node_compat/test.ts
+++ b/tests/node_compat/test.ts
diff --git a/cli/tests/node_compat/test/common/child_process.js b/tests/node_compat/test/common/child_process.js
index b860d7697..b860d7697 100644
--- a/cli/tests/node_compat/test/common/child_process.js
+++ b/tests/node_compat/test/common/child_process.js
diff --git a/cli/tests/node_compat/test/common/countdown.js b/tests/node_compat/test/common/countdown.js
index a7ae0d029..a7ae0d029 100644
--- a/cli/tests/node_compat/test/common/countdown.js
+++ b/tests/node_compat/test/common/countdown.js
diff --git a/cli/tests/node_compat/test/common/dns.js b/tests/node_compat/test/common/dns.js
index 54df6a55e..54df6a55e 100644
--- a/cli/tests/node_compat/test/common/dns.js
+++ b/tests/node_compat/test/common/dns.js
diff --git a/cli/tests/node_compat/test/common/duplexpair.js b/tests/node_compat/test/common/duplexpair.js
index 6e5286cc8..6e5286cc8 100644
--- a/cli/tests/node_compat/test/common/duplexpair.js
+++ b/tests/node_compat/test/common/duplexpair.js
diff --git a/cli/tests/node_compat/test/common/fixtures.js b/tests/node_compat/test/common/fixtures.js
index 64b888eb6..64b888eb6 100644
--- a/cli/tests/node_compat/test/common/fixtures.js
+++ b/tests/node_compat/test/common/fixtures.js
diff --git a/cli/tests/node_compat/test/common/hijackstdio.js b/tests/node_compat/test/common/hijackstdio.js
index 38582ece2..38582ece2 100644
--- a/cli/tests/node_compat/test/common/hijackstdio.js
+++ b/tests/node_compat/test/common/hijackstdio.js
diff --git a/cli/tests/node_compat/test/common/index.js b/tests/node_compat/test/common/index.js
index 9f5b4814c..9f5b4814c 100644
--- a/cli/tests/node_compat/test/common/index.js
+++ b/tests/node_compat/test/common/index.js
diff --git a/cli/tests/node_compat/test/common/index.mjs b/tests/node_compat/test/common/index.mjs
index 25fe5cbb0..25fe5cbb0 100644
--- a/cli/tests/node_compat/test/common/index.mjs
+++ b/tests/node_compat/test/common/index.mjs
diff --git a/cli/tests/node_compat/test/common/internet.js b/tests/node_compat/test/common/internet.js
index b42fda66c..b42fda66c 100644
--- a/cli/tests/node_compat/test/common/internet.js
+++ b/tests/node_compat/test/common/internet.js
diff --git a/cli/tests/node_compat/test/common/package.json b/tests/node_compat/test/common/package.json
index 0967ef424..0967ef424 100644
--- a/cli/tests/node_compat/test/common/package.json
+++ b/tests/node_compat/test/common/package.json
diff --git a/cli/tests/node_compat/test/common/tmpdir.js b/tests/node_compat/test/common/tmpdir.js
index 886c4a107..886c4a107 100644
--- a/cli/tests/node_compat/test/common/tmpdir.js
+++ b/tests/node_compat/test/common/tmpdir.js
diff --git a/cli/tests/node_compat/test/fixtures/GH-1899-output.js b/tests/node_compat/test/fixtures/GH-1899-output.js
index d647eb320..d647eb320 100644
--- a/cli/tests/node_compat/test/fixtures/GH-1899-output.js
+++ b/tests/node_compat/test/fixtures/GH-1899-output.js
diff --git a/cli/tests/node_compat/test/fixtures/a.js b/tests/node_compat/test/fixtures/a.js
index 9f5a21a06..9f5a21a06 100644
--- a/cli/tests/node_compat/test/fixtures/a.js
+++ b/tests/node_compat/test/fixtures/a.js
diff --git a/tests/node_compat/test/fixtures/child-process-spawn-node.js b/tests/node_compat/test/fixtures/child-process-spawn-node.js
new file mode 100644
index 000000000..da2b557c9
--- /dev/null
+++ b/tests/node_compat/test/fixtures/child-process-spawn-node.js
@@ -0,0 +1,14 @@
+const assert = require("assert");
+// TODO(kt3k): Uncomment this when util.debuglog is added
+// const debug = require('util').debuglog('test');
+const debug = console.log;
+
+function onmessage(m) {
+ debug("CHILD got message:", m);
+ assert.ok(m.hello);
+ process.removeListener("message", onmessage);
+}
+
+process.on("message", onmessage);
+// TODO(kt3k): Uncomment the below when the ipc features are ready
+// process.send({ foo: 'bar' });
diff --git a/cli/tests/node_compat/test/fixtures/child_process_should_emit_error.js b/tests/node_compat/test/fixtures/child_process_should_emit_error.js
index 5a56c312b..5a56c312b 100644
--- a/cli/tests/node_compat/test/fixtures/child_process_should_emit_error.js
+++ b/tests/node_compat/test/fixtures/child_process_should_emit_error.js
diff --git a/cli/tests/node_compat/test/fixtures/echo.js b/tests/node_compat/test/fixtures/echo.js
index 893099e9b..893099e9b 100644
--- a/cli/tests/node_compat/test/fixtures/echo.js
+++ b/tests/node_compat/test/fixtures/echo.js
diff --git a/cli/tests/node_compat/test/fixtures/elipses.txt b/tests/node_compat/test/fixtures/elipses.txt
index 610560050..610560050 100644
--- a/cli/tests/node_compat/test/fixtures/elipses.txt
+++ b/tests/node_compat/test/fixtures/elipses.txt
diff --git a/cli/tests/node_compat/test/fixtures/empty.txt b/tests/node_compat/test/fixtures/empty.txt
index e69de29bb..e69de29bb 100644
--- a/cli/tests/node_compat/test/fixtures/empty.txt
+++ b/tests/node_compat/test/fixtures/empty.txt
diff --git a/cli/tests/node_compat/test/fixtures/exit.js b/tests/node_compat/test/fixtures/exit.js
index ca80f4828..ca80f4828 100644
--- a/cli/tests/node_compat/test/fixtures/exit.js
+++ b/tests/node_compat/test/fixtures/exit.js
diff --git a/cli/tests/node_compat/test/fixtures/keys/agent1-cert.pem b/tests/node_compat/test/fixtures/keys/agent1-cert.pem
index bef645b0f..bef645b0f 100644
--- a/cli/tests/node_compat/test/fixtures/keys/agent1-cert.pem
+++ b/tests/node_compat/test/fixtures/keys/agent1-cert.pem
diff --git a/cli/tests/node_compat/test/fixtures/keys/agent1-key.pem b/tests/node_compat/test/fixtures/keys/agent1-key.pem
index 1bd840716..1bd840716 100644
--- a/cli/tests/node_compat/test/fixtures/keys/agent1-key.pem
+++ b/tests/node_compat/test/fixtures/keys/agent1-key.pem
diff --git a/cli/tests/node_compat/test/fixtures/keys/ca1-cert.pem b/tests/node_compat/test/fixtures/keys/ca1-cert.pem
index e1a012c6b..e1a012c6b 100644
--- a/cli/tests/node_compat/test/fixtures/keys/ca1-cert.pem
+++ b/tests/node_compat/test/fixtures/keys/ca1-cert.pem
diff --git a/cli/tests/node_compat/test/fixtures/loop.js b/tests/node_compat/test/fixtures/loop.js
index f9bcfc66e..f9bcfc66e 100644
--- a/cli/tests/node_compat/test/fixtures/loop.js
+++ b/tests/node_compat/test/fixtures/loop.js
diff --git a/cli/tests/node_compat/test/fixtures/package.json b/tests/node_compat/test/fixtures/package.json
index 0967ef424..0967ef424 100644
--- a/cli/tests/node_compat/test/fixtures/package.json
+++ b/tests/node_compat/test/fixtures/package.json
diff --git a/cli/tests/node_compat/test/fixtures/print-chars.js b/tests/node_compat/test/fixtures/print-chars.js
index 2519c77fd..2519c77fd 100644
--- a/cli/tests/node_compat/test/fixtures/print-chars.js
+++ b/tests/node_compat/test/fixtures/print-chars.js
diff --git a/cli/tests/node_compat/test/fixtures/x.txt b/tests/node_compat/test/fixtures/x.txt
index cd470e619..cd470e619 100644
--- a/cli/tests/node_compat/test/fixtures/x.txt
+++ b/tests/node_compat/test/fixtures/x.txt
diff --git a/cli/tests/node_compat/test/internet/package.json b/tests/node_compat/test/internet/package.json
index 0967ef424..0967ef424 100644
--- a/cli/tests/node_compat/test/internet/package.json
+++ b/tests/node_compat/test/internet/package.json
diff --git a/cli/tests/node_compat/test/internet/test-dns-any.js b/tests/node_compat/test/internet/test-dns-any.js
index b8a70b8e2..b8a70b8e2 100644
--- a/cli/tests/node_compat/test/internet/test-dns-any.js
+++ b/tests/node_compat/test/internet/test-dns-any.js
diff --git a/cli/tests/node_compat/test/internet/test-dns-idna2008.js b/tests/node_compat/test/internet/test-dns-idna2008.js
index 7308f9deb..7308f9deb 100644
--- a/cli/tests/node_compat/test/internet/test-dns-idna2008.js
+++ b/tests/node_compat/test/internet/test-dns-idna2008.js
diff --git a/cli/tests/node_compat/test/internet/test-dns-ipv4.js b/tests/node_compat/test/internet/test-dns-ipv4.js
index 43b60950a..43b60950a 100644
--- a/cli/tests/node_compat/test/internet/test-dns-ipv4.js
+++ b/tests/node_compat/test/internet/test-dns-ipv4.js
diff --git a/cli/tests/node_compat/test/internet/test-dns-ipv6.js b/tests/node_compat/test/internet/test-dns-ipv6.js
index 4b94d6041..4b94d6041 100644
--- a/cli/tests/node_compat/test/internet/test-dns-ipv6.js
+++ b/tests/node_compat/test/internet/test-dns-ipv6.js
diff --git a/cli/tests/node_compat/test/internet/test-dns-lookup.js b/tests/node_compat/test/internet/test-dns-lookup.js
index cfd3e758c..cfd3e758c 100644
--- a/cli/tests/node_compat/test/internet/test-dns-lookup.js
+++ b/tests/node_compat/test/internet/test-dns-lookup.js
diff --git a/cli/tests/node_compat/test/internet/test-dns-promises-resolve.js b/tests/node_compat/test/internet/test-dns-promises-resolve.js
index e4ee5f782..e4ee5f782 100644
--- a/cli/tests/node_compat/test/internet/test-dns-promises-resolve.js
+++ b/tests/node_compat/test/internet/test-dns-promises-resolve.js
diff --git a/cli/tests/node_compat/test/internet/test-dns-regress-6244.js b/tests/node_compat/test/internet/test-dns-regress-6244.js
index 988cf21ee..988cf21ee 100644
--- a/cli/tests/node_compat/test/internet/test-dns-regress-6244.js
+++ b/tests/node_compat/test/internet/test-dns-regress-6244.js
diff --git a/cli/tests/node_compat/test/internet/test-dns-setserver-in-callback-of-resolve4.js b/tests/node_compat/test/internet/test-dns-setserver-in-callback-of-resolve4.js
index b4360c205..b4360c205 100644
--- a/cli/tests/node_compat/test/internet/test-dns-setserver-in-callback-of-resolve4.js
+++ b/tests/node_compat/test/internet/test-dns-setserver-in-callback-of-resolve4.js
diff --git a/cli/tests/node_compat/test/internet/test-dns.js b/tests/node_compat/test/internet/test-dns.js
index 8aaeb728d..8aaeb728d 100644
--- a/cli/tests/node_compat/test/internet/test-dns.js
+++ b/tests/node_compat/test/internet/test-dns.js
diff --git a/cli/tests/node_compat/test/internet/test-http-https-default-ports.js b/tests/node_compat/test/internet/test-http-https-default-ports.js
index ef3edd2fc..ef3edd2fc 100644
--- a/cli/tests/node_compat/test/internet/test-http-https-default-ports.js
+++ b/tests/node_compat/test/internet/test-http-https-default-ports.js
diff --git a/cli/tests/node_compat/test/parallel/package.json b/tests/node_compat/test/parallel/package.json
index 0967ef424..0967ef424 100644
--- a/cli/tests/node_compat/test/parallel/package.json
+++ b/tests/node_compat/test/parallel/package.json
diff --git a/cli/tests/node_compat/test/parallel/test-assert-async.js b/tests/node_compat/test/parallel/test-assert-async.js
index a2a8315d8..a2a8315d8 100644
--- a/cli/tests/node_compat/test/parallel/test-assert-async.js
+++ b/tests/node_compat/test/parallel/test-assert-async.js
diff --git a/cli/tests/node_compat/test/parallel/test-assert-fail.js b/tests/node_compat/test/parallel/test-assert-fail.js
index 03def3a88..03def3a88 100644
--- a/cli/tests/node_compat/test/parallel/test-assert-fail.js
+++ b/tests/node_compat/test/parallel/test-assert-fail.js
diff --git a/cli/tests/node_compat/test/parallel/test-assert-strict-exists.js b/tests/node_compat/test/parallel/test-assert-strict-exists.js
index 49499c3f6..49499c3f6 100644
--- a/cli/tests/node_compat/test/parallel/test-assert-strict-exists.js
+++ b/tests/node_compat/test/parallel/test-assert-strict-exists.js
diff --git a/cli/tests/node_compat/test/parallel/test-assert.js b/tests/node_compat/test/parallel/test-assert.js
index 58b95068c..58b95068c 100644
--- a/cli/tests/node_compat/test/parallel/test-assert.js
+++ b/tests/node_compat/test/parallel/test-assert.js
diff --git a/cli/tests/node_compat/test/parallel/test-bad-unicode.js b/tests/node_compat/test/parallel/test-bad-unicode.js
index b4188878d..b4188878d 100644
--- a/cli/tests/node_compat/test/parallel/test-bad-unicode.js
+++ b/tests/node_compat/test/parallel/test-bad-unicode.js
diff --git a/cli/tests/node_compat/test/parallel/test-btoa-atob.js b/tests/node_compat/test/parallel/test-btoa-atob.js
index 3fd8d323c..3fd8d323c 100644
--- a/cli/tests/node_compat/test/parallel/test-btoa-atob.js
+++ b/tests/node_compat/test/parallel/test-btoa-atob.js
diff --git a/cli/tests/node_compat/test/parallel/test-buffer-alloc.js b/tests/node_compat/test/parallel/test-buffer-alloc.js
index bb0af6456..bb0af6456 100644
--- a/cli/tests/node_compat/test/parallel/test-buffer-alloc.js
+++ b/tests/node_compat/test/parallel/test-buffer-alloc.js
diff --git a/cli/tests/node_compat/test/parallel/test-buffer-arraybuffer.js b/tests/node_compat/test/parallel/test-buffer-arraybuffer.js
index 286481758..286481758 100644
--- a/cli/tests/node_compat/test/parallel/test-buffer-arraybuffer.js
+++ b/tests/node_compat/test/parallel/test-buffer-arraybuffer.js
diff --git a/cli/tests/node_compat/test/parallel/test-buffer-ascii.js b/tests/node_compat/test/parallel/test-buffer-ascii.js
index 08e4e6543..08e4e6543 100644
--- a/cli/tests/node_compat/test/parallel/test-buffer-ascii.js
+++ b/tests/node_compat/test/parallel/test-buffer-ascii.js
diff --git a/cli/tests/node_compat/test/parallel/test-buffer-badhex.js b/tests/node_compat/test/parallel/test-buffer-badhex.js
index cafaa0887..cafaa0887 100644
--- a/cli/tests/node_compat/test/parallel/test-buffer-badhex.js
+++ b/tests/node_compat/test/parallel/test-buffer-badhex.js
diff --git a/cli/tests/node_compat/test/parallel/test-buffer-bigint64.js b/tests/node_compat/test/parallel/test-buffer-bigint64.js
index 7aa391f0a..7aa391f0a 100644
--- a/cli/tests/node_compat/test/parallel/test-buffer-bigint64.js
+++ b/tests/node_compat/test/parallel/test-buffer-bigint64.js
diff --git a/cli/tests/node_compat/test/parallel/test-buffer-bytelength.js b/tests/node_compat/test/parallel/test-buffer-bytelength.js
index 4f10596a2..4f10596a2 100644
--- a/cli/tests/node_compat/test/parallel/test-buffer-bytelength.js
+++ b/tests/node_compat/test/parallel/test-buffer-bytelength.js
diff --git a/cli/tests/node_compat/test/parallel/test-buffer-compare-offset.js b/tests/node_compat/test/parallel/test-buffer-compare-offset.js
index bb7ba2998..bb7ba2998 100644
--- a/cli/tests/node_compat/test/parallel/test-buffer-compare-offset.js
+++ b/tests/node_compat/test/parallel/test-buffer-compare-offset.js
diff --git a/cli/tests/node_compat/test/parallel/test-buffer-concat.js b/tests/node_compat/test/parallel/test-buffer-concat.js
index 5d2e2c4a5..5d2e2c4a5 100644
--- a/cli/tests/node_compat/test/parallel/test-buffer-concat.js
+++ b/tests/node_compat/test/parallel/test-buffer-concat.js
diff --git a/cli/tests/node_compat/test/parallel/test-buffer-constants.js b/tests/node_compat/test/parallel/test-buffer-constants.js
index 0c4f6e21b..0c4f6e21b 100644
--- a/cli/tests/node_compat/test/parallel/test-buffer-constants.js
+++ b/tests/node_compat/test/parallel/test-buffer-constants.js
diff --git a/cli/tests/node_compat/test/parallel/test-buffer-copy.js b/tests/node_compat/test/parallel/test-buffer-copy.js
index a10bfebc5..a10bfebc5 100644
--- a/cli/tests/node_compat/test/parallel/test-buffer-copy.js
+++ b/tests/node_compat/test/parallel/test-buffer-copy.js
diff --git a/cli/tests/node_compat/test/parallel/test-buffer-equals.js b/tests/node_compat/test/parallel/test-buffer-equals.js
index 3d22fae84..3d22fae84 100644
--- a/cli/tests/node_compat/test/parallel/test-buffer-equals.js
+++ b/tests/node_compat/test/parallel/test-buffer-equals.js
diff --git a/cli/tests/node_compat/test/parallel/test-buffer-failed-alloc-typed-arrays.js b/tests/node_compat/test/parallel/test-buffer-failed-alloc-typed-arrays.js
index fc822ec86..fc822ec86 100644
--- a/cli/tests/node_compat/test/parallel/test-buffer-failed-alloc-typed-arrays.js
+++ b/tests/node_compat/test/parallel/test-buffer-failed-alloc-typed-arrays.js
diff --git a/cli/tests/node_compat/test/parallel/test-buffer-fakes.js b/tests/node_compat/test/parallel/test-buffer-fakes.js
index 2e25d6219..2e25d6219 100644
--- a/cli/tests/node_compat/test/parallel/test-buffer-fakes.js
+++ b/tests/node_compat/test/parallel/test-buffer-fakes.js
diff --git a/cli/tests/node_compat/test/parallel/test-buffer-from.js b/tests/node_compat/test/parallel/test-buffer-from.js
index 6483e2a63..6483e2a63 100644
--- a/cli/tests/node_compat/test/parallel/test-buffer-from.js
+++ b/tests/node_compat/test/parallel/test-buffer-from.js
diff --git a/cli/tests/node_compat/test/parallel/test-buffer-includes.js b/tests/node_compat/test/parallel/test-buffer-includes.js
index 797ec8246..797ec8246 100644
--- a/cli/tests/node_compat/test/parallel/test-buffer-includes.js
+++ b/tests/node_compat/test/parallel/test-buffer-includes.js
diff --git a/cli/tests/node_compat/test/parallel/test-buffer-indexof.js b/tests/node_compat/test/parallel/test-buffer-indexof.js
index 802e0208b..802e0208b 100644
--- a/cli/tests/node_compat/test/parallel/test-buffer-indexof.js
+++ b/tests/node_compat/test/parallel/test-buffer-indexof.js
diff --git a/cli/tests/node_compat/test/parallel/test-buffer-inheritance.js b/tests/node_compat/test/parallel/test-buffer-inheritance.js
index 6440a84cb..6440a84cb 100644
--- a/cli/tests/node_compat/test/parallel/test-buffer-inheritance.js
+++ b/tests/node_compat/test/parallel/test-buffer-inheritance.js
diff --git a/cli/tests/node_compat/test/parallel/test-buffer-isencoding.js b/tests/node_compat/test/parallel/test-buffer-isencoding.js
index 439e6860a..439e6860a 100644
--- a/cli/tests/node_compat/test/parallel/test-buffer-isencoding.js
+++ b/tests/node_compat/test/parallel/test-buffer-isencoding.js
diff --git a/cli/tests/node_compat/test/parallel/test-buffer-iterator.js b/tests/node_compat/test/parallel/test-buffer-iterator.js
index 8ac97e259..8ac97e259 100644
--- a/cli/tests/node_compat/test/parallel/test-buffer-iterator.js
+++ b/tests/node_compat/test/parallel/test-buffer-iterator.js
diff --git a/cli/tests/node_compat/test/parallel/test-buffer-new.js b/tests/node_compat/test/parallel/test-buffer-new.js
index d15138327..d15138327 100644
--- a/cli/tests/node_compat/test/parallel/test-buffer-new.js
+++ b/tests/node_compat/test/parallel/test-buffer-new.js
diff --git a/cli/tests/node_compat/test/parallel/test-buffer-no-negative-allocation.js b/tests/node_compat/test/parallel/test-buffer-no-negative-allocation.js
index df4a6cb52..df4a6cb52 100644
--- a/cli/tests/node_compat/test/parallel/test-buffer-no-negative-allocation.js
+++ b/tests/node_compat/test/parallel/test-buffer-no-negative-allocation.js
diff --git a/cli/tests/node_compat/test/parallel/test-buffer-nopendingdep-map.js b/tests/node_compat/test/parallel/test-buffer-nopendingdep-map.js
index a6320d0b0..a6320d0b0 100644
--- a/cli/tests/node_compat/test/parallel/test-buffer-nopendingdep-map.js
+++ b/tests/node_compat/test/parallel/test-buffer-nopendingdep-map.js
diff --git a/cli/tests/node_compat/test/parallel/test-buffer-of-no-deprecation.js b/tests/node_compat/test/parallel/test-buffer-of-no-deprecation.js
index b2b48d51d..b2b48d51d 100644
--- a/cli/tests/node_compat/test/parallel/test-buffer-of-no-deprecation.js
+++ b/tests/node_compat/test/parallel/test-buffer-of-no-deprecation.js
diff --git a/cli/tests/node_compat/test/parallel/test-buffer-over-max-length.js b/tests/node_compat/test/parallel/test-buffer-over-max-length.js
index c10c1e9d1..c10c1e9d1 100644
--- a/cli/tests/node_compat/test/parallel/test-buffer-over-max-length.js
+++ b/tests/node_compat/test/parallel/test-buffer-over-max-length.js
diff --git a/cli/tests/node_compat/test/parallel/test-buffer-parent-property.js b/tests/node_compat/test/parallel/test-buffer-parent-property.js
index 6efc42d06..6efc42d06 100644
--- a/cli/tests/node_compat/test/parallel/test-buffer-parent-property.js
+++ b/tests/node_compat/test/parallel/test-buffer-parent-property.js
diff --git a/cli/tests/node_compat/test/parallel/test-buffer-read.js b/tests/node_compat/test/parallel/test-buffer-read.js
index 391b309a8..391b309a8 100644
--- a/cli/tests/node_compat/test/parallel/test-buffer-read.js
+++ b/tests/node_compat/test/parallel/test-buffer-read.js
diff --git a/cli/tests/node_compat/test/parallel/test-buffer-readdouble.js b/tests/node_compat/test/parallel/test-buffer-readdouble.js
index f4ab9ba88..f4ab9ba88 100644
--- a/cli/tests/node_compat/test/parallel/test-buffer-readdouble.js
+++ b/tests/node_compat/test/parallel/test-buffer-readdouble.js
diff --git a/cli/tests/node_compat/test/parallel/test-buffer-readfloat.js b/tests/node_compat/test/parallel/test-buffer-readfloat.js
index 780d3a6ac..780d3a6ac 100644
--- a/cli/tests/node_compat/test/parallel/test-buffer-readfloat.js
+++ b/tests/node_compat/test/parallel/test-buffer-readfloat.js
diff --git a/cli/tests/node_compat/test/parallel/test-buffer-readint.js b/tests/node_compat/test/parallel/test-buffer-readint.js
index 0c865eb92..0c865eb92 100644
--- a/cli/tests/node_compat/test/parallel/test-buffer-readint.js
+++ b/tests/node_compat/test/parallel/test-buffer-readint.js
diff --git a/cli/tests/node_compat/test/parallel/test-buffer-readuint.js b/tests/node_compat/test/parallel/test-buffer-readuint.js
index bbef6f49a..bbef6f49a 100644
--- a/cli/tests/node_compat/test/parallel/test-buffer-readuint.js
+++ b/tests/node_compat/test/parallel/test-buffer-readuint.js
diff --git a/cli/tests/node_compat/test/parallel/test-buffer-safe-unsafe.js b/tests/node_compat/test/parallel/test-buffer-safe-unsafe.js
index 180af8993..180af8993 100644
--- a/cli/tests/node_compat/test/parallel/test-buffer-safe-unsafe.js
+++ b/tests/node_compat/test/parallel/test-buffer-safe-unsafe.js
diff --git a/cli/tests/node_compat/test/parallel/test-buffer-slice.js b/tests/node_compat/test/parallel/test-buffer-slice.js
index 518618d8d..518618d8d 100644
--- a/cli/tests/node_compat/test/parallel/test-buffer-slice.js
+++ b/tests/node_compat/test/parallel/test-buffer-slice.js
diff --git a/cli/tests/node_compat/test/parallel/test-buffer-slow.js b/tests/node_compat/test/parallel/test-buffer-slow.js
index eed2898c5..eed2898c5 100644
--- a/cli/tests/node_compat/test/parallel/test-buffer-slow.js
+++ b/tests/node_compat/test/parallel/test-buffer-slow.js
diff --git a/cli/tests/node_compat/test/parallel/test-buffer-swap.js b/tests/node_compat/test/parallel/test-buffer-swap.js
index 8e1315601..8e1315601 100644
--- a/cli/tests/node_compat/test/parallel/test-buffer-swap.js
+++ b/tests/node_compat/test/parallel/test-buffer-swap.js
diff --git a/cli/tests/node_compat/test/parallel/test-buffer-tojson.js b/tests/node_compat/test/parallel/test-buffer-tojson.js
index d21786c37..d21786c37 100644
--- a/cli/tests/node_compat/test/parallel/test-buffer-tojson.js
+++ b/tests/node_compat/test/parallel/test-buffer-tojson.js
diff --git a/cli/tests/node_compat/test/parallel/test-buffer-tostring-range.js b/tests/node_compat/test/parallel/test-buffer-tostring-range.js
index 9fa199bd5..9fa199bd5 100644
--- a/cli/tests/node_compat/test/parallel/test-buffer-tostring-range.js
+++ b/tests/node_compat/test/parallel/test-buffer-tostring-range.js
diff --git a/cli/tests/node_compat/test/parallel/test-buffer-tostring-rangeerror.js b/tests/node_compat/test/parallel/test-buffer-tostring-rangeerror.js
index 793d2d891..793d2d891 100644
--- a/cli/tests/node_compat/test/parallel/test-buffer-tostring-rangeerror.js
+++ b/tests/node_compat/test/parallel/test-buffer-tostring-rangeerror.js
diff --git a/cli/tests/node_compat/test/parallel/test-buffer-tostring.js b/tests/node_compat/test/parallel/test-buffer-tostring.js
index a6f5cabe0..a6f5cabe0 100644
--- a/cli/tests/node_compat/test/parallel/test-buffer-tostring.js
+++ b/tests/node_compat/test/parallel/test-buffer-tostring.js
diff --git a/cli/tests/node_compat/test/parallel/test-buffer-writedouble.js b/tests/node_compat/test/parallel/test-buffer-writedouble.js
index 3e4d4e676..3e4d4e676 100644
--- a/cli/tests/node_compat/test/parallel/test-buffer-writedouble.js
+++ b/tests/node_compat/test/parallel/test-buffer-writedouble.js
diff --git a/cli/tests/node_compat/test/parallel/test-buffer-writefloat.js b/tests/node_compat/test/parallel/test-buffer-writefloat.js
index 4dd75f83e..4dd75f83e 100644
--- a/cli/tests/node_compat/test/parallel/test-buffer-writefloat.js
+++ b/tests/node_compat/test/parallel/test-buffer-writefloat.js
diff --git a/cli/tests/node_compat/test/parallel/test-buffer-writeint.js b/tests/node_compat/test/parallel/test-buffer-writeint.js
index 117ba47c0..117ba47c0 100644
--- a/cli/tests/node_compat/test/parallel/test-buffer-writeint.js
+++ b/tests/node_compat/test/parallel/test-buffer-writeint.js
diff --git a/cli/tests/node_compat/test/parallel/test-buffer-writeuint.js b/tests/node_compat/test/parallel/test-buffer-writeuint.js
index 1c954bb9f..1c954bb9f 100644
--- a/cli/tests/node_compat/test/parallel/test-buffer-writeuint.js
+++ b/tests/node_compat/test/parallel/test-buffer-writeuint.js
diff --git a/cli/tests/node_compat/test/parallel/test-buffer-zero-fill-cli.js b/tests/node_compat/test/parallel/test-buffer-zero-fill-cli.js
index c3250b870..c3250b870 100644
--- a/cli/tests/node_compat/test/parallel/test-buffer-zero-fill-cli.js
+++ b/tests/node_compat/test/parallel/test-buffer-zero-fill-cli.js
diff --git a/cli/tests/node_compat/test/parallel/test-buffer-zero-fill-reset.js b/tests/node_compat/test/parallel/test-buffer-zero-fill-reset.js
index 1f1baed66..1f1baed66 100644
--- a/cli/tests/node_compat/test/parallel/test-buffer-zero-fill-reset.js
+++ b/tests/node_compat/test/parallel/test-buffer-zero-fill-reset.js
diff --git a/cli/tests/node_compat/test/parallel/test-buffer-zero-fill.js b/tests/node_compat/test/parallel/test-buffer-zero-fill.js
index be8ce1412..be8ce1412 100644
--- a/cli/tests/node_compat/test/parallel/test-buffer-zero-fill.js
+++ b/tests/node_compat/test/parallel/test-buffer-zero-fill.js
diff --git a/cli/tests/node_compat/test/parallel/test-child-process-default-options.js b/tests/node_compat/test/parallel/test-child-process-default-options.js
index 265cfe22f..265cfe22f 100644
--- a/cli/tests/node_compat/test/parallel/test-child-process-default-options.js
+++ b/tests/node_compat/test/parallel/test-child-process-default-options.js
diff --git a/cli/tests/node_compat/test/parallel/test-child-process-double-pipe.js b/tests/node_compat/test/parallel/test-child-process-double-pipe.js
index bd31d1038..bd31d1038 100644
--- a/cli/tests/node_compat/test/parallel/test-child-process-double-pipe.js
+++ b/tests/node_compat/test/parallel/test-child-process-double-pipe.js
diff --git a/cli/tests/node_compat/test/parallel/test-child-process-exec-abortcontroller-promisified.js b/tests/node_compat/test/parallel/test-child-process-exec-abortcontroller-promisified.js
index 4ba699ba4..4ba699ba4 100644
--- a/cli/tests/node_compat/test/parallel/test-child-process-exec-abortcontroller-promisified.js
+++ b/tests/node_compat/test/parallel/test-child-process-exec-abortcontroller-promisified.js
diff --git a/cli/tests/node_compat/test/parallel/test-child-process-exec-cwd.js b/tests/node_compat/test/parallel/test-child-process-exec-cwd.js
index 4bd394cca..4bd394cca 100644
--- a/cli/tests/node_compat/test/parallel/test-child-process-exec-cwd.js
+++ b/tests/node_compat/test/parallel/test-child-process-exec-cwd.js
diff --git a/cli/tests/node_compat/test/parallel/test-child-process-exec-encoding.js b/tests/node_compat/test/parallel/test-child-process-exec-encoding.js
index fe03e98d0..fe03e98d0 100644
--- a/cli/tests/node_compat/test/parallel/test-child-process-exec-encoding.js
+++ b/tests/node_compat/test/parallel/test-child-process-exec-encoding.js
diff --git a/cli/tests/node_compat/test/parallel/test-child-process-exec-env.js b/tests/node_compat/test/parallel/test-child-process-exec-env.js
index 2797b8761..2797b8761 100644
--- a/cli/tests/node_compat/test/parallel/test-child-process-exec-env.js
+++ b/tests/node_compat/test/parallel/test-child-process-exec-env.js
diff --git a/cli/tests/node_compat/test/parallel/test-child-process-exec-error.js b/tests/node_compat/test/parallel/test-child-process-exec-error.js
index 3f809ed18..3f809ed18 100644
--- a/cli/tests/node_compat/test/parallel/test-child-process-exec-error.js
+++ b/tests/node_compat/test/parallel/test-child-process-exec-error.js
diff --git a/cli/tests/node_compat/test/parallel/test-child-process-exec-kill-throws.js b/tests/node_compat/test/parallel/test-child-process-exec-kill-throws.js
index 6a28c2a18..6a28c2a18 100644
--- a/cli/tests/node_compat/test/parallel/test-child-process-exec-kill-throws.js
+++ b/tests/node_compat/test/parallel/test-child-process-exec-kill-throws.js
diff --git a/cli/tests/node_compat/test/parallel/test-child-process-exec-maxbuf.js b/tests/node_compat/test/parallel/test-child-process-exec-maxbuf.js
index 2e99855c0..2e99855c0 100644
--- a/cli/tests/node_compat/test/parallel/test-child-process-exec-maxbuf.js
+++ b/tests/node_compat/test/parallel/test-child-process-exec-maxbuf.js
diff --git a/cli/tests/node_compat/test/parallel/test-child-process-exec-std-encoding.js b/tests/node_compat/test/parallel/test-child-process-exec-std-encoding.js
index 85f3ec2bf..85f3ec2bf 100644
--- a/cli/tests/node_compat/test/parallel/test-child-process-exec-std-encoding.js
+++ b/tests/node_compat/test/parallel/test-child-process-exec-std-encoding.js
diff --git a/cli/tests/node_compat/test/parallel/test-child-process-exec-stdout-stderr-data-string.js b/tests/node_compat/test/parallel/test-child-process-exec-stdout-stderr-data-string.js
index 0e5453926..0e5453926 100644
--- a/cli/tests/node_compat/test/parallel/test-child-process-exec-stdout-stderr-data-string.js
+++ b/tests/node_compat/test/parallel/test-child-process-exec-stdout-stderr-data-string.js
diff --git a/cli/tests/node_compat/test/parallel/test-child-process-exec-timeout-not-expired.js b/tests/node_compat/test/parallel/test-child-process-exec-timeout-not-expired.js
index 31fa1f725..31fa1f725 100644
--- a/cli/tests/node_compat/test/parallel/test-child-process-exec-timeout-not-expired.js
+++ b/tests/node_compat/test/parallel/test-child-process-exec-timeout-not-expired.js
diff --git a/cli/tests/node_compat/test/parallel/test-child-process-execfile-maxbuf.js b/tests/node_compat/test/parallel/test-child-process-execfile-maxbuf.js
index 729929c78..729929c78 100644
--- a/cli/tests/node_compat/test/parallel/test-child-process-execfile-maxbuf.js
+++ b/tests/node_compat/test/parallel/test-child-process-execfile-maxbuf.js
diff --git a/cli/tests/node_compat/test/parallel/test-child-process-execfile.js b/tests/node_compat/test/parallel/test-child-process-execfile.js
index 9f9268407..9f9268407 100644
--- a/cli/tests/node_compat/test/parallel/test-child-process-execfile.js
+++ b/tests/node_compat/test/parallel/test-child-process-execfile.js
diff --git a/cli/tests/node_compat/test/parallel/test-child-process-execfilesync-maxbuf.js b/tests/node_compat/test/parallel/test-child-process-execfilesync-maxbuf.js
index 7ad857a18..7ad857a18 100644
--- a/cli/tests/node_compat/test/parallel/test-child-process-execfilesync-maxbuf.js
+++ b/tests/node_compat/test/parallel/test-child-process-execfilesync-maxbuf.js
diff --git a/cli/tests/node_compat/test/parallel/test-child-process-execsync-maxbuf.js b/tests/node_compat/test/parallel/test-child-process-execsync-maxbuf.js
index 703896ef1..703896ef1 100644
--- a/cli/tests/node_compat/test/parallel/test-child-process-execsync-maxbuf.js
+++ b/tests/node_compat/test/parallel/test-child-process-execsync-maxbuf.js
diff --git a/cli/tests/node_compat/test/parallel/test-child-process-exit-code.js b/tests/node_compat/test/parallel/test-child-process-exit-code.js
index caa57986b..caa57986b 100644
--- a/cli/tests/node_compat/test/parallel/test-child-process-exit-code.js
+++ b/tests/node_compat/test/parallel/test-child-process-exit-code.js
diff --git a/cli/tests/node_compat/test/parallel/test-child-process-flush-stdio.js b/tests/node_compat/test/parallel/test-child-process-flush-stdio.js
index c39bcbdbe..c39bcbdbe 100644
--- a/cli/tests/node_compat/test/parallel/test-child-process-flush-stdio.js
+++ b/tests/node_compat/test/parallel/test-child-process-flush-stdio.js
diff --git a/cli/tests/node_compat/test/parallel/test-child-process-fork-ref.js b/tests/node_compat/test/parallel/test-child-process-fork-ref.js
index 37c186af8..37c186af8 100644
--- a/cli/tests/node_compat/test/parallel/test-child-process-fork-ref.js
+++ b/tests/node_compat/test/parallel/test-child-process-fork-ref.js
diff --git a/cli/tests/node_compat/test/parallel/test-child-process-fork-ref2.js b/tests/node_compat/test/parallel/test-child-process-fork-ref2.js
index da59d9378..da59d9378 100644
--- a/cli/tests/node_compat/test/parallel/test-child-process-fork-ref2.js
+++ b/tests/node_compat/test/parallel/test-child-process-fork-ref2.js
diff --git a/cli/tests/node_compat/test/parallel/test-child-process-ipc-next-tick.js b/tests/node_compat/test/parallel/test-child-process-ipc-next-tick.js
index d255a0a64..d255a0a64 100644
--- a/cli/tests/node_compat/test/parallel/test-child-process-ipc-next-tick.js
+++ b/tests/node_compat/test/parallel/test-child-process-ipc-next-tick.js
diff --git a/cli/tests/node_compat/test/parallel/test-child-process-ipc.js b/tests/node_compat/test/parallel/test-child-process-ipc.js
index c1d7bc2b6..c1d7bc2b6 100644
--- a/cli/tests/node_compat/test/parallel/test-child-process-ipc.js
+++ b/tests/node_compat/test/parallel/test-child-process-ipc.js
diff --git a/cli/tests/node_compat/test/parallel/test-child-process-kill.js b/tests/node_compat/test/parallel/test-child-process-kill.js
index 4d4ac3033..4d4ac3033 100644
--- a/cli/tests/node_compat/test/parallel/test-child-process-kill.js
+++ b/tests/node_compat/test/parallel/test-child-process-kill.js
diff --git a/cli/tests/node_compat/test/parallel/test-child-process-set-blocking.js b/tests/node_compat/test/parallel/test-child-process-set-blocking.js
index b43d9ba9c..b43d9ba9c 100644
--- a/cli/tests/node_compat/test/parallel/test-child-process-set-blocking.js
+++ b/tests/node_compat/test/parallel/test-child-process-set-blocking.js
diff --git a/cli/tests/node_compat/test/parallel/test-child-process-spawn-args.js b/tests/node_compat/test/parallel/test-child-process-spawn-args.js
index e2597c921..e2597c921 100644
--- a/cli/tests/node_compat/test/parallel/test-child-process-spawn-args.js
+++ b/tests/node_compat/test/parallel/test-child-process-spawn-args.js
diff --git a/cli/tests/node_compat/test/parallel/test-child-process-spawn-event.js b/tests/node_compat/test/parallel/test-child-process-spawn-event.js
index 315644fd1..315644fd1 100644
--- a/cli/tests/node_compat/test/parallel/test-child-process-spawn-event.js
+++ b/tests/node_compat/test/parallel/test-child-process-spawn-event.js
diff --git a/cli/tests/node_compat/test/parallel/test-child-process-spawnsync-args.js b/tests/node_compat/test/parallel/test-child-process-spawnsync-args.js
index 05e04a92e..05e04a92e 100644
--- a/cli/tests/node_compat/test/parallel/test-child-process-spawnsync-args.js
+++ b/tests/node_compat/test/parallel/test-child-process-spawnsync-args.js
diff --git a/cli/tests/node_compat/test/parallel/test-child-process-spawnsync-env.js b/tests/node_compat/test/parallel/test-child-process-spawnsync-env.js
index d08ed48d9..d08ed48d9 100644
--- a/cli/tests/node_compat/test/parallel/test-child-process-spawnsync-env.js
+++ b/tests/node_compat/test/parallel/test-child-process-spawnsync-env.js
diff --git a/cli/tests/node_compat/test/parallel/test-child-process-spawnsync-maxbuf.js b/tests/node_compat/test/parallel/test-child-process-spawnsync-maxbuf.js
index 62b71c729..62b71c729 100644
--- a/cli/tests/node_compat/test/parallel/test-child-process-spawnsync-maxbuf.js
+++ b/tests/node_compat/test/parallel/test-child-process-spawnsync-maxbuf.js
diff --git a/cli/tests/node_compat/test/parallel/test-child-process-spawnsync-validation-errors.js b/tests/node_compat/test/parallel/test-child-process-spawnsync-validation-errors.js
index 89ff02260..89ff02260 100644
--- a/cli/tests/node_compat/test/parallel/test-child-process-spawnsync-validation-errors.js
+++ b/tests/node_compat/test/parallel/test-child-process-spawnsync-validation-errors.js
diff --git a/cli/tests/node_compat/test/parallel/test-child-process-spawnsync.js b/tests/node_compat/test/parallel/test-child-process-spawnsync.js
index bb60f3bef..bb60f3bef 100644
--- a/cli/tests/node_compat/test/parallel/test-child-process-spawnsync.js
+++ b/tests/node_compat/test/parallel/test-child-process-spawnsync.js
diff --git a/cli/tests/node_compat/test/parallel/test-child-process-stdio-inherit.js b/tests/node_compat/test/parallel/test-child-process-stdio-inherit.js
index e213dd6b8..e213dd6b8 100644
--- a/cli/tests/node_compat/test/parallel/test-child-process-stdio-inherit.js
+++ b/tests/node_compat/test/parallel/test-child-process-stdio-inherit.js
diff --git a/cli/tests/node_compat/test/parallel/test-child-process-stdout-flush-exit.js b/tests/node_compat/test/parallel/test-child-process-stdout-flush-exit.js
index 585cc6084..585cc6084 100644
--- a/cli/tests/node_compat/test/parallel/test-child-process-stdout-flush-exit.js
+++ b/tests/node_compat/test/parallel/test-child-process-stdout-flush-exit.js
diff --git a/cli/tests/node_compat/test/parallel/test-child-process-stdout-flush.js b/tests/node_compat/test/parallel/test-child-process-stdout-flush.js
index 4054d2189..4054d2189 100644
--- a/cli/tests/node_compat/test/parallel/test-child-process-stdout-flush.js
+++ b/tests/node_compat/test/parallel/test-child-process-stdout-flush.js
diff --git a/cli/tests/node_compat/test/parallel/test-console-async-write-error.js b/tests/node_compat/test/parallel/test-console-async-write-error.js
index e7591cb9b..e7591cb9b 100644
--- a/cli/tests/node_compat/test/parallel/test-console-async-write-error.js
+++ b/tests/node_compat/test/parallel/test-console-async-write-error.js
diff --git a/cli/tests/node_compat/test/parallel/test-console-group.js b/tests/node_compat/test/parallel/test-console-group.js
index f07107cec..f07107cec 100644
--- a/cli/tests/node_compat/test/parallel/test-console-group.js
+++ b/tests/node_compat/test/parallel/test-console-group.js
diff --git a/cli/tests/node_compat/test/parallel/test-console-instance.js b/tests/node_compat/test/parallel/test-console-instance.js
index ee561564f..ee561564f 100644
--- a/cli/tests/node_compat/test/parallel/test-console-instance.js
+++ b/tests/node_compat/test/parallel/test-console-instance.js
diff --git a/cli/tests/node_compat/test/parallel/test-console-log-stdio-broken-dest.js b/tests/node_compat/test/parallel/test-console-log-stdio-broken-dest.js
index 832e1a510..832e1a510 100644
--- a/cli/tests/node_compat/test/parallel/test-console-log-stdio-broken-dest.js
+++ b/tests/node_compat/test/parallel/test-console-log-stdio-broken-dest.js
diff --git a/cli/tests/node_compat/test/parallel/test-console-log-throw-primitive.js b/tests/node_compat/test/parallel/test-console-log-throw-primitive.js
index 760c96399..760c96399 100644
--- a/cli/tests/node_compat/test/parallel/test-console-log-throw-primitive.js
+++ b/tests/node_compat/test/parallel/test-console-log-throw-primitive.js
diff --git a/cli/tests/node_compat/test/parallel/test-console-no-swallow-stack-overflow.js b/tests/node_compat/test/parallel/test-console-no-swallow-stack-overflow.js
index 98621b3ce..98621b3ce 100644
--- a/cli/tests/node_compat/test/parallel/test-console-no-swallow-stack-overflow.js
+++ b/tests/node_compat/test/parallel/test-console-no-swallow-stack-overflow.js
diff --git a/cli/tests/node_compat/test/parallel/test-console-sync-write-error.js b/tests/node_compat/test/parallel/test-console-sync-write-error.js
index 1018a3b54..1018a3b54 100644
--- a/cli/tests/node_compat/test/parallel/test-console-sync-write-error.js
+++ b/tests/node_compat/test/parallel/test-console-sync-write-error.js
diff --git a/cli/tests/node_compat/test/parallel/test-console-table.js b/tests/node_compat/test/parallel/test-console-table.js
index a7fddac1e..a7fddac1e 100644
--- a/cli/tests/node_compat/test/parallel/test-console-table.js
+++ b/tests/node_compat/test/parallel/test-console-table.js
diff --git a/cli/tests/node_compat/test/parallel/test-console-tty-colors.js b/tests/node_compat/test/parallel/test-console-tty-colors.js
index 6b6886d1f..6b6886d1f 100644
--- a/cli/tests/node_compat/test/parallel/test-console-tty-colors.js
+++ b/tests/node_compat/test/parallel/test-console-tty-colors.js
diff --git a/cli/tests/node_compat/test/parallel/test-crypto-dh-shared.js b/tests/node_compat/test/parallel/test-crypto-dh-shared.js
index 7266b00b9..7266b00b9 100644
--- a/cli/tests/node_compat/test/parallel/test-crypto-dh-shared.js
+++ b/tests/node_compat/test/parallel/test-crypto-dh-shared.js
diff --git a/cli/tests/node_compat/test/parallel/test-crypto-dh.js b/tests/node_compat/test/parallel/test-crypto-dh.js
index bcf0c6764..bcf0c6764 100644
--- a/cli/tests/node_compat/test/parallel/test-crypto-dh.js
+++ b/tests/node_compat/test/parallel/test-crypto-dh.js
diff --git a/cli/tests/node_compat/test/parallel/test-crypto-hkdf.js b/tests/node_compat/test/parallel/test-crypto-hkdf.js
index b5b35e3ce..b5b35e3ce 100644
--- a/cli/tests/node_compat/test/parallel/test-crypto-hkdf.js
+++ b/tests/node_compat/test/parallel/test-crypto-hkdf.js
diff --git a/cli/tests/node_compat/test/parallel/test-crypto-hmac.js b/tests/node_compat/test/parallel/test-crypto-hmac.js
index 174457a63..174457a63 100644
--- a/cli/tests/node_compat/test/parallel/test-crypto-hmac.js
+++ b/tests/node_compat/test/parallel/test-crypto-hmac.js
diff --git a/cli/tests/node_compat/test/parallel/test-crypto-prime.js b/tests/node_compat/test/parallel/test-crypto-prime.js
index fc2218c2a..fc2218c2a 100644
--- a/cli/tests/node_compat/test/parallel/test-crypto-prime.js
+++ b/tests/node_compat/test/parallel/test-crypto-prime.js
diff --git a/cli/tests/node_compat/test/parallel/test-crypto-secret-keygen.js b/tests/node_compat/test/parallel/test-crypto-secret-keygen.js
index b108269d3..b108269d3 100644
--- a/cli/tests/node_compat/test/parallel/test-crypto-secret-keygen.js
+++ b/tests/node_compat/test/parallel/test-crypto-secret-keygen.js
diff --git a/cli/tests/node_compat/test/parallel/test-crypto-stream.js b/tests/node_compat/test/parallel/test-crypto-stream.js
index 07d3c5c6d..07d3c5c6d 100644
--- a/cli/tests/node_compat/test/parallel/test-crypto-stream.js
+++ b/tests/node_compat/test/parallel/test-crypto-stream.js
diff --git a/cli/tests/node_compat/test/parallel/test-crypto-update-encoding.js b/tests/node_compat/test/parallel/test-crypto-update-encoding.js
index deb3c17c3..deb3c17c3 100644
--- a/cli/tests/node_compat/test/parallel/test-crypto-update-encoding.js
+++ b/tests/node_compat/test/parallel/test-crypto-update-encoding.js
diff --git a/cli/tests/node_compat/test/parallel/test-crypto-x509.js b/tests/node_compat/test/parallel/test-crypto-x509.js
index eeee2f7d7..eeee2f7d7 100644
--- a/cli/tests/node_compat/test/parallel/test-crypto-x509.js
+++ b/tests/node_compat/test/parallel/test-crypto-x509.js
diff --git a/cli/tests/node_compat/test/parallel/test-dgram-close-during-bind.js b/tests/node_compat/test/parallel/test-dgram-close-during-bind.js
index fd1fe523e..fd1fe523e 100644
--- a/cli/tests/node_compat/test/parallel/test-dgram-close-during-bind.js
+++ b/tests/node_compat/test/parallel/test-dgram-close-during-bind.js
diff --git a/cli/tests/node_compat/test/parallel/test-dgram-close-signal.js b/tests/node_compat/test/parallel/test-dgram-close-signal.js
index ef6ac3a32..ef6ac3a32 100644
--- a/cli/tests/node_compat/test/parallel/test-dgram-close-signal.js
+++ b/tests/node_compat/test/parallel/test-dgram-close-signal.js
diff --git a/cli/tests/node_compat/test/parallel/test-dgram-custom-lookup.js b/tests/node_compat/test/parallel/test-dgram-custom-lookup.js
index ca3bd3df3..ca3bd3df3 100644
--- a/cli/tests/node_compat/test/parallel/test-dgram-custom-lookup.js
+++ b/tests/node_compat/test/parallel/test-dgram-custom-lookup.js
diff --git a/cli/tests/node_compat/test/parallel/test-dgram-ipv6only.js b/tests/node_compat/test/parallel/test-dgram-ipv6only.js
index 31f4e1fd9..31f4e1fd9 100644
--- a/cli/tests/node_compat/test/parallel/test-dgram-ipv6only.js
+++ b/tests/node_compat/test/parallel/test-dgram-ipv6only.js
diff --git a/cli/tests/node_compat/test/parallel/test-dgram-send-cb-quelches-error.js b/tests/node_compat/test/parallel/test-dgram-send-cb-quelches-error.js
index d2fd5af50..d2fd5af50 100644
--- a/cli/tests/node_compat/test/parallel/test-dgram-send-cb-quelches-error.js
+++ b/tests/node_compat/test/parallel/test-dgram-send-cb-quelches-error.js
diff --git a/cli/tests/node_compat/test/parallel/test-dgram-socket-buffer-size.js b/tests/node_compat/test/parallel/test-dgram-socket-buffer-size.js
index b2fc33262..b2fc33262 100644
--- a/cli/tests/node_compat/test/parallel/test-dgram-socket-buffer-size.js
+++ b/tests/node_compat/test/parallel/test-dgram-socket-buffer-size.js
diff --git a/cli/tests/node_compat/test/parallel/test-dgram-udp6-link-local-address.js b/tests/node_compat/test/parallel/test-dgram-udp6-link-local-address.js
index c828413a2..c828413a2 100644
--- a/cli/tests/node_compat/test/parallel/test-dgram-udp6-link-local-address.js
+++ b/tests/node_compat/test/parallel/test-dgram-udp6-link-local-address.js
diff --git a/cli/tests/node_compat/test/parallel/test-diagnostics-channel-has-subscribers.js b/tests/node_compat/test/parallel/test-diagnostics-channel-has-subscribers.js
index 66a548c37..66a548c37 100644
--- a/cli/tests/node_compat/test/parallel/test-diagnostics-channel-has-subscribers.js
+++ b/tests/node_compat/test/parallel/test-diagnostics-channel-has-subscribers.js
diff --git a/cli/tests/node_compat/test/parallel/test-diagnostics-channel-object-channel-pub-sub.js b/tests/node_compat/test/parallel/test-diagnostics-channel-object-channel-pub-sub.js
index 00b786582..00b786582 100644
--- a/cli/tests/node_compat/test/parallel/test-diagnostics-channel-object-channel-pub-sub.js
+++ b/tests/node_compat/test/parallel/test-diagnostics-channel-object-channel-pub-sub.js
diff --git a/cli/tests/node_compat/test/parallel/test-diagnostics-channel-pub-sub.js b/tests/node_compat/test/parallel/test-diagnostics-channel-pub-sub.js
index 378cf051e..378cf051e 100644
--- a/cli/tests/node_compat/test/parallel/test-diagnostics-channel-pub-sub.js
+++ b/tests/node_compat/test/parallel/test-diagnostics-channel-pub-sub.js
diff --git a/cli/tests/node_compat/test/parallel/test-diagnostics-channel-symbol-named.js b/tests/node_compat/test/parallel/test-diagnostics-channel-symbol-named.js
index 3067c78e9..3067c78e9 100644
--- a/cli/tests/node_compat/test/parallel/test-diagnostics-channel-symbol-named.js
+++ b/tests/node_compat/test/parallel/test-diagnostics-channel-symbol-named.js
diff --git a/cli/tests/node_compat/test/parallel/test-diagnostics-channel-udp.js b/tests/node_compat/test/parallel/test-diagnostics-channel-udp.js
index ddf757a12..ddf757a12 100644
--- a/cli/tests/node_compat/test/parallel/test-diagnostics-channel-udp.js
+++ b/tests/node_compat/test/parallel/test-diagnostics-channel-udp.js
diff --git a/cli/tests/node_compat/test/parallel/test-dns-lookup.js b/tests/node_compat/test/parallel/test-dns-lookup.js
index d137586d2..d137586d2 100644
--- a/cli/tests/node_compat/test/parallel/test-dns-lookup.js
+++ b/tests/node_compat/test/parallel/test-dns-lookup.js
diff --git a/cli/tests/node_compat/test/parallel/test-dns-memory-error.js b/tests/node_compat/test/parallel/test-dns-memory-error.js
index 6ef6968be..6ef6968be 100644
--- a/cli/tests/node_compat/test/parallel/test-dns-memory-error.js
+++ b/tests/node_compat/test/parallel/test-dns-memory-error.js
diff --git a/cli/tests/node_compat/test/parallel/test-dns-promises-exists.js b/tests/node_compat/test/parallel/test-dns-promises-exists.js
index 10f9f81df..10f9f81df 100644
--- a/cli/tests/node_compat/test/parallel/test-dns-promises-exists.js
+++ b/tests/node_compat/test/parallel/test-dns-promises-exists.js
diff --git a/cli/tests/node_compat/test/parallel/test-dns-resolveany.js b/tests/node_compat/test/parallel/test-dns-resolveany.js
index 56d533ad9..56d533ad9 100644
--- a/cli/tests/node_compat/test/parallel/test-dns-resolveany.js
+++ b/tests/node_compat/test/parallel/test-dns-resolveany.js
diff --git a/cli/tests/node_compat/test/parallel/test-dns-resolvens-typeerror.js b/tests/node_compat/test/parallel/test-dns-resolvens-typeerror.js
index f4b0770fd..f4b0770fd 100644
--- a/cli/tests/node_compat/test/parallel/test-dns-resolvens-typeerror.js
+++ b/tests/node_compat/test/parallel/test-dns-resolvens-typeerror.js
diff --git a/cli/tests/node_compat/test/parallel/test-dns-setservers-type-check.js b/tests/node_compat/test/parallel/test-dns-setservers-type-check.js
index e4e65b35a..e4e65b35a 100644
--- a/cli/tests/node_compat/test/parallel/test-dns-setservers-type-check.js
+++ b/tests/node_compat/test/parallel/test-dns-setservers-type-check.js
diff --git a/cli/tests/node_compat/test/parallel/test-dns.js b/tests/node_compat/test/parallel/test-dns.js
index e56f7ca40..e56f7ca40 100644
--- a/cli/tests/node_compat/test/parallel/test-dns.js
+++ b/tests/node_compat/test/parallel/test-dns.js
diff --git a/cli/tests/node_compat/test/parallel/test-eval-strict-referenceerror.js b/tests/node_compat/test/parallel/test-eval-strict-referenceerror.js
index b521b17ba..b521b17ba 100644
--- a/cli/tests/node_compat/test/parallel/test-eval-strict-referenceerror.js
+++ b/tests/node_compat/test/parallel/test-eval-strict-referenceerror.js
diff --git a/cli/tests/node_compat/test/parallel/test-eval.js b/tests/node_compat/test/parallel/test-eval.js
index 78254a377..78254a377 100644
--- a/cli/tests/node_compat/test/parallel/test-eval.js
+++ b/tests/node_compat/test/parallel/test-eval.js
diff --git a/cli/tests/node_compat/test/parallel/test-event-emitter-add-listeners.js b/tests/node_compat/test/parallel/test-event-emitter-add-listeners.js
index 8ad798021..8ad798021 100644
--- a/cli/tests/node_compat/test/parallel/test-event-emitter-add-listeners.js
+++ b/tests/node_compat/test/parallel/test-event-emitter-add-listeners.js
diff --git a/cli/tests/node_compat/test/parallel/test-event-emitter-emit-context.js b/tests/node_compat/test/parallel/test-event-emitter-emit-context.js
index d3673827f..d3673827f 100644
--- a/cli/tests/node_compat/test/parallel/test-event-emitter-emit-context.js
+++ b/tests/node_compat/test/parallel/test-event-emitter-emit-context.js
diff --git a/cli/tests/node_compat/test/parallel/test-event-emitter-error-monitor.js b/tests/node_compat/test/parallel/test-event-emitter-error-monitor.js
index 714a47e59..714a47e59 100644
--- a/cli/tests/node_compat/test/parallel/test-event-emitter-error-monitor.js
+++ b/tests/node_compat/test/parallel/test-event-emitter-error-monitor.js
diff --git a/cli/tests/node_compat/test/parallel/test-event-emitter-errors.js b/tests/node_compat/test/parallel/test-event-emitter-errors.js
index 39a896b05..39a896b05 100644
--- a/cli/tests/node_compat/test/parallel/test-event-emitter-errors.js
+++ b/tests/node_compat/test/parallel/test-event-emitter-errors.js
diff --git a/cli/tests/node_compat/test/parallel/test-event-emitter-get-max-listeners.js b/tests/node_compat/test/parallel/test-event-emitter-get-max-listeners.js
index 9eeb5ecf9..9eeb5ecf9 100644
--- a/cli/tests/node_compat/test/parallel/test-event-emitter-get-max-listeners.js
+++ b/tests/node_compat/test/parallel/test-event-emitter-get-max-listeners.js
diff --git a/cli/tests/node_compat/test/parallel/test-event-emitter-invalid-listener.js b/tests/node_compat/test/parallel/test-event-emitter-invalid-listener.js
index 604110a5e..604110a5e 100644
--- a/cli/tests/node_compat/test/parallel/test-event-emitter-invalid-listener.js
+++ b/tests/node_compat/test/parallel/test-event-emitter-invalid-listener.js
diff --git a/cli/tests/node_compat/test/parallel/test-event-emitter-listener-count.js b/tests/node_compat/test/parallel/test-event-emitter-listener-count.js
index e86a9512f..e86a9512f 100644
--- a/cli/tests/node_compat/test/parallel/test-event-emitter-listener-count.js
+++ b/tests/node_compat/test/parallel/test-event-emitter-listener-count.js
diff --git a/cli/tests/node_compat/test/parallel/test-event-emitter-listeners-side-effects.js b/tests/node_compat/test/parallel/test-event-emitter-listeners-side-effects.js
index 3daa73b21..3daa73b21 100644
--- a/cli/tests/node_compat/test/parallel/test-event-emitter-listeners-side-effects.js
+++ b/tests/node_compat/test/parallel/test-event-emitter-listeners-side-effects.js
diff --git a/cli/tests/node_compat/test/parallel/test-event-emitter-listeners.js b/tests/node_compat/test/parallel/test-event-emitter-listeners.js
index ddb52da1a..ddb52da1a 100644
--- a/cli/tests/node_compat/test/parallel/test-event-emitter-listeners.js
+++ b/tests/node_compat/test/parallel/test-event-emitter-listeners.js
diff --git a/cli/tests/node_compat/test/parallel/test-event-emitter-max-listeners.js b/tests/node_compat/test/parallel/test-event-emitter-max-listeners.js
index 1245c6b92..1245c6b92 100644
--- a/cli/tests/node_compat/test/parallel/test-event-emitter-max-listeners.js
+++ b/tests/node_compat/test/parallel/test-event-emitter-max-listeners.js
diff --git a/cli/tests/node_compat/test/parallel/test-event-emitter-method-names.js b/tests/node_compat/test/parallel/test-event-emitter-method-names.js
index 7b7822fe1..7b7822fe1 100644
--- a/cli/tests/node_compat/test/parallel/test-event-emitter-method-names.js
+++ b/tests/node_compat/test/parallel/test-event-emitter-method-names.js
diff --git a/cli/tests/node_compat/test/parallel/test-event-emitter-modify-in-emit.js b/tests/node_compat/test/parallel/test-event-emitter-modify-in-emit.js
index 4953241ba..4953241ba 100644
--- a/cli/tests/node_compat/test/parallel/test-event-emitter-modify-in-emit.js
+++ b/tests/node_compat/test/parallel/test-event-emitter-modify-in-emit.js
diff --git a/cli/tests/node_compat/test/parallel/test-event-emitter-no-error-provided-to-error-event.js b/tests/node_compat/test/parallel/test-event-emitter-no-error-provided-to-error-event.js
index 8ab7aec44..8ab7aec44 100644
--- a/cli/tests/node_compat/test/parallel/test-event-emitter-no-error-provided-to-error-event.js
+++ b/tests/node_compat/test/parallel/test-event-emitter-no-error-provided-to-error-event.js
diff --git a/cli/tests/node_compat/test/parallel/test-event-emitter-num-args.js b/tests/node_compat/test/parallel/test-event-emitter-num-args.js
index 05ed54cb6..05ed54cb6 100644
--- a/cli/tests/node_compat/test/parallel/test-event-emitter-num-args.js
+++ b/tests/node_compat/test/parallel/test-event-emitter-num-args.js
diff --git a/cli/tests/node_compat/test/parallel/test-event-emitter-once.js b/tests/node_compat/test/parallel/test-event-emitter-once.js
index 1d02a639e..1d02a639e 100644
--- a/cli/tests/node_compat/test/parallel/test-event-emitter-once.js
+++ b/tests/node_compat/test/parallel/test-event-emitter-once.js
diff --git a/cli/tests/node_compat/test/parallel/test-event-emitter-prepend.js b/tests/node_compat/test/parallel/test-event-emitter-prepend.js
index b06722742..b06722742 100644
--- a/cli/tests/node_compat/test/parallel/test-event-emitter-prepend.js
+++ b/tests/node_compat/test/parallel/test-event-emitter-prepend.js
diff --git a/cli/tests/node_compat/test/parallel/test-event-emitter-remove-all-listeners.js b/tests/node_compat/test/parallel/test-event-emitter-remove-all-listeners.js
index 576c02aa0..576c02aa0 100644
--- a/cli/tests/node_compat/test/parallel/test-event-emitter-remove-all-listeners.js
+++ b/tests/node_compat/test/parallel/test-event-emitter-remove-all-listeners.js
diff --git a/cli/tests/node_compat/test/parallel/test-event-emitter-remove-listeners.js b/tests/node_compat/test/parallel/test-event-emitter-remove-listeners.js
index 8ee09c30a..8ee09c30a 100644
--- a/cli/tests/node_compat/test/parallel/test-event-emitter-remove-listeners.js
+++ b/tests/node_compat/test/parallel/test-event-emitter-remove-listeners.js
diff --git a/cli/tests/node_compat/test/parallel/test-event-emitter-set-max-listeners-side-effects.js b/tests/node_compat/test/parallel/test-event-emitter-set-max-listeners-side-effects.js
index 431876fbd..431876fbd 100644
--- a/cli/tests/node_compat/test/parallel/test-event-emitter-set-max-listeners-side-effects.js
+++ b/tests/node_compat/test/parallel/test-event-emitter-set-max-listeners-side-effects.js
diff --git a/cli/tests/node_compat/test/parallel/test-event-emitter-special-event-names.js b/tests/node_compat/test/parallel/test-event-emitter-special-event-names.js
index 067b557f1..067b557f1 100644
--- a/cli/tests/node_compat/test/parallel/test-event-emitter-special-event-names.js
+++ b/tests/node_compat/test/parallel/test-event-emitter-special-event-names.js
diff --git a/cli/tests/node_compat/test/parallel/test-event-emitter-subclass.js b/tests/node_compat/test/parallel/test-event-emitter-subclass.js
index 02442c489..02442c489 100644
--- a/cli/tests/node_compat/test/parallel/test-event-emitter-subclass.js
+++ b/tests/node_compat/test/parallel/test-event-emitter-subclass.js
diff --git a/cli/tests/node_compat/test/parallel/test-event-emitter-symbols.js b/tests/node_compat/test/parallel/test-event-emitter-symbols.js
index 8f95d52bd..8f95d52bd 100644
--- a/cli/tests/node_compat/test/parallel/test-event-emitter-symbols.js
+++ b/tests/node_compat/test/parallel/test-event-emitter-symbols.js
diff --git a/cli/tests/node_compat/test/parallel/test-events-list.js b/tests/node_compat/test/parallel/test-events-list.js
index c66da1602..c66da1602 100644
--- a/cli/tests/node_compat/test/parallel/test-events-list.js
+++ b/tests/node_compat/test/parallel/test-events-list.js
diff --git a/cli/tests/node_compat/test/parallel/test-events-on-async-iterator.js b/tests/node_compat/test/parallel/test-events-on-async-iterator.js
index 87efeb842..87efeb842 100644
--- a/cli/tests/node_compat/test/parallel/test-events-on-async-iterator.js
+++ b/tests/node_compat/test/parallel/test-events-on-async-iterator.js
diff --git a/cli/tests/node_compat/test/parallel/test-events-once.js b/tests/node_compat/test/parallel/test-events-once.js
index 7236f9830..7236f9830 100644
--- a/cli/tests/node_compat/test/parallel/test-events-once.js
+++ b/tests/node_compat/test/parallel/test-events-once.js
diff --git a/cli/tests/node_compat/test/parallel/test-events-uncaught-exception-stack.js b/tests/node_compat/test/parallel/test-events-uncaught-exception-stack.js
index d5b39c203..d5b39c203 100644
--- a/cli/tests/node_compat/test/parallel/test-events-uncaught-exception-stack.js
+++ b/tests/node_compat/test/parallel/test-events-uncaught-exception-stack.js
diff --git a/cli/tests/node_compat/test/parallel/test-eventtarget-brandcheck.js b/tests/node_compat/test/parallel/test-eventtarget-brandcheck.js
index db5cd53f6..db5cd53f6 100644
--- a/cli/tests/node_compat/test/parallel/test-eventtarget-brandcheck.js
+++ b/tests/node_compat/test/parallel/test-eventtarget-brandcheck.js
diff --git a/cli/tests/node_compat/test/parallel/test-exception-handler.js b/tests/node_compat/test/parallel/test-exception-handler.js
index 6c76d2463..6c76d2463 100644
--- a/cli/tests/node_compat/test/parallel/test-exception-handler.js
+++ b/tests/node_compat/test/parallel/test-exception-handler.js
diff --git a/cli/tests/node_compat/test/parallel/test-exception-handler2.js b/tests/node_compat/test/parallel/test-exception-handler2.js
index 6cb214593..6cb214593 100644
--- a/cli/tests/node_compat/test/parallel/test-exception-handler2.js
+++ b/tests/node_compat/test/parallel/test-exception-handler2.js
diff --git a/cli/tests/node_compat/test/parallel/test-file-read-noexist.js b/tests/node_compat/test/parallel/test-file-read-noexist.js
index 2e2d4320d..2e2d4320d 100644
--- a/cli/tests/node_compat/test/parallel/test-file-read-noexist.js
+++ b/tests/node_compat/test/parallel/test-file-read-noexist.js
diff --git a/cli/tests/node_compat/test/parallel/test-file-write-stream.js b/tests/node_compat/test/parallel/test-file-write-stream.js
index 199cdd80e..199cdd80e 100644
--- a/cli/tests/node_compat/test/parallel/test-file-write-stream.js
+++ b/tests/node_compat/test/parallel/test-file-write-stream.js
diff --git a/cli/tests/node_compat/test/parallel/test-file-write-stream2.js b/tests/node_compat/test/parallel/test-file-write-stream2.js
index 3aa712a2f..3aa712a2f 100644
--- a/cli/tests/node_compat/test/parallel/test-file-write-stream2.js
+++ b/tests/node_compat/test/parallel/test-file-write-stream2.js
diff --git a/cli/tests/node_compat/test/parallel/test-file-write-stream3.js b/tests/node_compat/test/parallel/test-file-write-stream3.js
index d15a0b571..d15a0b571 100644
--- a/cli/tests/node_compat/test/parallel/test-file-write-stream3.js
+++ b/tests/node_compat/test/parallel/test-file-write-stream3.js
diff --git a/cli/tests/node_compat/test/parallel/test-file-write-stream4.js b/tests/node_compat/test/parallel/test-file-write-stream4.js
index 392a8ef23..392a8ef23 100644
--- a/cli/tests/node_compat/test/parallel/test-file-write-stream4.js
+++ b/tests/node_compat/test/parallel/test-file-write-stream4.js
diff --git a/cli/tests/node_compat/test/parallel/test-fs-access.js b/tests/node_compat/test/parallel/test-fs-access.js
index 2351d4171..2351d4171 100644
--- a/cli/tests/node_compat/test/parallel/test-fs-access.js
+++ b/tests/node_compat/test/parallel/test-fs-access.js
diff --git a/cli/tests/node_compat/test/parallel/test-fs-append-file-sync.js b/tests/node_compat/test/parallel/test-fs-append-file-sync.js
index d5adc427d..d5adc427d 100644
--- a/cli/tests/node_compat/test/parallel/test-fs-append-file-sync.js
+++ b/tests/node_compat/test/parallel/test-fs-append-file-sync.js
diff --git a/cli/tests/node_compat/test/parallel/test-fs-append-file.js b/tests/node_compat/test/parallel/test-fs-append-file.js
index 41c6be684..41c6be684 100644
--- a/cli/tests/node_compat/test/parallel/test-fs-append-file.js
+++ b/tests/node_compat/test/parallel/test-fs-append-file.js
diff --git a/cli/tests/node_compat/test/parallel/test-fs-chmod-mask.js b/tests/node_compat/test/parallel/test-fs-chmod-mask.js
index f11567c7e..f11567c7e 100644
--- a/cli/tests/node_compat/test/parallel/test-fs-chmod-mask.js
+++ b/tests/node_compat/test/parallel/test-fs-chmod-mask.js
diff --git a/cli/tests/node_compat/test/parallel/test-fs-chmod.js b/tests/node_compat/test/parallel/test-fs-chmod.js
index b5f524f64..b5f524f64 100644
--- a/cli/tests/node_compat/test/parallel/test-fs-chmod.js
+++ b/tests/node_compat/test/parallel/test-fs-chmod.js
diff --git a/cli/tests/node_compat/test/parallel/test-fs-chown-type-check.js b/tests/node_compat/test/parallel/test-fs-chown-type-check.js
index 147edf837..147edf837 100644
--- a/cli/tests/node_compat/test/parallel/test-fs-chown-type-check.js
+++ b/tests/node_compat/test/parallel/test-fs-chown-type-check.js
diff --git a/cli/tests/node_compat/test/parallel/test-fs-copyfile.js b/tests/node_compat/test/parallel/test-fs-copyfile.js
index 085fc19bf..085fc19bf 100644
--- a/cli/tests/node_compat/test/parallel/test-fs-copyfile.js
+++ b/tests/node_compat/test/parallel/test-fs-copyfile.js
diff --git a/cli/tests/node_compat/test/parallel/test-fs-empty-readStream.js b/tests/node_compat/test/parallel/test-fs-empty-readStream.js
index 4f70fda27..4f70fda27 100644
--- a/cli/tests/node_compat/test/parallel/test-fs-empty-readStream.js
+++ b/tests/node_compat/test/parallel/test-fs-empty-readStream.js
diff --git a/cli/tests/node_compat/test/parallel/test-fs-mkdir.js b/tests/node_compat/test/parallel/test-fs-mkdir.js
index 5a3897e91..5a3897e91 100644
--- a/cli/tests/node_compat/test/parallel/test-fs-mkdir.js
+++ b/tests/node_compat/test/parallel/test-fs-mkdir.js
diff --git a/cli/tests/node_compat/test/parallel/test-fs-open-flags.js b/tests/node_compat/test/parallel/test-fs-open-flags.js
index 532194e06..532194e06 100644
--- a/cli/tests/node_compat/test/parallel/test-fs-open-flags.js
+++ b/tests/node_compat/test/parallel/test-fs-open-flags.js
diff --git a/cli/tests/node_compat/test/parallel/test-fs-open-mode-mask.js b/tests/node_compat/test/parallel/test-fs-open-mode-mask.js
index 4b56b3b38..4b56b3b38 100644
--- a/cli/tests/node_compat/test/parallel/test-fs-open-mode-mask.js
+++ b/tests/node_compat/test/parallel/test-fs-open-mode-mask.js
diff --git a/cli/tests/node_compat/test/parallel/test-fs-open-no-close.js b/tests/node_compat/test/parallel/test-fs-open-no-close.js
index abde2ad07..abde2ad07 100644
--- a/cli/tests/node_compat/test/parallel/test-fs-open-no-close.js
+++ b/tests/node_compat/test/parallel/test-fs-open-no-close.js
diff --git a/cli/tests/node_compat/test/parallel/test-fs-open-numeric-flags.js b/tests/node_compat/test/parallel/test-fs-open-numeric-flags.js
index 3e8efde82..3e8efde82 100644
--- a/cli/tests/node_compat/test/parallel/test-fs-open-numeric-flags.js
+++ b/tests/node_compat/test/parallel/test-fs-open-numeric-flags.js
diff --git a/cli/tests/node_compat/test/parallel/test-fs-open.js b/tests/node_compat/test/parallel/test-fs-open.js
index 631e96a2e..631e96a2e 100644
--- a/cli/tests/node_compat/test/parallel/test-fs-open.js
+++ b/tests/node_compat/test/parallel/test-fs-open.js
diff --git a/cli/tests/node_compat/test/parallel/test-fs-opendir.js b/tests/node_compat/test/parallel/test-fs-opendir.js
index 75c4aa074..75c4aa074 100644
--- a/cli/tests/node_compat/test/parallel/test-fs-opendir.js
+++ b/tests/node_compat/test/parallel/test-fs-opendir.js
diff --git a/cli/tests/node_compat/test/parallel/test-fs-read-stream-autoClose.js b/tests/node_compat/test/parallel/test-fs-read-stream-autoClose.js
index aaa8b42e8..aaa8b42e8 100644
--- a/cli/tests/node_compat/test/parallel/test-fs-read-stream-autoClose.js
+++ b/tests/node_compat/test/parallel/test-fs-read-stream-autoClose.js
diff --git a/cli/tests/node_compat/test/parallel/test-fs-read-stream-concurrent-reads.js b/tests/node_compat/test/parallel/test-fs-read-stream-concurrent-reads.js
index ac52d66a8..ac52d66a8 100644
--- a/cli/tests/node_compat/test/parallel/test-fs-read-stream-concurrent-reads.js
+++ b/tests/node_compat/test/parallel/test-fs-read-stream-concurrent-reads.js
diff --git a/cli/tests/node_compat/test/parallel/test-fs-read-stream-double-close.js b/tests/node_compat/test/parallel/test-fs-read-stream-double-close.js
index 1706dd515..1706dd515 100644
--- a/cli/tests/node_compat/test/parallel/test-fs-read-stream-double-close.js
+++ b/tests/node_compat/test/parallel/test-fs-read-stream-double-close.js
diff --git a/cli/tests/node_compat/test/parallel/test-fs-read-stream-encoding.js b/tests/node_compat/test/parallel/test-fs-read-stream-encoding.js
index c3adee739..c3adee739 100644
--- a/cli/tests/node_compat/test/parallel/test-fs-read-stream-encoding.js
+++ b/tests/node_compat/test/parallel/test-fs-read-stream-encoding.js
diff --git a/cli/tests/node_compat/test/parallel/test-fs-read-stream-fd.js b/tests/node_compat/test/parallel/test-fs-read-stream-fd.js
index 467c48b8d..467c48b8d 100644
--- a/cli/tests/node_compat/test/parallel/test-fs-read-stream-fd.js
+++ b/tests/node_compat/test/parallel/test-fs-read-stream-fd.js
diff --git a/cli/tests/node_compat/test/parallel/test-fs-read-stream-inherit.js b/tests/node_compat/test/parallel/test-fs-read-stream-inherit.js
index 2de42ffb5..2de42ffb5 100644
--- a/cli/tests/node_compat/test/parallel/test-fs-read-stream-inherit.js
+++ b/tests/node_compat/test/parallel/test-fs-read-stream-inherit.js
diff --git a/cli/tests/node_compat/test/parallel/test-fs-read-stream-patch-open.js b/tests/node_compat/test/parallel/test-fs-read-stream-patch-open.js
index 2f9788894..2f9788894 100644
--- a/cli/tests/node_compat/test/parallel/test-fs-read-stream-patch-open.js
+++ b/tests/node_compat/test/parallel/test-fs-read-stream-patch-open.js
diff --git a/cli/tests/node_compat/test/parallel/test-fs-read-stream-resume.js b/tests/node_compat/test/parallel/test-fs-read-stream-resume.js
index 50ec85603..50ec85603 100644
--- a/cli/tests/node_compat/test/parallel/test-fs-read-stream-resume.js
+++ b/tests/node_compat/test/parallel/test-fs-read-stream-resume.js
diff --git a/cli/tests/node_compat/test/parallel/test-fs-read-stream-throw-type-error.js b/tests/node_compat/test/parallel/test-fs-read-stream-throw-type-error.js
index 4dda1150f..4dda1150f 100644
--- a/cli/tests/node_compat/test/parallel/test-fs-read-stream-throw-type-error.js
+++ b/tests/node_compat/test/parallel/test-fs-read-stream-throw-type-error.js
diff --git a/cli/tests/node_compat/test/parallel/test-fs-read-stream.js b/tests/node_compat/test/parallel/test-fs-read-stream.js
index e42347264..e42347264 100644
--- a/cli/tests/node_compat/test/parallel/test-fs-read-stream.js
+++ b/tests/node_compat/test/parallel/test-fs-read-stream.js
diff --git a/cli/tests/node_compat/test/parallel/test-fs-read-type.js b/tests/node_compat/test/parallel/test-fs-read-type.js
index 99321ce3e..99321ce3e 100644
--- a/cli/tests/node_compat/test/parallel/test-fs-read-type.js
+++ b/tests/node_compat/test/parallel/test-fs-read-type.js
diff --git a/cli/tests/node_compat/test/parallel/test-fs-read-zero-length.js b/tests/node_compat/test/parallel/test-fs-read-zero-length.js
index 3a7501073..3a7501073 100644
--- a/cli/tests/node_compat/test/parallel/test-fs-read-zero-length.js
+++ b/tests/node_compat/test/parallel/test-fs-read-zero-length.js
diff --git a/cli/tests/node_compat/test/parallel/test-fs-read.js b/tests/node_compat/test/parallel/test-fs-read.js
index 2a7a286d9..2a7a286d9 100644
--- a/cli/tests/node_compat/test/parallel/test-fs-read.js
+++ b/tests/node_compat/test/parallel/test-fs-read.js
diff --git a/cli/tests/node_compat/test/parallel/test-fs-readdir-stack-overflow.js b/tests/node_compat/test/parallel/test-fs-readdir-stack-overflow.js
index 1a60f9a71..1a60f9a71 100644
--- a/cli/tests/node_compat/test/parallel/test-fs-readdir-stack-overflow.js
+++ b/tests/node_compat/test/parallel/test-fs-readdir-stack-overflow.js
diff --git a/cli/tests/node_compat/test/parallel/test-fs-readdir.js b/tests/node_compat/test/parallel/test-fs-readdir.js
index 768162fe2..768162fe2 100644
--- a/cli/tests/node_compat/test/parallel/test-fs-readdir.js
+++ b/tests/node_compat/test/parallel/test-fs-readdir.js
diff --git a/cli/tests/node_compat/test/parallel/test-fs-readfile-empty.js b/tests/node_compat/test/parallel/test-fs-readfile-empty.js
index 15f08ef8c..15f08ef8c 100644
--- a/cli/tests/node_compat/test/parallel/test-fs-readfile-empty.js
+++ b/tests/node_compat/test/parallel/test-fs-readfile-empty.js
diff --git a/cli/tests/node_compat/test/parallel/test-fs-realpath-native.js b/tests/node_compat/test/parallel/test-fs-realpath-native.js
index 13e5b48cb..13e5b48cb 100644
--- a/cli/tests/node_compat/test/parallel/test-fs-realpath-native.js
+++ b/tests/node_compat/test/parallel/test-fs-realpath-native.js
diff --git a/cli/tests/node_compat/test/parallel/test-fs-rmdir-recursive-sync-warns-not-found.js b/tests/node_compat/test/parallel/test-fs-rmdir-recursive-sync-warns-not-found.js
index 92ca59255..92ca59255 100644
--- a/cli/tests/node_compat/test/parallel/test-fs-rmdir-recursive-sync-warns-not-found.js
+++ b/tests/node_compat/test/parallel/test-fs-rmdir-recursive-sync-warns-not-found.js
diff --git a/cli/tests/node_compat/test/parallel/test-fs-rmdir-recursive-sync-warns-on-file.js b/tests/node_compat/test/parallel/test-fs-rmdir-recursive-sync-warns-on-file.js
index 95703b99f..95703b99f 100644
--- a/cli/tests/node_compat/test/parallel/test-fs-rmdir-recursive-sync-warns-on-file.js
+++ b/tests/node_compat/test/parallel/test-fs-rmdir-recursive-sync-warns-on-file.js
diff --git a/cli/tests/node_compat/test/parallel/test-fs-rmdir-recursive-throws-not-found.js b/tests/node_compat/test/parallel/test-fs-rmdir-recursive-throws-not-found.js
index 9a6d584d9..9a6d584d9 100644
--- a/cli/tests/node_compat/test/parallel/test-fs-rmdir-recursive-throws-not-found.js
+++ b/tests/node_compat/test/parallel/test-fs-rmdir-recursive-throws-not-found.js
diff --git a/cli/tests/node_compat/test/parallel/test-fs-rmdir-recursive-throws-on-file.js b/tests/node_compat/test/parallel/test-fs-rmdir-recursive-throws-on-file.js
index 4dc27ab8f..4dc27ab8f 100644
--- a/cli/tests/node_compat/test/parallel/test-fs-rmdir-recursive-throws-on-file.js
+++ b/tests/node_compat/test/parallel/test-fs-rmdir-recursive-throws-on-file.js
diff --git a/cli/tests/node_compat/test/parallel/test-fs-rmdir-recursive-warns-not-found.js b/tests/node_compat/test/parallel/test-fs-rmdir-recursive-warns-not-found.js
index 3e9564ec1..3e9564ec1 100644
--- a/cli/tests/node_compat/test/parallel/test-fs-rmdir-recursive-warns-not-found.js
+++ b/tests/node_compat/test/parallel/test-fs-rmdir-recursive-warns-not-found.js
diff --git a/cli/tests/node_compat/test/parallel/test-fs-rmdir-recursive-warns-on-file.js b/tests/node_compat/test/parallel/test-fs-rmdir-recursive-warns-on-file.js
index 99644e639..99644e639 100644
--- a/cli/tests/node_compat/test/parallel/test-fs-rmdir-recursive-warns-on-file.js
+++ b/tests/node_compat/test/parallel/test-fs-rmdir-recursive-warns-on-file.js
diff --git a/cli/tests/node_compat/test/parallel/test-fs-rmdir-recursive.js b/tests/node_compat/test/parallel/test-fs-rmdir-recursive.js
index 31bde4487..31bde4487 100644
--- a/cli/tests/node_compat/test/parallel/test-fs-rmdir-recursive.js
+++ b/tests/node_compat/test/parallel/test-fs-rmdir-recursive.js
diff --git a/cli/tests/node_compat/test/parallel/test-fs-rmdir-type-check.js b/tests/node_compat/test/parallel/test-fs-rmdir-type-check.js
index 0ebfdacaf..0ebfdacaf 100644
--- a/cli/tests/node_compat/test/parallel/test-fs-rmdir-type-check.js
+++ b/tests/node_compat/test/parallel/test-fs-rmdir-type-check.js
diff --git a/cli/tests/node_compat/test/parallel/test-fs-watchfile.js b/tests/node_compat/test/parallel/test-fs-watchfile.js
index 3a77fb56d..3a77fb56d 100644
--- a/cli/tests/node_compat/test/parallel/test-fs-watchfile.js
+++ b/tests/node_compat/test/parallel/test-fs-watchfile.js
diff --git a/cli/tests/node_compat/test/parallel/test-fs-write-buffer.js b/tests/node_compat/test/parallel/test-fs-write-buffer.js
index 16577a8f2..16577a8f2 100644
--- a/cli/tests/node_compat/test/parallel/test-fs-write-buffer.js
+++ b/tests/node_compat/test/parallel/test-fs-write-buffer.js
diff --git a/cli/tests/node_compat/test/parallel/test-fs-write-file-buffer.js b/tests/node_compat/test/parallel/test-fs-write-file-buffer.js
index 9283cc8b4..9283cc8b4 100644
--- a/cli/tests/node_compat/test/parallel/test-fs-write-file-buffer.js
+++ b/tests/node_compat/test/parallel/test-fs-write-file-buffer.js
diff --git a/cli/tests/node_compat/test/parallel/test-fs-write-file-invalid-path.js b/tests/node_compat/test/parallel/test-fs-write-file-invalid-path.js
index d56aa9a13..d56aa9a13 100644
--- a/cli/tests/node_compat/test/parallel/test-fs-write-file-invalid-path.js
+++ b/tests/node_compat/test/parallel/test-fs-write-file-invalid-path.js
diff --git a/cli/tests/node_compat/test/parallel/test-fs-write-file-sync.js b/tests/node_compat/test/parallel/test-fs-write-file-sync.js
index 027ba6377..027ba6377 100644
--- a/cli/tests/node_compat/test/parallel/test-fs-write-file-sync.js
+++ b/tests/node_compat/test/parallel/test-fs-write-file-sync.js
diff --git a/cli/tests/node_compat/test/parallel/test-fs-write-file.js b/tests/node_compat/test/parallel/test-fs-write-file.js
index a5c93cd23..a5c93cd23 100644
--- a/cli/tests/node_compat/test/parallel/test-fs-write-file.js
+++ b/tests/node_compat/test/parallel/test-fs-write-file.js
diff --git a/cli/tests/node_compat/test/parallel/test-fs-write-no-fd.js b/tests/node_compat/test/parallel/test-fs-write-no-fd.js
index 58ab0fa44..58ab0fa44 100644
--- a/cli/tests/node_compat/test/parallel/test-fs-write-no-fd.js
+++ b/tests/node_compat/test/parallel/test-fs-write-no-fd.js
diff --git a/cli/tests/node_compat/test/parallel/test-fs-write-stream-autoclose-option.js b/tests/node_compat/test/parallel/test-fs-write-stream-autoclose-option.js
index 00958457f..00958457f 100644
--- a/cli/tests/node_compat/test/parallel/test-fs-write-stream-autoclose-option.js
+++ b/tests/node_compat/test/parallel/test-fs-write-stream-autoclose-option.js
diff --git a/cli/tests/node_compat/test/parallel/test-fs-write-stream-close-without-callback.js b/tests/node_compat/test/parallel/test-fs-write-stream-close-without-callback.js
index 61c3120d7..61c3120d7 100644
--- a/cli/tests/node_compat/test/parallel/test-fs-write-stream-close-without-callback.js
+++ b/tests/node_compat/test/parallel/test-fs-write-stream-close-without-callback.js
diff --git a/cli/tests/node_compat/test/parallel/test-fs-write-stream-double-close.js b/tests/node_compat/test/parallel/test-fs-write-stream-double-close.js
index 1f38a3b7d..1f38a3b7d 100644
--- a/cli/tests/node_compat/test/parallel/test-fs-write-stream-double-close.js
+++ b/tests/node_compat/test/parallel/test-fs-write-stream-double-close.js
diff --git a/cli/tests/node_compat/test/parallel/test-fs-write-stream-end.js b/tests/node_compat/test/parallel/test-fs-write-stream-end.js
index f11cf86af..f11cf86af 100644
--- a/cli/tests/node_compat/test/parallel/test-fs-write-stream-end.js
+++ b/tests/node_compat/test/parallel/test-fs-write-stream-end.js
diff --git a/cli/tests/node_compat/test/parallel/test-fs-write-stream-fs.js b/tests/node_compat/test/parallel/test-fs-write-stream-fs.js
index 533a60d4d..533a60d4d 100644
--- a/cli/tests/node_compat/test/parallel/test-fs-write-stream-fs.js
+++ b/tests/node_compat/test/parallel/test-fs-write-stream-fs.js
diff --git a/cli/tests/node_compat/test/parallel/test-fs-write-stream-throw-type-error.js b/tests/node_compat/test/parallel/test-fs-write-stream-throw-type-error.js
index 5540725f7..5540725f7 100644
--- a/cli/tests/node_compat/test/parallel/test-fs-write-stream-throw-type-error.js
+++ b/tests/node_compat/test/parallel/test-fs-write-stream-throw-type-error.js
diff --git a/cli/tests/node_compat/test/parallel/test-fs-write-stream.js b/tests/node_compat/test/parallel/test-fs-write-stream.js
index 4d03d44a8..4d03d44a8 100644
--- a/cli/tests/node_compat/test/parallel/test-fs-write-stream.js
+++ b/tests/node_compat/test/parallel/test-fs-write-stream.js
diff --git a/cli/tests/node_compat/test/parallel/test-fs-write-sync.js b/tests/node_compat/test/parallel/test-fs-write-sync.js
index 8d9ee9efe..8d9ee9efe 100644
--- a/cli/tests/node_compat/test/parallel/test-fs-write-sync.js
+++ b/tests/node_compat/test/parallel/test-fs-write-sync.js
diff --git a/cli/tests/node_compat/test/parallel/test-fs-write.js b/tests/node_compat/test/parallel/test-fs-write.js
index 33fcb84cf..33fcb84cf 100644
--- a/cli/tests/node_compat/test/parallel/test-fs-write.js
+++ b/tests/node_compat/test/parallel/test-fs-write.js
diff --git a/cli/tests/node_compat/test/parallel/test-fs-writev-sync.js b/tests/node_compat/test/parallel/test-fs-writev-sync.js
index 53fa48af1..53fa48af1 100644
--- a/cli/tests/node_compat/test/parallel/test-fs-writev-sync.js
+++ b/tests/node_compat/test/parallel/test-fs-writev-sync.js
diff --git a/cli/tests/node_compat/test/parallel/test-handle-wrap-close-abort.js b/tests/node_compat/test/parallel/test-handle-wrap-close-abort.js
index d143dd439..d143dd439 100644
--- a/cli/tests/node_compat/test/parallel/test-handle-wrap-close-abort.js
+++ b/tests/node_compat/test/parallel/test-handle-wrap-close-abort.js
diff --git a/cli/tests/node_compat/test/parallel/test-http-agent-getname.js b/tests/node_compat/test/parallel/test-http-agent-getname.js
index 3404252a8..3404252a8 100644
--- a/cli/tests/node_compat/test/parallel/test-http-agent-getname.js
+++ b/tests/node_compat/test/parallel/test-http-agent-getname.js
diff --git a/cli/tests/node_compat/test/parallel/test-http-client-get-url.js b/tests/node_compat/test/parallel/test-http-client-get-url.js
index a38d3ff7b..a38d3ff7b 100644
--- a/cli/tests/node_compat/test/parallel/test-http-client-get-url.js
+++ b/tests/node_compat/test/parallel/test-http-client-get-url.js
diff --git a/cli/tests/node_compat/test/parallel/test-http-client-read-in-error.js b/tests/node_compat/test/parallel/test-http-client-read-in-error.js
index 3c86ad8f5..3c86ad8f5 100644
--- a/cli/tests/node_compat/test/parallel/test-http-client-read-in-error.js
+++ b/tests/node_compat/test/parallel/test-http-client-read-in-error.js
diff --git a/cli/tests/node_compat/test/parallel/test-http-localaddress.js b/tests/node_compat/test/parallel/test-http-localaddress.js
index ab3eff808..ab3eff808 100644
--- a/cli/tests/node_compat/test/parallel/test-http-localaddress.js
+++ b/tests/node_compat/test/parallel/test-http-localaddress.js
diff --git a/cli/tests/node_compat/test/parallel/test-http-outgoing-internal-headernames-getter.js b/tests/node_compat/test/parallel/test-http-outgoing-internal-headernames-getter.js
index e9b324892..e9b324892 100644
--- a/cli/tests/node_compat/test/parallel/test-http-outgoing-internal-headernames-getter.js
+++ b/tests/node_compat/test/parallel/test-http-outgoing-internal-headernames-getter.js
diff --git a/cli/tests/node_compat/test/parallel/test-http-outgoing-internal-headernames-setter.js b/tests/node_compat/test/parallel/test-http-outgoing-internal-headernames-setter.js
index 9531e5611..9531e5611 100644
--- a/cli/tests/node_compat/test/parallel/test-http-outgoing-internal-headernames-setter.js
+++ b/tests/node_compat/test/parallel/test-http-outgoing-internal-headernames-setter.js
diff --git a/cli/tests/node_compat/test/parallel/test-http-outgoing-internal-headers.js b/tests/node_compat/test/parallel/test-http-outgoing-internal-headers.js
index 0e4783a6d..0e4783a6d 100644
--- a/cli/tests/node_compat/test/parallel/test-http-outgoing-internal-headers.js
+++ b/tests/node_compat/test/parallel/test-http-outgoing-internal-headers.js
diff --git a/cli/tests/node_compat/test/parallel/test-http-outgoing-renderHeaders.js b/tests/node_compat/test/parallel/test-http-outgoing-renderHeaders.js
index 194a9345a..194a9345a 100644
--- a/cli/tests/node_compat/test/parallel/test-http-outgoing-renderHeaders.js
+++ b/tests/node_compat/test/parallel/test-http-outgoing-renderHeaders.js
diff --git a/cli/tests/node_compat/test/parallel/test-http-outgoing-settimeout.js b/tests/node_compat/test/parallel/test-http-outgoing-settimeout.js
index 592e576b4..592e576b4 100644
--- a/cli/tests/node_compat/test/parallel/test-http-outgoing-settimeout.js
+++ b/tests/node_compat/test/parallel/test-http-outgoing-settimeout.js
diff --git a/cli/tests/node_compat/test/parallel/test-http-url.parse-auth-with-header-in-request.js b/tests/node_compat/test/parallel/test-http-url.parse-auth-with-header-in-request.js
index 24cc2f33d..24cc2f33d 100644
--- a/cli/tests/node_compat/test/parallel/test-http-url.parse-auth-with-header-in-request.js
+++ b/tests/node_compat/test/parallel/test-http-url.parse-auth-with-header-in-request.js
diff --git a/cli/tests/node_compat/test/parallel/test-http-url.parse-auth.js b/tests/node_compat/test/parallel/test-http-url.parse-auth.js
index c9b691aa2..c9b691aa2 100644
--- a/cli/tests/node_compat/test/parallel/test-http-url.parse-auth.js
+++ b/tests/node_compat/test/parallel/test-http-url.parse-auth.js
diff --git a/cli/tests/node_compat/test/parallel/test-http-url.parse-basic.js b/tests/node_compat/test/parallel/test-http-url.parse-basic.js
index e41bf41a1..e41bf41a1 100644
--- a/cli/tests/node_compat/test/parallel/test-http-url.parse-basic.js
+++ b/tests/node_compat/test/parallel/test-http-url.parse-basic.js
diff --git a/cli/tests/node_compat/test/parallel/test-http-url.parse-https.request.js b/tests/node_compat/test/parallel/test-http-url.parse-https.request.js
index 89c7ca2b4..89c7ca2b4 100644
--- a/cli/tests/node_compat/test/parallel/test-http-url.parse-https.request.js
+++ b/tests/node_compat/test/parallel/test-http-url.parse-https.request.js
diff --git a/cli/tests/node_compat/test/parallel/test-http-url.parse-only-support-http-https-protocol.js b/tests/node_compat/test/parallel/test-http-url.parse-only-support-http-https-protocol.js
index 4f50f8a54..4f50f8a54 100644
--- a/cli/tests/node_compat/test/parallel/test-http-url.parse-only-support-http-https-protocol.js
+++ b/tests/node_compat/test/parallel/test-http-url.parse-only-support-http-https-protocol.js
diff --git a/cli/tests/node_compat/test/parallel/test-http-url.parse-path.js b/tests/node_compat/test/parallel/test-http-url.parse-path.js
index 7077fcae1..7077fcae1 100644
--- a/cli/tests/node_compat/test/parallel/test-http-url.parse-path.js
+++ b/tests/node_compat/test/parallel/test-http-url.parse-path.js
diff --git a/cli/tests/node_compat/test/parallel/test-http-url.parse-post.js b/tests/node_compat/test/parallel/test-http-url.parse-post.js
index da316d2db..da316d2db 100644
--- a/cli/tests/node_compat/test/parallel/test-http-url.parse-post.js
+++ b/tests/node_compat/test/parallel/test-http-url.parse-post.js
diff --git a/cli/tests/node_compat/test/parallel/test-http-url.parse-search.js b/tests/node_compat/test/parallel/test-http-url.parse-search.js
index 52651869d..52651869d 100644
--- a/cli/tests/node_compat/test/parallel/test-http-url.parse-search.js
+++ b/tests/node_compat/test/parallel/test-http-url.parse-search.js
diff --git a/cli/tests/node_compat/test/parallel/test-net-access-byteswritten.js b/tests/node_compat/test/parallel/test-net-access-byteswritten.js
index a20a1a7a7..a20a1a7a7 100644
--- a/cli/tests/node_compat/test/parallel/test-net-access-byteswritten.js
+++ b/tests/node_compat/test/parallel/test-net-access-byteswritten.js
diff --git a/cli/tests/node_compat/test/parallel/test-net-better-error-messages-listen-path.js b/tests/node_compat/test/parallel/test-net-better-error-messages-listen-path.js
index edafbcdc4..edafbcdc4 100644
--- a/cli/tests/node_compat/test/parallel/test-net-better-error-messages-listen-path.js
+++ b/tests/node_compat/test/parallel/test-net-better-error-messages-listen-path.js
diff --git a/cli/tests/node_compat/test/parallel/test-net-better-error-messages-path.js b/tests/node_compat/test/parallel/test-net-better-error-messages-path.js
index d1bada362..d1bada362 100644
--- a/cli/tests/node_compat/test/parallel/test-net-better-error-messages-path.js
+++ b/tests/node_compat/test/parallel/test-net-better-error-messages-path.js
diff --git a/cli/tests/node_compat/test/parallel/test-net-better-error-messages-port-hostname.js b/tests/node_compat/test/parallel/test-net-better-error-messages-port-hostname.js
index 6db63fef3..6db63fef3 100644
--- a/cli/tests/node_compat/test/parallel/test-net-better-error-messages-port-hostname.js
+++ b/tests/node_compat/test/parallel/test-net-better-error-messages-port-hostname.js
diff --git a/cli/tests/node_compat/test/parallel/test-net-connect-after-destroy.js b/tests/node_compat/test/parallel/test-net-connect-after-destroy.js
index e08d7c036..e08d7c036 100644
--- a/cli/tests/node_compat/test/parallel/test-net-connect-after-destroy.js
+++ b/tests/node_compat/test/parallel/test-net-connect-after-destroy.js
diff --git a/cli/tests/node_compat/test/parallel/test-net-connect-buffer.js b/tests/node_compat/test/parallel/test-net-connect-buffer.js
index 04e71247e..04e71247e 100644
--- a/cli/tests/node_compat/test/parallel/test-net-connect-buffer.js
+++ b/tests/node_compat/test/parallel/test-net-connect-buffer.js
diff --git a/cli/tests/node_compat/test/parallel/test-net-connect-buffer2.js b/tests/node_compat/test/parallel/test-net-connect-buffer2.js
index 499f3849f..499f3849f 100644
--- a/cli/tests/node_compat/test/parallel/test-net-connect-buffer2.js
+++ b/tests/node_compat/test/parallel/test-net-connect-buffer2.js
diff --git a/cli/tests/node_compat/test/parallel/test-net-connect-destroy.js b/tests/node_compat/test/parallel/test-net-connect-destroy.js
index 2dcea39b2..2dcea39b2 100644
--- a/cli/tests/node_compat/test/parallel/test-net-connect-destroy.js
+++ b/tests/node_compat/test/parallel/test-net-connect-destroy.js
diff --git a/cli/tests/node_compat/test/parallel/test-net-connect-immediate-destroy.js b/tests/node_compat/test/parallel/test-net-connect-immediate-destroy.js
index 08d65f75e..08d65f75e 100644
--- a/cli/tests/node_compat/test/parallel/test-net-connect-immediate-destroy.js
+++ b/tests/node_compat/test/parallel/test-net-connect-immediate-destroy.js
diff --git a/cli/tests/node_compat/test/parallel/test-net-connect-immediate-finish.js b/tests/node_compat/test/parallel/test-net-connect-immediate-finish.js
index 4df92e9c1..4df92e9c1 100644
--- a/cli/tests/node_compat/test/parallel/test-net-connect-immediate-finish.js
+++ b/tests/node_compat/test/parallel/test-net-connect-immediate-finish.js
diff --git a/cli/tests/node_compat/test/parallel/test-net-connect-no-arg.js b/tests/node_compat/test/parallel/test-net-connect-no-arg.js
index 3e3e3eec4..3e3e3eec4 100644
--- a/cli/tests/node_compat/test/parallel/test-net-connect-no-arg.js
+++ b/tests/node_compat/test/parallel/test-net-connect-no-arg.js
diff --git a/cli/tests/node_compat/test/parallel/test-net-dns-error.js b/tests/node_compat/test/parallel/test-net-dns-error.js
index ce326dd6f..ce326dd6f 100644
--- a/cli/tests/node_compat/test/parallel/test-net-dns-error.js
+++ b/tests/node_compat/test/parallel/test-net-dns-error.js
diff --git a/cli/tests/node_compat/test/parallel/test-net-during-close.js b/tests/node_compat/test/parallel/test-net-during-close.js
index f13c9fb18..f13c9fb18 100644
--- a/cli/tests/node_compat/test/parallel/test-net-during-close.js
+++ b/tests/node_compat/test/parallel/test-net-during-close.js
diff --git a/cli/tests/node_compat/test/parallel/test-net-end-close.js b/tests/node_compat/test/parallel/test-net-end-close.js
index a818dd097..a818dd097 100644
--- a/cli/tests/node_compat/test/parallel/test-net-end-close.js
+++ b/tests/node_compat/test/parallel/test-net-end-close.js
diff --git a/cli/tests/node_compat/test/parallel/test-net-end-without-connect.js b/tests/node_compat/test/parallel/test-net-end-without-connect.js
index f14d81770..f14d81770 100644
--- a/cli/tests/node_compat/test/parallel/test-net-end-without-connect.js
+++ b/tests/node_compat/test/parallel/test-net-end-without-connect.js
diff --git a/cli/tests/node_compat/test/parallel/test-net-isip.js b/tests/node_compat/test/parallel/test-net-isip.js
index 016277483..016277483 100644
--- a/cli/tests/node_compat/test/parallel/test-net-isip.js
+++ b/tests/node_compat/test/parallel/test-net-isip.js
diff --git a/cli/tests/node_compat/test/parallel/test-net-isipv4.js b/tests/node_compat/test/parallel/test-net-isipv4.js
index a9733c342..a9733c342 100644
--- a/cli/tests/node_compat/test/parallel/test-net-isipv4.js
+++ b/tests/node_compat/test/parallel/test-net-isipv4.js
diff --git a/cli/tests/node_compat/test/parallel/test-net-isipv6.js b/tests/node_compat/test/parallel/test-net-isipv6.js
index cc74fe657..cc74fe657 100644
--- a/cli/tests/node_compat/test/parallel/test-net-isipv6.js
+++ b/tests/node_compat/test/parallel/test-net-isipv6.js
diff --git a/cli/tests/node_compat/test/parallel/test-net-listen-close-server-callback-is-not-function.js b/tests/node_compat/test/parallel/test-net-listen-close-server-callback-is-not-function.js
index 69b72b9c2..69b72b9c2 100644
--- a/cli/tests/node_compat/test/parallel/test-net-listen-close-server-callback-is-not-function.js
+++ b/tests/node_compat/test/parallel/test-net-listen-close-server-callback-is-not-function.js
diff --git a/cli/tests/node_compat/test/parallel/test-net-listen-close-server.js b/tests/node_compat/test/parallel/test-net-listen-close-server.js
index 441cf4511..441cf4511 100644
--- a/cli/tests/node_compat/test/parallel/test-net-listen-close-server.js
+++ b/tests/node_compat/test/parallel/test-net-listen-close-server.js
diff --git a/cli/tests/node_compat/test/parallel/test-net-listen-invalid-port.js b/tests/node_compat/test/parallel/test-net-listen-invalid-port.js
index 10685f1d0..10685f1d0 100644
--- a/cli/tests/node_compat/test/parallel/test-net-listen-invalid-port.js
+++ b/tests/node_compat/test/parallel/test-net-listen-invalid-port.js
diff --git a/cli/tests/node_compat/test/parallel/test-net-listening.js b/tests/node_compat/test/parallel/test-net-listening.js
index 275dd06eb..275dd06eb 100644
--- a/cli/tests/node_compat/test/parallel/test-net-listening.js
+++ b/tests/node_compat/test/parallel/test-net-listening.js
diff --git a/cli/tests/node_compat/test/parallel/test-net-localerror.js b/tests/node_compat/test/parallel/test-net-localerror.js
index 9e2080ed4..9e2080ed4 100644
--- a/cli/tests/node_compat/test/parallel/test-net-localerror.js
+++ b/tests/node_compat/test/parallel/test-net-localerror.js
diff --git a/cli/tests/node_compat/test/parallel/test-net-options-lookup.js b/tests/node_compat/test/parallel/test-net-options-lookup.js
index d3ca0451c..d3ca0451c 100644
--- a/cli/tests/node_compat/test/parallel/test-net-options-lookup.js
+++ b/tests/node_compat/test/parallel/test-net-options-lookup.js
diff --git a/cli/tests/node_compat/test/parallel/test-net-pipe-connect-errors.js b/tests/node_compat/test/parallel/test-net-pipe-connect-errors.js
index 451c9eb92..451c9eb92 100644
--- a/cli/tests/node_compat/test/parallel/test-net-pipe-connect-errors.js
+++ b/tests/node_compat/test/parallel/test-net-pipe-connect-errors.js
diff --git a/cli/tests/node_compat/test/parallel/test-net-server-call-listen-multiple-times.js b/tests/node_compat/test/parallel/test-net-server-call-listen-multiple-times.js
index 30b443b18..30b443b18 100644
--- a/cli/tests/node_compat/test/parallel/test-net-server-call-listen-multiple-times.js
+++ b/tests/node_compat/test/parallel/test-net-server-call-listen-multiple-times.js
diff --git a/cli/tests/node_compat/test/parallel/test-net-server-listen-options-signal.js b/tests/node_compat/test/parallel/test-net-server-listen-options-signal.js
index b8547f516..b8547f516 100644
--- a/cli/tests/node_compat/test/parallel/test-net-server-listen-options-signal.js
+++ b/tests/node_compat/test/parallel/test-net-server-listen-options-signal.js
diff --git a/cli/tests/node_compat/test/parallel/test-net-server-listen-options.js b/tests/node_compat/test/parallel/test-net-server-listen-options.js
index 4d76a7ca7..4d76a7ca7 100644
--- a/cli/tests/node_compat/test/parallel/test-net-server-listen-options.js
+++ b/tests/node_compat/test/parallel/test-net-server-listen-options.js
diff --git a/cli/tests/node_compat/test/parallel/test-net-server-listen-path.js b/tests/node_compat/test/parallel/test-net-server-listen-path.js
index 559e9c7eb..559e9c7eb 100644
--- a/cli/tests/node_compat/test/parallel/test-net-server-listen-path.js
+++ b/tests/node_compat/test/parallel/test-net-server-listen-path.js
diff --git a/cli/tests/node_compat/test/parallel/test-net-server-listen-remove-callback.js b/tests/node_compat/test/parallel/test-net-server-listen-remove-callback.js
index 15808a7a1..15808a7a1 100644
--- a/cli/tests/node_compat/test/parallel/test-net-server-listen-remove-callback.js
+++ b/tests/node_compat/test/parallel/test-net-server-listen-remove-callback.js
diff --git a/cli/tests/node_compat/test/parallel/test-net-server-options.js b/tests/node_compat/test/parallel/test-net-server-options.js
index 92086d149..92086d149 100644
--- a/cli/tests/node_compat/test/parallel/test-net-server-options.js
+++ b/tests/node_compat/test/parallel/test-net-server-options.js
diff --git a/cli/tests/node_compat/test/parallel/test-net-server-try-ports.js b/tests/node_compat/test/parallel/test-net-server-try-ports.js
index 69dbc78b8..69dbc78b8 100644
--- a/cli/tests/node_compat/test/parallel/test-net-server-try-ports.js
+++ b/tests/node_compat/test/parallel/test-net-server-try-ports.js
diff --git a/cli/tests/node_compat/test/parallel/test-net-server-unref-persistent.js b/tests/node_compat/test/parallel/test-net-server-unref-persistent.js
index 04b79686e..04b79686e 100644
--- a/cli/tests/node_compat/test/parallel/test-net-server-unref-persistent.js
+++ b/tests/node_compat/test/parallel/test-net-server-unref-persistent.js
diff --git a/cli/tests/node_compat/test/parallel/test-net-server-unref.js b/tests/node_compat/test/parallel/test-net-server-unref.js
index 68fd6edb1..68fd6edb1 100644
--- a/cli/tests/node_compat/test/parallel/test-net-server-unref.js
+++ b/tests/node_compat/test/parallel/test-net-server-unref.js
diff --git a/cli/tests/node_compat/test/parallel/test-net-socket-destroy-twice.js b/tests/node_compat/test/parallel/test-net-socket-destroy-twice.js
index 8cff55d70..8cff55d70 100644
--- a/cli/tests/node_compat/test/parallel/test-net-socket-destroy-twice.js
+++ b/tests/node_compat/test/parallel/test-net-socket-destroy-twice.js
diff --git a/cli/tests/node_compat/test/parallel/test-net-socket-no-halfopen-enforcer.js b/tests/node_compat/test/parallel/test-net-socket-no-halfopen-enforcer.js
index c50b0061a..c50b0061a 100644
--- a/cli/tests/node_compat/test/parallel/test-net-socket-no-halfopen-enforcer.js
+++ b/tests/node_compat/test/parallel/test-net-socket-no-halfopen-enforcer.js
diff --git a/cli/tests/node_compat/test/parallel/test-net-socket-timeout.js b/tests/node_compat/test/parallel/test-net-socket-timeout.js
index b69e40530..b69e40530 100644
--- a/cli/tests/node_compat/test/parallel/test-net-socket-timeout.js
+++ b/tests/node_compat/test/parallel/test-net-socket-timeout.js
diff --git a/cli/tests/node_compat/test/parallel/test-net-timeout-no-handle.js b/tests/node_compat/test/parallel/test-net-timeout-no-handle.js
index 1948dc9ad..1948dc9ad 100644
--- a/cli/tests/node_compat/test/parallel/test-net-timeout-no-handle.js
+++ b/tests/node_compat/test/parallel/test-net-timeout-no-handle.js
diff --git a/cli/tests/node_compat/test/parallel/test-net-write-arguments.js b/tests/node_compat/test/parallel/test-net-write-arguments.js
index d6beb72ee..d6beb72ee 100644
--- a/cli/tests/node_compat/test/parallel/test-net-write-arguments.js
+++ b/tests/node_compat/test/parallel/test-net-write-arguments.js
diff --git a/cli/tests/node_compat/test/parallel/test-next-tick-doesnt-hang.js b/tests/node_compat/test/parallel/test-next-tick-doesnt-hang.js
index 6d0d6a7e0..6d0d6a7e0 100644
--- a/cli/tests/node_compat/test/parallel/test-next-tick-doesnt-hang.js
+++ b/tests/node_compat/test/parallel/test-next-tick-doesnt-hang.js
diff --git a/cli/tests/node_compat/test/parallel/test-next-tick-fixed-queue-regression.js b/tests/node_compat/test/parallel/test-next-tick-fixed-queue-regression.js
index fff40f754..fff40f754 100644
--- a/cli/tests/node_compat/test/parallel/test-next-tick-fixed-queue-regression.js
+++ b/tests/node_compat/test/parallel/test-next-tick-fixed-queue-regression.js
diff --git a/cli/tests/node_compat/test/parallel/test-next-tick-intentional-starvation.js b/tests/node_compat/test/parallel/test-next-tick-intentional-starvation.js
index b2c00b43a..b2c00b43a 100644
--- a/cli/tests/node_compat/test/parallel/test-next-tick-intentional-starvation.js
+++ b/tests/node_compat/test/parallel/test-next-tick-intentional-starvation.js
diff --git a/cli/tests/node_compat/test/parallel/test-next-tick-ordering.js b/tests/node_compat/test/parallel/test-next-tick-ordering.js
index a2839a49e..a2839a49e 100644
--- a/cli/tests/node_compat/test/parallel/test-next-tick-ordering.js
+++ b/tests/node_compat/test/parallel/test-next-tick-ordering.js
diff --git a/cli/tests/node_compat/test/parallel/test-next-tick-ordering2.js b/tests/node_compat/test/parallel/test-next-tick-ordering2.js
index 29c76d32e..29c76d32e 100644
--- a/cli/tests/node_compat/test/parallel/test-next-tick-ordering2.js
+++ b/tests/node_compat/test/parallel/test-next-tick-ordering2.js
diff --git a/cli/tests/node_compat/test/parallel/test-next-tick-when-exiting.js b/tests/node_compat/test/parallel/test-next-tick-when-exiting.js
index 5f20b5247..5f20b5247 100644
--- a/cli/tests/node_compat/test/parallel/test-next-tick-when-exiting.js
+++ b/tests/node_compat/test/parallel/test-next-tick-when-exiting.js
diff --git a/cli/tests/node_compat/test/parallel/test-next-tick.js b/tests/node_compat/test/parallel/test-next-tick.js
index aee5c06a1..aee5c06a1 100644
--- a/cli/tests/node_compat/test/parallel/test-next-tick.js
+++ b/tests/node_compat/test/parallel/test-next-tick.js
diff --git a/cli/tests/node_compat/test/parallel/test-nodeeventtarget.js b/tests/node_compat/test/parallel/test-nodeeventtarget.js
index b5c6e788f..b5c6e788f 100644
--- a/cli/tests/node_compat/test/parallel/test-nodeeventtarget.js
+++ b/tests/node_compat/test/parallel/test-nodeeventtarget.js
diff --git a/cli/tests/node_compat/test/parallel/test-os.js b/tests/node_compat/test/parallel/test-os.js
index 9de4f516f..9de4f516f 100644
--- a/cli/tests/node_compat/test/parallel/test-os.js
+++ b/tests/node_compat/test/parallel/test-os.js
diff --git a/cli/tests/node_compat/test/parallel/test-outgoing-message-destroy.js b/tests/node_compat/test/parallel/test-outgoing-message-destroy.js
index d9a13796f..d9a13796f 100644
--- a/cli/tests/node_compat/test/parallel/test-outgoing-message-destroy.js
+++ b/tests/node_compat/test/parallel/test-outgoing-message-destroy.js
diff --git a/cli/tests/node_compat/test/parallel/test-outgoing-message-pipe.js b/tests/node_compat/test/parallel/test-outgoing-message-pipe.js
index ab9063c93..ab9063c93 100644
--- a/cli/tests/node_compat/test/parallel/test-outgoing-message-pipe.js
+++ b/tests/node_compat/test/parallel/test-outgoing-message-pipe.js
diff --git a/cli/tests/node_compat/test/parallel/test-parse-args.mjs b/tests/node_compat/test/parallel/test-parse-args.mjs
index ae8332fa7..ae8332fa7 100644
--- a/cli/tests/node_compat/test/parallel/test-parse-args.mjs
+++ b/tests/node_compat/test/parallel/test-parse-args.mjs
diff --git a/cli/tests/node_compat/test/parallel/test-path-basename.js b/tests/node_compat/test/parallel/test-path-basename.js
index 9e8e9ecf8..9e8e9ecf8 100644
--- a/cli/tests/node_compat/test/parallel/test-path-basename.js
+++ b/tests/node_compat/test/parallel/test-path-basename.js
diff --git a/cli/tests/node_compat/test/parallel/test-path-dirname.js b/tests/node_compat/test/parallel/test-path-dirname.js
index 0b123fcdf..0b123fcdf 100644
--- a/cli/tests/node_compat/test/parallel/test-path-dirname.js
+++ b/tests/node_compat/test/parallel/test-path-dirname.js
diff --git a/cli/tests/node_compat/test/parallel/test-path-extname.js b/tests/node_compat/test/parallel/test-path-extname.js
index d1ed0342b..d1ed0342b 100644
--- a/cli/tests/node_compat/test/parallel/test-path-extname.js
+++ b/tests/node_compat/test/parallel/test-path-extname.js
diff --git a/cli/tests/node_compat/test/parallel/test-path-isabsolute.js b/tests/node_compat/test/parallel/test-path-isabsolute.js
index ff64fc7ff..ff64fc7ff 100644
--- a/cli/tests/node_compat/test/parallel/test-path-isabsolute.js
+++ b/tests/node_compat/test/parallel/test-path-isabsolute.js
diff --git a/cli/tests/node_compat/test/parallel/test-path-join.js b/tests/node_compat/test/parallel/test-path-join.js
index 2b958b720..2b958b720 100644
--- a/cli/tests/node_compat/test/parallel/test-path-join.js
+++ b/tests/node_compat/test/parallel/test-path-join.js
diff --git a/cli/tests/node_compat/test/parallel/test-path-makelong.js b/tests/node_compat/test/parallel/test-path-makelong.js
index 694240109..694240109 100644
--- a/cli/tests/node_compat/test/parallel/test-path-makelong.js
+++ b/tests/node_compat/test/parallel/test-path-makelong.js
diff --git a/cli/tests/node_compat/test/parallel/test-path-normalize.js b/tests/node_compat/test/parallel/test-path-normalize.js
index 543be42e6..543be42e6 100644
--- a/cli/tests/node_compat/test/parallel/test-path-normalize.js
+++ b/tests/node_compat/test/parallel/test-path-normalize.js
diff --git a/cli/tests/node_compat/test/parallel/test-path-parse-format.js b/tests/node_compat/test/parallel/test-path-parse-format.js
index 657503d3c..657503d3c 100644
--- a/cli/tests/node_compat/test/parallel/test-path-parse-format.js
+++ b/tests/node_compat/test/parallel/test-path-parse-format.js
diff --git a/cli/tests/node_compat/test/parallel/test-path-posix-exists.js b/tests/node_compat/test/parallel/test-path-posix-exists.js
index 97f2c4ae6..97f2c4ae6 100644
--- a/cli/tests/node_compat/test/parallel/test-path-posix-exists.js
+++ b/tests/node_compat/test/parallel/test-path-posix-exists.js
diff --git a/cli/tests/node_compat/test/parallel/test-path-relative.js b/tests/node_compat/test/parallel/test-path-relative.js
index 7b89cc2cd..7b89cc2cd 100644
--- a/cli/tests/node_compat/test/parallel/test-path-relative.js
+++ b/tests/node_compat/test/parallel/test-path-relative.js
diff --git a/cli/tests/node_compat/test/parallel/test-path-resolve.js b/tests/node_compat/test/parallel/test-path-resolve.js
index be010ed83..be010ed83 100644
--- a/cli/tests/node_compat/test/parallel/test-path-resolve.js
+++ b/tests/node_compat/test/parallel/test-path-resolve.js
diff --git a/cli/tests/node_compat/test/parallel/test-path-win32-exists.js b/tests/node_compat/test/parallel/test-path-win32-exists.js
index 8bb1850dc..8bb1850dc 100644
--- a/cli/tests/node_compat/test/parallel/test-path-win32-exists.js
+++ b/tests/node_compat/test/parallel/test-path-win32-exists.js
diff --git a/cli/tests/node_compat/test/parallel/test-path-zero-length-strings.js b/tests/node_compat/test/parallel/test-path-zero-length-strings.js
index 5fa1eafbf..5fa1eafbf 100644
--- a/cli/tests/node_compat/test/parallel/test-path-zero-length-strings.js
+++ b/tests/node_compat/test/parallel/test-path-zero-length-strings.js
diff --git a/cli/tests/node_compat/test/parallel/test-path.js b/tests/node_compat/test/parallel/test-path.js
index b68f0c2d4..b68f0c2d4 100644
--- a/cli/tests/node_compat/test/parallel/test-path.js
+++ b/tests/node_compat/test/parallel/test-path.js
diff --git a/cli/tests/node_compat/test/parallel/test-process-beforeexit.js b/tests/node_compat/test/parallel/test-process-beforeexit.js
index 7ac789c69..7ac789c69 100644
--- a/cli/tests/node_compat/test/parallel/test-process-beforeexit.js
+++ b/tests/node_compat/test/parallel/test-process-beforeexit.js
diff --git a/cli/tests/node_compat/test/parallel/test-process-binding-internalbinding-allowlist.js b/tests/node_compat/test/parallel/test-process-binding-internalbinding-allowlist.js
index 28a9a31e9..28a9a31e9 100644
--- a/cli/tests/node_compat/test/parallel/test-process-binding-internalbinding-allowlist.js
+++ b/tests/node_compat/test/parallel/test-process-binding-internalbinding-allowlist.js
diff --git a/cli/tests/node_compat/test/parallel/test-process-env-allowed-flags.js b/tests/node_compat/test/parallel/test-process-env-allowed-flags.js
index 1b2c96e68..1b2c96e68 100644
--- a/cli/tests/node_compat/test/parallel/test-process-env-allowed-flags.js
+++ b/tests/node_compat/test/parallel/test-process-env-allowed-flags.js
diff --git a/cli/tests/node_compat/test/parallel/test-process-exit-from-before-exit.js b/tests/node_compat/test/parallel/test-process-exit-from-before-exit.js
index a1472e538..a1472e538 100644
--- a/cli/tests/node_compat/test/parallel/test-process-exit-from-before-exit.js
+++ b/tests/node_compat/test/parallel/test-process-exit-from-before-exit.js
diff --git a/cli/tests/node_compat/test/parallel/test-process-exit-handler.js b/tests/node_compat/test/parallel/test-process-exit-handler.js
index 7069c73e9..7069c73e9 100644
--- a/cli/tests/node_compat/test/parallel/test-process-exit-handler.js
+++ b/tests/node_compat/test/parallel/test-process-exit-handler.js
diff --git a/cli/tests/node_compat/test/parallel/test-process-exit-recursive.js b/tests/node_compat/test/parallel/test-process-exit-recursive.js
index 054b23271..054b23271 100644
--- a/cli/tests/node_compat/test/parallel/test-process-exit-recursive.js
+++ b/tests/node_compat/test/parallel/test-process-exit-recursive.js
diff --git a/cli/tests/node_compat/test/parallel/test-process-exit.js b/tests/node_compat/test/parallel/test-process-exit.js
index 50a3bd3b1..50a3bd3b1 100644
--- a/cli/tests/node_compat/test/parallel/test-process-exit.js
+++ b/tests/node_compat/test/parallel/test-process-exit.js
diff --git a/cli/tests/node_compat/test/parallel/test-process-kill-pid.js b/tests/node_compat/test/parallel/test-process-kill-pid.js
index f6e612f2b..f6e612f2b 100644
--- a/cli/tests/node_compat/test/parallel/test-process-kill-pid.js
+++ b/tests/node_compat/test/parallel/test-process-kill-pid.js
diff --git a/cli/tests/node_compat/test/parallel/test-process-uptime.js b/tests/node_compat/test/parallel/test-process-uptime.js
index 74d2c13bd..74d2c13bd 100644
--- a/cli/tests/node_compat/test/parallel/test-process-uptime.js
+++ b/tests/node_compat/test/parallel/test-process-uptime.js
diff --git a/cli/tests/node_compat/test/parallel/test-promise-unhandled-silent.js b/tests/node_compat/test/parallel/test-promise-unhandled-silent.js
index 3b2dcde15..3b2dcde15 100644
--- a/cli/tests/node_compat/test/parallel/test-promise-unhandled-silent.js
+++ b/tests/node_compat/test/parallel/test-promise-unhandled-silent.js
diff --git a/cli/tests/node_compat/test/parallel/test-promise-unhandled-throw-handler.js b/tests/node_compat/test/parallel/test-promise-unhandled-throw-handler.js
index a911f096a..a911f096a 100644
--- a/cli/tests/node_compat/test/parallel/test-promise-unhandled-throw-handler.js
+++ b/tests/node_compat/test/parallel/test-promise-unhandled-throw-handler.js
diff --git a/cli/tests/node_compat/test/parallel/test-querystring-escape.js b/tests/node_compat/test/parallel/test-querystring-escape.js
index f4f635af1..f4f635af1 100644
--- a/cli/tests/node_compat/test/parallel/test-querystring-escape.js
+++ b/tests/node_compat/test/parallel/test-querystring-escape.js
diff --git a/cli/tests/node_compat/test/parallel/test-querystring-maxKeys-non-finite.js b/tests/node_compat/test/parallel/test-querystring-maxKeys-non-finite.js
index 4a8c7ab0d..4a8c7ab0d 100644
--- a/cli/tests/node_compat/test/parallel/test-querystring-maxKeys-non-finite.js
+++ b/tests/node_compat/test/parallel/test-querystring-maxKeys-non-finite.js
diff --git a/cli/tests/node_compat/test/parallel/test-querystring-multichar-separator.js b/tests/node_compat/test/parallel/test-querystring-multichar-separator.js
index 3234dcd60..3234dcd60 100644
--- a/cli/tests/node_compat/test/parallel/test-querystring-multichar-separator.js
+++ b/tests/node_compat/test/parallel/test-querystring-multichar-separator.js
diff --git a/cli/tests/node_compat/test/parallel/test-querystring.js b/tests/node_compat/test/parallel/test-querystring.js
index fb8176da5..fb8176da5 100644
--- a/cli/tests/node_compat/test/parallel/test-querystring.js
+++ b/tests/node_compat/test/parallel/test-querystring.js
diff --git a/cli/tests/node_compat/test/parallel/test-readline-emit-keypress-events.js b/tests/node_compat/test/parallel/test-readline-emit-keypress-events.js
index 542616424..542616424 100644
--- a/cli/tests/node_compat/test/parallel/test-readline-emit-keypress-events.js
+++ b/tests/node_compat/test/parallel/test-readline-emit-keypress-events.js
diff --git a/cli/tests/node_compat/test/parallel/test-readline-interface-escapecodetimeout.js b/tests/node_compat/test/parallel/test-readline-interface-escapecodetimeout.js
index 584dc1110..584dc1110 100644
--- a/cli/tests/node_compat/test/parallel/test-readline-interface-escapecodetimeout.js
+++ b/tests/node_compat/test/parallel/test-readline-interface-escapecodetimeout.js
diff --git a/cli/tests/node_compat/test/parallel/test-readline-interface.js b/tests/node_compat/test/parallel/test-readline-interface.js
index e8e48dd1e..e8e48dd1e 100644
--- a/cli/tests/node_compat/test/parallel/test-readline-interface.js
+++ b/tests/node_compat/test/parallel/test-readline-interface.js
diff --git a/cli/tests/node_compat/test/parallel/test-readline-keys.js b/tests/node_compat/test/parallel/test-readline-keys.js
index aeeb5fffc..aeeb5fffc 100644
--- a/cli/tests/node_compat/test/parallel/test-readline-keys.js
+++ b/tests/node_compat/test/parallel/test-readline-keys.js
diff --git a/cli/tests/node_compat/test/parallel/test-readline-position.js b/tests/node_compat/test/parallel/test-readline-position.js
index 5ee445c8e..5ee445c8e 100644
--- a/cli/tests/node_compat/test/parallel/test-readline-position.js
+++ b/tests/node_compat/test/parallel/test-readline-position.js
diff --git a/cli/tests/node_compat/test/parallel/test-readline-reopen.js b/tests/node_compat/test/parallel/test-readline-reopen.js
index 6d3207220..6d3207220 100644
--- a/cli/tests/node_compat/test/parallel/test-readline-reopen.js
+++ b/tests/node_compat/test/parallel/test-readline-reopen.js
diff --git a/cli/tests/node_compat/test/parallel/test-readline-set-raw-mode.js b/tests/node_compat/test/parallel/test-readline-set-raw-mode.js
index a1f4f743d..a1f4f743d 100644
--- a/cli/tests/node_compat/test/parallel/test-readline-set-raw-mode.js
+++ b/tests/node_compat/test/parallel/test-readline-set-raw-mode.js
diff --git a/cli/tests/node_compat/test/parallel/test-readline-undefined-columns.js b/tests/node_compat/test/parallel/test-readline-undefined-columns.js
index e41798ae3..e41798ae3 100644
--- a/cli/tests/node_compat/test/parallel/test-readline-undefined-columns.js
+++ b/tests/node_compat/test/parallel/test-readline-undefined-columns.js
diff --git a/cli/tests/node_compat/test/parallel/test-readline.js b/tests/node_compat/test/parallel/test-readline.js
index 15f1b4f0c..15f1b4f0c 100644
--- a/cli/tests/node_compat/test/parallel/test-readline.js
+++ b/tests/node_compat/test/parallel/test-readline.js
diff --git a/cli/tests/node_compat/test/parallel/test-stdin-from-file-spawn.js b/tests/node_compat/test/parallel/test-stdin-from-file-spawn.js
index 2f6b41898..2f6b41898 100644
--- a/cli/tests/node_compat/test/parallel/test-stdin-from-file-spawn.js
+++ b/tests/node_compat/test/parallel/test-stdin-from-file-spawn.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream-add-abort-signal.js b/tests/node_compat/test/parallel/test-stream-add-abort-signal.js
index cf598b547..cf598b547 100644
--- a/cli/tests/node_compat/test/parallel/test-stream-add-abort-signal.js
+++ b/tests/node_compat/test/parallel/test-stream-add-abort-signal.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream-aliases-legacy.js b/tests/node_compat/test/parallel/test-stream-aliases-legacy.js
index e0af8bb47..e0af8bb47 100644
--- a/cli/tests/node_compat/test/parallel/test-stream-aliases-legacy.js
+++ b/tests/node_compat/test/parallel/test-stream-aliases-legacy.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream-auto-destroy.js b/tests/node_compat/test/parallel/test-stream-auto-destroy.js
index a0947ba39..a0947ba39 100644
--- a/cli/tests/node_compat/test/parallel/test-stream-auto-destroy.js
+++ b/tests/node_compat/test/parallel/test-stream-auto-destroy.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream-await-drain-writers-in-synchronously-recursion-write.js b/tests/node_compat/test/parallel/test-stream-await-drain-writers-in-synchronously-recursion-write.js
index 84095dbf1..84095dbf1 100644
--- a/cli/tests/node_compat/test/parallel/test-stream-await-drain-writers-in-synchronously-recursion-write.js
+++ b/tests/node_compat/test/parallel/test-stream-await-drain-writers-in-synchronously-recursion-write.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream-backpressure.js b/tests/node_compat/test/parallel/test-stream-backpressure.js
index f1e14bb5d..f1e14bb5d 100644
--- a/cli/tests/node_compat/test/parallel/test-stream-backpressure.js
+++ b/tests/node_compat/test/parallel/test-stream-backpressure.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream-big-packet.js b/tests/node_compat/test/parallel/test-stream-big-packet.js
index 4e816cc2d..4e816cc2d 100644
--- a/cli/tests/node_compat/test/parallel/test-stream-big-packet.js
+++ b/tests/node_compat/test/parallel/test-stream-big-packet.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream-big-push.js b/tests/node_compat/test/parallel/test-stream-big-push.js
index 2e6d01fe2..2e6d01fe2 100644
--- a/cli/tests/node_compat/test/parallel/test-stream-big-push.js
+++ b/tests/node_compat/test/parallel/test-stream-big-push.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream-buffer-list.js b/tests/node_compat/test/parallel/test-stream-buffer-list.js
index 7b16f5d83..7b16f5d83 100644
--- a/cli/tests/node_compat/test/parallel/test-stream-buffer-list.js
+++ b/tests/node_compat/test/parallel/test-stream-buffer-list.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream-construct.js b/tests/node_compat/test/parallel/test-stream-construct.js
index 0cd93c9e9..0cd93c9e9 100644
--- a/cli/tests/node_compat/test/parallel/test-stream-construct.js
+++ b/tests/node_compat/test/parallel/test-stream-construct.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream-destroy-event-order.js b/tests/node_compat/test/parallel/test-stream-destroy-event-order.js
index 09802b2a3..09802b2a3 100644
--- a/cli/tests/node_compat/test/parallel/test-stream-destroy-event-order.js
+++ b/tests/node_compat/test/parallel/test-stream-destroy-event-order.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream-duplex-destroy.js b/tests/node_compat/test/parallel/test-stream-duplex-destroy.js
index 73cf75fe3..73cf75fe3 100644
--- a/cli/tests/node_compat/test/parallel/test-stream-duplex-destroy.js
+++ b/tests/node_compat/test/parallel/test-stream-duplex-destroy.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream-duplex-end.js b/tests/node_compat/test/parallel/test-stream-duplex-end.js
index b6d95a448..b6d95a448 100644
--- a/cli/tests/node_compat/test/parallel/test-stream-duplex-end.js
+++ b/tests/node_compat/test/parallel/test-stream-duplex-end.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream-duplex-from.js b/tests/node_compat/test/parallel/test-stream-duplex-from.js
index c91a040c5..c91a040c5 100644
--- a/cli/tests/node_compat/test/parallel/test-stream-duplex-from.js
+++ b/tests/node_compat/test/parallel/test-stream-duplex-from.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream-duplex-props.js b/tests/node_compat/test/parallel/test-stream-duplex-props.js
index 1eedc9404..1eedc9404 100644
--- a/cli/tests/node_compat/test/parallel/test-stream-duplex-props.js
+++ b/tests/node_compat/test/parallel/test-stream-duplex-props.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream-duplex-readable-end.js b/tests/node_compat/test/parallel/test-stream-duplex-readable-end.js
index 87327814c..87327814c 100644
--- a/cli/tests/node_compat/test/parallel/test-stream-duplex-readable-end.js
+++ b/tests/node_compat/test/parallel/test-stream-duplex-readable-end.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream-duplex-writable-finished.js b/tests/node_compat/test/parallel/test-stream-duplex-writable-finished.js
index c556d14ef..c556d14ef 100644
--- a/cli/tests/node_compat/test/parallel/test-stream-duplex-writable-finished.js
+++ b/tests/node_compat/test/parallel/test-stream-duplex-writable-finished.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream-duplex.js b/tests/node_compat/test/parallel/test-stream-duplex.js
index d7210e49e..d7210e49e 100644
--- a/cli/tests/node_compat/test/parallel/test-stream-duplex.js
+++ b/tests/node_compat/test/parallel/test-stream-duplex.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream-end-paused.js b/tests/node_compat/test/parallel/test-stream-end-paused.js
index 12c05243d..12c05243d 100644
--- a/cli/tests/node_compat/test/parallel/test-stream-end-paused.js
+++ b/tests/node_compat/test/parallel/test-stream-end-paused.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream-error-once.js b/tests/node_compat/test/parallel/test-stream-error-once.js
index 592788d4f..592788d4f 100644
--- a/cli/tests/node_compat/test/parallel/test-stream-error-once.js
+++ b/tests/node_compat/test/parallel/test-stream-error-once.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream-events-prepend.js b/tests/node_compat/test/parallel/test-stream-events-prepend.js
index 7245977f1..7245977f1 100644
--- a/cli/tests/node_compat/test/parallel/test-stream-events-prepend.js
+++ b/tests/node_compat/test/parallel/test-stream-events-prepend.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream-inheritance.js b/tests/node_compat/test/parallel/test-stream-inheritance.js
index 296e12996..296e12996 100644
--- a/cli/tests/node_compat/test/parallel/test-stream-inheritance.js
+++ b/tests/node_compat/test/parallel/test-stream-inheritance.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream-ispaused.js b/tests/node_compat/test/parallel/test-stream-ispaused.js
index 8f4897047..8f4897047 100644
--- a/cli/tests/node_compat/test/parallel/test-stream-ispaused.js
+++ b/tests/node_compat/test/parallel/test-stream-ispaused.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream-objectmode-undefined.js b/tests/node_compat/test/parallel/test-stream-objectmode-undefined.js
index 0478b0ee7..0478b0ee7 100644
--- a/cli/tests/node_compat/test/parallel/test-stream-objectmode-undefined.js
+++ b/tests/node_compat/test/parallel/test-stream-objectmode-undefined.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream-once-readable-pipe.js b/tests/node_compat/test/parallel/test-stream-once-readable-pipe.js
index f273b9602..f273b9602 100644
--- a/cli/tests/node_compat/test/parallel/test-stream-once-readable-pipe.js
+++ b/tests/node_compat/test/parallel/test-stream-once-readable-pipe.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream-pipe-after-end.js b/tests/node_compat/test/parallel/test-stream-pipe-after-end.js
index a7af22b94..a7af22b94 100644
--- a/cli/tests/node_compat/test/parallel/test-stream-pipe-after-end.js
+++ b/tests/node_compat/test/parallel/test-stream-pipe-after-end.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream-pipe-await-drain-manual-resume.js b/tests/node_compat/test/parallel/test-stream-pipe-await-drain-manual-resume.js
index e49c99033..e49c99033 100644
--- a/cli/tests/node_compat/test/parallel/test-stream-pipe-await-drain-manual-resume.js
+++ b/tests/node_compat/test/parallel/test-stream-pipe-await-drain-manual-resume.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream-pipe-await-drain-push-while-write.js b/tests/node_compat/test/parallel/test-stream-pipe-await-drain-push-while-write.js
index 54fbe9e89..54fbe9e89 100644
--- a/cli/tests/node_compat/test/parallel/test-stream-pipe-await-drain-push-while-write.js
+++ b/tests/node_compat/test/parallel/test-stream-pipe-await-drain-push-while-write.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream-pipe-await-drain.js b/tests/node_compat/test/parallel/test-stream-pipe-await-drain.js
index 49062fe0b..49062fe0b 100644
--- a/cli/tests/node_compat/test/parallel/test-stream-pipe-await-drain.js
+++ b/tests/node_compat/test/parallel/test-stream-pipe-await-drain.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream-pipe-cleanup-pause.js b/tests/node_compat/test/parallel/test-stream-pipe-cleanup-pause.js
index 279ce10d5..279ce10d5 100644
--- a/cli/tests/node_compat/test/parallel/test-stream-pipe-cleanup-pause.js
+++ b/tests/node_compat/test/parallel/test-stream-pipe-cleanup-pause.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream-pipe-cleanup.js b/tests/node_compat/test/parallel/test-stream-pipe-cleanup.js
index 8106ab4f1..8106ab4f1 100644
--- a/cli/tests/node_compat/test/parallel/test-stream-pipe-cleanup.js
+++ b/tests/node_compat/test/parallel/test-stream-pipe-cleanup.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream-pipe-error-handling.js b/tests/node_compat/test/parallel/test-stream-pipe-error-handling.js
index 356bb1cd9..356bb1cd9 100644
--- a/cli/tests/node_compat/test/parallel/test-stream-pipe-error-handling.js
+++ b/tests/node_compat/test/parallel/test-stream-pipe-error-handling.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream-pipe-event.js b/tests/node_compat/test/parallel/test-stream-pipe-event.js
index a2721c053..a2721c053 100644
--- a/cli/tests/node_compat/test/parallel/test-stream-pipe-event.js
+++ b/tests/node_compat/test/parallel/test-stream-pipe-event.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream-pipe-flow-after-unpipe.js b/tests/node_compat/test/parallel/test-stream-pipe-flow-after-unpipe.js
index c0b144c18..c0b144c18 100644
--- a/cli/tests/node_compat/test/parallel/test-stream-pipe-flow-after-unpipe.js
+++ b/tests/node_compat/test/parallel/test-stream-pipe-flow-after-unpipe.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream-pipe-flow.js b/tests/node_compat/test/parallel/test-stream-pipe-flow.js
index 8e877312f..8e877312f 100644
--- a/cli/tests/node_compat/test/parallel/test-stream-pipe-flow.js
+++ b/tests/node_compat/test/parallel/test-stream-pipe-flow.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream-pipe-manual-resume.js b/tests/node_compat/test/parallel/test-stream-pipe-manual-resume.js
index 0666e44d6..0666e44d6 100644
--- a/cli/tests/node_compat/test/parallel/test-stream-pipe-manual-resume.js
+++ b/tests/node_compat/test/parallel/test-stream-pipe-manual-resume.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream-pipe-multiple-pipes.js b/tests/node_compat/test/parallel/test-stream-pipe-multiple-pipes.js
index cd24dd4ca..cd24dd4ca 100644
--- a/cli/tests/node_compat/test/parallel/test-stream-pipe-multiple-pipes.js
+++ b/tests/node_compat/test/parallel/test-stream-pipe-multiple-pipes.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream-pipe-needDrain.js b/tests/node_compat/test/parallel/test-stream-pipe-needDrain.js
index f8b724de9..f8b724de9 100644
--- a/cli/tests/node_compat/test/parallel/test-stream-pipe-needDrain.js
+++ b/tests/node_compat/test/parallel/test-stream-pipe-needDrain.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream-pipe-same-destination-twice.js b/tests/node_compat/test/parallel/test-stream-pipe-same-destination-twice.js
index 7e1215733..7e1215733 100644
--- a/cli/tests/node_compat/test/parallel/test-stream-pipe-same-destination-twice.js
+++ b/tests/node_compat/test/parallel/test-stream-pipe-same-destination-twice.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream-pipe-unpipe-streams.js b/tests/node_compat/test/parallel/test-stream-pipe-unpipe-streams.js
index a51dcfbad..a51dcfbad 100644
--- a/cli/tests/node_compat/test/parallel/test-stream-pipe-unpipe-streams.js
+++ b/tests/node_compat/test/parallel/test-stream-pipe-unpipe-streams.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream-pipe-without-listenerCount.js b/tests/node_compat/test/parallel/test-stream-pipe-without-listenerCount.js
index 7a1719be3..7a1719be3 100644
--- a/cli/tests/node_compat/test/parallel/test-stream-pipe-without-listenerCount.js
+++ b/tests/node_compat/test/parallel/test-stream-pipe-without-listenerCount.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream-pipeline-async-iterator.js b/tests/node_compat/test/parallel/test-stream-pipeline-async-iterator.js
index 3d3ce96cc..3d3ce96cc 100644
--- a/cli/tests/node_compat/test/parallel/test-stream-pipeline-async-iterator.js
+++ b/tests/node_compat/test/parallel/test-stream-pipeline-async-iterator.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream-pipeline-queued-end-in-destroy.js b/tests/node_compat/test/parallel/test-stream-pipeline-queued-end-in-destroy.js
index e785a0008..e785a0008 100644
--- a/cli/tests/node_compat/test/parallel/test-stream-pipeline-queued-end-in-destroy.js
+++ b/tests/node_compat/test/parallel/test-stream-pipeline-queued-end-in-destroy.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream-pipeline-with-empty-string.js b/tests/node_compat/test/parallel/test-stream-pipeline-with-empty-string.js
index a03fe17dd..a03fe17dd 100644
--- a/cli/tests/node_compat/test/parallel/test-stream-pipeline-with-empty-string.js
+++ b/tests/node_compat/test/parallel/test-stream-pipeline-with-empty-string.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream-push-strings.js b/tests/node_compat/test/parallel/test-stream-push-strings.js
index 4d88e082b..4d88e082b 100644
--- a/cli/tests/node_compat/test/parallel/test-stream-push-strings.js
+++ b/tests/node_compat/test/parallel/test-stream-push-strings.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream-readable-aborted.js b/tests/node_compat/test/parallel/test-stream-readable-aborted.js
index 3e6550e7e..3e6550e7e 100644
--- a/cli/tests/node_compat/test/parallel/test-stream-readable-aborted.js
+++ b/tests/node_compat/test/parallel/test-stream-readable-aborted.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream-readable-add-chunk-during-data.js b/tests/node_compat/test/parallel/test-stream-readable-add-chunk-during-data.js
index 50939ac81..50939ac81 100644
--- a/cli/tests/node_compat/test/parallel/test-stream-readable-add-chunk-during-data.js
+++ b/tests/node_compat/test/parallel/test-stream-readable-add-chunk-during-data.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream-readable-constructor-set-methods.js b/tests/node_compat/test/parallel/test-stream-readable-constructor-set-methods.js
index b11ae8fca..b11ae8fca 100644
--- a/cli/tests/node_compat/test/parallel/test-stream-readable-constructor-set-methods.js
+++ b/tests/node_compat/test/parallel/test-stream-readable-constructor-set-methods.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream-readable-data.js b/tests/node_compat/test/parallel/test-stream-readable-data.js
index d33f9f248..d33f9f248 100644
--- a/cli/tests/node_compat/test/parallel/test-stream-readable-data.js
+++ b/tests/node_compat/test/parallel/test-stream-readable-data.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream-readable-destroy.js b/tests/node_compat/test/parallel/test-stream-readable-destroy.js
index 0a780c98e..0a780c98e 100644
--- a/cli/tests/node_compat/test/parallel/test-stream-readable-destroy.js
+++ b/tests/node_compat/test/parallel/test-stream-readable-destroy.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream-readable-didRead.js b/tests/node_compat/test/parallel/test-stream-readable-didRead.js
index 2d9cfa40f..2d9cfa40f 100644
--- a/cli/tests/node_compat/test/parallel/test-stream-readable-didRead.js
+++ b/tests/node_compat/test/parallel/test-stream-readable-didRead.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream-readable-emit-readable-short-stream.js b/tests/node_compat/test/parallel/test-stream-readable-emit-readable-short-stream.js
index fac562092..fac562092 100644
--- a/cli/tests/node_compat/test/parallel/test-stream-readable-emit-readable-short-stream.js
+++ b/tests/node_compat/test/parallel/test-stream-readable-emit-readable-short-stream.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream-readable-emittedReadable.js b/tests/node_compat/test/parallel/test-stream-readable-emittedReadable.js
index a05130737..a05130737 100644
--- a/cli/tests/node_compat/test/parallel/test-stream-readable-emittedReadable.js
+++ b/tests/node_compat/test/parallel/test-stream-readable-emittedReadable.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream-readable-end-destroyed.js b/tests/node_compat/test/parallel/test-stream-readable-end-destroyed.js
index 7c542f330..7c542f330 100644
--- a/cli/tests/node_compat/test/parallel/test-stream-readable-end-destroyed.js
+++ b/tests/node_compat/test/parallel/test-stream-readable-end-destroyed.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream-readable-ended.js b/tests/node_compat/test/parallel/test-stream-readable-ended.js
index b8f59e2df..b8f59e2df 100644
--- a/cli/tests/node_compat/test/parallel/test-stream-readable-ended.js
+++ b/tests/node_compat/test/parallel/test-stream-readable-ended.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream-readable-error-end.js b/tests/node_compat/test/parallel/test-stream-readable-error-end.js
index 821a5f458..821a5f458 100644
--- a/cli/tests/node_compat/test/parallel/test-stream-readable-error-end.js
+++ b/tests/node_compat/test/parallel/test-stream-readable-error-end.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream-readable-event.js b/tests/node_compat/test/parallel/test-stream-readable-event.js
index 87a4e0feb..87a4e0feb 100644
--- a/cli/tests/node_compat/test/parallel/test-stream-readable-event.js
+++ b/tests/node_compat/test/parallel/test-stream-readable-event.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream-readable-flow-recursion.js b/tests/node_compat/test/parallel/test-stream-readable-flow-recursion.js
index 1ac657197..1ac657197 100644
--- a/cli/tests/node_compat/test/parallel/test-stream-readable-flow-recursion.js
+++ b/tests/node_compat/test/parallel/test-stream-readable-flow-recursion.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream-readable-hwm-0-async.js b/tests/node_compat/test/parallel/test-stream-readable-hwm-0-async.js
index c797129ee..c797129ee 100644
--- a/cli/tests/node_compat/test/parallel/test-stream-readable-hwm-0-async.js
+++ b/tests/node_compat/test/parallel/test-stream-readable-hwm-0-async.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream-readable-hwm-0-no-flow-data.js b/tests/node_compat/test/parallel/test-stream-readable-hwm-0-no-flow-data.js
index 3d9c0507a..3d9c0507a 100644
--- a/cli/tests/node_compat/test/parallel/test-stream-readable-hwm-0-no-flow-data.js
+++ b/tests/node_compat/test/parallel/test-stream-readable-hwm-0-no-flow-data.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream-readable-hwm-0.js b/tests/node_compat/test/parallel/test-stream-readable-hwm-0.js
index cfbfac8ab..cfbfac8ab 100644
--- a/cli/tests/node_compat/test/parallel/test-stream-readable-hwm-0.js
+++ b/tests/node_compat/test/parallel/test-stream-readable-hwm-0.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream-readable-infinite-read.js b/tests/node_compat/test/parallel/test-stream-readable-infinite-read.js
index e3819cad9..e3819cad9 100644
--- a/cli/tests/node_compat/test/parallel/test-stream-readable-infinite-read.js
+++ b/tests/node_compat/test/parallel/test-stream-readable-infinite-read.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream-readable-invalid-chunk.js b/tests/node_compat/test/parallel/test-stream-readable-invalid-chunk.js
index a40526389..a40526389 100644
--- a/cli/tests/node_compat/test/parallel/test-stream-readable-invalid-chunk.js
+++ b/tests/node_compat/test/parallel/test-stream-readable-invalid-chunk.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream-readable-needReadable.js b/tests/node_compat/test/parallel/test-stream-readable-needReadable.js
index 675e5e872..675e5e872 100644
--- a/cli/tests/node_compat/test/parallel/test-stream-readable-needReadable.js
+++ b/tests/node_compat/test/parallel/test-stream-readable-needReadable.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream-readable-next-no-null.js b/tests/node_compat/test/parallel/test-stream-readable-next-no-null.js
index 06f06f41d..06f06f41d 100644
--- a/cli/tests/node_compat/test/parallel/test-stream-readable-next-no-null.js
+++ b/tests/node_compat/test/parallel/test-stream-readable-next-no-null.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream-readable-no-unneeded-readable.js b/tests/node_compat/test/parallel/test-stream-readable-no-unneeded-readable.js
index 9a96db87d..9a96db87d 100644
--- a/cli/tests/node_compat/test/parallel/test-stream-readable-no-unneeded-readable.js
+++ b/tests/node_compat/test/parallel/test-stream-readable-no-unneeded-readable.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream-readable-object-multi-push-async.js b/tests/node_compat/test/parallel/test-stream-readable-object-multi-push-async.js
index 4ab7f3adb..4ab7f3adb 100644
--- a/cli/tests/node_compat/test/parallel/test-stream-readable-object-multi-push-async.js
+++ b/tests/node_compat/test/parallel/test-stream-readable-object-multi-push-async.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream-readable-pause-and-resume.js b/tests/node_compat/test/parallel/test-stream-readable-pause-and-resume.js
index 923349ef4..923349ef4 100644
--- a/cli/tests/node_compat/test/parallel/test-stream-readable-pause-and-resume.js
+++ b/tests/node_compat/test/parallel/test-stream-readable-pause-and-resume.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream-readable-readable-then-resume.js b/tests/node_compat/test/parallel/test-stream-readable-readable-then-resume.js
index 3df0bcaaf..3df0bcaaf 100644
--- a/cli/tests/node_compat/test/parallel/test-stream-readable-readable-then-resume.js
+++ b/tests/node_compat/test/parallel/test-stream-readable-readable-then-resume.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream-readable-readable.js b/tests/node_compat/test/parallel/test-stream-readable-readable.js
index 6353ad8d4..6353ad8d4 100644
--- a/cli/tests/node_compat/test/parallel/test-stream-readable-readable.js
+++ b/tests/node_compat/test/parallel/test-stream-readable-readable.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream-readable-reading-readingMore.js b/tests/node_compat/test/parallel/test-stream-readable-reading-readingMore.js
index 26663b88b..26663b88b 100644
--- a/cli/tests/node_compat/test/parallel/test-stream-readable-reading-readingMore.js
+++ b/tests/node_compat/test/parallel/test-stream-readable-reading-readingMore.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream-readable-resume-hwm.js b/tests/node_compat/test/parallel/test-stream-readable-resume-hwm.js
index 0e490529c..0e490529c 100644
--- a/cli/tests/node_compat/test/parallel/test-stream-readable-resume-hwm.js
+++ b/tests/node_compat/test/parallel/test-stream-readable-resume-hwm.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream-readable-resumeScheduled.js b/tests/node_compat/test/parallel/test-stream-readable-resumeScheduled.js
index 474670264..474670264 100644
--- a/cli/tests/node_compat/test/parallel/test-stream-readable-resumeScheduled.js
+++ b/tests/node_compat/test/parallel/test-stream-readable-resumeScheduled.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream-readable-setEncoding-existing-buffers.js b/tests/node_compat/test/parallel/test-stream-readable-setEncoding-existing-buffers.js
index c99a39819..c99a39819 100644
--- a/cli/tests/node_compat/test/parallel/test-stream-readable-setEncoding-existing-buffers.js
+++ b/tests/node_compat/test/parallel/test-stream-readable-setEncoding-existing-buffers.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream-readable-setEncoding-null.js b/tests/node_compat/test/parallel/test-stream-readable-setEncoding-null.js
index e6823f7cd..e6823f7cd 100644
--- a/cli/tests/node_compat/test/parallel/test-stream-readable-setEncoding-null.js
+++ b/tests/node_compat/test/parallel/test-stream-readable-setEncoding-null.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream-readable-unshift.js b/tests/node_compat/test/parallel/test-stream-readable-unshift.js
index 1303befa9..1303befa9 100644
--- a/cli/tests/node_compat/test/parallel/test-stream-readable-unshift.js
+++ b/tests/node_compat/test/parallel/test-stream-readable-unshift.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream-readable-with-unimplemented-_read.js b/tests/node_compat/test/parallel/test-stream-readable-with-unimplemented-_read.js
index a2fe2ac01..a2fe2ac01 100644
--- a/cli/tests/node_compat/test/parallel/test-stream-readable-with-unimplemented-_read.js
+++ b/tests/node_compat/test/parallel/test-stream-readable-with-unimplemented-_read.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream-readableListening-state.js b/tests/node_compat/test/parallel/test-stream-readableListening-state.js
index 69085ac86..69085ac86 100644
--- a/cli/tests/node_compat/test/parallel/test-stream-readableListening-state.js
+++ b/tests/node_compat/test/parallel/test-stream-readableListening-state.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream-transform-callback-twice.js b/tests/node_compat/test/parallel/test-stream-transform-callback-twice.js
index 3ca0a4c68..3ca0a4c68 100644
--- a/cli/tests/node_compat/test/parallel/test-stream-transform-callback-twice.js
+++ b/tests/node_compat/test/parallel/test-stream-transform-callback-twice.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream-transform-constructor-set-methods.js b/tests/node_compat/test/parallel/test-stream-transform-constructor-set-methods.js
index 4daf199b0..4daf199b0 100644
--- a/cli/tests/node_compat/test/parallel/test-stream-transform-constructor-set-methods.js
+++ b/tests/node_compat/test/parallel/test-stream-transform-constructor-set-methods.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream-transform-destroy.js b/tests/node_compat/test/parallel/test-stream-transform-destroy.js
index e721f848f..e721f848f 100644
--- a/cli/tests/node_compat/test/parallel/test-stream-transform-destroy.js
+++ b/tests/node_compat/test/parallel/test-stream-transform-destroy.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream-transform-final-sync.js b/tests/node_compat/test/parallel/test-stream-transform-final-sync.js
index 5d108097d..5d108097d 100644
--- a/cli/tests/node_compat/test/parallel/test-stream-transform-final-sync.js
+++ b/tests/node_compat/test/parallel/test-stream-transform-final-sync.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream-transform-final.js b/tests/node_compat/test/parallel/test-stream-transform-final.js
index 1d14adf6b..1d14adf6b 100644
--- a/cli/tests/node_compat/test/parallel/test-stream-transform-final.js
+++ b/tests/node_compat/test/parallel/test-stream-transform-final.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream-transform-flush-data.js b/tests/node_compat/test/parallel/test-stream-transform-flush-data.js
index 6b8ba1adc..6b8ba1adc 100644
--- a/cli/tests/node_compat/test/parallel/test-stream-transform-flush-data.js
+++ b/tests/node_compat/test/parallel/test-stream-transform-flush-data.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream-transform-objectmode-falsey-value.js b/tests/node_compat/test/parallel/test-stream-transform-objectmode-falsey-value.js
index 12390fe36..12390fe36 100644
--- a/cli/tests/node_compat/test/parallel/test-stream-transform-objectmode-falsey-value.js
+++ b/tests/node_compat/test/parallel/test-stream-transform-objectmode-falsey-value.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream-transform-split-highwatermark.js b/tests/node_compat/test/parallel/test-stream-transform-split-highwatermark.js
index 783ddfc91..783ddfc91 100644
--- a/cli/tests/node_compat/test/parallel/test-stream-transform-split-highwatermark.js
+++ b/tests/node_compat/test/parallel/test-stream-transform-split-highwatermark.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream-transform-split-objectmode.js b/tests/node_compat/test/parallel/test-stream-transform-split-objectmode.js
index 22e2586df..22e2586df 100644
--- a/cli/tests/node_compat/test/parallel/test-stream-transform-split-objectmode.js
+++ b/tests/node_compat/test/parallel/test-stream-transform-split-objectmode.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream-uint8array.js b/tests/node_compat/test/parallel/test-stream-uint8array.js
index c8de2dfe6..c8de2dfe6 100644
--- a/cli/tests/node_compat/test/parallel/test-stream-uint8array.js
+++ b/tests/node_compat/test/parallel/test-stream-uint8array.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream-unpipe-event.js b/tests/node_compat/test/parallel/test-stream-unpipe-event.js
index d0b60f435..d0b60f435 100644
--- a/cli/tests/node_compat/test/parallel/test-stream-unpipe-event.js
+++ b/tests/node_compat/test/parallel/test-stream-unpipe-event.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream-unshift-empty-chunk.js b/tests/node_compat/test/parallel/test-stream-unshift-empty-chunk.js
index f6c057fd6..f6c057fd6 100644
--- a/cli/tests/node_compat/test/parallel/test-stream-unshift-empty-chunk.js
+++ b/tests/node_compat/test/parallel/test-stream-unshift-empty-chunk.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream-unshift-read-race.js b/tests/node_compat/test/parallel/test-stream-unshift-read-race.js
index d88850519..d88850519 100644
--- a/cli/tests/node_compat/test/parallel/test-stream-unshift-read-race.js
+++ b/tests/node_compat/test/parallel/test-stream-unshift-read-race.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream-writable-change-default-encoding.js b/tests/node_compat/test/parallel/test-stream-writable-change-default-encoding.js
index 547309d70..547309d70 100644
--- a/cli/tests/node_compat/test/parallel/test-stream-writable-change-default-encoding.js
+++ b/tests/node_compat/test/parallel/test-stream-writable-change-default-encoding.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream-writable-clear-buffer.js b/tests/node_compat/test/parallel/test-stream-writable-clear-buffer.js
index ee24da756..ee24da756 100644
--- a/cli/tests/node_compat/test/parallel/test-stream-writable-clear-buffer.js
+++ b/tests/node_compat/test/parallel/test-stream-writable-clear-buffer.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream-writable-constructor-set-methods.js b/tests/node_compat/test/parallel/test-stream-writable-constructor-set-methods.js
index 58e687edd..58e687edd 100644
--- a/cli/tests/node_compat/test/parallel/test-stream-writable-constructor-set-methods.js
+++ b/tests/node_compat/test/parallel/test-stream-writable-constructor-set-methods.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream-writable-decoded-encoding.js b/tests/node_compat/test/parallel/test-stream-writable-decoded-encoding.js
index 9bf47bb1a..9bf47bb1a 100644
--- a/cli/tests/node_compat/test/parallel/test-stream-writable-decoded-encoding.js
+++ b/tests/node_compat/test/parallel/test-stream-writable-decoded-encoding.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream-writable-destroy.js b/tests/node_compat/test/parallel/test-stream-writable-destroy.js
index bfe145854..bfe145854 100644
--- a/cli/tests/node_compat/test/parallel/test-stream-writable-destroy.js
+++ b/tests/node_compat/test/parallel/test-stream-writable-destroy.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream-writable-end-cb-error.js b/tests/node_compat/test/parallel/test-stream-writable-end-cb-error.js
index 730146db3..730146db3 100644
--- a/cli/tests/node_compat/test/parallel/test-stream-writable-end-cb-error.js
+++ b/tests/node_compat/test/parallel/test-stream-writable-end-cb-error.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream-writable-end-multiple.js b/tests/node_compat/test/parallel/test-stream-writable-end-multiple.js
index ea1759303..ea1759303 100644
--- a/cli/tests/node_compat/test/parallel/test-stream-writable-end-multiple.js
+++ b/tests/node_compat/test/parallel/test-stream-writable-end-multiple.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream-writable-ended-state.js b/tests/node_compat/test/parallel/test-stream-writable-ended-state.js
index f6f6971a2..f6f6971a2 100644
--- a/cli/tests/node_compat/test/parallel/test-stream-writable-ended-state.js
+++ b/tests/node_compat/test/parallel/test-stream-writable-ended-state.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream-writable-finish-destroyed.js b/tests/node_compat/test/parallel/test-stream-writable-finish-destroyed.js
index 9d8775dec..9d8775dec 100644
--- a/cli/tests/node_compat/test/parallel/test-stream-writable-finish-destroyed.js
+++ b/tests/node_compat/test/parallel/test-stream-writable-finish-destroyed.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream-writable-finished-state.js b/tests/node_compat/test/parallel/test-stream-writable-finished-state.js
index 0b7333bf2..0b7333bf2 100644
--- a/cli/tests/node_compat/test/parallel/test-stream-writable-finished-state.js
+++ b/tests/node_compat/test/parallel/test-stream-writable-finished-state.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream-writable-finished.js b/tests/node_compat/test/parallel/test-stream-writable-finished.js
index 30ae737f9..30ae737f9 100644
--- a/cli/tests/node_compat/test/parallel/test-stream-writable-finished.js
+++ b/tests/node_compat/test/parallel/test-stream-writable-finished.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream-writable-invalid-chunk.js b/tests/node_compat/test/parallel/test-stream-writable-invalid-chunk.js
index 82912adb8..82912adb8 100644
--- a/cli/tests/node_compat/test/parallel/test-stream-writable-invalid-chunk.js
+++ b/tests/node_compat/test/parallel/test-stream-writable-invalid-chunk.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream-writable-needdrain-state.js b/tests/node_compat/test/parallel/test-stream-writable-needdrain-state.js
index fe8c28921..fe8c28921 100644
--- a/cli/tests/node_compat/test/parallel/test-stream-writable-needdrain-state.js
+++ b/tests/node_compat/test/parallel/test-stream-writable-needdrain-state.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream-writable-null.js b/tests/node_compat/test/parallel/test-stream-writable-null.js
index e2ddd7d0a..e2ddd7d0a 100644
--- a/cli/tests/node_compat/test/parallel/test-stream-writable-null.js
+++ b/tests/node_compat/test/parallel/test-stream-writable-null.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream-writable-properties.js b/tests/node_compat/test/parallel/test-stream-writable-properties.js
index ef19b3a01..ef19b3a01 100644
--- a/cli/tests/node_compat/test/parallel/test-stream-writable-properties.js
+++ b/tests/node_compat/test/parallel/test-stream-writable-properties.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream-writable-writable.js b/tests/node_compat/test/parallel/test-stream-writable-writable.js
index 63be4b3ca..63be4b3ca 100644
--- a/cli/tests/node_compat/test/parallel/test-stream-writable-writable.js
+++ b/tests/node_compat/test/parallel/test-stream-writable-writable.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream-writable-write-cb-error.js b/tests/node_compat/test/parallel/test-stream-writable-write-cb-error.js
index c4df3233a..c4df3233a 100644
--- a/cli/tests/node_compat/test/parallel/test-stream-writable-write-cb-error.js
+++ b/tests/node_compat/test/parallel/test-stream-writable-write-cb-error.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream-writable-write-cb-twice.js b/tests/node_compat/test/parallel/test-stream-writable-write-cb-twice.js
index ab2408fd9..ab2408fd9 100644
--- a/cli/tests/node_compat/test/parallel/test-stream-writable-write-cb-twice.js
+++ b/tests/node_compat/test/parallel/test-stream-writable-write-cb-twice.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream-writable-write-error.js b/tests/node_compat/test/parallel/test-stream-writable-write-error.js
index 2bb91f821..2bb91f821 100644
--- a/cli/tests/node_compat/test/parallel/test-stream-writable-write-error.js
+++ b/tests/node_compat/test/parallel/test-stream-writable-write-error.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream-writable-write-writev-finish.js b/tests/node_compat/test/parallel/test-stream-writable-write-writev-finish.js
index ff34a83c1..ff34a83c1 100644
--- a/cli/tests/node_compat/test/parallel/test-stream-writable-write-writev-finish.js
+++ b/tests/node_compat/test/parallel/test-stream-writable-write-writev-finish.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream-writableState-ending.js b/tests/node_compat/test/parallel/test-stream-writableState-ending.js
index a477e63b6..a477e63b6 100644
--- a/cli/tests/node_compat/test/parallel/test-stream-writableState-ending.js
+++ b/tests/node_compat/test/parallel/test-stream-writableState-ending.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream-writableState-uncorked-bufferedRequestCount.js b/tests/node_compat/test/parallel/test-stream-writableState-uncorked-bufferedRequestCount.js
index 0320d1a5d..0320d1a5d 100644
--- a/cli/tests/node_compat/test/parallel/test-stream-writableState-uncorked-bufferedRequestCount.js
+++ b/tests/node_compat/test/parallel/test-stream-writableState-uncorked-bufferedRequestCount.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream-write-destroy.js b/tests/node_compat/test/parallel/test-stream-write-destroy.js
index a4f103547..a4f103547 100644
--- a/cli/tests/node_compat/test/parallel/test-stream-write-destroy.js
+++ b/tests/node_compat/test/parallel/test-stream-write-destroy.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream-write-drain.js b/tests/node_compat/test/parallel/test-stream-write-drain.js
index 008b2b34b..008b2b34b 100644
--- a/cli/tests/node_compat/test/parallel/test-stream-write-drain.js
+++ b/tests/node_compat/test/parallel/test-stream-write-drain.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream-write-final.js b/tests/node_compat/test/parallel/test-stream-write-final.js
index 527f515eb..527f515eb 100644
--- a/cli/tests/node_compat/test/parallel/test-stream-write-final.js
+++ b/tests/node_compat/test/parallel/test-stream-write-final.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream-writev.js b/tests/node_compat/test/parallel/test-stream-writev.js
index 050546646..050546646 100644
--- a/cli/tests/node_compat/test/parallel/test-stream-writev.js
+++ b/tests/node_compat/test/parallel/test-stream-writev.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream2-base64-single-char-read-end.js b/tests/node_compat/test/parallel/test-stream2-base64-single-char-read-end.js
index 34a1f7240..34a1f7240 100644
--- a/cli/tests/node_compat/test/parallel/test-stream2-base64-single-char-read-end.js
+++ b/tests/node_compat/test/parallel/test-stream2-base64-single-char-read-end.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream2-basic.js b/tests/node_compat/test/parallel/test-stream2-basic.js
index b820d5287..b820d5287 100644
--- a/cli/tests/node_compat/test/parallel/test-stream2-basic.js
+++ b/tests/node_compat/test/parallel/test-stream2-basic.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream2-compatibility.js b/tests/node_compat/test/parallel/test-stream2-compatibility.js
index c228366c3..c228366c3 100644
--- a/cli/tests/node_compat/test/parallel/test-stream2-compatibility.js
+++ b/tests/node_compat/test/parallel/test-stream2-compatibility.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream2-decode-partial.js b/tests/node_compat/test/parallel/test-stream2-decode-partial.js
index f3a9ec15d..f3a9ec15d 100644
--- a/cli/tests/node_compat/test/parallel/test-stream2-decode-partial.js
+++ b/tests/node_compat/test/parallel/test-stream2-decode-partial.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream2-finish-pipe.js b/tests/node_compat/test/parallel/test-stream2-finish-pipe.js
index c98812ff8..c98812ff8 100644
--- a/cli/tests/node_compat/test/parallel/test-stream2-finish-pipe.js
+++ b/tests/node_compat/test/parallel/test-stream2-finish-pipe.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream2-large-read-stall.js b/tests/node_compat/test/parallel/test-stream2-large-read-stall.js
index e13b53711..e13b53711 100644
--- a/cli/tests/node_compat/test/parallel/test-stream2-large-read-stall.js
+++ b/tests/node_compat/test/parallel/test-stream2-large-read-stall.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream2-objects.js b/tests/node_compat/test/parallel/test-stream2-objects.js
index c5b2c981e..c5b2c981e 100644
--- a/cli/tests/node_compat/test/parallel/test-stream2-objects.js
+++ b/tests/node_compat/test/parallel/test-stream2-objects.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream2-pipe-error-handling.js b/tests/node_compat/test/parallel/test-stream2-pipe-error-handling.js
index ee8b0d656..ee8b0d656 100644
--- a/cli/tests/node_compat/test/parallel/test-stream2-pipe-error-handling.js
+++ b/tests/node_compat/test/parallel/test-stream2-pipe-error-handling.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream2-pipe-error-once-listener.js b/tests/node_compat/test/parallel/test-stream2-pipe-error-once-listener.js
index 990dfc67d..990dfc67d 100644
--- a/cli/tests/node_compat/test/parallel/test-stream2-pipe-error-once-listener.js
+++ b/tests/node_compat/test/parallel/test-stream2-pipe-error-once-listener.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream2-push.js b/tests/node_compat/test/parallel/test-stream2-push.js
index e1dcdec95..e1dcdec95 100644
--- a/cli/tests/node_compat/test/parallel/test-stream2-push.js
+++ b/tests/node_compat/test/parallel/test-stream2-push.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream2-read-sync-stack.js b/tests/node_compat/test/parallel/test-stream2-read-sync-stack.js
index 0d291ac08..0d291ac08 100644
--- a/cli/tests/node_compat/test/parallel/test-stream2-read-sync-stack.js
+++ b/tests/node_compat/test/parallel/test-stream2-read-sync-stack.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream2-readable-empty-buffer-no-eof.js b/tests/node_compat/test/parallel/test-stream2-readable-empty-buffer-no-eof.js
index fca3b11f2..fca3b11f2 100644
--- a/cli/tests/node_compat/test/parallel/test-stream2-readable-empty-buffer-no-eof.js
+++ b/tests/node_compat/test/parallel/test-stream2-readable-empty-buffer-no-eof.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream2-readable-from-list.js b/tests/node_compat/test/parallel/test-stream2-readable-from-list.js
index 90f93d040..90f93d040 100644
--- a/cli/tests/node_compat/test/parallel/test-stream2-readable-from-list.js
+++ b/tests/node_compat/test/parallel/test-stream2-readable-from-list.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream2-readable-legacy-drain.js b/tests/node_compat/test/parallel/test-stream2-readable-legacy-drain.js
index bf65fda0a..bf65fda0a 100644
--- a/cli/tests/node_compat/test/parallel/test-stream2-readable-legacy-drain.js
+++ b/tests/node_compat/test/parallel/test-stream2-readable-legacy-drain.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream2-readable-non-empty-end.js b/tests/node_compat/test/parallel/test-stream2-readable-non-empty-end.js
index c1e3a2f46..c1e3a2f46 100644
--- a/cli/tests/node_compat/test/parallel/test-stream2-readable-non-empty-end.js
+++ b/tests/node_compat/test/parallel/test-stream2-readable-non-empty-end.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream2-readable-wrap-destroy.js b/tests/node_compat/test/parallel/test-stream2-readable-wrap-destroy.js
index 8971536e7..8971536e7 100644
--- a/cli/tests/node_compat/test/parallel/test-stream2-readable-wrap-destroy.js
+++ b/tests/node_compat/test/parallel/test-stream2-readable-wrap-destroy.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream2-readable-wrap-empty.js b/tests/node_compat/test/parallel/test-stream2-readable-wrap-empty.js
index 5716d0bf9..5716d0bf9 100644
--- a/cli/tests/node_compat/test/parallel/test-stream2-readable-wrap-empty.js
+++ b/tests/node_compat/test/parallel/test-stream2-readable-wrap-empty.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream2-readable-wrap-error.js b/tests/node_compat/test/parallel/test-stream2-readable-wrap-error.js
index 77cb757c4..77cb757c4 100644
--- a/cli/tests/node_compat/test/parallel/test-stream2-readable-wrap-error.js
+++ b/tests/node_compat/test/parallel/test-stream2-readable-wrap-error.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream2-readable-wrap.js b/tests/node_compat/test/parallel/test-stream2-readable-wrap.js
index 2bf8e99b0..2bf8e99b0 100644
--- a/cli/tests/node_compat/test/parallel/test-stream2-readable-wrap.js
+++ b/tests/node_compat/test/parallel/test-stream2-readable-wrap.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream2-set-encoding.js b/tests/node_compat/test/parallel/test-stream2-set-encoding.js
index ed7023b29..ed7023b29 100644
--- a/cli/tests/node_compat/test/parallel/test-stream2-set-encoding.js
+++ b/tests/node_compat/test/parallel/test-stream2-set-encoding.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream2-transform.js b/tests/node_compat/test/parallel/test-stream2-transform.js
index 2bd376b1f..2bd376b1f 100644
--- a/cli/tests/node_compat/test/parallel/test-stream2-transform.js
+++ b/tests/node_compat/test/parallel/test-stream2-transform.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream2-unpipe-drain.js b/tests/node_compat/test/parallel/test-stream2-unpipe-drain.js
index 9c1a6844d..9c1a6844d 100644
--- a/cli/tests/node_compat/test/parallel/test-stream2-unpipe-drain.js
+++ b/tests/node_compat/test/parallel/test-stream2-unpipe-drain.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream2-unpipe-leak.js b/tests/node_compat/test/parallel/test-stream2-unpipe-leak.js
index 8958bc06b..8958bc06b 100644
--- a/cli/tests/node_compat/test/parallel/test-stream2-unpipe-leak.js
+++ b/tests/node_compat/test/parallel/test-stream2-unpipe-leak.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream2-writable.js b/tests/node_compat/test/parallel/test-stream2-writable.js
index 8b7197b9b..8b7197b9b 100644
--- a/cli/tests/node_compat/test/parallel/test-stream2-writable.js
+++ b/tests/node_compat/test/parallel/test-stream2-writable.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream3-cork-end.js b/tests/node_compat/test/parallel/test-stream3-cork-end.js
index 52f881121..52f881121 100644
--- a/cli/tests/node_compat/test/parallel/test-stream3-cork-end.js
+++ b/tests/node_compat/test/parallel/test-stream3-cork-end.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream3-cork-uncork.js b/tests/node_compat/test/parallel/test-stream3-cork-uncork.js
index 1fb993003..1fb993003 100644
--- a/cli/tests/node_compat/test/parallel/test-stream3-cork-uncork.js
+++ b/tests/node_compat/test/parallel/test-stream3-cork-uncork.js
diff --git a/cli/tests/node_compat/test/parallel/test-stream3-pause-then-read.js b/tests/node_compat/test/parallel/test-stream3-pause-then-read.js
index f840672ce..f840672ce 100644
--- a/cli/tests/node_compat/test/parallel/test-stream3-pause-then-read.js
+++ b/tests/node_compat/test/parallel/test-stream3-pause-then-read.js
diff --git a/cli/tests/node_compat/test/parallel/test-streams-highwatermark.js b/tests/node_compat/test/parallel/test-streams-highwatermark.js
index 9245f7db0..9245f7db0 100644
--- a/cli/tests/node_compat/test/parallel/test-streams-highwatermark.js
+++ b/tests/node_compat/test/parallel/test-streams-highwatermark.js
diff --git a/cli/tests/node_compat/test/parallel/test-timers-api-refs.js b/tests/node_compat/test/parallel/test-timers-api-refs.js
index 62ce55fad..62ce55fad 100644
--- a/cli/tests/node_compat/test/parallel/test-timers-api-refs.js
+++ b/tests/node_compat/test/parallel/test-timers-api-refs.js
diff --git a/cli/tests/node_compat/test/parallel/test-timers-args.js b/tests/node_compat/test/parallel/test-timers-args.js
index b771bf591..b771bf591 100644
--- a/cli/tests/node_compat/test/parallel/test-timers-args.js
+++ b/tests/node_compat/test/parallel/test-timers-args.js
diff --git a/cli/tests/node_compat/test/parallel/test-timers-clear-null-does-not-throw-error.js b/tests/node_compat/test/parallel/test-timers-clear-null-does-not-throw-error.js
index 7b7b59b27..7b7b59b27 100644
--- a/cli/tests/node_compat/test/parallel/test-timers-clear-null-does-not-throw-error.js
+++ b/tests/node_compat/test/parallel/test-timers-clear-null-does-not-throw-error.js
diff --git a/cli/tests/node_compat/test/parallel/test-timers-clear-object-does-not-throw-error.js b/tests/node_compat/test/parallel/test-timers-clear-object-does-not-throw-error.js
index 524389c6b..524389c6b 100644
--- a/cli/tests/node_compat/test/parallel/test-timers-clear-object-does-not-throw-error.js
+++ b/tests/node_compat/test/parallel/test-timers-clear-object-does-not-throw-error.js
diff --git a/cli/tests/node_compat/test/parallel/test-timers-clear-timeout-interval-equivalent.js b/tests/node_compat/test/parallel/test-timers-clear-timeout-interval-equivalent.js
index b6af3f943..b6af3f943 100644
--- a/cli/tests/node_compat/test/parallel/test-timers-clear-timeout-interval-equivalent.js
+++ b/tests/node_compat/test/parallel/test-timers-clear-timeout-interval-equivalent.js
diff --git a/cli/tests/node_compat/test/parallel/test-timers-clearImmediate.js b/tests/node_compat/test/parallel/test-timers-clearImmediate.js
index 129e301f2..129e301f2 100644
--- a/cli/tests/node_compat/test/parallel/test-timers-clearImmediate.js
+++ b/tests/node_compat/test/parallel/test-timers-clearImmediate.js
diff --git a/cli/tests/node_compat/test/parallel/test-timers-interval-throw.js b/tests/node_compat/test/parallel/test-timers-interval-throw.js
index d408fc866..d408fc866 100644
--- a/cli/tests/node_compat/test/parallel/test-timers-interval-throw.js
+++ b/tests/node_compat/test/parallel/test-timers-interval-throw.js
diff --git a/cli/tests/node_compat/test/parallel/test-timers-non-integer-delay.js b/tests/node_compat/test/parallel/test-timers-non-integer-delay.js
index 1d3ca55c2..1d3ca55c2 100644
--- a/cli/tests/node_compat/test/parallel/test-timers-non-integer-delay.js
+++ b/tests/node_compat/test/parallel/test-timers-non-integer-delay.js
diff --git a/cli/tests/node_compat/test/parallel/test-timers-refresh.js b/tests/node_compat/test/parallel/test-timers-refresh.js
index 942cf5604..942cf5604 100644
--- a/cli/tests/node_compat/test/parallel/test-timers-refresh.js
+++ b/tests/node_compat/test/parallel/test-timers-refresh.js
diff --git a/cli/tests/node_compat/test/parallel/test-timers-same-timeout-wrong-list-deleted.js b/tests/node_compat/test/parallel/test-timers-same-timeout-wrong-list-deleted.js
index fa6348d75..fa6348d75 100644
--- a/cli/tests/node_compat/test/parallel/test-timers-same-timeout-wrong-list-deleted.js
+++ b/tests/node_compat/test/parallel/test-timers-same-timeout-wrong-list-deleted.js
diff --git a/cli/tests/node_compat/test/parallel/test-timers-timeout-with-non-integer.js b/tests/node_compat/test/parallel/test-timers-timeout-with-non-integer.js
index d93ef57fe..d93ef57fe 100644
--- a/cli/tests/node_compat/test/parallel/test-timers-timeout-with-non-integer.js
+++ b/tests/node_compat/test/parallel/test-timers-timeout-with-non-integer.js
diff --git a/cli/tests/node_compat/test/parallel/test-timers-uncaught-exception.js b/tests/node_compat/test/parallel/test-timers-uncaught-exception.js
index e76c11afc..e76c11afc 100644
--- a/cli/tests/node_compat/test/parallel/test-timers-uncaught-exception.js
+++ b/tests/node_compat/test/parallel/test-timers-uncaught-exception.js
diff --git a/cli/tests/node_compat/test/parallel/test-timers-unref-throw-then-ref.js b/tests/node_compat/test/parallel/test-timers-unref-throw-then-ref.js
index 03a0861e2..03a0861e2 100644
--- a/cli/tests/node_compat/test/parallel/test-timers-unref-throw-then-ref.js
+++ b/tests/node_compat/test/parallel/test-timers-unref-throw-then-ref.js
diff --git a/cli/tests/node_compat/test/parallel/test-timers-user-call.js b/tests/node_compat/test/parallel/test-timers-user-call.js
index 969051f80..969051f80 100644
--- a/cli/tests/node_compat/test/parallel/test-timers-user-call.js
+++ b/tests/node_compat/test/parallel/test-timers-user-call.js
diff --git a/cli/tests/node_compat/test/parallel/test-timers-zero-timeout.js b/tests/node_compat/test/parallel/test-timers-zero-timeout.js
index ef32f7381..ef32f7381 100644
--- a/cli/tests/node_compat/test/parallel/test-timers-zero-timeout.js
+++ b/tests/node_compat/test/parallel/test-timers-zero-timeout.js
diff --git a/cli/tests/node_compat/test/parallel/test-tty-stdin-end.js b/tests/node_compat/test/parallel/test-tty-stdin-end.js
index ee38cbd2c..ee38cbd2c 100644
--- a/cli/tests/node_compat/test/parallel/test-tty-stdin-end.js
+++ b/tests/node_compat/test/parallel/test-tty-stdin-end.js
diff --git a/cli/tests/node_compat/test/parallel/test-ttywrap-invalid-fd.js b/tests/node_compat/test/parallel/test-ttywrap-invalid-fd.js
index 95b9bffe6..95b9bffe6 100644
--- a/cli/tests/node_compat/test/parallel/test-ttywrap-invalid-fd.js
+++ b/tests/node_compat/test/parallel/test-ttywrap-invalid-fd.js
diff --git a/cli/tests/node_compat/test/parallel/test-url-domain-ascii-unicode.js b/tests/node_compat/test/parallel/test-url-domain-ascii-unicode.js
index 9aeb23a54..9aeb23a54 100644
--- a/cli/tests/node_compat/test/parallel/test-url-domain-ascii-unicode.js
+++ b/tests/node_compat/test/parallel/test-url-domain-ascii-unicode.js
diff --git a/cli/tests/node_compat/test/parallel/test-url-fileurltopath.js b/tests/node_compat/test/parallel/test-url-fileurltopath.js
index 72ba73166..72ba73166 100644
--- a/cli/tests/node_compat/test/parallel/test-url-fileurltopath.js
+++ b/tests/node_compat/test/parallel/test-url-fileurltopath.js
diff --git a/cli/tests/node_compat/test/parallel/test-url-format-invalid-input.js b/tests/node_compat/test/parallel/test-url-format-invalid-input.js
index d411b8d32..d411b8d32 100644
--- a/cli/tests/node_compat/test/parallel/test-url-format-invalid-input.js
+++ b/tests/node_compat/test/parallel/test-url-format-invalid-input.js
diff --git a/cli/tests/node_compat/test/parallel/test-url-format-whatwg.js b/tests/node_compat/test/parallel/test-url-format-whatwg.js
index 1e9b36dcb..1e9b36dcb 100644
--- a/cli/tests/node_compat/test/parallel/test-url-format-whatwg.js
+++ b/tests/node_compat/test/parallel/test-url-format-whatwg.js
diff --git a/cli/tests/node_compat/test/parallel/test-url-format.js b/tests/node_compat/test/parallel/test-url-format.js
index 1208509c7..1208509c7 100644
--- a/cli/tests/node_compat/test/parallel/test-url-format.js
+++ b/tests/node_compat/test/parallel/test-url-format.js
diff --git a/cli/tests/node_compat/test/parallel/test-url-parse-invalid-input.js b/tests/node_compat/test/parallel/test-url-parse-invalid-input.js
index 345e8d338..345e8d338 100644
--- a/cli/tests/node_compat/test/parallel/test-url-parse-invalid-input.js
+++ b/tests/node_compat/test/parallel/test-url-parse-invalid-input.js
diff --git a/cli/tests/node_compat/test/parallel/test-url-parse-query.js b/tests/node_compat/test/parallel/test-url-parse-query.js
index f6ccb1f46..f6ccb1f46 100644
--- a/cli/tests/node_compat/test/parallel/test-url-parse-query.js
+++ b/tests/node_compat/test/parallel/test-url-parse-query.js
diff --git a/cli/tests/node_compat/test/parallel/test-url-pathtofileurl.js b/tests/node_compat/test/parallel/test-url-pathtofileurl.js
index bafd870aa..bafd870aa 100644
--- a/cli/tests/node_compat/test/parallel/test-url-pathtofileurl.js
+++ b/tests/node_compat/test/parallel/test-url-pathtofileurl.js
diff --git a/cli/tests/node_compat/test/parallel/test-url-relative.js b/tests/node_compat/test/parallel/test-url-relative.js
index 2bcddd96f..2bcddd96f 100644
--- a/cli/tests/node_compat/test/parallel/test-url-relative.js
+++ b/tests/node_compat/test/parallel/test-url-relative.js
diff --git a/cli/tests/node_compat/test/parallel/test-url-urltooptions.js b/tests/node_compat/test/parallel/test-url-urltooptions.js
index 05813f0ae..05813f0ae 100644
--- a/cli/tests/node_compat/test/parallel/test-url-urltooptions.js
+++ b/tests/node_compat/test/parallel/test-url-urltooptions.js
diff --git a/cli/tests/node_compat/test/parallel/test-util-deprecate-invalid-code.js b/tests/node_compat/test/parallel/test-util-deprecate-invalid-code.js
index 19093a3ae..19093a3ae 100644
--- a/cli/tests/node_compat/test/parallel/test-util-deprecate-invalid-code.js
+++ b/tests/node_compat/test/parallel/test-util-deprecate-invalid-code.js
diff --git a/cli/tests/node_compat/test/parallel/test-util-deprecate.js b/tests/node_compat/test/parallel/test-util-deprecate.js
index 2394caa22..2394caa22 100644
--- a/cli/tests/node_compat/test/parallel/test-util-deprecate.js
+++ b/tests/node_compat/test/parallel/test-util-deprecate.js
diff --git a/cli/tests/node_compat/test/parallel/test-util-format.js b/tests/node_compat/test/parallel/test-util-format.js
index 9d474c481..9d474c481 100644
--- a/cli/tests/node_compat/test/parallel/test-util-format.js
+++ b/tests/node_compat/test/parallel/test-util-format.js
diff --git a/cli/tests/node_compat/test/parallel/test-util-inherits.js b/tests/node_compat/test/parallel/test-util-inherits.js
index ac1ab596b..ac1ab596b 100644
--- a/cli/tests/node_compat/test/parallel/test-util-inherits.js
+++ b/tests/node_compat/test/parallel/test-util-inherits.js
diff --git a/cli/tests/node_compat/test/parallel/test-util-inspect-long-running.js b/tests/node_compat/test/parallel/test-util-inspect-long-running.js
index 67dc03ba4..67dc03ba4 100644
--- a/cli/tests/node_compat/test/parallel/test-util-inspect-long-running.js
+++ b/tests/node_compat/test/parallel/test-util-inspect-long-running.js
diff --git a/cli/tests/node_compat/test/parallel/test-util-inspect-namespace.js b/tests/node_compat/test/parallel/test-util-inspect-namespace.js
index 786f05671..786f05671 100644
--- a/cli/tests/node_compat/test/parallel/test-util-inspect-namespace.js
+++ b/tests/node_compat/test/parallel/test-util-inspect-namespace.js
diff --git a/cli/tests/node_compat/test/parallel/test-util-inspect-proxy.js b/tests/node_compat/test/parallel/test-util-inspect-proxy.js
index ef78ab07a..ef78ab07a 100644
--- a/cli/tests/node_compat/test/parallel/test-util-inspect-proxy.js
+++ b/tests/node_compat/test/parallel/test-util-inspect-proxy.js
diff --git a/cli/tests/node_compat/test/parallel/test-util-inspect.js b/tests/node_compat/test/parallel/test-util-inspect.js
index 17fafed2e..17fafed2e 100644
--- a/cli/tests/node_compat/test/parallel/test-util-inspect.js
+++ b/tests/node_compat/test/parallel/test-util-inspect.js
diff --git a/cli/tests/node_compat/test/parallel/test-util-isDeepStrictEqual.js b/tests/node_compat/test/parallel/test-util-isDeepStrictEqual.js
index 25caac1f7..25caac1f7 100644
--- a/cli/tests/node_compat/test/parallel/test-util-isDeepStrictEqual.js
+++ b/tests/node_compat/test/parallel/test-util-isDeepStrictEqual.js
diff --git a/cli/tests/node_compat/test/parallel/test-util-promisify.js b/tests/node_compat/test/parallel/test-util-promisify.js
index 8046f6fb8..8046f6fb8 100644
--- a/cli/tests/node_compat/test/parallel/test-util-promisify.js
+++ b/tests/node_compat/test/parallel/test-util-promisify.js
diff --git a/cli/tests/node_compat/test/parallel/test-util-types-exists.js b/tests/node_compat/test/parallel/test-util-types-exists.js
index 0c04a38b0..0c04a38b0 100644
--- a/cli/tests/node_compat/test/parallel/test-util-types-exists.js
+++ b/tests/node_compat/test/parallel/test-util-types-exists.js
diff --git a/cli/tests/node_compat/test/parallel/test-util-types.js b/tests/node_compat/test/parallel/test-util-types.js
index d401a282c..d401a282c 100644
--- a/cli/tests/node_compat/test/parallel/test-util-types.js
+++ b/tests/node_compat/test/parallel/test-util-types.js
diff --git a/cli/tests/node_compat/test/parallel/test-util.js b/tests/node_compat/test/parallel/test-util.js
index eaffc7f6d..eaffc7f6d 100644
--- a/cli/tests/node_compat/test/parallel/test-util.js
+++ b/tests/node_compat/test/parallel/test-util.js
diff --git a/cli/tests/node_compat/test/parallel/test-vm-new-script-this-context.js b/tests/node_compat/test/parallel/test-vm-new-script-this-context.js
index 9a9d8fb13..9a9d8fb13 100644
--- a/cli/tests/node_compat/test/parallel/test-vm-new-script-this-context.js
+++ b/tests/node_compat/test/parallel/test-vm-new-script-this-context.js
diff --git a/cli/tests/node_compat/test/parallel/test-vm-static-this.js b/tests/node_compat/test/parallel/test-vm-static-this.js
index c6804cfc0..c6804cfc0 100644
--- a/cli/tests/node_compat/test/parallel/test-vm-static-this.js
+++ b/tests/node_compat/test/parallel/test-vm-static-this.js
diff --git a/cli/tests/node_compat/test/parallel/test-webcrypto-sign-verify.js b/tests/node_compat/test/parallel/test-webcrypto-sign-verify.js
index 23df883ee..23df883ee 100644
--- a/cli/tests/node_compat/test/parallel/test-webcrypto-sign-verify.js
+++ b/tests/node_compat/test/parallel/test-webcrypto-sign-verify.js
diff --git a/cli/tests/node_compat/test/parallel/test-whatwg-encoding-custom-api-basics.js b/tests/node_compat/test/parallel/test-whatwg-encoding-custom-api-basics.js
index e423c25d0..e423c25d0 100644
--- a/cli/tests/node_compat/test/parallel/test-whatwg-encoding-custom-api-basics.js
+++ b/tests/node_compat/test/parallel/test-whatwg-encoding-custom-api-basics.js
diff --git a/cli/tests/node_compat/test/parallel/test-whatwg-encoding-custom-textdecoder-ignorebom.js b/tests/node_compat/test/parallel/test-whatwg-encoding-custom-textdecoder-ignorebom.js
index 58488d25d..58488d25d 100644
--- a/cli/tests/node_compat/test/parallel/test-whatwg-encoding-custom-textdecoder-ignorebom.js
+++ b/tests/node_compat/test/parallel/test-whatwg-encoding-custom-textdecoder-ignorebom.js
diff --git a/cli/tests/node_compat/test/parallel/test-whatwg-encoding-custom-textdecoder-streaming.js b/tests/node_compat/test/parallel/test-whatwg-encoding-custom-textdecoder-streaming.js
index ef9cecc0f..ef9cecc0f 100644
--- a/cli/tests/node_compat/test/parallel/test-whatwg-encoding-custom-textdecoder-streaming.js
+++ b/tests/node_compat/test/parallel/test-whatwg-encoding-custom-textdecoder-streaming.js
diff --git a/cli/tests/node_compat/test/parallel/test-whatwg-events-add-event-listener-options-passive.js b/tests/node_compat/test/parallel/test-whatwg-events-add-event-listener-options-passive.js
index e2bc96139..e2bc96139 100644
--- a/cli/tests/node_compat/test/parallel/test-whatwg-events-add-event-listener-options-passive.js
+++ b/tests/node_compat/test/parallel/test-whatwg-events-add-event-listener-options-passive.js
diff --git a/cli/tests/node_compat/test/parallel/test-whatwg-events-add-event-listener-options-signal.js b/tests/node_compat/test/parallel/test-whatwg-events-add-event-listener-options-signal.js
index 80d09c4b7..80d09c4b7 100644
--- a/cli/tests/node_compat/test/parallel/test-whatwg-events-add-event-listener-options-signal.js
+++ b/tests/node_compat/test/parallel/test-whatwg-events-add-event-listener-options-signal.js
diff --git a/cli/tests/node_compat/test/parallel/test-whatwg-events-customevent.js b/tests/node_compat/test/parallel/test-whatwg-events-customevent.js
index 749c838de..749c838de 100644
--- a/cli/tests/node_compat/test/parallel/test-whatwg-events-customevent.js
+++ b/tests/node_compat/test/parallel/test-whatwg-events-customevent.js
diff --git a/cli/tests/node_compat/test/parallel/test-whatwg-url-custom-deepequal.js b/tests/node_compat/test/parallel/test-whatwg-url-custom-deepequal.js
index e33590530..e33590530 100644
--- a/cli/tests/node_compat/test/parallel/test-whatwg-url-custom-deepequal.js
+++ b/tests/node_compat/test/parallel/test-whatwg-url-custom-deepequal.js
diff --git a/cli/tests/node_compat/test/parallel/test-whatwg-url-custom-global.js b/tests/node_compat/test/parallel/test-whatwg-url-custom-global.js
index b7880d8c2..b7880d8c2 100644
--- a/cli/tests/node_compat/test/parallel/test-whatwg-url-custom-global.js
+++ b/tests/node_compat/test/parallel/test-whatwg-url-custom-global.js
diff --git a/cli/tests/node_compat/test/parallel/test-whatwg-url-custom-href-side-effect.js b/tests/node_compat/test/parallel/test-whatwg-url-custom-href-side-effect.js
index de175e357..de175e357 100644
--- a/cli/tests/node_compat/test/parallel/test-whatwg-url-custom-href-side-effect.js
+++ b/tests/node_compat/test/parallel/test-whatwg-url-custom-href-side-effect.js
diff --git a/cli/tests/node_compat/test/parallel/test-whatwg-url-custom-tostringtag.js b/tests/node_compat/test/parallel/test-whatwg-url-custom-tostringtag.js
index add70bc34..add70bc34 100644
--- a/cli/tests/node_compat/test/parallel/test-whatwg-url-custom-tostringtag.js
+++ b/tests/node_compat/test/parallel/test-whatwg-url-custom-tostringtag.js
diff --git a/cli/tests/node_compat/test/parallel/test-whatwg-url-override-hostname.js b/tests/node_compat/test/parallel/test-whatwg-url-override-hostname.js
index 1fcdefdf7..1fcdefdf7 100644
--- a/cli/tests/node_compat/test/parallel/test-whatwg-url-override-hostname.js
+++ b/tests/node_compat/test/parallel/test-whatwg-url-override-hostname.js
diff --git a/cli/tests/node_compat/test/parallel/test-whatwg-url-properties.js b/tests/node_compat/test/parallel/test-whatwg-url-properties.js
index 8a4f4e57b..8a4f4e57b 100644
--- a/cli/tests/node_compat/test/parallel/test-whatwg-url-properties.js
+++ b/tests/node_compat/test/parallel/test-whatwg-url-properties.js
diff --git a/cli/tests/node_compat/test/parallel/test-zlib-close-after-error.js b/tests/node_compat/test/parallel/test-zlib-close-after-error.js
index 55f1d6b02..55f1d6b02 100644
--- a/cli/tests/node_compat/test/parallel/test-zlib-close-after-error.js
+++ b/tests/node_compat/test/parallel/test-zlib-close-after-error.js
diff --git a/cli/tests/node_compat/test/parallel/test-zlib-close-after-write.js b/tests/node_compat/test/parallel/test-zlib-close-after-write.js
index 94fa4eb20..94fa4eb20 100644
--- a/cli/tests/node_compat/test/parallel/test-zlib-close-after-write.js
+++ b/tests/node_compat/test/parallel/test-zlib-close-after-write.js
diff --git a/cli/tests/node_compat/test/parallel/test-zlib-convenience-methods.js b/tests/node_compat/test/parallel/test-zlib-convenience-methods.js
index cf6694b1f..cf6694b1f 100644
--- a/cli/tests/node_compat/test/parallel/test-zlib-convenience-methods.js
+++ b/tests/node_compat/test/parallel/test-zlib-convenience-methods.js
diff --git a/cli/tests/node_compat/test/parallel/test-zlib-deflate-raw-inherits.js b/tests/node_compat/test/parallel/test-zlib-deflate-raw-inherits.js
index 58c069c74..58c069c74 100644
--- a/cli/tests/node_compat/test/parallel/test-zlib-deflate-raw-inherits.js
+++ b/tests/node_compat/test/parallel/test-zlib-deflate-raw-inherits.js
diff --git a/cli/tests/node_compat/test/parallel/test-zlib-destroy-pipe.js b/tests/node_compat/test/parallel/test-zlib-destroy-pipe.js
index 274068f9f..274068f9f 100644
--- a/cli/tests/node_compat/test/parallel/test-zlib-destroy-pipe.js
+++ b/tests/node_compat/test/parallel/test-zlib-destroy-pipe.js
diff --git a/cli/tests/node_compat/test/parallel/test-zlib-empty-buffer.js b/tests/node_compat/test/parallel/test-zlib-empty-buffer.js
index 2281ba88e..2281ba88e 100644
--- a/cli/tests/node_compat/test/parallel/test-zlib-empty-buffer.js
+++ b/tests/node_compat/test/parallel/test-zlib-empty-buffer.js
diff --git a/cli/tests/node_compat/test/parallel/test-zlib-from-string.js b/tests/node_compat/test/parallel/test-zlib-from-string.js
index dc238220b..dc238220b 100644
--- a/cli/tests/node_compat/test/parallel/test-zlib-from-string.js
+++ b/tests/node_compat/test/parallel/test-zlib-from-string.js
diff --git a/cli/tests/node_compat/test/parallel/test-zlib-invalid-input.js b/tests/node_compat/test/parallel/test-zlib-invalid-input.js
index d8ecae521..d8ecae521 100644
--- a/cli/tests/node_compat/test/parallel/test-zlib-invalid-input.js
+++ b/tests/node_compat/test/parallel/test-zlib-invalid-input.js
diff --git a/cli/tests/node_compat/test/parallel/test-zlib-no-stream.js b/tests/node_compat/test/parallel/test-zlib-no-stream.js
index 27b352406..27b352406 100644
--- a/cli/tests/node_compat/test/parallel/test-zlib-no-stream.js
+++ b/tests/node_compat/test/parallel/test-zlib-no-stream.js
diff --git a/cli/tests/node_compat/test/parallel/test-zlib-random-byte-pipes.js b/tests/node_compat/test/parallel/test-zlib-random-byte-pipes.js
index 56409d411..56409d411 100644
--- a/cli/tests/node_compat/test/parallel/test-zlib-random-byte-pipes.js
+++ b/tests/node_compat/test/parallel/test-zlib-random-byte-pipes.js
diff --git a/cli/tests/node_compat/test/parallel/test-zlib-sync-no-event.js b/tests/node_compat/test/parallel/test-zlib-sync-no-event.js
index 62019677c..62019677c 100644
--- a/cli/tests/node_compat/test/parallel/test-zlib-sync-no-event.js
+++ b/tests/node_compat/test/parallel/test-zlib-sync-no-event.js
diff --git a/cli/tests/node_compat/test/parallel/test-zlib-truncated.js b/tests/node_compat/test/parallel/test-zlib-truncated.js
index 60e730171..60e730171 100644
--- a/cli/tests/node_compat/test/parallel/test-zlib-truncated.js
+++ b/tests/node_compat/test/parallel/test-zlib-truncated.js
diff --git a/cli/tests/node_compat/test/parallel/test-zlib-unzip-one-byte-chunks.js b/tests/node_compat/test/parallel/test-zlib-unzip-one-byte-chunks.js
index 62b2050d3..62b2050d3 100644
--- a/cli/tests/node_compat/test/parallel/test-zlib-unzip-one-byte-chunks.js
+++ b/tests/node_compat/test/parallel/test-zlib-unzip-one-byte-chunks.js
diff --git a/cli/tests/node_compat/test/parallel/test-zlib-write-after-end.js b/tests/node_compat/test/parallel/test-zlib-write-after-end.js
index 7c7e3ea35..7c7e3ea35 100644
--- a/cli/tests/node_compat/test/parallel/test-zlib-write-after-end.js
+++ b/tests/node_compat/test/parallel/test-zlib-write-after-end.js
diff --git a/cli/tests/node_compat/test/parallel/test-zlib-write-after-flush.js b/tests/node_compat/test/parallel/test-zlib-write-after-flush.js
index 6f33668c7..6f33668c7 100644
--- a/cli/tests/node_compat/test/parallel/test-zlib-write-after-flush.js
+++ b/tests/node_compat/test/parallel/test-zlib-write-after-flush.js
diff --git a/cli/tests/node_compat/test/parallel/test-zlib-zero-byte.js b/tests/node_compat/test/parallel/test-zlib-zero-byte.js
index fb12b2280..fb12b2280 100644
--- a/cli/tests/node_compat/test/parallel/test-zlib-zero-byte.js
+++ b/tests/node_compat/test/parallel/test-zlib-zero-byte.js
diff --git a/cli/tests/node_compat/test/parallel/test-zlib-zero-windowBits.js b/tests/node_compat/test/parallel/test-zlib-zero-windowBits.js
index fe74fe6d8..fe74fe6d8 100644
--- a/cli/tests/node_compat/test/parallel/test-zlib-zero-windowBits.js
+++ b/tests/node_compat/test/parallel/test-zlib-zero-windowBits.js
diff --git a/cli/tests/node_compat/test/pseudo-tty/console-dumb-tty.js b/tests/node_compat/test/pseudo-tty/console-dumb-tty.js
index 9b4bd1520..9b4bd1520 100644
--- a/cli/tests/node_compat/test/pseudo-tty/console-dumb-tty.js
+++ b/tests/node_compat/test/pseudo-tty/console-dumb-tty.js
diff --git a/cli/tests/node_compat/test/pseudo-tty/console_colors.js b/tests/node_compat/test/pseudo-tty/console_colors.js
index 2be464457..2be464457 100644
--- a/cli/tests/node_compat/test/pseudo-tty/console_colors.js
+++ b/tests/node_compat/test/pseudo-tty/console_colors.js
diff --git a/cli/tests/node_compat/test/pseudo-tty/no_dropped_stdio.js b/tests/node_compat/test/pseudo-tty/no_dropped_stdio.js
index d2bbb92c5..d2bbb92c5 100644
--- a/cli/tests/node_compat/test/pseudo-tty/no_dropped_stdio.js
+++ b/tests/node_compat/test/pseudo-tty/no_dropped_stdio.js
diff --git a/cli/tests/node_compat/test/pseudo-tty/no_interleaved_stdio.js b/tests/node_compat/test/pseudo-tty/no_interleaved_stdio.js
index 895124420..895124420 100644
--- a/cli/tests/node_compat/test/pseudo-tty/no_interleaved_stdio.js
+++ b/tests/node_compat/test/pseudo-tty/no_interleaved_stdio.js
diff --git a/cli/tests/node_compat/test/pseudo-tty/package.json b/tests/node_compat/test/pseudo-tty/package.json
index 0967ef424..0967ef424 100644
--- a/cli/tests/node_compat/test/pseudo-tty/package.json
+++ b/tests/node_compat/test/pseudo-tty/package.json
diff --git a/cli/tests/node_compat/test/pseudo-tty/test-tty-color-support-warning-2.js b/tests/node_compat/test/pseudo-tty/test-tty-color-support-warning-2.js
index 6a969ac9e..6a969ac9e 100644
--- a/cli/tests/node_compat/test/pseudo-tty/test-tty-color-support-warning-2.js
+++ b/tests/node_compat/test/pseudo-tty/test-tty-color-support-warning-2.js
diff --git a/cli/tests/node_compat/test/pseudo-tty/test-tty-color-support-warning.js b/tests/node_compat/test/pseudo-tty/test-tty-color-support-warning.js
index a9338105c..a9338105c 100644
--- a/cli/tests/node_compat/test/pseudo-tty/test-tty-color-support-warning.js
+++ b/tests/node_compat/test/pseudo-tty/test-tty-color-support-warning.js
diff --git a/cli/tests/node_compat/test/pseudo-tty/test-tty-stdin-end.js b/tests/node_compat/test/pseudo-tty/test-tty-stdin-end.js
index ee38cbd2c..ee38cbd2c 100644
--- a/cli/tests/node_compat/test/pseudo-tty/test-tty-stdin-end.js
+++ b/tests/node_compat/test/pseudo-tty/test-tty-stdin-end.js
diff --git a/cli/tests/node_compat/test/pseudo-tty/test-tty-stdout-end.js b/tests/node_compat/test/pseudo-tty/test-tty-stdout-end.js
index bd30a9a2e..bd30a9a2e 100644
--- a/cli/tests/node_compat/test/pseudo-tty/test-tty-stdout-end.js
+++ b/tests/node_compat/test/pseudo-tty/test-tty-stdout-end.js
diff --git a/cli/tests/node_compat/test/pummel/package.json b/tests/node_compat/test/pummel/package.json
index 0967ef424..0967ef424 100644
--- a/cli/tests/node_compat/test/pummel/package.json
+++ b/tests/node_compat/test/pummel/package.json
diff --git a/cli/tests/node_compat/test/sequential/package.json b/tests/node_compat/test/sequential/package.json
index 0967ef424..0967ef424 100644
--- a/cli/tests/node_compat/test/sequential/package.json
+++ b/tests/node_compat/test/sequential/package.json
diff --git a/cli/tests/node_compat/test/sequential/test-child-process-exit.js b/tests/node_compat/test/sequential/test-child-process-exit.js
index c8930b059..c8930b059 100644
--- a/cli/tests/node_compat/test/sequential/test-child-process-exit.js
+++ b/tests/node_compat/test/sequential/test-child-process-exit.js
diff --git a/cli/tests/testdata/allow_run_allowlist_resolution.ts b/tests/testdata/allow_run_allowlist_resolution.ts
index c7369d928..c7369d928 100644
--- a/cli/tests/testdata/allow_run_allowlist_resolution.ts
+++ b/tests/testdata/allow_run_allowlist_resolution.ts
diff --git a/cli/tests/testdata/allow_run_allowlist_resolution.ts.out b/tests/testdata/allow_run_allowlist_resolution.ts.out
index 16ba6754a..16ba6754a 100644
--- a/cli/tests/testdata/allow_run_allowlist_resolution.ts.out
+++ b/tests/testdata/allow_run_allowlist_resolution.ts.out
diff --git a/cli/tests/testdata/assets/DenoWinRunner.cs b/tests/testdata/assets/DenoWinRunner.cs
index 2f9e9f89f..2f9e9f89f 100644
--- a/cli/tests/testdata/assets/DenoWinRunner.cs
+++ b/tests/testdata/assets/DenoWinRunner.cs
diff --git a/cli/tests/testdata/assets/DenoWinRunner.ps1 b/tests/testdata/assets/DenoWinRunner.ps1
index 203b5d36c..203b5d36c 100644
--- a/cli/tests/testdata/assets/DenoWinRunner.ps1
+++ b/tests/testdata/assets/DenoWinRunner.ps1
diff --git a/cli/tests/testdata/assets/deno_dom_0.1.3-alpha2.wasm b/tests/testdata/assets/deno_dom_0.1.3-alpha2.wasm
index 6dd9d0e91..6dd9d0e91 100644
--- a/cli/tests/testdata/assets/deno_dom_0.1.3-alpha2.wasm
+++ b/tests/testdata/assets/deno_dom_0.1.3-alpha2.wasm
Binary files differ
diff --git a/cli/tests/testdata/assets/fixture.json b/tests/testdata/assets/fixture.json
index 56e056b6a..56e056b6a 100644
--- a/cli/tests/testdata/assets/fixture.json
+++ b/tests/testdata/assets/fixture.json
diff --git a/cli/tests/testdata/assets/hello.txt b/tests/testdata/assets/hello.txt
index 6769dd60b..6769dd60b 100644
--- a/cli/tests/testdata/assets/hello.txt
+++ b/tests/testdata/assets/hello.txt
diff --git a/cli/tests/testdata/assets/lock_target.txt b/tests/testdata/assets/lock_target.txt
index 5a29d1c26..5a29d1c26 100644
--- a/cli/tests/testdata/assets/lock_target.txt
+++ b/tests/testdata/assets/lock_target.txt
diff --git a/cli/tests/testdata/assets/unreachable.wasm b/tests/testdata/assets/unreachable.wasm
index a4110ee39..a4110ee39 100644
--- a/cli/tests/testdata/assets/unreachable.wasm
+++ b/tests/testdata/assets/unreachable.wasm
Binary files differ
diff --git a/cli/tests/testdata/bench/allow_all.out b/tests/testdata/bench/allow_all.out
index b118856e9..b118856e9 100644
--- a/cli/tests/testdata/bench/allow_all.out
+++ b/tests/testdata/bench/allow_all.out
diff --git a/tests/testdata/bench/allow_all.ts b/tests/testdata/bench/allow_all.ts
new file mode 100644
index 000000000..43e005b58
--- /dev/null
+++ b/tests/testdata/bench/allow_all.ts
@@ -0,0 +1,43 @@
+import { assertEquals } from "../../../test_util/std/assert/mod.ts";
+
+const permissions: Deno.PermissionName[] = [
+ "read",
+ "write",
+ "net",
+ "env",
+ "run",
+ "ffi",
+ "hrtime",
+];
+
+for (const name of permissions) {
+ Deno.bench({
+ name: `${name} false`,
+ permissions: {
+ [name]: false,
+ },
+ async fn() {
+ for await (const n of permissions) {
+ const status = await Deno.permissions.query({ name: n });
+ assertEquals(status.state, "prompt");
+ }
+ },
+ });
+
+ Deno.bench({
+ name: `${name} true`,
+ permissions: {
+ [name]: true,
+ },
+ async fn() {
+ for await (const n of permissions) {
+ const status = await Deno.permissions.query({ name: n });
+ if (n === name) {
+ assertEquals(status.state, "granted");
+ } else {
+ assertEquals(status.state, "prompt");
+ }
+ }
+ },
+ });
+}
diff --git a/cli/tests/testdata/bench/allow_none.out b/tests/testdata/bench/allow_none.out
index 7c443075b..7c443075b 100644
--- a/cli/tests/testdata/bench/allow_none.out
+++ b/tests/testdata/bench/allow_none.out
diff --git a/tests/testdata/bench/allow_none.ts b/tests/testdata/bench/allow_none.ts
new file mode 100644
index 000000000..62eb9c4c6
--- /dev/null
+++ b/tests/testdata/bench/allow_none.ts
@@ -0,0 +1,23 @@
+import { unreachable } from "../../../test_util/std/assert/mod.ts";
+
+const permissions: Deno.PermissionName[] = [
+ "read",
+ "write",
+ "net",
+ "env",
+ "run",
+ "ffi",
+ "hrtime",
+];
+
+for (const name of permissions) {
+ Deno.bench({
+ name,
+ permissions: {
+ [name]: true,
+ },
+ fn() {
+ unreachable();
+ },
+ });
+}
diff --git a/cli/tests/testdata/bench/before_unload_prevent_default.out b/tests/testdata/bench/before_unload_prevent_default.out
index dcb6d8194..dcb6d8194 100644
--- a/cli/tests/testdata/bench/before_unload_prevent_default.out
+++ b/tests/testdata/bench/before_unload_prevent_default.out
diff --git a/cli/tests/testdata/bench/before_unload_prevent_default.ts b/tests/testdata/bench/before_unload_prevent_default.ts
index 2759d4659..2759d4659 100644
--- a/cli/tests/testdata/bench/before_unload_prevent_default.ts
+++ b/tests/testdata/bench/before_unload_prevent_default.ts
diff --git a/cli/tests/testdata/bench/bench_formatting.out b/tests/testdata/bench/bench_formatting.out
index 5e3eed1cd..5e3eed1cd 100644
--- a/cli/tests/testdata/bench/bench_formatting.out
+++ b/tests/testdata/bench/bench_formatting.out
diff --git a/cli/tests/testdata/bench/bench_formatting.ts b/tests/testdata/bench/bench_formatting.ts
index fdee15abb..fdee15abb 100644
--- a/cli/tests/testdata/bench/bench_formatting.ts
+++ b/tests/testdata/bench/bench_formatting.ts
diff --git a/cli/tests/testdata/bench/check_local_by_default.out b/tests/testdata/bench/check_local_by_default.out
index bf07bcc44..bf07bcc44 100644
--- a/cli/tests/testdata/bench/check_local_by_default.out
+++ b/tests/testdata/bench/check_local_by_default.out
diff --git a/cli/tests/testdata/bench/check_local_by_default.ts b/tests/testdata/bench/check_local_by_default.ts
index 2ae8c2692..2ae8c2692 100644
--- a/cli/tests/testdata/bench/check_local_by_default.ts
+++ b/tests/testdata/bench/check_local_by_default.ts
diff --git a/cli/tests/testdata/bench/check_local_by_default2.out b/tests/testdata/bench/check_local_by_default2.out
index 01aeda636..01aeda636 100644
--- a/cli/tests/testdata/bench/check_local_by_default2.out
+++ b/tests/testdata/bench/check_local_by_default2.out
diff --git a/cli/tests/testdata/bench/check_local_by_default2.ts b/tests/testdata/bench/check_local_by_default2.ts
index 5177ff944..5177ff944 100644
--- a/cli/tests/testdata/bench/check_local_by_default2.ts
+++ b/tests/testdata/bench/check_local_by_default2.ts
diff --git a/cli/tests/testdata/bench/clear_timeout.out b/tests/testdata/bench/clear_timeout.out
index fe17b4ae3..fe17b4ae3 100644
--- a/cli/tests/testdata/bench/clear_timeout.out
+++ b/tests/testdata/bench/clear_timeout.out
diff --git a/cli/tests/testdata/bench/clear_timeout.ts b/tests/testdata/bench/clear_timeout.ts
index 4148263ac..4148263ac 100644
--- a/cli/tests/testdata/bench/clear_timeout.ts
+++ b/tests/testdata/bench/clear_timeout.ts
diff --git a/cli/tests/testdata/bench/collect.out b/tests/testdata/bench/collect.out
index 03c75922b..03c75922b 100644
--- a/cli/tests/testdata/bench/collect.out
+++ b/tests/testdata/bench/collect.out
diff --git a/cli/tests/testdata/bench/collect/bench.ts b/tests/testdata/bench/collect/bench.ts
index e69de29bb..e69de29bb 100644
--- a/cli/tests/testdata/bench/collect/bench.ts
+++ b/tests/testdata/bench/collect/bench.ts
diff --git a/cli/tests/testdata/bench/collect/deno.jsonc b/tests/testdata/bench/collect/deno.jsonc
index 7f8f190d3..7f8f190d3 100644
--- a/cli/tests/testdata/bench/collect/deno.jsonc
+++ b/tests/testdata/bench/collect/deno.jsonc
diff --git a/cli/tests/testdata/bench/collect/deno.malformed.jsonc b/tests/testdata/bench/collect/deno.malformed.jsonc
index 8e558fbcf..8e558fbcf 100644
--- a/cli/tests/testdata/bench/collect/deno.malformed.jsonc
+++ b/tests/testdata/bench/collect/deno.malformed.jsonc
diff --git a/cli/tests/testdata/bench/collect/deno2.jsonc b/tests/testdata/bench/collect/deno2.jsonc
index 653ab1e31..653ab1e31 100644
--- a/cli/tests/testdata/bench/collect/deno2.jsonc
+++ b/tests/testdata/bench/collect/deno2.jsonc
diff --git a/cli/tests/testdata/bench/collect/ignore/bench.ts b/tests/testdata/bench/collect/ignore/bench.ts
index 16fb63ba7..16fb63ba7 100644
--- a/cli/tests/testdata/bench/collect/ignore/bench.ts
+++ b/tests/testdata/bench/collect/ignore/bench.ts
diff --git a/cli/tests/testdata/bench/collect/include/2_bench.ts b/tests/testdata/bench/collect/include/2_bench.ts
index e69de29bb..e69de29bb 100644
--- a/cli/tests/testdata/bench/collect/include/2_bench.ts
+++ b/tests/testdata/bench/collect/include/2_bench.ts
diff --git a/cli/tests/testdata/bench/collect/include/bench.ts b/tests/testdata/bench/collect/include/bench.ts
index e69de29bb..e69de29bb 100644
--- a/cli/tests/testdata/bench/collect/include/bench.ts
+++ b/tests/testdata/bench/collect/include/bench.ts
diff --git a/cli/tests/testdata/bench/collect2.out b/tests/testdata/bench/collect2.out
index 00b8bfc0d..00b8bfc0d 100644
--- a/cli/tests/testdata/bench/collect2.out
+++ b/tests/testdata/bench/collect2.out
diff --git a/cli/tests/testdata/bench/collect_with_malformed_config.out b/tests/testdata/bench/collect_with_malformed_config.out
index 92e5e29d2..92e5e29d2 100644
--- a/cli/tests/testdata/bench/collect_with_malformed_config.out
+++ b/tests/testdata/bench/collect_with_malformed_config.out
diff --git a/cli/tests/testdata/bench/exit_sanitizer.out b/tests/testdata/bench/exit_sanitizer.out
index 9f15d3f26..9f15d3f26 100644
--- a/cli/tests/testdata/bench/exit_sanitizer.out
+++ b/tests/testdata/bench/exit_sanitizer.out
diff --git a/cli/tests/testdata/bench/exit_sanitizer.ts b/tests/testdata/bench/exit_sanitizer.ts
index 8e596b310..8e596b310 100644
--- a/cli/tests/testdata/bench/exit_sanitizer.ts
+++ b/tests/testdata/bench/exit_sanitizer.ts
diff --git a/cli/tests/testdata/bench/explicit_start_and_end.out b/tests/testdata/bench/explicit_start_and_end.out
index fa118540c..fa118540c 100644
--- a/cli/tests/testdata/bench/explicit_start_and_end.out
+++ b/tests/testdata/bench/explicit_start_and_end.out
diff --git a/cli/tests/testdata/bench/explicit_start_and_end.ts b/tests/testdata/bench/explicit_start_and_end.ts
index 60a3d10d7..60a3d10d7 100644
--- a/cli/tests/testdata/bench/explicit_start_and_end.ts
+++ b/tests/testdata/bench/explicit_start_and_end.ts
diff --git a/cli/tests/testdata/bench/explicit_start_and_end_low_precision.out b/tests/testdata/bench/explicit_start_and_end_low_precision.out
index 6dc66cfcc..6dc66cfcc 100644
--- a/cli/tests/testdata/bench/explicit_start_and_end_low_precision.out
+++ b/tests/testdata/bench/explicit_start_and_end_low_precision.out
diff --git a/cli/tests/testdata/bench/explicit_start_and_end_low_precision.ts b/tests/testdata/bench/explicit_start_and_end_low_precision.ts
index 23bdf19fe..23bdf19fe 100644
--- a/cli/tests/testdata/bench/explicit_start_and_end_low_precision.ts
+++ b/tests/testdata/bench/explicit_start_and_end_low_precision.ts
diff --git a/cli/tests/testdata/bench/fail.out b/tests/testdata/bench/fail.out
index ff3c29b92..ff3c29b92 100644
--- a/cli/tests/testdata/bench/fail.out
+++ b/tests/testdata/bench/fail.out
diff --git a/cli/tests/testdata/bench/fail.ts b/tests/testdata/bench/fail.ts
index 33d70ce55..33d70ce55 100644
--- a/cli/tests/testdata/bench/fail.ts
+++ b/tests/testdata/bench/fail.ts
diff --git a/cli/tests/testdata/bench/file_protocol.out b/tests/testdata/bench/file_protocol.out
index 7086c861c..7086c861c 100644
--- a/cli/tests/testdata/bench/file_protocol.out
+++ b/tests/testdata/bench/file_protocol.out
diff --git a/cli/tests/testdata/bench/file_protocol.ts b/tests/testdata/bench/file_protocol.ts
index 06a07bb38..06a07bb38 100644
--- a/cli/tests/testdata/bench/file_protocol.ts
+++ b/tests/testdata/bench/file_protocol.ts
diff --git a/cli/tests/testdata/bench/filter.out b/tests/testdata/bench/filter.out
index 970171e0b..970171e0b 100644
--- a/cli/tests/testdata/bench/filter.out
+++ b/tests/testdata/bench/filter.out
diff --git a/cli/tests/testdata/bench/filter/a_bench.ts b/tests/testdata/bench/filter/a_bench.ts
index fc4ef859c..fc4ef859c 100644
--- a/cli/tests/testdata/bench/filter/a_bench.ts
+++ b/tests/testdata/bench/filter/a_bench.ts
diff --git a/cli/tests/testdata/bench/filter/b_bench.ts b/tests/testdata/bench/filter/b_bench.ts
index fc4ef859c..fc4ef859c 100644
--- a/cli/tests/testdata/bench/filter/b_bench.ts
+++ b/tests/testdata/bench/filter/b_bench.ts
diff --git a/cli/tests/testdata/bench/filter/c_bench.ts b/tests/testdata/bench/filter/c_bench.ts
index fc4ef859c..fc4ef859c 100644
--- a/cli/tests/testdata/bench/filter/c_bench.ts
+++ b/tests/testdata/bench/filter/c_bench.ts
diff --git a/cli/tests/testdata/bench/finally_timeout.out b/tests/testdata/bench/finally_timeout.out
index 96bec017d..96bec017d 100644
--- a/cli/tests/testdata/bench/finally_timeout.out
+++ b/tests/testdata/bench/finally_timeout.out
diff --git a/cli/tests/testdata/bench/finally_timeout.ts b/tests/testdata/bench/finally_timeout.ts
index c49eb8da2..c49eb8da2 100644
--- a/cli/tests/testdata/bench/finally_timeout.ts
+++ b/tests/testdata/bench/finally_timeout.ts
diff --git a/cli/tests/testdata/bench/group_baseline.out b/tests/testdata/bench/group_baseline.out
index 5de0ac1fe..5de0ac1fe 100644
--- a/cli/tests/testdata/bench/group_baseline.out
+++ b/tests/testdata/bench/group_baseline.out
diff --git a/cli/tests/testdata/bench/group_baseline.ts b/tests/testdata/bench/group_baseline.ts
index a86f6455c..a86f6455c 100644
--- a/cli/tests/testdata/bench/group_baseline.ts
+++ b/tests/testdata/bench/group_baseline.ts
diff --git a/cli/tests/testdata/bench/ignore.out b/tests/testdata/bench/ignore.out
index 0693a7fc8..0693a7fc8 100644
--- a/cli/tests/testdata/bench/ignore.out
+++ b/tests/testdata/bench/ignore.out
diff --git a/cli/tests/testdata/bench/ignore.ts b/tests/testdata/bench/ignore.ts
index 0226fe76f..0226fe76f 100644
--- a/cli/tests/testdata/bench/ignore.ts
+++ b/tests/testdata/bench/ignore.ts
diff --git a/cli/tests/testdata/bench/ignore_permissions.out b/tests/testdata/bench/ignore_permissions.out
index 1c8e93535..1c8e93535 100644
--- a/cli/tests/testdata/bench/ignore_permissions.out
+++ b/tests/testdata/bench/ignore_permissions.out
diff --git a/cli/tests/testdata/bench/ignore_permissions.ts b/tests/testdata/bench/ignore_permissions.ts
index 0dcd9299f..0dcd9299f 100644
--- a/cli/tests/testdata/bench/ignore_permissions.ts
+++ b/tests/testdata/bench/ignore_permissions.ts
diff --git a/cli/tests/testdata/bench/interval.out b/tests/testdata/bench/interval.out
index 389b89162..389b89162 100644
--- a/cli/tests/testdata/bench/interval.out
+++ b/tests/testdata/bench/interval.out
diff --git a/cli/tests/testdata/bench/interval.ts b/tests/testdata/bench/interval.ts
index 7eb588c59..7eb588c59 100644
--- a/cli/tests/testdata/bench/interval.ts
+++ b/tests/testdata/bench/interval.ts
diff --git a/cli/tests/testdata/bench/load_unload.out b/tests/testdata/bench/load_unload.out
index e5bc6b29e..e5bc6b29e 100644
--- a/cli/tests/testdata/bench/load_unload.out
+++ b/tests/testdata/bench/load_unload.out
diff --git a/cli/tests/testdata/bench/load_unload.ts b/tests/testdata/bench/load_unload.ts
index 3653c135d..3653c135d 100644
--- a/cli/tests/testdata/bench/load_unload.ts
+++ b/tests/testdata/bench/load_unload.ts
diff --git a/cli/tests/testdata/bench/meta.out b/tests/testdata/bench/meta.out
index 8c9aa9123..8c9aa9123 100644
--- a/cli/tests/testdata/bench/meta.out
+++ b/tests/testdata/bench/meta.out
diff --git a/cli/tests/testdata/bench/meta.ts b/tests/testdata/bench/meta.ts
index e32fdeea6..e32fdeea6 100644
--- a/cli/tests/testdata/bench/meta.ts
+++ b/tests/testdata/bench/meta.ts
diff --git a/cli/tests/testdata/bench/multifile_summary.out b/tests/testdata/bench/multifile_summary.out
index 37aebe187..37aebe187 100644
--- a/cli/tests/testdata/bench/multifile_summary.out
+++ b/tests/testdata/bench/multifile_summary.out
diff --git a/cli/tests/testdata/bench/multiple_group.ts b/tests/testdata/bench/multiple_group.ts
index 69e73a7f2..69e73a7f2 100644
--- a/cli/tests/testdata/bench/multiple_group.ts
+++ b/tests/testdata/bench/multiple_group.ts
diff --git a/cli/tests/testdata/bench/no_check.out b/tests/testdata/bench/no_check.out
index 6dc016458..6dc016458 100644
--- a/cli/tests/testdata/bench/no_check.out
+++ b/tests/testdata/bench/no_check.out
diff --git a/cli/tests/testdata/bench/no_check.ts b/tests/testdata/bench/no_check.ts
index b159cabd6..b159cabd6 100644
--- a/cli/tests/testdata/bench/no_check.ts
+++ b/tests/testdata/bench/no_check.ts
diff --git a/cli/tests/testdata/bench/no_color.ts b/tests/testdata/bench/no_color.ts
index d15bf3572..d15bf3572 100644
--- a/cli/tests/testdata/bench/no_color.ts
+++ b/tests/testdata/bench/no_color.ts
diff --git a/cli/tests/testdata/bench/no_prompt_by_default.out b/tests/testdata/bench/no_prompt_by_default.out
index 4c7e7f146..4c7e7f146 100644
--- a/cli/tests/testdata/bench/no_prompt_by_default.out
+++ b/tests/testdata/bench/no_prompt_by_default.out
diff --git a/cli/tests/testdata/bench/no_prompt_by_default.ts b/tests/testdata/bench/no_prompt_by_default.ts
index 59359eebd..59359eebd 100644
--- a/cli/tests/testdata/bench/no_prompt_by_default.ts
+++ b/tests/testdata/bench/no_prompt_by_default.ts
diff --git a/cli/tests/testdata/bench/no_prompt_with_denied_perms.out b/tests/testdata/bench/no_prompt_with_denied_perms.out
index 74400dafe..74400dafe 100644
--- a/cli/tests/testdata/bench/no_prompt_with_denied_perms.out
+++ b/tests/testdata/bench/no_prompt_with_denied_perms.out
diff --git a/cli/tests/testdata/bench/no_prompt_with_denied_perms.ts b/tests/testdata/bench/no_prompt_with_denied_perms.ts
index 2f0d63bbe..2f0d63bbe 100644
--- a/cli/tests/testdata/bench/no_prompt_with_denied_perms.ts
+++ b/tests/testdata/bench/no_prompt_with_denied_perms.ts
diff --git a/cli/tests/testdata/bench/no_run.out b/tests/testdata/bench/no_run.out
index 5d40f1d3b..5d40f1d3b 100644
--- a/cli/tests/testdata/bench/no_run.out
+++ b/tests/testdata/bench/no_run.out
diff --git a/cli/tests/testdata/bench/no_run.ts b/tests/testdata/bench/no_run.ts
index c7a5dc1e8..c7a5dc1e8 100644
--- a/cli/tests/testdata/bench/no_run.ts
+++ b/tests/testdata/bench/no_run.ts
diff --git a/cli/tests/testdata/bench/only.out b/tests/testdata/bench/only.out
index 00338af8e..00338af8e 100644
--- a/cli/tests/testdata/bench/only.out
+++ b/tests/testdata/bench/only.out
diff --git a/cli/tests/testdata/bench/only.ts b/tests/testdata/bench/only.ts
index 0129c024c..0129c024c 100644
--- a/cli/tests/testdata/bench/only.ts
+++ b/tests/testdata/bench/only.ts
diff --git a/cli/tests/testdata/bench/overloads.out b/tests/testdata/bench/overloads.out
index 289c8dde6..289c8dde6 100644
--- a/cli/tests/testdata/bench/overloads.out
+++ b/tests/testdata/bench/overloads.out
diff --git a/cli/tests/testdata/bench/overloads.ts b/tests/testdata/bench/overloads.ts
index 4f5887f79..4f5887f79 100644
--- a/cli/tests/testdata/bench/overloads.ts
+++ b/tests/testdata/bench/overloads.ts
diff --git a/cli/tests/testdata/bench/pass.json.out b/tests/testdata/bench/pass.json.out
index 73daa7202..73daa7202 100644
--- a/cli/tests/testdata/bench/pass.json.out
+++ b/tests/testdata/bench/pass.json.out
diff --git a/cli/tests/testdata/bench/pass.out b/tests/testdata/bench/pass.out
index 19ea6fd13..19ea6fd13 100644
--- a/cli/tests/testdata/bench/pass.out
+++ b/tests/testdata/bench/pass.out
diff --git a/cli/tests/testdata/bench/pass.ts b/tests/testdata/bench/pass.ts
index 48348d447..48348d447 100644
--- a/cli/tests/testdata/bench/pass.ts
+++ b/tests/testdata/bench/pass.ts
diff --git a/cli/tests/testdata/bench/quiet.out b/tests/testdata/bench/quiet.out
index ed9e06c84..ed9e06c84 100644
--- a/cli/tests/testdata/bench/quiet.out
+++ b/tests/testdata/bench/quiet.out
diff --git a/cli/tests/testdata/bench/quiet.ts b/tests/testdata/bench/quiet.ts
index efeb366ff..efeb366ff 100644
--- a/cli/tests/testdata/bench/quiet.ts
+++ b/tests/testdata/bench/quiet.ts
diff --git a/cli/tests/testdata/bench/recursive_permissions_pledge.js b/tests/testdata/bench/recursive_permissions_pledge.js
index 9bf320c37..9bf320c37 100644
--- a/cli/tests/testdata/bench/recursive_permissions_pledge.js
+++ b/tests/testdata/bench/recursive_permissions_pledge.js
diff --git a/cli/tests/testdata/bench/unhandled_rejection.out b/tests/testdata/bench/unhandled_rejection.out
index dba6d9ed4..dba6d9ed4 100644
--- a/cli/tests/testdata/bench/unhandled_rejection.out
+++ b/tests/testdata/bench/unhandled_rejection.out
diff --git a/cli/tests/testdata/bench/unhandled_rejection.ts b/tests/testdata/bench/unhandled_rejection.ts
index 32f3111ea..32f3111ea 100644
--- a/cli/tests/testdata/bench/unhandled_rejection.ts
+++ b/tests/testdata/bench/unhandled_rejection.ts
diff --git a/cli/tests/testdata/bench/unresolved_promise.out b/tests/testdata/bench/unresolved_promise.out
index e5c53836a..e5c53836a 100644
--- a/cli/tests/testdata/bench/unresolved_promise.out
+++ b/tests/testdata/bench/unresolved_promise.out
diff --git a/cli/tests/testdata/bench/unresolved_promise.ts b/tests/testdata/bench/unresolved_promise.ts
index 25fe70762..25fe70762 100644
--- a/cli/tests/testdata/bench/unresolved_promise.ts
+++ b/tests/testdata/bench/unresolved_promise.ts
diff --git a/cli/tests/testdata/benches/response_string_perf.js b/tests/testdata/benches/response_string_perf.js
index f55376c77..f55376c77 100644
--- a/cli/tests/testdata/benches/response_string_perf.js
+++ b/tests/testdata/benches/response_string_perf.js
diff --git a/cli/tests/testdata/benches/text_decoder_perf.js b/tests/testdata/benches/text_decoder_perf.js
index 2e52b1f8b..2e52b1f8b 100644
--- a/cli/tests/testdata/benches/text_decoder_perf.js
+++ b/tests/testdata/benches/text_decoder_perf.js
diff --git a/cli/tests/testdata/benches/text_encoder_into_perf.js b/tests/testdata/benches/text_encoder_into_perf.js
index 8d60e9f00..8d60e9f00 100644
--- a/cli/tests/testdata/benches/text_encoder_into_perf.js
+++ b/tests/testdata/benches/text_encoder_into_perf.js
diff --git a/cli/tests/testdata/benches/text_encoder_perf.js b/tests/testdata/benches/text_encoder_perf.js
index 6f61f019e..6f61f019e 100644
--- a/cli/tests/testdata/benches/text_encoder_perf.js
+++ b/tests/testdata/benches/text_encoder_perf.js
diff --git a/cli/tests/testdata/bundle/bare_imports/error_with_bare_import.ts b/tests/testdata/bundle/bare_imports/error_with_bare_import.ts
index c0748305d..c0748305d 100644
--- a/cli/tests/testdata/bundle/bare_imports/error_with_bare_import.ts
+++ b/tests/testdata/bundle/bare_imports/error_with_bare_import.ts
diff --git a/cli/tests/testdata/bundle/bare_imports/error_with_bare_import.ts.out b/tests/testdata/bundle/bare_imports/error_with_bare_import.ts.out
index 44d063a5e..44d063a5e 100644
--- a/cli/tests/testdata/bundle/bare_imports/error_with_bare_import.ts.out
+++ b/tests/testdata/bundle/bare_imports/error_with_bare_import.ts.out
diff --git a/cli/tests/testdata/bundle/bundle.test.out b/tests/testdata/bundle/bundle.test.out
index 6b1c109d3..6b1c109d3 100644
--- a/cli/tests/testdata/bundle/bundle.test.out
+++ b/tests/testdata/bundle/bundle.test.out
diff --git a/cli/tests/testdata/bundle/check_local_by_default/no_errors.out b/tests/testdata/bundle/check_local_by_default/no_errors.out
index c4559d1fa..c4559d1fa 100644
--- a/cli/tests/testdata/bundle/check_local_by_default/no_errors.out
+++ b/tests/testdata/bundle/check_local_by_default/no_errors.out
diff --git a/cli/tests/testdata/bundle/check_local_by_default/no_errors.ts b/tests/testdata/bundle/check_local_by_default/no_errors.ts
index 2ae8c2692..2ae8c2692 100644
--- a/cli/tests/testdata/bundle/check_local_by_default/no_errors.ts
+++ b/tests/testdata/bundle/check_local_by_default/no_errors.ts
diff --git a/cli/tests/testdata/bundle/check_local_by_default/type_error.out b/tests/testdata/bundle/check_local_by_default/type_error.out
index 6d53e9498..6d53e9498 100644
--- a/cli/tests/testdata/bundle/check_local_by_default/type_error.out
+++ b/tests/testdata/bundle/check_local_by_default/type_error.out
diff --git a/cli/tests/testdata/bundle/check_local_by_default/type_error.ts b/tests/testdata/bundle/check_local_by_default/type_error.ts
index 5177ff944..5177ff944 100644
--- a/cli/tests/testdata/bundle/check_local_by_default/type_error.ts
+++ b/tests/testdata/bundle/check_local_by_default/type_error.ts
diff --git a/cli/tests/testdata/bundle/decorators/ts_decorators.out b/tests/testdata/bundle/decorators/ts_decorators.out
index e988aadd3..e988aadd3 100644
--- a/cli/tests/testdata/bundle/decorators/ts_decorators.out
+++ b/tests/testdata/bundle/decorators/ts_decorators.out
diff --git a/cli/tests/testdata/bundle/decorators/ts_decorators.ts b/tests/testdata/bundle/decorators/ts_decorators.ts
index 61299bccf..61299bccf 100644
--- a/cli/tests/testdata/bundle/decorators/ts_decorators.ts
+++ b/tests/testdata/bundle/decorators/ts_decorators.ts
diff --git a/cli/tests/testdata/bundle/dynamic_import.ts b/tests/testdata/bundle/dynamic_import.ts
index d8c7d08ec..d8c7d08ec 100644
--- a/cli/tests/testdata/bundle/dynamic_import.ts
+++ b/tests/testdata/bundle/dynamic_import.ts
diff --git a/cli/tests/testdata/bundle/file_extensions/js_without_extension.out b/tests/testdata/bundle/file_extensions/js_without_extension.out
index 0273e6207..0273e6207 100644
--- a/cli/tests/testdata/bundle/file_extensions/js_without_extension.out
+++ b/tests/testdata/bundle/file_extensions/js_without_extension.out
diff --git a/cli/tests/testdata/bundle/file_extensions/ts_without_extension.out b/tests/testdata/bundle/file_extensions/ts_without_extension.out
index 39e355d14..39e355d14 100644
--- a/cli/tests/testdata/bundle/file_extensions/ts_without_extension.out
+++ b/tests/testdata/bundle/file_extensions/ts_without_extension.out
diff --git a/cli/tests/testdata/bundle/file_tests-fixture01.ts b/tests/testdata/bundle/file_tests-fixture01.ts
index 3598d0298..3598d0298 100644
--- a/cli/tests/testdata/bundle/file_tests-fixture01.ts
+++ b/tests/testdata/bundle/file_tests-fixture01.ts
diff --git a/cli/tests/testdata/bundle/file_tests-fixture02.ts b/tests/testdata/bundle/file_tests-fixture02.ts
index 0cd291329..0cd291329 100644
--- a/cli/tests/testdata/bundle/file_tests-fixture02.ts
+++ b/tests/testdata/bundle/file_tests-fixture02.ts
diff --git a/cli/tests/testdata/bundle/file_tests-fixture03.ts b/tests/testdata/bundle/file_tests-fixture03.ts
index 78365ce13..78365ce13 100644
--- a/cli/tests/testdata/bundle/file_tests-fixture03.ts
+++ b/tests/testdata/bundle/file_tests-fixture03.ts
diff --git a/cli/tests/testdata/bundle/file_tests-fixture04.ts b/tests/testdata/bundle/file_tests-fixture04.ts
index 590f4fef9..590f4fef9 100644
--- a/cli/tests/testdata/bundle/file_tests-fixture04.ts
+++ b/tests/testdata/bundle/file_tests-fixture04.ts
diff --git a/cli/tests/testdata/bundle/file_tests-fixture05.ts b/tests/testdata/bundle/file_tests-fixture05.ts
index 19541ce59..19541ce59 100644
--- a/cli/tests/testdata/bundle/file_tests-fixture05.ts
+++ b/tests/testdata/bundle/file_tests-fixture05.ts
diff --git a/cli/tests/testdata/bundle/file_tests-fixture06.ts b/tests/testdata/bundle/file_tests-fixture06.ts
index 3d94332df..3d94332df 100644
--- a/cli/tests/testdata/bundle/file_tests-fixture06.ts
+++ b/tests/testdata/bundle/file_tests-fixture06.ts
diff --git a/cli/tests/testdata/bundle/file_tests-fixture07.ts b/tests/testdata/bundle/file_tests-fixture07.ts
index 0475a6c53..0475a6c53 100644
--- a/cli/tests/testdata/bundle/file_tests-fixture07.ts
+++ b/tests/testdata/bundle/file_tests-fixture07.ts
diff --git a/cli/tests/testdata/bundle/file_tests-fixture08.ts b/tests/testdata/bundle/file_tests-fixture08.ts
index 6af5d172e..6af5d172e 100644
--- a/cli/tests/testdata/bundle/file_tests-fixture08.ts
+++ b/tests/testdata/bundle/file_tests-fixture08.ts
diff --git a/cli/tests/testdata/bundle/file_tests-fixture09.ts b/tests/testdata/bundle/file_tests-fixture09.ts
index 30ba983ee..30ba983ee 100644
--- a/cli/tests/testdata/bundle/file_tests-fixture09.ts
+++ b/tests/testdata/bundle/file_tests-fixture09.ts
diff --git a/cli/tests/testdata/bundle/file_tests-fixture10.ts b/tests/testdata/bundle/file_tests-fixture10.ts
index bec555da8..bec555da8 100644
--- a/cli/tests/testdata/bundle/file_tests-fixture10.ts
+++ b/tests/testdata/bundle/file_tests-fixture10.ts
diff --git a/cli/tests/testdata/bundle/file_tests-fixture11.ts b/tests/testdata/bundle/file_tests-fixture11.ts
index 1c361438f..1c361438f 100644
--- a/cli/tests/testdata/bundle/file_tests-fixture11.ts
+++ b/tests/testdata/bundle/file_tests-fixture11.ts
diff --git a/cli/tests/testdata/bundle/file_tests-fixture12.ts b/tests/testdata/bundle/file_tests-fixture12.ts
index 32b9566bd..32b9566bd 100644
--- a/cli/tests/testdata/bundle/file_tests-fixture12.ts
+++ b/tests/testdata/bundle/file_tests-fixture12.ts
diff --git a/cli/tests/testdata/bundle/file_tests-fixture13.ts b/tests/testdata/bundle/file_tests-fixture13.ts
index 7dc13534c..7dc13534c 100644
--- a/cli/tests/testdata/bundle/file_tests-fixture13.ts
+++ b/tests/testdata/bundle/file_tests-fixture13.ts
diff --git a/cli/tests/testdata/bundle/file_tests-fixture14.ts b/tests/testdata/bundle/file_tests-fixture14.ts
index aa8eef1b8..aa8eef1b8 100644
--- a/cli/tests/testdata/bundle/file_tests-fixture14.ts
+++ b/tests/testdata/bundle/file_tests-fixture14.ts
diff --git a/cli/tests/testdata/bundle/file_tests-fixture15.ts b/tests/testdata/bundle/file_tests-fixture15.ts
index c1dd3bc89..c1dd3bc89 100644
--- a/cli/tests/testdata/bundle/file_tests-fixture15.ts
+++ b/tests/testdata/bundle/file_tests-fixture15.ts
diff --git a/cli/tests/testdata/bundle/file_tests-fixture16.ts b/tests/testdata/bundle/file_tests-fixture16.ts
index 5d0b05e92..5d0b05e92 100644
--- a/cli/tests/testdata/bundle/file_tests-fixture16.ts
+++ b/tests/testdata/bundle/file_tests-fixture16.ts
diff --git a/cli/tests/testdata/bundle/file_tests-fixture16_2.ts b/tests/testdata/bundle/file_tests-fixture16_2.ts
index 7115949c9..7115949c9 100644
--- a/cli/tests/testdata/bundle/file_tests-fixture16_2.ts
+++ b/tests/testdata/bundle/file_tests-fixture16_2.ts
diff --git a/cli/tests/testdata/bundle/file_tests-subdir-a.ts b/tests/testdata/bundle/file_tests-subdir-a.ts
index 9233cce2f..9233cce2f 100644
--- a/cli/tests/testdata/bundle/file_tests-subdir-a.ts
+++ b/tests/testdata/bundle/file_tests-subdir-a.ts
diff --git a/cli/tests/testdata/bundle/file_tests-subdir-b.ts b/tests/testdata/bundle/file_tests-subdir-b.ts
index 1cf751c22..1cf751c22 100644
--- a/cli/tests/testdata/bundle/file_tests-subdir-b.ts
+++ b/tests/testdata/bundle/file_tests-subdir-b.ts
diff --git a/cli/tests/testdata/bundle/file_tests-subdir-c.ts b/tests/testdata/bundle/file_tests-subdir-c.ts
index 7cc01f993..7cc01f993 100644
--- a/cli/tests/testdata/bundle/file_tests-subdir-c.ts
+++ b/tests/testdata/bundle/file_tests-subdir-c.ts
diff --git a/cli/tests/testdata/bundle/file_tests-subdir-d.ts b/tests/testdata/bundle/file_tests-subdir-d.ts
index 9f1ba7f67..9f1ba7f67 100644
--- a/cli/tests/testdata/bundle/file_tests-subdir-d.ts
+++ b/tests/testdata/bundle/file_tests-subdir-d.ts
diff --git a/cli/tests/testdata/bundle/file_tests-subdir-e.ts b/tests/testdata/bundle/file_tests-subdir-e.ts
index 55e8e0e18..55e8e0e18 100644
--- a/cli/tests/testdata/bundle/file_tests-subdir-e.ts
+++ b/tests/testdata/bundle/file_tests-subdir-e.ts
diff --git a/cli/tests/testdata/bundle/file_tests-subdir-f.ts b/tests/testdata/bundle/file_tests-subdir-f.ts
index 8bc8d9bf4..8bc8d9bf4 100644
--- a/cli/tests/testdata/bundle/file_tests-subdir-f.ts
+++ b/tests/testdata/bundle/file_tests-subdir-f.ts
diff --git a/cli/tests/testdata/bundle/file_tests-subdir-g.ts b/tests/testdata/bundle/file_tests-subdir-g.ts
index 3eb4cd3cc..3eb4cd3cc 100644
--- a/cli/tests/testdata/bundle/file_tests-subdir-g.ts
+++ b/tests/testdata/bundle/file_tests-subdir-g.ts
diff --git a/cli/tests/testdata/bundle/file_tests-subdir-h.ts b/tests/testdata/bundle/file_tests-subdir-h.ts
index 9c86dd5c5..9c86dd5c5 100644
--- a/cli/tests/testdata/bundle/file_tests-subdir-h.ts
+++ b/tests/testdata/bundle/file_tests-subdir-h.ts
diff --git a/cli/tests/testdata/bundle/file_tests-subdir-i.ts b/tests/testdata/bundle/file_tests-subdir-i.ts
index 4ad9ce449..4ad9ce449 100644
--- a/cli/tests/testdata/bundle/file_tests-subdir-i.ts
+++ b/tests/testdata/bundle/file_tests-subdir-i.ts
diff --git a/cli/tests/testdata/bundle/file_tests-subdir-j.ts b/tests/testdata/bundle/file_tests-subdir-j.ts
index ac7bce0ea..ac7bce0ea 100644
--- a/cli/tests/testdata/bundle/file_tests-subdir-j.ts
+++ b/tests/testdata/bundle/file_tests-subdir-j.ts
diff --git a/cli/tests/testdata/bundle/file_tests-subdir-k.ts b/tests/testdata/bundle/file_tests-subdir-k.ts
index 1b8a533f1..1b8a533f1 100644
--- a/cli/tests/testdata/bundle/file_tests-subdir-k.ts
+++ b/tests/testdata/bundle/file_tests-subdir-k.ts
diff --git a/cli/tests/testdata/bundle/file_tests-subdir-l.ts b/tests/testdata/bundle/file_tests-subdir-l.ts
index d767e6ad0..d767e6ad0 100644
--- a/cli/tests/testdata/bundle/file_tests-subdir-l.ts
+++ b/tests/testdata/bundle/file_tests-subdir-l.ts
diff --git a/cli/tests/testdata/bundle/file_tests-subdir-m.ts b/tests/testdata/bundle/file_tests-subdir-m.ts
index 21e86d07c..21e86d07c 100644
--- a/cli/tests/testdata/bundle/file_tests-subdir-m.ts
+++ b/tests/testdata/bundle/file_tests-subdir-m.ts
diff --git a/cli/tests/testdata/bundle/file_tests-subdir-n.ts b/tests/testdata/bundle/file_tests-subdir-n.ts
index ac3c37005..ac3c37005 100644
--- a/cli/tests/testdata/bundle/file_tests-subdir-n.ts
+++ b/tests/testdata/bundle/file_tests-subdir-n.ts
diff --git a/cli/tests/testdata/bundle/file_tests-subdir-o.ts b/tests/testdata/bundle/file_tests-subdir-o.ts
index ab9753fea..ab9753fea 100644
--- a/cli/tests/testdata/bundle/file_tests-subdir-o.ts
+++ b/tests/testdata/bundle/file_tests-subdir-o.ts
diff --git a/cli/tests/testdata/bundle/file_tests-subdir-p.ts b/tests/testdata/bundle/file_tests-subdir-p.ts
index 19b486f71..19b486f71 100644
--- a/cli/tests/testdata/bundle/file_tests-subdir-p.ts
+++ b/tests/testdata/bundle/file_tests-subdir-p.ts
diff --git a/cli/tests/testdata/bundle/file_tests-subdir-q.ts b/tests/testdata/bundle/file_tests-subdir-q.ts
index eebe0a38b..eebe0a38b 100644
--- a/cli/tests/testdata/bundle/file_tests-subdir-q.ts
+++ b/tests/testdata/bundle/file_tests-subdir-q.ts
diff --git a/cli/tests/testdata/bundle/fixture01.out b/tests/testdata/bundle/fixture01.out
index a825140b7..a825140b7 100644
--- a/cli/tests/testdata/bundle/fixture01.out
+++ b/tests/testdata/bundle/fixture01.out
diff --git a/cli/tests/testdata/bundle/fixture02.out b/tests/testdata/bundle/fixture02.out
index 5c502e2f0..5c502e2f0 100644
--- a/cli/tests/testdata/bundle/fixture02.out
+++ b/tests/testdata/bundle/fixture02.out
diff --git a/cli/tests/testdata/bundle/fixture03.out b/tests/testdata/bundle/fixture03.out
index 524e77abb..524e77abb 100644
--- a/cli/tests/testdata/bundle/fixture03.out
+++ b/tests/testdata/bundle/fixture03.out
diff --git a/cli/tests/testdata/bundle/fixture04.out b/tests/testdata/bundle/fixture04.out
index 37869205b..37869205b 100644
--- a/cli/tests/testdata/bundle/fixture04.out
+++ b/tests/testdata/bundle/fixture04.out
diff --git a/cli/tests/testdata/bundle/fixture05.out b/tests/testdata/bundle/fixture05.out
index 1289cca5f..1289cca5f 100644
--- a/cli/tests/testdata/bundle/fixture05.out
+++ b/tests/testdata/bundle/fixture05.out
diff --git a/cli/tests/testdata/bundle/fixture06.out b/tests/testdata/bundle/fixture06.out
index 47288d5e4..47288d5e4 100644
--- a/cli/tests/testdata/bundle/fixture06.out
+++ b/tests/testdata/bundle/fixture06.out
diff --git a/cli/tests/testdata/bundle/fixture07.out b/tests/testdata/bundle/fixture07.out
index 39e6a11e8..39e6a11e8 100644
--- a/cli/tests/testdata/bundle/fixture07.out
+++ b/tests/testdata/bundle/fixture07.out
diff --git a/cli/tests/testdata/bundle/fixture08.out b/tests/testdata/bundle/fixture08.out
index bfe40aa37..bfe40aa37 100644
--- a/cli/tests/testdata/bundle/fixture08.out
+++ b/tests/testdata/bundle/fixture08.out
diff --git a/cli/tests/testdata/bundle/fixture09.out b/tests/testdata/bundle/fixture09.out
index e06cc92de..e06cc92de 100644
--- a/cli/tests/testdata/bundle/fixture09.out
+++ b/tests/testdata/bundle/fixture09.out
diff --git a/cli/tests/testdata/bundle/fixture10.out b/tests/testdata/bundle/fixture10.out
index 5491e5e7f..5491e5e7f 100644
--- a/cli/tests/testdata/bundle/fixture10.out
+++ b/tests/testdata/bundle/fixture10.out
diff --git a/cli/tests/testdata/bundle/fixture11.out b/tests/testdata/bundle/fixture11.out
index 4f333a513..4f333a513 100644
--- a/cli/tests/testdata/bundle/fixture11.out
+++ b/tests/testdata/bundle/fixture11.out
diff --git a/cli/tests/testdata/bundle/fixture12.out b/tests/testdata/bundle/fixture12.out
index 64e2d6cdb..64e2d6cdb 100644
--- a/cli/tests/testdata/bundle/fixture12.out
+++ b/tests/testdata/bundle/fixture12.out
diff --git a/cli/tests/testdata/bundle/fixture13.out b/tests/testdata/bundle/fixture13.out
index 1c7a8c991..1c7a8c991 100644
--- a/cli/tests/testdata/bundle/fixture13.out
+++ b/tests/testdata/bundle/fixture13.out
diff --git a/cli/tests/testdata/bundle/fixture14.out b/tests/testdata/bundle/fixture14.out
index 392bb6478..392bb6478 100644
--- a/cli/tests/testdata/bundle/fixture14.out
+++ b/tests/testdata/bundle/fixture14.out
diff --git a/cli/tests/testdata/bundle/fixture15.out b/tests/testdata/bundle/fixture15.out
index dc72fdeff..dc72fdeff 100644
--- a/cli/tests/testdata/bundle/fixture15.out
+++ b/tests/testdata/bundle/fixture15.out
diff --git a/cli/tests/testdata/bundle/fixture16.out b/tests/testdata/bundle/fixture16.out
index 5e21c2a71..5e21c2a71 100644
--- a/cli/tests/testdata/bundle/fixture16.out
+++ b/tests/testdata/bundle/fixture16.out
diff --git a/cli/tests/testdata/bundle/https_deno.land-x-lib-a.ts b/tests/testdata/bundle/https_deno.land-x-lib-a.ts
index a0a6f8e94..a0a6f8e94 100644
--- a/cli/tests/testdata/bundle/https_deno.land-x-lib-a.ts
+++ b/tests/testdata/bundle/https_deno.land-x-lib-a.ts
diff --git a/cli/tests/testdata/bundle/https_deno.land-x-lib-b.js b/tests/testdata/bundle/https_deno.land-x-lib-b.js
index 13cacdd8b..13cacdd8b 100644
--- a/cli/tests/testdata/bundle/https_deno.land-x-lib-b.js
+++ b/tests/testdata/bundle/https_deno.land-x-lib-b.js
diff --git a/cli/tests/testdata/bundle/https_deno.land-x-lib-c.d.ts b/tests/testdata/bundle/https_deno.land-x-lib-c.d.ts
index fac988e49..fac988e49 100644
--- a/cli/tests/testdata/bundle/https_deno.land-x-lib-c.d.ts
+++ b/tests/testdata/bundle/https_deno.land-x-lib-c.d.ts
diff --git a/cli/tests/testdata/bundle/https_deno.land-x-lib-c.js b/tests/testdata/bundle/https_deno.land-x-lib-c.js
index 620ca0b66..620ca0b66 100644
--- a/cli/tests/testdata/bundle/https_deno.land-x-lib-c.js
+++ b/tests/testdata/bundle/https_deno.land-x-lib-c.js
diff --git a/cli/tests/testdata/bundle/https_deno.land-x-lib-mod.d.ts b/tests/testdata/bundle/https_deno.land-x-lib-mod.d.ts
index 76ed81df0..76ed81df0 100644
--- a/cli/tests/testdata/bundle/https_deno.land-x-lib-mod.d.ts
+++ b/tests/testdata/bundle/https_deno.land-x-lib-mod.d.ts
diff --git a/cli/tests/testdata/bundle/https_deno.land-x-lib-mod.js b/tests/testdata/bundle/https_deno.land-x-lib-mod.js
index 505162094..505162094 100644
--- a/cli/tests/testdata/bundle/https_deno.land-x-lib-mod.js
+++ b/tests/testdata/bundle/https_deno.land-x-lib-mod.js
diff --git a/cli/tests/testdata/bundle/ignore_directives.test.out b/tests/testdata/bundle/ignore_directives.test.out
index b69c2632c..b69c2632c 100644
--- a/cli/tests/testdata/bundle/ignore_directives.test.out
+++ b/tests/testdata/bundle/ignore_directives.test.out
diff --git a/cli/tests/testdata/bundle/import_map/import_map.json b/tests/testdata/bundle/import_map/import_map.json
index c02f72718..c02f72718 100644
--- a/cli/tests/testdata/bundle/import_map/import_map.json
+++ b/tests/testdata/bundle/import_map/import_map.json
diff --git a/cli/tests/testdata/bundle/import_map/main.ts b/tests/testdata/bundle/import_map/main.ts
index 74834de20..74834de20 100644
--- a/cli/tests/testdata/bundle/import_map/main.ts
+++ b/tests/testdata/bundle/import_map/main.ts
diff --git a/cli/tests/testdata/bundle/jsx.out b/tests/testdata/bundle/jsx.out
index da83cde82..da83cde82 100644
--- a/cli/tests/testdata/bundle/jsx.out
+++ b/tests/testdata/bundle/jsx.out
diff --git a/cli/tests/testdata/bundle/lockfile/check_error.json b/tests/testdata/bundle/lockfile/check_error.json
index a218d7000..a218d7000 100644
--- a/cli/tests/testdata/bundle/lockfile/check_error.json
+++ b/tests/testdata/bundle/lockfile/check_error.json
diff --git a/cli/tests/testdata/bundle/lockfile/check_error.out b/tests/testdata/bundle/lockfile/check_error.out
index 9299bc27e..9299bc27e 100644
--- a/cli/tests/testdata/bundle/lockfile/check_error.out
+++ b/tests/testdata/bundle/lockfile/check_error.out
diff --git a/cli/tests/testdata/bundle/shebang_file.bundle.out b/tests/testdata/bundle/shebang_file.bundle.out
index d3369bc9c..d3369bc9c 100644
--- a/cli/tests/testdata/bundle/shebang_file.bundle.out
+++ b/tests/testdata/bundle/shebang_file.bundle.out
diff --git a/cli/tests/testdata/cache/036_import_map_fetch.out b/tests/testdata/cache/036_import_map_fetch.out
index e69de29bb..e69de29bb 100644
--- a/cli/tests/testdata/cache/036_import_map_fetch.out
+++ b/tests/testdata/cache/036_import_map_fetch.out
diff --git a/cli/tests/testdata/cache/037_fetch_multiple.out b/tests/testdata/cache/037_fetch_multiple.out
index f4c0c314b..f4c0c314b 100644
--- a/cli/tests/testdata/cache/037_fetch_multiple.out
+++ b/tests/testdata/cache/037_fetch_multiple.out
diff --git a/cli/tests/testdata/cache/095_cache_with_bare_import.ts b/tests/testdata/cache/095_cache_with_bare_import.ts
index c0748305d..c0748305d 100644
--- a/cli/tests/testdata/cache/095_cache_with_bare_import.ts
+++ b/tests/testdata/cache/095_cache_with_bare_import.ts
diff --git a/cli/tests/testdata/cache/095_cache_with_bare_import.ts.out b/tests/testdata/cache/095_cache_with_bare_import.ts.out
index 2668a6e08..2668a6e08 100644
--- a/cli/tests/testdata/cache/095_cache_with_bare_import.ts.out
+++ b/tests/testdata/cache/095_cache_with_bare_import.ts.out
diff --git a/cli/tests/testdata/cache/cache_extensionless.out b/tests/testdata/cache/cache_extensionless.out
index 3694c67cb..3694c67cb 100644
--- a/cli/tests/testdata/cache/cache_extensionless.out
+++ b/tests/testdata/cache/cache_extensionless.out
diff --git a/cli/tests/testdata/cache/cache_random_extension.out b/tests/testdata/cache/cache_random_extension.out
index 745a2e0e3..745a2e0e3 100644
--- a/cli/tests/testdata/cache/cache_random_extension.out
+++ b/tests/testdata/cache/cache_random_extension.out
diff --git a/cli/tests/testdata/cache/check_local_by_default.out b/tests/testdata/cache/check_local_by_default.out
index e69de29bb..e69de29bb 100644
--- a/cli/tests/testdata/cache/check_local_by_default.out
+++ b/tests/testdata/cache/check_local_by_default.out
diff --git a/cli/tests/testdata/cache/check_local_by_default.ts b/tests/testdata/cache/check_local_by_default.ts
index 2ae8c2692..2ae8c2692 100644
--- a/cli/tests/testdata/cache/check_local_by_default.ts
+++ b/tests/testdata/cache/check_local_by_default.ts
diff --git a/cli/tests/testdata/cache/check_local_by_default2.out b/tests/testdata/cache/check_local_by_default2.out
index e69de29bb..e69de29bb 100644
--- a/cli/tests/testdata/cache/check_local_by_default2.out
+++ b/tests/testdata/cache/check_local_by_default2.out
diff --git a/cli/tests/testdata/cache/check_local_by_default2.ts b/tests/testdata/cache/check_local_by_default2.ts
index 5177ff944..5177ff944 100644
--- a/cli/tests/testdata/cache/check_local_by_default2.ts
+++ b/tests/testdata/cache/check_local_by_default2.ts
diff --git a/cli/tests/testdata/cache/ignore_require.js b/tests/testdata/cache/ignore_require.js
index a8ef15021..a8ef15021 100644
--- a/cli/tests/testdata/cache/ignore_require.js
+++ b/tests/testdata/cache/ignore_require.js
diff --git a/cli/tests/testdata/cache/json_import/main.ts b/tests/testdata/cache/json_import/main.ts
index 78273558f..78273558f 100644
--- a/cli/tests/testdata/cache/json_import/main.ts
+++ b/tests/testdata/cache/json_import/main.ts
diff --git a/cli/tests/testdata/cache/json_import/test.json b/tests/testdata/cache/json_import/test.json
index 258849a68..258849a68 100644
--- a/cli/tests/testdata/cache/json_import/test.json
+++ b/tests/testdata/cache/json_import/test.json
diff --git a/cli/tests/testdata/cache/performance_stats.out b/tests/testdata/cache/performance_stats.out
index 141829ee6..141829ee6 100644
--- a/cli/tests/testdata/cache/performance_stats.out
+++ b/tests/testdata/cache/performance_stats.out
diff --git a/cli/tests/testdata/cache/redirect_cache.out b/tests/testdata/cache/redirect_cache.out
index 8905c4529..8905c4529 100644
--- a/cli/tests/testdata/cache/redirect_cache.out
+++ b/tests/testdata/cache/redirect_cache.out
diff --git a/tests/testdata/cat.ts b/tests/testdata/cat.ts
new file mode 100644
index 000000000..f0205451e
--- /dev/null
+++ b/tests/testdata/cat.ts
@@ -0,0 +1,10 @@
+import { copy } from "../../test_util/std/streams/copy.ts";
+async function main() {
+ for (let i = 1; i < Deno.args.length; i++) {
+ const filename = Deno.args[i];
+ const file = await Deno.open(filename);
+ await copy(file, Deno.stdout);
+ }
+}
+
+main();
diff --git a/cli/tests/testdata/cert/cafile_info.ts b/tests/testdata/cert/cafile_info.ts
index b41873f73..b41873f73 100644
--- a/cli/tests/testdata/cert/cafile_info.ts
+++ b/tests/testdata/cert/cafile_info.ts
diff --git a/cli/tests/testdata/cert/cafile_info.ts.out b/tests/testdata/cert/cafile_info.ts.out
index 279453f88..279453f88 100644
--- a/cli/tests/testdata/cert/cafile_info.ts.out
+++ b/tests/testdata/cert/cafile_info.ts.out
diff --git a/cli/tests/testdata/cert/cafile_ts_fetch.ts b/tests/testdata/cert/cafile_ts_fetch.ts
index 12fcda007..12fcda007 100644
--- a/cli/tests/testdata/cert/cafile_ts_fetch.ts
+++ b/tests/testdata/cert/cafile_ts_fetch.ts
diff --git a/cli/tests/testdata/cert/cafile_ts_fetch.ts.out b/tests/testdata/cert/cafile_ts_fetch.ts.out
index 699b756ed..699b756ed 100644
--- a/cli/tests/testdata/cert/cafile_ts_fetch.ts.out
+++ b/tests/testdata/cert/cafile_ts_fetch.ts.out
diff --git a/cli/tests/testdata/cert/cafile_ts_fetch_unsafe_ssl.ts.out b/tests/testdata/cert/cafile_ts_fetch_unsafe_ssl.ts.out
index a0934e584..a0934e584 100644
--- a/cli/tests/testdata/cert/cafile_ts_fetch_unsafe_ssl.ts.out
+++ b/tests/testdata/cert/cafile_ts_fetch_unsafe_ssl.ts.out
diff --git a/cli/tests/testdata/cert/cafile_url_imports.ts b/tests/testdata/cert/cafile_url_imports.ts
index 2355a8628..2355a8628 100644
--- a/cli/tests/testdata/cert/cafile_url_imports.ts
+++ b/tests/testdata/cert/cafile_url_imports.ts
diff --git a/cli/tests/testdata/cert/cafile_url_imports.ts.out b/tests/testdata/cert/cafile_url_imports.ts.out
index 989ce33e9..989ce33e9 100644
--- a/cli/tests/testdata/cert/cafile_url_imports.ts.out
+++ b/tests/testdata/cert/cafile_url_imports.ts.out
diff --git a/cli/tests/testdata/cert/cafile_url_imports_unsafe_ssl.ts.out b/tests/testdata/cert/cafile_url_imports_unsafe_ssl.ts.out
index daebcd766..daebcd766 100644
--- a/cli/tests/testdata/cert/cafile_url_imports_unsafe_ssl.ts.out
+++ b/tests/testdata/cert/cafile_url_imports_unsafe_ssl.ts.out
diff --git a/cli/tests/testdata/cert/deno_land_unsafe_ssl.ts b/tests/testdata/cert/deno_land_unsafe_ssl.ts
index f5e8dcc80..f5e8dcc80 100644
--- a/cli/tests/testdata/cert/deno_land_unsafe_ssl.ts
+++ b/tests/testdata/cert/deno_land_unsafe_ssl.ts
diff --git a/cli/tests/testdata/cert/deno_land_unsafe_ssl.ts.out b/tests/testdata/cert/deno_land_unsafe_ssl.ts.out
index cbf52b076..cbf52b076 100644
--- a/cli/tests/testdata/cert/deno_land_unsafe_ssl.ts.out
+++ b/tests/testdata/cert/deno_land_unsafe_ssl.ts.out
diff --git a/cli/tests/testdata/cert/ip_address_unsafe_ssl.ts b/tests/testdata/cert/ip_address_unsafe_ssl.ts
index a3268888f..a3268888f 100644
--- a/cli/tests/testdata/cert/ip_address_unsafe_ssl.ts
+++ b/tests/testdata/cert/ip_address_unsafe_ssl.ts
diff --git a/cli/tests/testdata/cert/ip_address_unsafe_ssl.ts.out b/tests/testdata/cert/ip_address_unsafe_ssl.ts.out
index d4ebb2617..d4ebb2617 100644
--- a/cli/tests/testdata/cert/ip_address_unsafe_ssl.ts.out
+++ b/tests/testdata/cert/ip_address_unsafe_ssl.ts.out
diff --git a/cli/tests/testdata/cert/listen_tls_alpn.ts b/tests/testdata/cert/listen_tls_alpn.ts
index 6b92364ba..6b92364ba 100644
--- a/cli/tests/testdata/cert/listen_tls_alpn.ts
+++ b/tests/testdata/cert/listen_tls_alpn.ts
diff --git a/tests/testdata/cert/listen_tls_alpn_fail.ts b/tests/testdata/cert/listen_tls_alpn_fail.ts
new file mode 100644
index 000000000..f52316cbc
--- /dev/null
+++ b/tests/testdata/cert/listen_tls_alpn_fail.ts
@@ -0,0 +1,20 @@
+import { assertRejects } from "../../../test_util/std/assert/mod.ts";
+
+const listener = Deno.listenTls({
+ port: Number(Deno.args[0]),
+ cert: Deno.readTextFileSync("./tls/localhost.crt"),
+ key: Deno.readTextFileSync("./tls/localhost.key"),
+ alpnProtocols: ["h2", "http/1.1", "foobar"],
+});
+
+console.log("READY");
+
+const conn = await listener.accept() as Deno.TlsConn;
+await assertRejects(
+ () => conn.handshake(),
+ Deno.errors.InvalidData,
+ "peer doesn't support any known protocol",
+);
+conn.close();
+
+listener.close();
diff --git a/cli/tests/testdata/cert/localhost_unsafe_ssl.ts.out b/tests/testdata/cert/localhost_unsafe_ssl.ts.out
index 81e490c1c..81e490c1c 100644
--- a/cli/tests/testdata/cert/localhost_unsafe_ssl.ts.out
+++ b/tests/testdata/cert/localhost_unsafe_ssl.ts.out
diff --git a/cli/tests/testdata/check/all/check_all.out b/tests/testdata/check/all/check_all.out
index 344264634..344264634 100644
--- a/cli/tests/testdata/check/all/check_all.out
+++ b/tests/testdata/check/all/check_all.out
diff --git a/cli/tests/testdata/check/all/check_all.ts b/tests/testdata/check/all/check_all.ts
index 2ae8c2692..2ae8c2692 100644
--- a/cli/tests/testdata/check/all/check_all.ts
+++ b/tests/testdata/check/all/check_all.ts
diff --git a/cli/tests/testdata/check/broadcast_channel.ts b/tests/testdata/check/broadcast_channel.ts
index 6c75b4a8e..6c75b4a8e 100644
--- a/cli/tests/testdata/check/broadcast_channel.ts
+++ b/tests/testdata/check/broadcast_channel.ts
diff --git a/cli/tests/testdata/check/cache_config_on_off/deno.json b/tests/testdata/check/cache_config_on_off/deno.json
index 8ad9c9801..8ad9c9801 100644
--- a/cli/tests/testdata/check/cache_config_on_off/deno.json
+++ b/tests/testdata/check/cache_config_on_off/deno.json
diff --git a/cli/tests/testdata/check/cache_config_on_off/main.ts b/tests/testdata/check/cache_config_on_off/main.ts
index 0f3785f91..0f3785f91 100644
--- a/cli/tests/testdata/check/cache_config_on_off/main.ts
+++ b/tests/testdata/check/cache_config_on_off/main.ts
diff --git a/cli/tests/testdata/check/declaration_header_file_with_no_exports.ts b/tests/testdata/check/declaration_header_file_with_no_exports.ts
index ef5da7a38..ef5da7a38 100644
--- a/cli/tests/testdata/check/declaration_header_file_with_no_exports.ts
+++ b/tests/testdata/check/declaration_header_file_with_no_exports.ts
diff --git a/cli/tests/testdata/check/declaration_header_file_with_no_exports_js.d.ts b/tests/testdata/check/declaration_header_file_with_no_exports_js.d.ts
index e69de29bb..e69de29bb 100644
--- a/cli/tests/testdata/check/declaration_header_file_with_no_exports_js.d.ts
+++ b/tests/testdata/check/declaration_header_file_with_no_exports_js.d.ts
diff --git a/cli/tests/testdata/check/declaration_header_file_with_no_exports_js.js b/tests/testdata/check/declaration_header_file_with_no_exports_js.js
index b8ae2bcef..b8ae2bcef 100644
--- a/cli/tests/testdata/check/declaration_header_file_with_no_exports_js.js
+++ b/tests/testdata/check/declaration_header_file_with_no_exports_js.js
diff --git a/cli/tests/testdata/check/deno_not_found/main.out b/tests/testdata/check/deno_not_found/main.out
index dc4a682c7..dc4a682c7 100644
--- a/cli/tests/testdata/check/deno_not_found/main.out
+++ b/tests/testdata/check/deno_not_found/main.out
diff --git a/cli/tests/testdata/check/deno_not_found/main.ts b/tests/testdata/check/deno_not_found/main.ts
index 3269f047a..3269f047a 100644
--- a/cli/tests/testdata/check/deno_not_found/main.ts
+++ b/tests/testdata/check/deno_not_found/main.ts
diff --git a/cli/tests/testdata/check/dts/check_dts.d.ts b/tests/testdata/check/dts/check_dts.d.ts
index 9cf60f063..9cf60f063 100644
--- a/cli/tests/testdata/check/dts/check_dts.d.ts
+++ b/tests/testdata/check/dts/check_dts.d.ts
diff --git a/cli/tests/testdata/check/dts/check_dts.out b/tests/testdata/check/dts/check_dts.out
index e7ff9a009..e7ff9a009 100644
--- a/cli/tests/testdata/check/dts/check_dts.out
+++ b/tests/testdata/check/dts/check_dts.out
diff --git a/cli/tests/testdata/check/exclude_option/deno.exclude_dir.json b/tests/testdata/check/exclude_option/deno.exclude_dir.json
index 2019f8953..2019f8953 100644
--- a/cli/tests/testdata/check/exclude_option/deno.exclude_dir.json
+++ b/tests/testdata/check/exclude_option/deno.exclude_dir.json
diff --git a/cli/tests/testdata/check/exclude_option/deno.exclude_glob.json b/tests/testdata/check/exclude_option/deno.exclude_glob.json
index 1d203ba08..1d203ba08 100644
--- a/cli/tests/testdata/check/exclude_option/deno.exclude_glob.json
+++ b/tests/testdata/check/exclude_option/deno.exclude_glob.json
diff --git a/cli/tests/testdata/check/exclude_option/deno.json b/tests/testdata/check/exclude_option/deno.json
index a9eca74ca..a9eca74ca 100644
--- a/cli/tests/testdata/check/exclude_option/deno.json
+++ b/tests/testdata/check/exclude_option/deno.json
diff --git a/cli/tests/testdata/check/exclude_option/exclude_option.ts.error.out b/tests/testdata/check/exclude_option/exclude_option.ts.error.out
index abd1c1258..abd1c1258 100644
--- a/cli/tests/testdata/check/exclude_option/exclude_option.ts.error.out
+++ b/tests/testdata/check/exclude_option/exclude_option.ts.error.out
diff --git a/cli/tests/testdata/check/exclude_option/ignored/index.ts b/tests/testdata/check/exclude_option/ignored/index.ts
index 0419cf073..0419cf073 100644
--- a/cli/tests/testdata/check/exclude_option/ignored/index.ts
+++ b/tests/testdata/check/exclude_option/ignored/index.ts
diff --git a/cli/tests/testdata/check/exclude_option/index.ts b/tests/testdata/check/exclude_option/index.ts
index 8335ca3a2..8335ca3a2 100644
--- a/cli/tests/testdata/check/exclude_option/index.ts
+++ b/tests/testdata/check/exclude_option/index.ts
diff --git a/cli/tests/testdata/check/excluded_file_specified/check.out b/tests/testdata/check/excluded_file_specified/check.out
index 2bc26aaaf..2bc26aaaf 100644
--- a/cli/tests/testdata/check/excluded_file_specified/check.out
+++ b/tests/testdata/check/excluded_file_specified/check.out
diff --git a/cli/tests/testdata/check/excluded_file_specified/deno.json b/tests/testdata/check/excluded_file_specified/deno.json
index 039be18df..039be18df 100644
--- a/cli/tests/testdata/check/excluded_file_specified/deno.json
+++ b/tests/testdata/check/excluded_file_specified/deno.json
diff --git a/cli/tests/testdata/check/excluded_file_specified/lib/types.d.ts b/tests/testdata/check/excluded_file_specified/lib/types.d.ts
index a02ad0cbe..a02ad0cbe 100644
--- a/cli/tests/testdata/check/excluded_file_specified/lib/types.d.ts
+++ b/tests/testdata/check/excluded_file_specified/lib/types.d.ts
diff --git a/cli/tests/testdata/check/export_equals_declaration_file/main.ts b/tests/testdata/check/export_equals_declaration_file/main.ts
index e20a735d5..e20a735d5 100644
--- a/cli/tests/testdata/check/export_equals_declaration_file/main.ts
+++ b/tests/testdata/check/export_equals_declaration_file/main.ts
diff --git a/cli/tests/testdata/check/export_equals_declaration_file/other.d.ts b/tests/testdata/check/export_equals_declaration_file/other.d.ts
index 5e1274fa5..5e1274fa5 100644
--- a/cli/tests/testdata/check/export_equals_declaration_file/other.d.ts
+++ b/tests/testdata/check/export_equals_declaration_file/other.d.ts
diff --git a/cli/tests/testdata/check/export_equals_declaration_file/other.js b/tests/testdata/check/export_equals_declaration_file/other.js
index f66c03162..f66c03162 100644
--- a/cli/tests/testdata/check/export_equals_declaration_file/other.js
+++ b/tests/testdata/check/export_equals_declaration_file/other.js
diff --git a/cli/tests/testdata/check/jsx_not_checked/main.jsx b/tests/testdata/check/jsx_not_checked/main.jsx
index 8de05f9f7..8de05f9f7 100644
--- a/cli/tests/testdata/check/jsx_not_checked/main.jsx
+++ b/tests/testdata/check/jsx_not_checked/main.jsx
diff --git a/cli/tests/testdata/check/jsx_not_checked/main.out b/tests/testdata/check/jsx_not_checked/main.out
index 82c1c2358..82c1c2358 100644
--- a/cli/tests/testdata/check/jsx_not_checked/main.out
+++ b/tests/testdata/check/jsx_not_checked/main.out
diff --git a/cli/tests/testdata/check/jsx_not_checked/other.ts b/tests/testdata/check/jsx_not_checked/other.ts
index 47995cb0f..47995cb0f 100644
--- a/cli/tests/testdata/check/jsx_not_checked/other.ts
+++ b/tests/testdata/check/jsx_not_checked/other.ts
diff --git a/cli/tests/testdata/check/jsximportsource_importmap_config/deno.json b/tests/testdata/check/jsximportsource_importmap_config/deno.json
index 6d837af7c..6d837af7c 100644
--- a/cli/tests/testdata/check/jsximportsource_importmap_config/deno.json
+++ b/tests/testdata/check/jsximportsource_importmap_config/deno.json
diff --git a/cli/tests/testdata/check/jsximportsource_importmap_config/import_map.json b/tests/testdata/check/jsximportsource_importmap_config/import_map.json
index e926207af..e926207af 100644
--- a/cli/tests/testdata/check/jsximportsource_importmap_config/import_map.json
+++ b/tests/testdata/check/jsximportsource_importmap_config/import_map.json
diff --git a/cli/tests/testdata/check/jsximportsource_importmap_config/jsx_runtime.ts b/tests/testdata/check/jsximportsource_importmap_config/jsx_runtime.ts
index 33a07ca73..33a07ca73 100644
--- a/cli/tests/testdata/check/jsximportsource_importmap_config/jsx_runtime.ts
+++ b/tests/testdata/check/jsximportsource_importmap_config/jsx_runtime.ts
diff --git a/cli/tests/testdata/check/jsximportsource_importmap_config/main.bundle.js b/tests/testdata/check/jsximportsource_importmap_config/main.bundle.js
index 6f39c876e..6f39c876e 100644
--- a/cli/tests/testdata/check/jsximportsource_importmap_config/main.bundle.js
+++ b/tests/testdata/check/jsximportsource_importmap_config/main.bundle.js
diff --git a/cli/tests/testdata/check/jsximportsource_importmap_config/main.tsx b/tests/testdata/check/jsximportsource_importmap_config/main.tsx
index a1eb24f0b..a1eb24f0b 100644
--- a/cli/tests/testdata/check/jsximportsource_importmap_config/main.tsx
+++ b/tests/testdata/check/jsximportsource_importmap_config/main.tsx
diff --git a/cli/tests/testdata/check/module_detection_force.ts b/tests/testdata/check/module_detection_force.ts
index 185ceb816..185ceb816 100644
--- a/cli/tests/testdata/check/module_detection_force.ts
+++ b/tests/testdata/check/module_detection_force.ts
diff --git a/cli/tests/testdata/check/module_detection_force/import.ts b/tests/testdata/check/module_detection_force/import.ts
index 66b229870..66b229870 100644
--- a/cli/tests/testdata/check/module_detection_force/import.ts
+++ b/tests/testdata/check/module_detection_force/import.ts
diff --git a/cli/tests/testdata/check/module_detection_force/main.ts b/tests/testdata/check/module_detection_force/main.ts
index a55c9962b..a55c9962b 100644
--- a/cli/tests/testdata/check/module_detection_force/main.ts
+++ b/tests/testdata/check/module_detection_force/main.ts
diff --git a/cli/tests/testdata/check/no_error_truncation/deno.json b/tests/testdata/check/no_error_truncation/deno.json
index 643707ccc..643707ccc 100644
--- a/cli/tests/testdata/check/no_error_truncation/deno.json
+++ b/tests/testdata/check/no_error_truncation/deno.json
diff --git a/cli/tests/testdata/check/no_error_truncation/main.out b/tests/testdata/check/no_error_truncation/main.out
index 13fd5aae4..13fd5aae4 100644
--- a/cli/tests/testdata/check/no_error_truncation/main.out
+++ b/tests/testdata/check/no_error_truncation/main.out
diff --git a/cli/tests/testdata/check/no_error_truncation/main.ts b/tests/testdata/check/no_error_truncation/main.ts
index bb1856602..bb1856602 100644
--- a/cli/tests/testdata/check/no_error_truncation/main.ts
+++ b/tests/testdata/check/no_error_truncation/main.ts
diff --git a/cli/tests/testdata/check/node_builtin_modules/mod.js b/tests/testdata/check/node_builtin_modules/mod.js
index 196fb9be9..196fb9be9 100644
--- a/cli/tests/testdata/check/node_builtin_modules/mod.js
+++ b/tests/testdata/check/node_builtin_modules/mod.js
diff --git a/cli/tests/testdata/check/node_builtin_modules/mod.js.out b/tests/testdata/check/node_builtin_modules/mod.js.out
index 97786ebae..97786ebae 100644
--- a/cli/tests/testdata/check/node_builtin_modules/mod.js.out
+++ b/tests/testdata/check/node_builtin_modules/mod.js.out
diff --git a/cli/tests/testdata/check/node_builtin_modules/mod.ts b/tests/testdata/check/node_builtin_modules/mod.ts
index 0e62353fe..0e62353fe 100644
--- a/cli/tests/testdata/check/node_builtin_modules/mod.ts
+++ b/tests/testdata/check/node_builtin_modules/mod.ts
diff --git a/cli/tests/testdata/check/node_builtin_modules/mod.ts.out b/tests/testdata/check/node_builtin_modules/mod.ts.out
index 49b762cff..49b762cff 100644
--- a/cli/tests/testdata/check/node_builtin_modules/mod.ts.out
+++ b/tests/testdata/check/node_builtin_modules/mod.ts.out
diff --git a/cli/tests/testdata/check/npm_install_diagnostics/main.out b/tests/testdata/check/npm_install_diagnostics/main.out
index fe46f0e42..fe46f0e42 100644
--- a/cli/tests/testdata/check/npm_install_diagnostics/main.out
+++ b/tests/testdata/check/npm_install_diagnostics/main.out
diff --git a/cli/tests/testdata/check/npm_install_diagnostics/main.ts b/tests/testdata/check/npm_install_diagnostics/main.ts
index 62c0c5619..62c0c5619 100644
--- a/cli/tests/testdata/check/npm_install_diagnostics/main.ts
+++ b/tests/testdata/check/npm_install_diagnostics/main.ts
diff --git a/cli/tests/testdata/check/response_json.ts b/tests/testdata/check/response_json.ts
index e936f7bff..e936f7bff 100644
--- a/cli/tests/testdata/check/response_json.ts
+++ b/tests/testdata/check/response_json.ts
diff --git a/cli/tests/testdata/check/types_dts/deno.json b/tests/testdata/check/types_dts/deno.json
index 85f1549e0..85f1549e0 100644
--- a/cli/tests/testdata/check/types_dts/deno.json
+++ b/tests/testdata/check/types_dts/deno.json
diff --git a/cli/tests/testdata/check/types_dts/main.out b/tests/testdata/check/types_dts/main.out
index c769989e3..c769989e3 100644
--- a/cli/tests/testdata/check/types_dts/main.out
+++ b/tests/testdata/check/types_dts/main.out
diff --git a/cli/tests/testdata/check/types_dts/main.ts b/tests/testdata/check/types_dts/main.ts
index ca375a094..ca375a094 100644
--- a/cli/tests/testdata/check/types_dts/main.ts
+++ b/tests/testdata/check/types_dts/main.ts
diff --git a/cli/tests/testdata/check/types_dts/types.d.ts b/tests/testdata/check/types_dts/types.d.ts
index 141c2a3d3..141c2a3d3 100644
--- a/cli/tests/testdata/check/types_dts/types.d.ts
+++ b/tests/testdata/check/types_dts/types.d.ts
diff --git a/cli/tests/testdata/commonjs/data.json b/tests/testdata/commonjs/data.json
index f2a886f39..f2a886f39 100644
--- a/cli/tests/testdata/commonjs/data.json
+++ b/tests/testdata/commonjs/data.json
diff --git a/cli/tests/testdata/commonjs/example.js b/tests/testdata/commonjs/example.js
index d2f89d3f0..d2f89d3f0 100644
--- a/cli/tests/testdata/commonjs/example.js
+++ b/tests/testdata/commonjs/example.js
diff --git a/cli/tests/testdata/commonjs/node_modules/colorette/index.cjs b/tests/testdata/commonjs/node_modules/colorette/index.cjs
index 0590d668d..0590d668d 100644
--- a/cli/tests/testdata/commonjs/node_modules/colorette/index.cjs
+++ b/tests/testdata/commonjs/node_modules/colorette/index.cjs
diff --git a/cli/tests/testdata/commonjs/node_modules/colorette/index.js b/tests/testdata/commonjs/node_modules/colorette/index.js
index 6e83866f3..6e83866f3 100644
--- a/cli/tests/testdata/commonjs/node_modules/colorette/index.js
+++ b/tests/testdata/commonjs/node_modules/colorette/index.js
diff --git a/cli/tests/testdata/commonjs/node_modules/colorette/package.json b/tests/testdata/commonjs/node_modules/colorette/package.json
index fdca1aa24..fdca1aa24 100644
--- a/cli/tests/testdata/commonjs/node_modules/colorette/package.json
+++ b/tests/testdata/commonjs/node_modules/colorette/package.json
diff --git a/cli/tests/testdata/commonjs/node_modules/imports_exports/import_export.js b/tests/testdata/commonjs/node_modules/imports_exports/import_export.js
index 3ebd222ea..3ebd222ea 100644
--- a/cli/tests/testdata/commonjs/node_modules/imports_exports/import_export.js
+++ b/tests/testdata/commonjs/node_modules/imports_exports/import_export.js
diff --git a/cli/tests/testdata/commonjs/node_modules/imports_exports/import_polyfill.js b/tests/testdata/commonjs/node_modules/imports_exports/import_polyfill.js
index 76716a3ef..76716a3ef 100644
--- a/cli/tests/testdata/commonjs/node_modules/imports_exports/import_polyfill.js
+++ b/tests/testdata/commonjs/node_modules/imports_exports/import_polyfill.js
diff --git a/cli/tests/testdata/commonjs/node_modules/imports_exports/package.json b/tests/testdata/commonjs/node_modules/imports_exports/package.json
index 5d26359db..5d26359db 100644
--- a/cli/tests/testdata/commonjs/node_modules/imports_exports/package.json
+++ b/tests/testdata/commonjs/node_modules/imports_exports/package.json
diff --git a/cli/tests/testdata/commonjs/node_modules/imports_exports/require_export.cjs b/tests/testdata/commonjs/node_modules/imports_exports/require_export.cjs
index 48923b8d8..48923b8d8 100644
--- a/cli/tests/testdata/commonjs/node_modules/imports_exports/require_export.cjs
+++ b/tests/testdata/commonjs/node_modules/imports_exports/require_export.cjs
diff --git a/cli/tests/testdata/commonjs/node_modules/imports_exports/require_polyfill.js b/tests/testdata/commonjs/node_modules/imports_exports/require_polyfill.js
index 1023fd65c..1023fd65c 100644
--- a/cli/tests/testdata/commonjs/node_modules/imports_exports/require_polyfill.js
+++ b/tests/testdata/commonjs/node_modules/imports_exports/require_polyfill.js
diff --git a/cli/tests/testdata/commonjs/node_modules/left-pad/README.md b/tests/testdata/commonjs/node_modules/left-pad/README.md
index 0e70d461e..0e70d461e 100644
--- a/cli/tests/testdata/commonjs/node_modules/left-pad/README.md
+++ b/tests/testdata/commonjs/node_modules/left-pad/README.md
diff --git a/cli/tests/testdata/commonjs/node_modules/left-pad/index.js b/tests/testdata/commonjs/node_modules/left-pad/index.js
index a439e91de..a439e91de 100644
--- a/cli/tests/testdata/commonjs/node_modules/left-pad/index.js
+++ b/tests/testdata/commonjs/node_modules/left-pad/index.js
diff --git a/cli/tests/testdata/commonjs/node_modules/left-pad/package.json b/tests/testdata/commonjs/node_modules/left-pad/package.json
index 57be04271..57be04271 100644
--- a/cli/tests/testdata/commonjs/node_modules/left-pad/package.json
+++ b/tests/testdata/commonjs/node_modules/left-pad/package.json
diff --git a/cli/tests/testdata/commonjs/package.json b/tests/testdata/commonjs/package.json
index 9ce08a900..9ce08a900 100644
--- a/cli/tests/testdata/commonjs/package.json
+++ b/tests/testdata/commonjs/package.json
diff --git a/cli/tests/testdata/compile/args.ts b/tests/testdata/compile/args.ts
index ec41d52f9..ec41d52f9 100644
--- a/cli/tests/testdata/compile/args.ts
+++ b/tests/testdata/compile/args.ts
diff --git a/cli/tests/testdata/compile/check_local_by_default.ts b/tests/testdata/compile/check_local_by_default.ts
index 2ae8c2692..2ae8c2692 100644
--- a/cli/tests/testdata/compile/check_local_by_default.ts
+++ b/tests/testdata/compile/check_local_by_default.ts
diff --git a/cli/tests/testdata/compile/check_local_by_default2.ts b/tests/testdata/compile/check_local_by_default2.ts
index 5177ff944..5177ff944 100644
--- a/cli/tests/testdata/compile/check_local_by_default2.ts
+++ b/tests/testdata/compile/check_local_by_default2.ts
diff --git a/cli/tests/testdata/compile/dynamic_imports/import1.ts b/tests/testdata/compile/dynamic_imports/import1.ts
index 2d9dde2a4..2d9dde2a4 100644
--- a/cli/tests/testdata/compile/dynamic_imports/import1.ts
+++ b/tests/testdata/compile/dynamic_imports/import1.ts
diff --git a/cli/tests/testdata/compile/dynamic_imports/import2.ts b/tests/testdata/compile/dynamic_imports/import2.ts
index 22321a5a7..22321a5a7 100644
--- a/cli/tests/testdata/compile/dynamic_imports/import2.ts
+++ b/tests/testdata/compile/dynamic_imports/import2.ts
diff --git a/cli/tests/testdata/compile/dynamic_imports/import_path b/tests/testdata/compile/dynamic_imports/import_path
index 98222a208..98222a208 100644
--- a/cli/tests/testdata/compile/dynamic_imports/import_path
+++ b/tests/testdata/compile/dynamic_imports/import_path
diff --git a/cli/tests/testdata/compile/dynamic_imports/main.out b/tests/testdata/compile/dynamic_imports/main.out
index 4304fb06f..4304fb06f 100644
--- a/cli/tests/testdata/compile/dynamic_imports/main.out
+++ b/tests/testdata/compile/dynamic_imports/main.out
diff --git a/cli/tests/testdata/compile/dynamic_imports/main.ts b/tests/testdata/compile/dynamic_imports/main.ts
index b889e2203..b889e2203 100644
--- a/cli/tests/testdata/compile/dynamic_imports/main.ts
+++ b/tests/testdata/compile/dynamic_imports/main.ts
diff --git a/tests/testdata/compile/dynamic_imports/main_unanalyzable.ts b/tests/testdata/compile/dynamic_imports/main_unanalyzable.ts
new file mode 100644
index 000000000..7880fa4a6
--- /dev/null
+++ b/tests/testdata/compile/dynamic_imports/main_unanalyzable.ts
@@ -0,0 +1,18 @@
+import { join } from "../../../../test_util/std/path/mod.ts";
+
+console.log("Starting the main module");
+
+// We load the dynamic import path from the file system, to make sure any
+// improvements in static analysis can't defeat the purpose of this test, which
+// is to make sure the `--include` flag works to add non-analyzed imports to the
+// module graph.
+const IMPORT_PATH_FILE_PATH = join(
+ Deno.cwd(),
+ "tests/testdata/compile/dynamic_imports/import_path",
+);
+
+setTimeout(async () => {
+ console.log("Dynamic importing");
+ const importPath = (await Deno.readTextFile(IMPORT_PATH_FILE_PATH)).trim();
+ import(importPath).then(() => console.log("Dynamic import done."));
+}, 0);
diff --git a/cli/tests/testdata/compile/dynamic_imports_tmp_lit/main.info.out b/tests/testdata/compile/dynamic_imports_tmp_lit/main.info.out
index 57d730a64..57d730a64 100644
--- a/cli/tests/testdata/compile/dynamic_imports_tmp_lit/main.info.out
+++ b/tests/testdata/compile/dynamic_imports_tmp_lit/main.info.out
diff --git a/cli/tests/testdata/compile/dynamic_imports_tmp_lit/main.js b/tests/testdata/compile/dynamic_imports_tmp_lit/main.js
index 3bda59772..3bda59772 100644
--- a/cli/tests/testdata/compile/dynamic_imports_tmp_lit/main.js
+++ b/tests/testdata/compile/dynamic_imports_tmp_lit/main.js
diff --git a/cli/tests/testdata/compile/dynamic_imports_tmp_lit/other/data.json b/tests/testdata/compile/dynamic_imports_tmp_lit/other/data.json
index 0131e01e4..0131e01e4 100644
--- a/cli/tests/testdata/compile/dynamic_imports_tmp_lit/other/data.json
+++ b/tests/testdata/compile/dynamic_imports_tmp_lit/other/data.json
diff --git a/cli/tests/testdata/compile/dynamic_imports_tmp_lit/other/sub/data2.json b/tests/testdata/compile/dynamic_imports_tmp_lit/other/sub/data2.json
index 858a13cdd..858a13cdd 100644
--- a/cli/tests/testdata/compile/dynamic_imports_tmp_lit/other/sub/data2.json
+++ b/tests/testdata/compile/dynamic_imports_tmp_lit/other/sub/data2.json
diff --git a/cli/tests/testdata/compile/dynamic_imports_tmp_lit/sub/a.js b/tests/testdata/compile/dynamic_imports_tmp_lit/sub/a.js
index 7b2a34601..7b2a34601 100644
--- a/cli/tests/testdata/compile/dynamic_imports_tmp_lit/sub/a.js
+++ b/tests/testdata/compile/dynamic_imports_tmp_lit/sub/a.js
diff --git a/cli/tests/testdata/compile/dynamic_imports_tmp_lit/sub/b.ts b/tests/testdata/compile/dynamic_imports_tmp_lit/sub/b.ts
index 6d012e7f1..6d012e7f1 100644
--- a/cli/tests/testdata/compile/dynamic_imports_tmp_lit/sub/b.ts
+++ b/tests/testdata/compile/dynamic_imports_tmp_lit/sub/b.ts
diff --git a/cli/tests/testdata/compile/node_modules_symlink_outside/main.out b/tests/testdata/compile/node_modules_symlink_outside/main.out
index 61c83cba4..61c83cba4 100644
--- a/cli/tests/testdata/compile/node_modules_symlink_outside/main.out
+++ b/tests/testdata/compile/node_modules_symlink_outside/main.out
diff --git a/cli/tests/testdata/compile/node_modules_symlink_outside/main.ts b/tests/testdata/compile/node_modules_symlink_outside/main.ts
index 45f681f7c..45f681f7c 100644
--- a/cli/tests/testdata/compile/node_modules_symlink_outside/main.ts
+++ b/tests/testdata/compile/node_modules_symlink_outside/main.ts
diff --git a/cli/tests/testdata/compile/node_modules_symlink_outside/main_compile_file.out b/tests/testdata/compile/node_modules_symlink_outside/main_compile_file.out
index 1154c3256..1154c3256 100644
--- a/cli/tests/testdata/compile/node_modules_symlink_outside/main_compile_file.out
+++ b/tests/testdata/compile/node_modules_symlink_outside/main_compile_file.out
diff --git a/cli/tests/testdata/compile/node_modules_symlink_outside/main_compile_folder.out b/tests/testdata/compile/node_modules_symlink_outside/main_compile_folder.out
index e88b95834..e88b95834 100644
--- a/cli/tests/testdata/compile/node_modules_symlink_outside/main_compile_folder.out
+++ b/tests/testdata/compile/node_modules_symlink_outside/main_compile_folder.out
diff --git a/cli/tests/testdata/compile/npm_fs/main.out b/tests/testdata/compile/npm_fs/main.out
index 2e9ba477f..2e9ba477f 100644
--- a/cli/tests/testdata/compile/npm_fs/main.out
+++ b/tests/testdata/compile/npm_fs/main.out
diff --git a/cli/tests/testdata/compile/npm_fs/main.ts b/tests/testdata/compile/npm_fs/main.ts
index 6361610a9..6361610a9 100644
--- a/cli/tests/testdata/compile/npm_fs/main.ts
+++ b/tests/testdata/compile/npm_fs/main.ts
diff --git a/cli/tests/testdata/compile/standalone_error.ts b/tests/testdata/compile/standalone_error.ts
index 279398113..279398113 100644
--- a/cli/tests/testdata/compile/standalone_error.ts
+++ b/tests/testdata/compile/standalone_error.ts
diff --git a/cli/tests/testdata/compile/standalone_error_module_with_imports_1.ts b/tests/testdata/compile/standalone_error_module_with_imports_1.ts
index bf38f7263..bf38f7263 100644
--- a/cli/tests/testdata/compile/standalone_error_module_with_imports_1.ts
+++ b/tests/testdata/compile/standalone_error_module_with_imports_1.ts
diff --git a/cli/tests/testdata/compile/standalone_error_module_with_imports_2.ts b/tests/testdata/compile/standalone_error_module_with_imports_2.ts
index ef052b512..ef052b512 100644
--- a/cli/tests/testdata/compile/standalone_error_module_with_imports_2.ts
+++ b/tests/testdata/compile/standalone_error_module_with_imports_2.ts
diff --git a/cli/tests/testdata/compile/standalone_follow_redirects.ts b/tests/testdata/compile/standalone_follow_redirects.ts
index f0957bc3d..f0957bc3d 100644
--- a/cli/tests/testdata/compile/standalone_follow_redirects.ts
+++ b/tests/testdata/compile/standalone_follow_redirects.ts
diff --git a/tests/testdata/compile/standalone_follow_redirects_2.js b/tests/testdata/compile/standalone_follow_redirects_2.js
new file mode 100644
index 000000000..765dda153
--- /dev/null
+++ b/tests/testdata/compile/standalone_follow_redirects_2.js
@@ -0,0 +1,5 @@
+// unversioned import redirects with dependencies.
+import {
+ assertNotEquals as _a,
+ assertStrictEquals as _b,
+} from "../../../test_util/std/assert/mod.ts";
diff --git a/cli/tests/testdata/compile/standalone_import_datauri.ts b/tests/testdata/compile/standalone_import_datauri.ts
index 68f348828..68f348828 100644
--- a/cli/tests/testdata/compile/standalone_import_datauri.ts
+++ b/tests/testdata/compile/standalone_import_datauri.ts
diff --git a/cli/tests/testdata/compile/standalone_import_map.json b/tests/testdata/compile/standalone_import_map.json
index 9e5b90bd7..9e5b90bd7 100644
--- a/cli/tests/testdata/compile/standalone_import_map.json
+++ b/tests/testdata/compile/standalone_import_map.json
diff --git a/cli/tests/testdata/compile/standalone_import_map.ts b/tests/testdata/compile/standalone_import_map.ts
index 097b96356..097b96356 100644
--- a/cli/tests/testdata/compile/standalone_import_map.ts
+++ b/tests/testdata/compile/standalone_import_map.ts
diff --git a/cli/tests/testdata/compile/standalone_import_map_config.json b/tests/testdata/compile/standalone_import_map_config.json
index 4959827f4..4959827f4 100644
--- a/cli/tests/testdata/compile/standalone_import_map_config.json
+++ b/tests/testdata/compile/standalone_import_map_config.json
diff --git a/cli/tests/testdata/compile/standalone_runtime_flags.ts b/tests/testdata/compile/standalone_runtime_flags.ts
index 0154c7f4e..0154c7f4e 100644
--- a/cli/tests/testdata/compile/standalone_runtime_flags.ts
+++ b/tests/testdata/compile/standalone_runtime_flags.ts
diff --git a/cli/tests/testdata/compile/unstable_features.ts b/tests/testdata/compile/unstable_features.ts
index 819a3d187..819a3d187 100644
--- a/cli/tests/testdata/compile/unstable_features.ts
+++ b/tests/testdata/compile/unstable_features.ts
diff --git a/cli/tests/testdata/compile/vfs_implicit_read_permission/main.out b/tests/testdata/compile/vfs_implicit_read_permission/main.out
index 17d05159c..17d05159c 100644
--- a/cli/tests/testdata/compile/vfs_implicit_read_permission/main.out
+++ b/tests/testdata/compile/vfs_implicit_read_permission/main.out
diff --git a/cli/tests/testdata/compile/vfs_implicit_read_permission/main.ts b/tests/testdata/compile/vfs_implicit_read_permission/main.ts
index 56ad1e095..56ad1e095 100644
--- a/cli/tests/testdata/compile/vfs_implicit_read_permission/main.ts
+++ b/tests/testdata/compile/vfs_implicit_read_permission/main.ts
diff --git a/cli/tests/testdata/compile/workers/basic.out b/tests/testdata/compile/workers/basic.out
index 9cf9aa18f..9cf9aa18f 100644
--- a/cli/tests/testdata/compile/workers/basic.out
+++ b/tests/testdata/compile/workers/basic.out
diff --git a/cli/tests/testdata/compile/workers/basic.ts b/tests/testdata/compile/workers/basic.ts
index 8edf58de9..8edf58de9 100644
--- a/cli/tests/testdata/compile/workers/basic.ts
+++ b/tests/testdata/compile/workers/basic.ts
diff --git a/cli/tests/testdata/compile/workers/not_in_module_map.ts b/tests/testdata/compile/workers/not_in_module_map.ts
index b43f8cb1f..b43f8cb1f 100644
--- a/cli/tests/testdata/compile/workers/not_in_module_map.ts
+++ b/tests/testdata/compile/workers/not_in_module_map.ts
diff --git a/cli/tests/testdata/compile/workers/worker.ts b/tests/testdata/compile/workers/worker.ts
index a1c357ab1..a1c357ab1 100644
--- a/cli/tests/testdata/compile/workers/worker.ts
+++ b/tests/testdata/compile/workers/worker.ts
diff --git a/cli/tests/testdata/coverage/branch.ts b/tests/testdata/coverage/branch.ts
index 352167109..352167109 100644
--- a/cli/tests/testdata/coverage/branch.ts
+++ b/tests/testdata/coverage/branch.ts
diff --git a/cli/tests/testdata/coverage/branch_expected.lcov b/tests/testdata/coverage/branch_expected.lcov
index fb3454210..fb3454210 100644
--- a/cli/tests/testdata/coverage/branch_expected.lcov
+++ b/tests/testdata/coverage/branch_expected.lcov
diff --git a/cli/tests/testdata/coverage/branch_expected.out b/tests/testdata/coverage/branch_expected.out
index 630ea93b2..630ea93b2 100644
--- a/cli/tests/testdata/coverage/branch_expected.out
+++ b/tests/testdata/coverage/branch_expected.out
diff --git a/cli/tests/testdata/coverage/branch_test.ts b/tests/testdata/coverage/branch_test.ts
index 2a44c8071..2a44c8071 100644
--- a/cli/tests/testdata/coverage/branch_test.ts
+++ b/tests/testdata/coverage/branch_test.ts
diff --git a/cli/tests/testdata/coverage/complex.ts b/tests/testdata/coverage/complex.ts
index d128b5437..d128b5437 100644
--- a/cli/tests/testdata/coverage/complex.ts
+++ b/tests/testdata/coverage/complex.ts
diff --git a/cli/tests/testdata/coverage/complex_expected.lcov b/tests/testdata/coverage/complex_expected.lcov
index 94b86465a..94b86465a 100644
--- a/cli/tests/testdata/coverage/complex_expected.lcov
+++ b/tests/testdata/coverage/complex_expected.lcov
diff --git a/cli/tests/testdata/coverage/complex_expected.out b/tests/testdata/coverage/complex_expected.out
index 3d5f6a0ab..3d5f6a0ab 100644
--- a/cli/tests/testdata/coverage/complex_expected.out
+++ b/tests/testdata/coverage/complex_expected.out
diff --git a/cli/tests/testdata/coverage/complex_test.ts b/tests/testdata/coverage/complex_test.ts
index d6e9c2691..d6e9c2691 100644
--- a/cli/tests/testdata/coverage/complex_test.ts
+++ b/tests/testdata/coverage/complex_test.ts
diff --git a/cli/tests/testdata/coverage/doesnt_exist.out b/tests/testdata/coverage/doesnt_exist.out
index 0b679bcb4..0b679bcb4 100644
--- a/cli/tests/testdata/coverage/doesnt_exist.out
+++ b/tests/testdata/coverage/doesnt_exist.out
diff --git a/cli/tests/testdata/coverage/final_blankline.js b/tests/testdata/coverage/final_blankline.js
index bb5ab0378..bb5ab0378 100644
--- a/cli/tests/testdata/coverage/final_blankline.js
+++ b/tests/testdata/coverage/final_blankline.js
diff --git a/cli/tests/testdata/coverage/final_blankline_expected.lcov b/tests/testdata/coverage/final_blankline_expected.lcov
index 48af66180..48af66180 100644
--- a/cli/tests/testdata/coverage/final_blankline_expected.lcov
+++ b/tests/testdata/coverage/final_blankline_expected.lcov
diff --git a/cli/tests/testdata/coverage/final_blankline_expected.out b/tests/testdata/coverage/final_blankline_expected.out
index 8dc5ce30d..8dc5ce30d 100644
--- a/cli/tests/testdata/coverage/final_blankline_expected.out
+++ b/tests/testdata/coverage/final_blankline_expected.out
diff --git a/cli/tests/testdata/coverage/final_blankline_test.js b/tests/testdata/coverage/final_blankline_test.js
index e7331c537..e7331c537 100644
--- a/cli/tests/testdata/coverage/final_blankline_test.js
+++ b/tests/testdata/coverage/final_blankline_test.js
diff --git a/cli/tests/testdata/coverage/invalid_cache/mod.test.ts b/tests/testdata/coverage/invalid_cache/mod.test.ts
index 5815d07a3..5815d07a3 100644
--- a/cli/tests/testdata/coverage/invalid_cache/mod.test.ts
+++ b/tests/testdata/coverage/invalid_cache/mod.test.ts
diff --git a/cli/tests/testdata/coverage/invalid_cache/mod_after.ts b/tests/testdata/coverage/invalid_cache/mod_after.ts
index 294dc0843..294dc0843 100644
--- a/cli/tests/testdata/coverage/invalid_cache/mod_after.ts
+++ b/tests/testdata/coverage/invalid_cache/mod_after.ts
diff --git a/cli/tests/testdata/coverage/invalid_cache/mod_before.ts b/tests/testdata/coverage/invalid_cache/mod_before.ts
index ea52ccbce..ea52ccbce 100644
--- a/cli/tests/testdata/coverage/invalid_cache/mod_before.ts
+++ b/tests/testdata/coverage/invalid_cache/mod_before.ts
diff --git a/cli/tests/testdata/coverage/multifile/a_test.js b/tests/testdata/coverage/multifile/a_test.js
index d5d9c3533..d5d9c3533 100644
--- a/cli/tests/testdata/coverage/multifile/a_test.js
+++ b/tests/testdata/coverage/multifile/a_test.js
diff --git a/cli/tests/testdata/coverage/multifile/b_test.js b/tests/testdata/coverage/multifile/b_test.js
index d93b15a17..d93b15a17 100644
--- a/cli/tests/testdata/coverage/multifile/b_test.js
+++ b/tests/testdata/coverage/multifile/b_test.js
diff --git a/cli/tests/testdata/coverage/multifile/expected.lcov b/tests/testdata/coverage/multifile/expected.lcov
index 03ad5e7bd..03ad5e7bd 100644
--- a/cli/tests/testdata/coverage/multifile/expected.lcov
+++ b/tests/testdata/coverage/multifile/expected.lcov
diff --git a/cli/tests/testdata/coverage/multifile/expected.out b/tests/testdata/coverage/multifile/expected.out
index fde26e165..fde26e165 100644
--- a/cli/tests/testdata/coverage/multifile/expected.out
+++ b/tests/testdata/coverage/multifile/expected.out
diff --git a/cli/tests/testdata/coverage/multifile/mod.js b/tests/testdata/coverage/multifile/mod.js
index b9f8d627a..b9f8d627a 100644
--- a/cli/tests/testdata/coverage/multifile/mod.js
+++ b/tests/testdata/coverage/multifile/mod.js
diff --git a/cli/tests/testdata/coverage/multisource/bar.ts b/tests/testdata/coverage/multisource/bar.ts
index 123937b0b..123937b0b 100644
--- a/cli/tests/testdata/coverage/multisource/bar.ts
+++ b/tests/testdata/coverage/multisource/bar.ts
diff --git a/cli/tests/testdata/coverage/multisource/baz/quux.ts b/tests/testdata/coverage/multisource/baz/quux.ts
index 6032f6f3c..6032f6f3c 100644
--- a/cli/tests/testdata/coverage/multisource/baz/quux.ts
+++ b/tests/testdata/coverage/multisource/baz/quux.ts
diff --git a/cli/tests/testdata/coverage/multisource/baz/qux.ts b/tests/testdata/coverage/multisource/baz/qux.ts
index 973f48c61..973f48c61 100644
--- a/cli/tests/testdata/coverage/multisource/baz/qux.ts
+++ b/tests/testdata/coverage/multisource/baz/qux.ts
diff --git a/cli/tests/testdata/coverage/multisource/foo.ts b/tests/testdata/coverage/multisource/foo.ts
index 0559cadd8..0559cadd8 100644
--- a/cli/tests/testdata/coverage/multisource/foo.ts
+++ b/tests/testdata/coverage/multisource/foo.ts
diff --git a/cli/tests/testdata/coverage/multisource/test.ts b/tests/testdata/coverage/multisource/test.ts
index 350421177..350421177 100644
--- a/cli/tests/testdata/coverage/multisource/test.ts
+++ b/tests/testdata/coverage/multisource/test.ts
diff --git a/cli/tests/testdata/coverage/no_internal_code_test.ts b/tests/testdata/coverage/no_internal_code_test.ts
index 0cf46d252..0cf46d252 100644
--- a/cli/tests/testdata/coverage/no_internal_code_test.ts
+++ b/tests/testdata/coverage/no_internal_code_test.ts
diff --git a/cli/tests/testdata/coverage/no_internal_node_code_test.ts b/tests/testdata/coverage/no_internal_node_code_test.ts
index dc53e0c52..dc53e0c52 100644
--- a/cli/tests/testdata/coverage/no_internal_node_code_test.ts
+++ b/tests/testdata/coverage/no_internal_node_code_test.ts
diff --git a/cli/tests/testdata/coverage/no_npm_coverage/expected.out b/tests/testdata/coverage/no_npm_coverage/expected.out
index ca4511277..ca4511277 100644
--- a/cli/tests/testdata/coverage/no_npm_coverage/expected.out
+++ b/tests/testdata/coverage/no_npm_coverage/expected.out
diff --git a/cli/tests/testdata/coverage/no_npm_coverage/no_npm_coverage.ts b/tests/testdata/coverage/no_npm_coverage/no_npm_coverage.ts
index 4233b2e5d..4233b2e5d 100644
--- a/cli/tests/testdata/coverage/no_npm_coverage/no_npm_coverage.ts
+++ b/tests/testdata/coverage/no_npm_coverage/no_npm_coverage.ts
diff --git a/cli/tests/testdata/coverage/no_npm_coverage/no_npm_coverage_test.ts b/tests/testdata/coverage/no_npm_coverage/no_npm_coverage_test.ts
index 8305f9597..8305f9597 100644
--- a/cli/tests/testdata/coverage/no_npm_coverage/no_npm_coverage_test.ts
+++ b/tests/testdata/coverage/no_npm_coverage/no_npm_coverage_test.ts
diff --git a/cli/tests/testdata/coverage/no_snaps_included/__snapshots__/no_snaps_included_test.ts.snap b/tests/testdata/coverage/no_snaps_included/__snapshots__/no_snaps_included_test.ts.snap
index b7bfe6b8b..b7bfe6b8b 100644
--- a/cli/tests/testdata/coverage/no_snaps_included/__snapshots__/no_snaps_included_test.ts.snap
+++ b/tests/testdata/coverage/no_snaps_included/__snapshots__/no_snaps_included_test.ts.snap
diff --git a/cli/tests/testdata/coverage/no_snaps_included/expected.out b/tests/testdata/coverage/no_snaps_included/expected.out
index 83979a752..83979a752 100644
--- a/cli/tests/testdata/coverage/no_snaps_included/expected.out
+++ b/tests/testdata/coverage/no_snaps_included/expected.out
diff --git a/cli/tests/testdata/coverage/no_snaps_included/no_snaps_included.ts b/tests/testdata/coverage/no_snaps_included/no_snaps_included.ts
index 2d844150b..2d844150b 100644
--- a/cli/tests/testdata/coverage/no_snaps_included/no_snaps_included.ts
+++ b/tests/testdata/coverage/no_snaps_included/no_snaps_included.ts
diff --git a/tests/testdata/coverage/no_snaps_included/no_snaps_included_test.ts b/tests/testdata/coverage/no_snaps_included/no_snaps_included_test.ts
new file mode 100644
index 000000000..6fb44fcc6
--- /dev/null
+++ b/tests/testdata/coverage/no_snaps_included/no_snaps_included_test.ts
@@ -0,0 +1,11 @@
+import { assertSnapshot } from "../../../../test_util/std/testing/snapshot.ts";
+import { truth } from "./no_snaps_included.ts";
+
+Deno.test("the truth", () => {
+ truth();
+});
+
+// Create snapshot in .snap file, but it shouldn't be in the coverage output
+Deno.test("snapshot excluded from coverage", async (context) => {
+ await assertSnapshot(context, {});
+});
diff --git a/cli/tests/testdata/coverage/no_tests_included/expected.out b/tests/testdata/coverage/no_tests_included/expected.out
index 3b2469f2d..3b2469f2d 100644
--- a/cli/tests/testdata/coverage/no_tests_included/expected.out
+++ b/tests/testdata/coverage/no_tests_included/expected.out
diff --git a/tests/testdata/coverage/no_tests_included/foo.test.js b/tests/testdata/coverage/no_tests_included/foo.test.js
new file mode 100644
index 000000000..46dd037be
--- /dev/null
+++ b/tests/testdata/coverage/no_tests_included/foo.test.js
@@ -0,0 +1,6 @@
+import { addNumbers } from "./foo.ts";
+import { assertEquals } from "../../../../test_util/std/assert/mod.ts";
+
+Deno.test("addNumbers works", () => {
+ assertEquals(addNumbers(1, 2), 3);
+});
diff --git a/tests/testdata/coverage/no_tests_included/foo.test.mts b/tests/testdata/coverage/no_tests_included/foo.test.mts
new file mode 100644
index 000000000..46dd037be
--- /dev/null
+++ b/tests/testdata/coverage/no_tests_included/foo.test.mts
@@ -0,0 +1,6 @@
+import { addNumbers } from "./foo.ts";
+import { assertEquals } from "../../../../test_util/std/assert/mod.ts";
+
+Deno.test("addNumbers works", () => {
+ assertEquals(addNumbers(1, 2), 3);
+});
diff --git a/tests/testdata/coverage/no_tests_included/foo.test.ts b/tests/testdata/coverage/no_tests_included/foo.test.ts
new file mode 100644
index 000000000..46dd037be
--- /dev/null
+++ b/tests/testdata/coverage/no_tests_included/foo.test.ts
@@ -0,0 +1,6 @@
+import { addNumbers } from "./foo.ts";
+import { assertEquals } from "../../../../test_util/std/assert/mod.ts";
+
+Deno.test("addNumbers works", () => {
+ assertEquals(addNumbers(1, 2), 3);
+});
diff --git a/cli/tests/testdata/coverage/no_tests_included/foo.ts b/tests/testdata/coverage/no_tests_included/foo.ts
index fc2860ef0..fc2860ef0 100644
--- a/cli/tests/testdata/coverage/no_tests_included/foo.ts
+++ b/tests/testdata/coverage/no_tests_included/foo.ts
diff --git a/cli/tests/testdata/coverage/no_transpiled_lines/expected.lcov b/tests/testdata/coverage/no_transpiled_lines/expected.lcov
index 480945d14..480945d14 100644
--- a/cli/tests/testdata/coverage/no_transpiled_lines/expected.lcov
+++ b/tests/testdata/coverage/no_transpiled_lines/expected.lcov
diff --git a/cli/tests/testdata/coverage/no_transpiled_lines/expected.out b/tests/testdata/coverage/no_transpiled_lines/expected.out
index 3438a045c..3438a045c 100644
--- a/cli/tests/testdata/coverage/no_transpiled_lines/expected.out
+++ b/tests/testdata/coverage/no_transpiled_lines/expected.out
diff --git a/tests/testdata/coverage/no_transpiled_lines/index.ts b/tests/testdata/coverage/no_transpiled_lines/index.ts
new file mode 100644
index 000000000..8b87e7680
--- /dev/null
+++ b/tests/testdata/coverage/no_transpiled_lines/index.ts
@@ -0,0 +1,3 @@
+export { assertStrictEquals } from "../../../../test_util/std/assert/mod.ts";
+
+export * from "./interface.ts";
diff --git a/cli/tests/testdata/coverage/no_transpiled_lines/interface.ts b/tests/testdata/coverage/no_transpiled_lines/interface.ts
index 6e58a7b2f..6e58a7b2f 100644
--- a/cli/tests/testdata/coverage/no_transpiled_lines/interface.ts
+++ b/tests/testdata/coverage/no_transpiled_lines/interface.ts
diff --git a/cli/tests/testdata/coverage/no_transpiled_lines/repro_test.ts b/tests/testdata/coverage/no_transpiled_lines/repro_test.ts
index ca4a0d17f..ca4a0d17f 100644
--- a/cli/tests/testdata/coverage/no_transpiled_lines/repro_test.ts
+++ b/tests/testdata/coverage/no_transpiled_lines/repro_test.ts
diff --git a/cli/tests/testdata/doc/060_deno_doc_displays_all_overloads_in_details_view.ts b/tests/testdata/doc/060_deno_doc_displays_all_overloads_in_details_view.ts
index 854c1b464..854c1b464 100644
--- a/cli/tests/testdata/doc/060_deno_doc_displays_all_overloads_in_details_view.ts
+++ b/tests/testdata/doc/060_deno_doc_displays_all_overloads_in_details_view.ts
diff --git a/cli/tests/testdata/doc/060_deno_doc_displays_all_overloads_in_details_view.ts.out b/tests/testdata/doc/060_deno_doc_displays_all_overloads_in_details_view.ts.out
index 28d1cb921..28d1cb921 100644
--- a/cli/tests/testdata/doc/060_deno_doc_displays_all_overloads_in_details_view.ts.out
+++ b/tests/testdata/doc/060_deno_doc_displays_all_overloads_in_details_view.ts.out
diff --git a/cli/tests/testdata/doc/deno_doc.ts b/tests/testdata/doc/deno_doc.ts
index fb3c50957..fb3c50957 100644
--- a/cli/tests/testdata/doc/deno_doc.ts
+++ b/tests/testdata/doc/deno_doc.ts
diff --git a/cli/tests/testdata/doc/deno_doc2.ts b/tests/testdata/doc/deno_doc2.ts
index ee6fc22dc..ee6fc22dc 100644
--- a/cli/tests/testdata/doc/deno_doc2.ts
+++ b/tests/testdata/doc/deno_doc2.ts
diff --git a/cli/tests/testdata/doc/deno_doc_builtin.out b/tests/testdata/doc/deno_doc_builtin.out
index b4a90d6bc..b4a90d6bc 100644
--- a/cli/tests/testdata/doc/deno_doc_builtin.out
+++ b/tests/testdata/doc/deno_doc_builtin.out
diff --git a/cli/tests/testdata/doc/import_map.json b/tests/testdata/doc/import_map.json
index 244a30296..244a30296 100644
--- a/cli/tests/testdata/doc/import_map.json
+++ b/tests/testdata/doc/import_map.json
diff --git a/cli/tests/testdata/doc/invalid_url.out b/tests/testdata/doc/invalid_url.out
index 038c53177..038c53177 100644
--- a/cli/tests/testdata/doc/invalid_url.out
+++ b/tests/testdata/doc/invalid_url.out
diff --git a/cli/tests/testdata/doc/lint_success.out b/tests/testdata/doc/lint_success.out
index c05ac45a1..c05ac45a1 100644
--- a/cli/tests/testdata/doc/lint_success.out
+++ b/tests/testdata/doc/lint_success.out
diff --git a/cli/tests/testdata/doc/lint_success.ts b/tests/testdata/doc/lint_success.ts
index 42c44b2d7..42c44b2d7 100644
--- a/cli/tests/testdata/doc/lint_success.ts
+++ b/tests/testdata/doc/lint_success.ts
diff --git a/cli/tests/testdata/doc/lint_success_html.out b/tests/testdata/doc/lint_success_html.out
index 9503a335f..9503a335f 100644
--- a/cli/tests/testdata/doc/lint_success_html.out
+++ b/tests/testdata/doc/lint_success_html.out
diff --git a/cli/tests/testdata/doc/lint_success_json.out b/tests/testdata/doc/lint_success_json.out
index 050b2540c..050b2540c 100644
--- a/cli/tests/testdata/doc/lint_success_json.out
+++ b/tests/testdata/doc/lint_success_json.out
diff --git a/cli/tests/testdata/doc/module/fun.js b/tests/testdata/doc/module/fun.js
index 28901d945..28901d945 100644
--- a/cli/tests/testdata/doc/module/fun.js
+++ b/tests/testdata/doc/module/fun.js
diff --git a/cli/tests/testdata/doc/referenced_private_types.out b/tests/testdata/doc/referenced_private_types.out
index 3c91dbe15..3c91dbe15 100644
--- a/cli/tests/testdata/doc/referenced_private_types.out
+++ b/tests/testdata/doc/referenced_private_types.out
diff --git a/cli/tests/testdata/doc/referenced_private_types.ts b/tests/testdata/doc/referenced_private_types.ts
index 9570d4625..9570d4625 100644
--- a/cli/tests/testdata/doc/referenced_private_types.ts
+++ b/tests/testdata/doc/referenced_private_types.ts
diff --git a/cli/tests/testdata/doc/referenced_private_types_fixed.out b/tests/testdata/doc/referenced_private_types_fixed.out
index c05ac45a1..c05ac45a1 100644
--- a/cli/tests/testdata/doc/referenced_private_types_fixed.out
+++ b/tests/testdata/doc/referenced_private_types_fixed.out
diff --git a/cli/tests/testdata/doc/referenced_private_types_fixed.ts b/tests/testdata/doc/referenced_private_types_fixed.ts
index cd99bc76e..cd99bc76e 100644
--- a/cli/tests/testdata/doc/referenced_private_types_fixed.ts
+++ b/tests/testdata/doc/referenced_private_types_fixed.ts
diff --git a/cli/tests/testdata/doc/referenced_private_types_lint.out b/tests/testdata/doc/referenced_private_types_lint.out
index 328435cd7..328435cd7 100644
--- a/cli/tests/testdata/doc/referenced_private_types_lint.out
+++ b/tests/testdata/doc/referenced_private_types_lint.out
diff --git a/cli/tests/testdata/doc/types_header.out b/tests/testdata/doc/types_header.out
index a97b35dd7..a97b35dd7 100644
--- a/cli/tests/testdata/doc/types_header.out
+++ b/tests/testdata/doc/types_header.out
diff --git a/cli/tests/testdata/doc/types_header.ts b/tests/testdata/doc/types_header.ts
index b64c8d000..b64c8d000 100644
--- a/cli/tests/testdata/doc/types_header.ts
+++ b/tests/testdata/doc/types_header.ts
diff --git a/cli/tests/testdata/doc/types_hint.out b/tests/testdata/doc/types_hint.out
index bfd5191a1..bfd5191a1 100644
--- a/cli/tests/testdata/doc/types_hint.out
+++ b/tests/testdata/doc/types_hint.out
diff --git a/cli/tests/testdata/doc/types_hint.ts b/tests/testdata/doc/types_hint.ts
index bacea46db..bacea46db 100644
--- a/cli/tests/testdata/doc/types_hint.ts
+++ b/tests/testdata/doc/types_hint.ts
diff --git a/cli/tests/testdata/doc/types_ref.js b/tests/testdata/doc/types_ref.js
index 03d8b5570..03d8b5570 100644
--- a/cli/tests/testdata/doc/types_ref.js
+++ b/tests/testdata/doc/types_ref.js
diff --git a/cli/tests/testdata/doc/types_ref.out b/tests/testdata/doc/types_ref.out
index bfd5191a1..bfd5191a1 100644
--- a/cli/tests/testdata/doc/types_ref.out
+++ b/tests/testdata/doc/types_ref.out
diff --git a/cli/tests/testdata/doc/use_import_map.js b/tests/testdata/doc/use_import_map.js
index 672a7a7bd..672a7a7bd 100644
--- a/cli/tests/testdata/doc/use_import_map.js
+++ b/tests/testdata/doc/use_import_map.js
diff --git a/cli/tests/testdata/doc/use_import_map.out b/tests/testdata/doc/use_import_map.out
index 9509d5bfe..9509d5bfe 100644
--- a/cli/tests/testdata/doc/use_import_map.out
+++ b/tests/testdata/doc/use_import_map.out
diff --git a/cli/tests/testdata/dynamic_import/b.js b/tests/testdata/dynamic_import/b.js
index 6ea50d360..6ea50d360 100644
--- a/cli/tests/testdata/dynamic_import/b.js
+++ b/tests/testdata/dynamic_import/b.js
diff --git a/cli/tests/testdata/dynamic_import/c.js b/tests/testdata/dynamic_import/c.js
index 20546455e..20546455e 100644
--- a/cli/tests/testdata/dynamic_import/c.js
+++ b/tests/testdata/dynamic_import/c.js
diff --git a/cli/tests/testdata/dynamic_import/empty_1.ts b/tests/testdata/dynamic_import/empty_1.ts
index e69de29bb..e69de29bb 100644
--- a/cli/tests/testdata/dynamic_import/empty_1.ts
+++ b/tests/testdata/dynamic_import/empty_1.ts
diff --git a/cli/tests/testdata/dynamic_import/empty_2.ts b/tests/testdata/dynamic_import/empty_2.ts
index e69de29bb..e69de29bb 100644
--- a/cli/tests/testdata/dynamic_import/empty_2.ts
+++ b/tests/testdata/dynamic_import/empty_2.ts
diff --git a/cli/tests/testdata/dynamic_import/permissions_blob_local.ts b/tests/testdata/dynamic_import/permissions_blob_local.ts
index 9ef4158ce..9ef4158ce 100644
--- a/cli/tests/testdata/dynamic_import/permissions_blob_local.ts
+++ b/tests/testdata/dynamic_import/permissions_blob_local.ts
diff --git a/cli/tests/testdata/dynamic_import/permissions_blob_local.ts.out b/tests/testdata/dynamic_import/permissions_blob_local.ts.out
index b7b246ba2..b7b246ba2 100644
--- a/cli/tests/testdata/dynamic_import/permissions_blob_local.ts.out
+++ b/tests/testdata/dynamic_import/permissions_blob_local.ts.out
diff --git a/cli/tests/testdata/dynamic_import/permissions_blob_remote.ts b/tests/testdata/dynamic_import/permissions_blob_remote.ts
index 1e2c8c21a..1e2c8c21a 100644
--- a/cli/tests/testdata/dynamic_import/permissions_blob_remote.ts
+++ b/tests/testdata/dynamic_import/permissions_blob_remote.ts
diff --git a/cli/tests/testdata/dynamic_import/permissions_blob_remote.ts.out b/tests/testdata/dynamic_import/permissions_blob_remote.ts.out
index a00c02d72..a00c02d72 100644
--- a/cli/tests/testdata/dynamic_import/permissions_blob_remote.ts.out
+++ b/tests/testdata/dynamic_import/permissions_blob_remote.ts.out
diff --git a/cli/tests/testdata/dynamic_import/permissions_data_local.ts b/tests/testdata/dynamic_import/permissions_data_local.ts
index be4fc1c34..be4fc1c34 100644
--- a/cli/tests/testdata/dynamic_import/permissions_data_local.ts
+++ b/tests/testdata/dynamic_import/permissions_data_local.ts
diff --git a/cli/tests/testdata/dynamic_import/permissions_data_local.ts.out b/tests/testdata/dynamic_import/permissions_data_local.ts.out
index 98c8a7310..98c8a7310 100644
--- a/cli/tests/testdata/dynamic_import/permissions_data_local.ts.out
+++ b/tests/testdata/dynamic_import/permissions_data_local.ts.out
diff --git a/cli/tests/testdata/dynamic_import/permissions_data_remote.ts b/tests/testdata/dynamic_import/permissions_data_remote.ts
index b0a9540c3..b0a9540c3 100644
--- a/cli/tests/testdata/dynamic_import/permissions_data_remote.ts
+++ b/tests/testdata/dynamic_import/permissions_data_remote.ts
diff --git a/cli/tests/testdata/dynamic_import/permissions_data_remote.ts.out b/tests/testdata/dynamic_import/permissions_data_remote.ts.out
index cb2a7ccf7..cb2a7ccf7 100644
--- a/cli/tests/testdata/dynamic_import/permissions_data_remote.ts.out
+++ b/tests/testdata/dynamic_import/permissions_data_remote.ts.out
diff --git a/cli/tests/testdata/dynamic_import/permissions_remote_remote.ts b/tests/testdata/dynamic_import/permissions_remote_remote.ts
index 65a254191..65a254191 100644
--- a/cli/tests/testdata/dynamic_import/permissions_remote_remote.ts
+++ b/tests/testdata/dynamic_import/permissions_remote_remote.ts
diff --git a/cli/tests/testdata/dynamic_import/permissions_remote_remote.ts.out b/tests/testdata/dynamic_import/permissions_remote_remote.ts.out
index bd88dd4d9..bd88dd4d9 100644
--- a/cli/tests/testdata/dynamic_import/permissions_remote_remote.ts.out
+++ b/tests/testdata/dynamic_import/permissions_remote_remote.ts.out
diff --git a/cli/tests/testdata/dynamic_import/static_analysis_no_permissions.ts b/tests/testdata/dynamic_import/static_analysis_no_permissions.ts
index de75ba87b..de75ba87b 100644
--- a/cli/tests/testdata/dynamic_import/static_analysis_no_permissions.ts
+++ b/tests/testdata/dynamic_import/static_analysis_no_permissions.ts
diff --git a/cli/tests/testdata/dynamic_import/static_analysis_no_permissions.ts.out b/tests/testdata/dynamic_import/static_analysis_no_permissions.ts.out
index ba9249ab0..ba9249ab0 100644
--- a/cli/tests/testdata/dynamic_import/static_analysis_no_permissions.ts.out
+++ b/tests/testdata/dynamic_import/static_analysis_no_permissions.ts.out
diff --git a/cli/tests/testdata/dynamic_import/static_remote.ts b/tests/testdata/dynamic_import/static_remote.ts
index 2d6e820fd..2d6e820fd 100644
--- a/cli/tests/testdata/dynamic_import/static_remote.ts
+++ b/tests/testdata/dynamic_import/static_remote.ts
diff --git a/cli/tests/testdata/echo.ts b/tests/testdata/echo.ts
index 84a645433..84a645433 100644
--- a/cli/tests/testdata/echo.ts
+++ b/tests/testdata/echo.ts
diff --git a/tests/testdata/echo_server.ts b/tests/testdata/echo_server.ts
new file mode 100644
index 000000000..e7622c7aa
--- /dev/null
+++ b/tests/testdata/echo_server.ts
@@ -0,0 +1,12 @@
+import { copy } from "../../test_util/std/streams/copy.ts";
+const addr = Deno.args[0] || "0.0.0.0:4544";
+const [hostname, port] = addr.split(":");
+const listener = Deno.listen({ hostname, port: Number(port) });
+console.log("listening on", addr);
+listener.accept().then(
+ async (conn) => {
+ console.log("received bytes:", await copy(conn, conn));
+ conn.close();
+ listener.close();
+ },
+);
diff --git a/cli/tests/testdata/encoding/utf-16be.ts b/tests/testdata/encoding/utf-16be.ts
index 3d0144d7c..3d0144d7c 100644
--- a/cli/tests/testdata/encoding/utf-16be.ts
+++ b/tests/testdata/encoding/utf-16be.ts
Binary files differ
diff --git a/cli/tests/testdata/encoding/utf-16le.ts b/tests/testdata/encoding/utf-16le.ts
index 6f0e415f2..6f0e415f2 100644
--- a/cli/tests/testdata/encoding/utf-16le.ts
+++ b/tests/testdata/encoding/utf-16le.ts
Binary files differ
diff --git a/cli/tests/testdata/encoding/utf-8.ts b/tests/testdata/encoding/utf-8.ts
index bf889aeb7..bf889aeb7 100644
--- a/cli/tests/testdata/encoding/utf-8.ts
+++ b/tests/testdata/encoding/utf-8.ts
diff --git a/cli/tests/testdata/encoding/windows-1255 b/tests/testdata/encoding/windows-1255
index ec5cad7fd..ec5cad7fd 100644
--- a/cli/tests/testdata/encoding/windows-1255
+++ b/tests/testdata/encoding/windows-1255
diff --git a/cli/tests/testdata/env b/tests/testdata/env
index c41732d30..c41732d30 100644
--- a/cli/tests/testdata/env
+++ b/tests/testdata/env
diff --git a/cli/tests/testdata/error_cause_recursive_aggregate.ts b/tests/testdata/error_cause_recursive_aggregate.ts
index 4bb2ae064..4bb2ae064 100644
--- a/cli/tests/testdata/error_cause_recursive_aggregate.ts
+++ b/tests/testdata/error_cause_recursive_aggregate.ts
diff --git a/cli/tests/testdata/error_cause_recursive_aggregate.ts.out b/tests/testdata/error_cause_recursive_aggregate.ts.out
index 4ae20055a..4ae20055a 100644
--- a/cli/tests/testdata/error_cause_recursive_aggregate.ts.out
+++ b/tests/testdata/error_cause_recursive_aggregate.ts.out
diff --git a/cli/tests/testdata/error_cause_recursive_tail.ts b/tests/testdata/error_cause_recursive_tail.ts
index 51e7fa6d9..51e7fa6d9 100644
--- a/cli/tests/testdata/error_cause_recursive_tail.ts
+++ b/tests/testdata/error_cause_recursive_tail.ts
diff --git a/cli/tests/testdata/error_cause_recursive_tail.ts.out b/tests/testdata/error_cause_recursive_tail.ts.out
index 04b15e91a..04b15e91a 100644
--- a/cli/tests/testdata/error_cause_recursive_tail.ts.out
+++ b/tests/testdata/error_cause_recursive_tail.ts.out
diff --git a/cli/tests/testdata/eval/check_local_by_default.out b/tests/testdata/eval/check_local_by_default.out
index 52d98849f..52d98849f 100644
--- a/cli/tests/testdata/eval/check_local_by_default.out
+++ b/tests/testdata/eval/check_local_by_default.out
diff --git a/cli/tests/testdata/eval/check_local_by_default2.out b/tests/testdata/eval/check_local_by_default2.out
index 26a1fe6f8..26a1fe6f8 100644
--- a/cli/tests/testdata/eval/check_local_by_default2.out
+++ b/tests/testdata/eval/check_local_by_default2.out
diff --git a/cli/tests/testdata/eval/check_local_by_default2.ts b/tests/testdata/eval/check_local_by_default2.ts
index 5177ff944..5177ff944 100644
--- a/cli/tests/testdata/eval/check_local_by_default2.ts
+++ b/tests/testdata/eval/check_local_by_default2.ts
diff --git a/cli/tests/testdata/eval/dyn_import_eval.out b/tests/testdata/eval/dyn_import_eval.out
index 89e16b478..89e16b478 100644
--- a/cli/tests/testdata/eval/dyn_import_eval.out
+++ b/tests/testdata/eval/dyn_import_eval.out
diff --git a/cli/tests/testdata/eval/env_file_missing.out b/tests/testdata/eval/env_file_missing.out
index 221acab93..221acab93 100644
--- a/cli/tests/testdata/eval/env_file_missing.out
+++ b/tests/testdata/eval/env_file_missing.out
diff --git a/cli/tests/testdata/file_extensions/js_without_extension b/tests/testdata/file_extensions/js_without_extension
index 4774be326..4774be326 100644
--- a/cli/tests/testdata/file_extensions/js_without_extension
+++ b/tests/testdata/file_extensions/js_without_extension
diff --git a/cli/tests/testdata/file_extensions/js_without_extension.out b/tests/testdata/file_extensions/js_without_extension.out
index 1236c1e53..1236c1e53 100644
--- a/cli/tests/testdata/file_extensions/js_without_extension.out
+++ b/tests/testdata/file_extensions/js_without_extension.out
diff --git a/cli/tests/testdata/file_extensions/ts_with_extension.out b/tests/testdata/file_extensions/ts_with_extension.out
index 181959ee2..181959ee2 100644
--- a/cli/tests/testdata/file_extensions/ts_with_extension.out
+++ b/tests/testdata/file_extensions/ts_with_extension.out
diff --git a/cli/tests/testdata/file_extensions/ts_with_extension.ts b/tests/testdata/file_extensions/ts_with_extension.ts
index 3c49f7484..3c49f7484 100644
--- a/cli/tests/testdata/file_extensions/ts_with_extension.ts
+++ b/tests/testdata/file_extensions/ts_with_extension.ts
diff --git a/cli/tests/testdata/file_extensions/ts_with_js_extension.js b/tests/testdata/file_extensions/ts_with_js_extension.js
index 3c49f7484..3c49f7484 100644
--- a/cli/tests/testdata/file_extensions/ts_with_js_extension.js
+++ b/tests/testdata/file_extensions/ts_with_js_extension.js
diff --git a/cli/tests/testdata/file_extensions/ts_with_js_extension.out b/tests/testdata/file_extensions/ts_with_js_extension.out
index 1c3739bb9..1c3739bb9 100644
--- a/cli/tests/testdata/file_extensions/ts_with_js_extension.out
+++ b/tests/testdata/file_extensions/ts_with_js_extension.out
diff --git a/cli/tests/testdata/file_extensions/ts_without_extension b/tests/testdata/file_extensions/ts_without_extension
index f10891d7a..f10891d7a 100644
--- a/cli/tests/testdata/file_extensions/ts_without_extension
+++ b/tests/testdata/file_extensions/ts_without_extension
diff --git a/cli/tests/testdata/file_extensions/ts_without_extension.out b/tests/testdata/file_extensions/ts_without_extension.out
index e1f019f9e..e1f019f9e 100644
--- a/cli/tests/testdata/file_extensions/ts_without_extension.out
+++ b/tests/testdata/file_extensions/ts_without_extension.out
diff --git a/cli/tests/testdata/fmt/badly_formatted.ipynb b/tests/testdata/fmt/badly_formatted.ipynb
index c8600564f..c8600564f 100644
--- a/cli/tests/testdata/fmt/badly_formatted.ipynb
+++ b/tests/testdata/fmt/badly_formatted.ipynb
diff --git a/cli/tests/testdata/fmt/badly_formatted.json b/tests/testdata/fmt/badly_formatted.json
index f2bacf73d..f2bacf73d 100644
--- a/cli/tests/testdata/fmt/badly_formatted.json
+++ b/tests/testdata/fmt/badly_formatted.json
diff --git a/cli/tests/testdata/fmt/badly_formatted.md b/tests/testdata/fmt/badly_formatted.md
index 26afe483b..26afe483b 100644
--- a/cli/tests/testdata/fmt/badly_formatted.md
+++ b/tests/testdata/fmt/badly_formatted.md
diff --git a/cli/tests/testdata/fmt/badly_formatted.mjs b/tests/testdata/fmt/badly_formatted.mjs
index bc515a330..bc515a330 100644
--- a/cli/tests/testdata/fmt/badly_formatted.mjs
+++ b/tests/testdata/fmt/badly_formatted.mjs
diff --git a/cli/tests/testdata/fmt/badly_formatted_fixed.ipynb b/tests/testdata/fmt/badly_formatted_fixed.ipynb
index a26a95e24..a26a95e24 100644
--- a/cli/tests/testdata/fmt/badly_formatted_fixed.ipynb
+++ b/tests/testdata/fmt/badly_formatted_fixed.ipynb
diff --git a/cli/tests/testdata/fmt/badly_formatted_fixed.js b/tests/testdata/fmt/badly_formatted_fixed.js
index e9062ba85..e9062ba85 100644
--- a/cli/tests/testdata/fmt/badly_formatted_fixed.js
+++ b/tests/testdata/fmt/badly_formatted_fixed.js
diff --git a/cli/tests/testdata/fmt/badly_formatted_fixed.json b/tests/testdata/fmt/badly_formatted_fixed.json
index 0d697a2c6..0d697a2c6 100644
--- a/cli/tests/testdata/fmt/badly_formatted_fixed.json
+++ b/tests/testdata/fmt/badly_formatted_fixed.json
diff --git a/cli/tests/testdata/fmt/badly_formatted_fixed.md b/tests/testdata/fmt/badly_formatted_fixed.md
index 8ba74cac3..8ba74cac3 100644
--- a/cli/tests/testdata/fmt/badly_formatted_fixed.md
+++ b/tests/testdata/fmt/badly_formatted_fixed.md
diff --git a/cli/tests/testdata/fmt/deno.glob.json b/tests/testdata/fmt/deno.glob.json
index ff74e9d2b..ff74e9d2b 100644
--- a/cli/tests/testdata/fmt/deno.glob.json
+++ b/tests/testdata/fmt/deno.glob.json
diff --git a/cli/tests/testdata/fmt/deno.malformed.jsonc b/tests/testdata/fmt/deno.malformed.jsonc
index e326edb1f..e326edb1f 100644
--- a/cli/tests/testdata/fmt/deno.malformed.jsonc
+++ b/tests/testdata/fmt/deno.malformed.jsonc
diff --git a/cli/tests/testdata/fmt/deno.malformed2.jsonc b/tests/testdata/fmt/deno.malformed2.jsonc
index e326edb1f..e326edb1f 100644
--- a/cli/tests/testdata/fmt/deno.malformed2.jsonc
+++ b/tests/testdata/fmt/deno.malformed2.jsonc
diff --git a/cli/tests/testdata/fmt/expected_fmt_check_formatted_files.out b/tests/testdata/fmt/expected_fmt_check_formatted_files.out
index 5a4833dd4..5a4833dd4 100644
--- a/cli/tests/testdata/fmt/expected_fmt_check_formatted_files.out
+++ b/tests/testdata/fmt/expected_fmt_check_formatted_files.out
diff --git a/cli/tests/testdata/fmt/expected_fmt_check_ignore.out b/tests/testdata/fmt/expected_fmt_check_ignore.out
index 7c1e471b9..7c1e471b9 100644
--- a/cli/tests/testdata/fmt/expected_fmt_check_ignore.out
+++ b/tests/testdata/fmt/expected_fmt_check_ignore.out
diff --git a/cli/tests/testdata/fmt/expected_fmt_check_verbose_formatted_files.out b/tests/testdata/fmt/expected_fmt_check_verbose_formatted_files.out
index 158c556c2..158c556c2 100644
--- a/cli/tests/testdata/fmt/expected_fmt_check_verbose_formatted_files.out
+++ b/tests/testdata/fmt/expected_fmt_check_verbose_formatted_files.out
diff --git a/cli/tests/testdata/fmt/fmt_check_parse_error.out b/tests/testdata/fmt/fmt_check_parse_error.out
index 9854b6c97..9854b6c97 100644
--- a/cli/tests/testdata/fmt/fmt_check_parse_error.out
+++ b/tests/testdata/fmt/fmt_check_parse_error.out
diff --git a/cli/tests/testdata/fmt/fmt_with_config.out b/tests/testdata/fmt/fmt_with_config.out
index 158c556c2..158c556c2 100644
--- a/cli/tests/testdata/fmt/fmt_with_config.out
+++ b/tests/testdata/fmt/fmt_with_config.out
diff --git a/cli/tests/testdata/fmt/fmt_with_config_and_flags.out b/tests/testdata/fmt/fmt_with_config_and_flags.out
index c05ac45a1..c05ac45a1 100644
--- a/cli/tests/testdata/fmt/fmt_with_config_and_flags.out
+++ b/tests/testdata/fmt/fmt_with_config_and_flags.out
diff --git a/cli/tests/testdata/fmt/fmt_with_config_default.out b/tests/testdata/fmt/fmt_with_config_default.out
index faad9352b..faad9352b 100644
--- a/cli/tests/testdata/fmt/fmt_with_config_default.out
+++ b/tests/testdata/fmt/fmt_with_config_default.out
diff --git a/cli/tests/testdata/fmt/fmt_with_deprecated_config.out b/tests/testdata/fmt/fmt_with_deprecated_config.out
index 793fac1bc..793fac1bc 100644
--- a/cli/tests/testdata/fmt/fmt_with_deprecated_config.out
+++ b/tests/testdata/fmt/fmt_with_deprecated_config.out
diff --git a/cli/tests/testdata/fmt/fmt_with_malformed_config.out b/tests/testdata/fmt/fmt_with_malformed_config.out
index c269053a6..c269053a6 100644
--- a/cli/tests/testdata/fmt/fmt_with_malformed_config.out
+++ b/tests/testdata/fmt/fmt_with_malformed_config.out
diff --git a/cli/tests/testdata/fmt/fmt_with_malformed_config2.out b/tests/testdata/fmt/fmt_with_malformed_config2.out
index c269053a6..c269053a6 100644
--- a/cli/tests/testdata/fmt/fmt_with_malformed_config2.out
+++ b/tests/testdata/fmt/fmt_with_malformed_config2.out
diff --git a/cli/tests/testdata/fmt/glob/data/tes.ts b/tests/testdata/fmt/glob/data/tes.ts
index 0127c4af3..0127c4af3 100644
--- a/cli/tests/testdata/fmt/glob/data/tes.ts
+++ b/tests/testdata/fmt/glob/data/tes.ts
diff --git a/cli/tests/testdata/fmt/glob/data/test1.js b/tests/testdata/fmt/glob/data/test1.js
index e939e4595..e939e4595 100644
--- a/cli/tests/testdata/fmt/glob/data/test1.js
+++ b/tests/testdata/fmt/glob/data/test1.js
diff --git a/cli/tests/testdata/fmt/glob/data/test1.ts b/tests/testdata/fmt/glob/data/test1.ts
index e939e4595..e939e4595 100644
--- a/cli/tests/testdata/fmt/glob/data/test1.ts
+++ b/tests/testdata/fmt/glob/data/test1.ts
diff --git a/cli/tests/testdata/fmt/glob/data/test12.ts b/tests/testdata/fmt/glob/data/test12.ts
index 0127c4af3..0127c4af3 100644
--- a/cli/tests/testdata/fmt/glob/data/test12.ts
+++ b/tests/testdata/fmt/glob/data/test12.ts
diff --git a/cli/tests/testdata/fmt/glob/nested/fizz/bar.ts b/tests/testdata/fmt/glob/nested/fizz/bar.ts
index e939e4595..e939e4595 100644
--- a/cli/tests/testdata/fmt/glob/nested/fizz/bar.ts
+++ b/tests/testdata/fmt/glob/nested/fizz/bar.ts
diff --git a/cli/tests/testdata/fmt/glob/nested/fizz/bazz.ts b/tests/testdata/fmt/glob/nested/fizz/bazz.ts
index 0127c4af3..0127c4af3 100644
--- a/cli/tests/testdata/fmt/glob/nested/fizz/bazz.ts
+++ b/tests/testdata/fmt/glob/nested/fizz/bazz.ts
diff --git a/cli/tests/testdata/fmt/glob/nested/fizz/fizz.ts b/tests/testdata/fmt/glob/nested/fizz/fizz.ts
index e939e4595..e939e4595 100644
--- a/cli/tests/testdata/fmt/glob/nested/fizz/fizz.ts
+++ b/tests/testdata/fmt/glob/nested/fizz/fizz.ts
diff --git a/cli/tests/testdata/fmt/glob/nested/fizz/foo.ts b/tests/testdata/fmt/glob/nested/fizz/foo.ts
index e939e4595..e939e4595 100644
--- a/cli/tests/testdata/fmt/glob/nested/fizz/foo.ts
+++ b/tests/testdata/fmt/glob/nested/fizz/foo.ts
diff --git a/cli/tests/testdata/fmt/glob/nested/foo/bar.ts b/tests/testdata/fmt/glob/nested/foo/bar.ts
index e939e4595..e939e4595 100644
--- a/cli/tests/testdata/fmt/glob/nested/foo/bar.ts
+++ b/tests/testdata/fmt/glob/nested/foo/bar.ts
diff --git a/cli/tests/testdata/fmt/glob/nested/foo/bazz.ts b/tests/testdata/fmt/glob/nested/foo/bazz.ts
index 0127c4af3..0127c4af3 100644
--- a/cli/tests/testdata/fmt/glob/nested/foo/bazz.ts
+++ b/tests/testdata/fmt/glob/nested/foo/bazz.ts
diff --git a/cli/tests/testdata/fmt/glob/nested/foo/fizz.ts b/tests/testdata/fmt/glob/nested/foo/fizz.ts
index e939e4595..e939e4595 100644
--- a/cli/tests/testdata/fmt/glob/nested/foo/fizz.ts
+++ b/tests/testdata/fmt/glob/nested/foo/fizz.ts
diff --git a/cli/tests/testdata/fmt/glob/nested/foo/foo.ts b/tests/testdata/fmt/glob/nested/foo/foo.ts
index e939e4595..e939e4595 100644
--- a/cli/tests/testdata/fmt/glob/nested/foo/foo.ts
+++ b/tests/testdata/fmt/glob/nested/foo/foo.ts
diff --git a/cli/tests/testdata/fmt/glob/pages/[id].ts b/tests/testdata/fmt/glob/pages/[id].ts
index e939e4595..e939e4595 100644
--- a/cli/tests/testdata/fmt/glob/pages/[id].ts
+++ b/tests/testdata/fmt/glob/pages/[id].ts
diff --git a/cli/tests/testdata/fmt/invalid_data.json b/tests/testdata/fmt/invalid_data.json
index fb9bec94f..fb9bec94f 100644
--- a/cli/tests/testdata/fmt/invalid_data.json
+++ b/tests/testdata/fmt/invalid_data.json
Binary files differ
diff --git a/cli/tests/testdata/fmt/invalid_data.out b/tests/testdata/fmt/invalid_data.out
index dee00fcc5..dee00fcc5 100644
--- a/cli/tests/testdata/fmt/invalid_data.out
+++ b/tests/testdata/fmt/invalid_data.out
diff --git a/cli/tests/testdata/fmt/parse_error/parse_error.ts b/tests/testdata/fmt/parse_error/parse_error.ts
index 136d16508..136d16508 100644
--- a/cli/tests/testdata/fmt/parse_error/parse_error.ts
+++ b/tests/testdata/fmt/parse_error/parse_error.ts
diff --git a/cli/tests/testdata/fmt/regular/formatted1.js b/tests/testdata/fmt/regular/formatted1.js
index 587aa5b96..587aa5b96 100644
--- a/cli/tests/testdata/fmt/regular/formatted1.js
+++ b/tests/testdata/fmt/regular/formatted1.js
diff --git a/cli/tests/testdata/fmt/regular/formatted2.ts b/tests/testdata/fmt/regular/formatted2.ts
index 4a8036806..4a8036806 100644
--- a/cli/tests/testdata/fmt/regular/formatted2.ts
+++ b/tests/testdata/fmt/regular/formatted2.ts
diff --git a/cli/tests/testdata/fmt/regular/formatted3.markdown b/tests/testdata/fmt/regular/formatted3.markdown
index e6e616584..e6e616584 100644
--- a/cli/tests/testdata/fmt/regular/formatted3.markdown
+++ b/tests/testdata/fmt/regular/formatted3.markdown
diff --git a/cli/tests/testdata/fmt/regular/formatted4.jsonc b/tests/testdata/fmt/regular/formatted4.jsonc
index f0f72a6ed..f0f72a6ed 100644
--- a/cli/tests/testdata/fmt/regular/formatted4.jsonc
+++ b/tests/testdata/fmt/regular/formatted4.jsonc
diff --git a/cli/tests/testdata/fmt/with_config/deno.deprecated.jsonc b/tests/testdata/fmt/with_config/deno.deprecated.jsonc
index e053233fd..e053233fd 100644
--- a/cli/tests/testdata/fmt/with_config/deno.deprecated.jsonc
+++ b/tests/testdata/fmt/with_config/deno.deprecated.jsonc
diff --git a/cli/tests/testdata/fmt/with_config/deno.jsonc b/tests/testdata/fmt/with_config/deno.jsonc
index ffd265dcd..ffd265dcd 100644
--- a/cli/tests/testdata/fmt/with_config/deno.jsonc
+++ b/tests/testdata/fmt/with_config/deno.jsonc
diff --git a/cli/tests/testdata/fmt/with_config/subdir/a.ts b/tests/testdata/fmt/with_config/subdir/a.ts
index 5474b3aa3..5474b3aa3 100644
--- a/cli/tests/testdata/fmt/with_config/subdir/a.ts
+++ b/tests/testdata/fmt/with_config/subdir/a.ts
diff --git a/cli/tests/testdata/fmt/with_config/subdir/b.ts b/tests/testdata/fmt/with_config/subdir/b.ts
index d7eb08b09..d7eb08b09 100644
--- a/cli/tests/testdata/fmt/with_config/subdir/b.ts
+++ b/tests/testdata/fmt/with_config/subdir/b.ts
diff --git a/cli/tests/testdata/fmt/with_config/subdir/c.md b/tests/testdata/fmt/with_config/subdir/c.md
index 012f7e3d4..012f7e3d4 100644
--- a/cli/tests/testdata/fmt/with_config/subdir/c.md
+++ b/tests/testdata/fmt/with_config/subdir/c.md
diff --git a/cli/tests/testdata/import_attributes/data.json b/tests/testdata/import_attributes/data.json
index 37b3ee1e0..37b3ee1e0 100644
--- a/cli/tests/testdata/import_attributes/data.json
+++ b/tests/testdata/import_attributes/data.json
diff --git a/cli/tests/testdata/import_attributes/dynamic_error.out b/tests/testdata/import_attributes/dynamic_error.out
index 24f29de72..24f29de72 100644
--- a/cli/tests/testdata/import_attributes/dynamic_error.out
+++ b/tests/testdata/import_attributes/dynamic_error.out
diff --git a/cli/tests/testdata/import_attributes/dynamic_error.ts b/tests/testdata/import_attributes/dynamic_error.ts
index 2d9c6757f..2d9c6757f 100644
--- a/cli/tests/testdata/import_attributes/dynamic_error.ts
+++ b/tests/testdata/import_attributes/dynamic_error.ts
diff --git a/cli/tests/testdata/import_attributes/dynamic_import.out b/tests/testdata/import_attributes/dynamic_import.out
index 01bc76c8a..01bc76c8a 100644
--- a/cli/tests/testdata/import_attributes/dynamic_import.out
+++ b/tests/testdata/import_attributes/dynamic_import.out
diff --git a/cli/tests/testdata/import_attributes/dynamic_import.ts b/tests/testdata/import_attributes/dynamic_import.ts
index 73f348697..73f348697 100644
--- a/cli/tests/testdata/import_attributes/dynamic_import.ts
+++ b/tests/testdata/import_attributes/dynamic_import.ts
diff --git a/cli/tests/testdata/import_attributes/json_with_shebang.json b/tests/testdata/import_attributes/json_with_shebang.json
index b695e4457..b695e4457 100644
--- a/cli/tests/testdata/import_attributes/json_with_shebang.json
+++ b/tests/testdata/import_attributes/json_with_shebang.json
diff --git a/cli/tests/testdata/import_attributes/json_with_shebang.ts b/tests/testdata/import_attributes/json_with_shebang.ts
index 523bf8772..523bf8772 100644
--- a/cli/tests/testdata/import_attributes/json_with_shebang.ts
+++ b/tests/testdata/import_attributes/json_with_shebang.ts
diff --git a/cli/tests/testdata/import_attributes/json_with_shebang.ts.out b/tests/testdata/import_attributes/json_with_shebang.ts.out
index 23eb03720..23eb03720 100644
--- a/cli/tests/testdata/import_attributes/json_with_shebang.ts.out
+++ b/tests/testdata/import_attributes/json_with_shebang.ts.out
diff --git a/cli/tests/testdata/import_attributes/static_error.out b/tests/testdata/import_attributes/static_error.out
index 29b24b965..29b24b965 100644
--- a/cli/tests/testdata/import_attributes/static_error.out
+++ b/tests/testdata/import_attributes/static_error.out
diff --git a/cli/tests/testdata/import_attributes/static_error.ts b/tests/testdata/import_attributes/static_error.ts
index 0bc3a93f8..0bc3a93f8 100644
--- a/cli/tests/testdata/import_attributes/static_error.ts
+++ b/tests/testdata/import_attributes/static_error.ts
diff --git a/cli/tests/testdata/import_attributes/static_export.out b/tests/testdata/import_attributes/static_export.out
index 41af79d7c..41af79d7c 100644
--- a/cli/tests/testdata/import_attributes/static_export.out
+++ b/tests/testdata/import_attributes/static_export.out
diff --git a/cli/tests/testdata/import_attributes/static_export.ts b/tests/testdata/import_attributes/static_export.ts
index ac3ee694f..ac3ee694f 100644
--- a/cli/tests/testdata/import_attributes/static_export.ts
+++ b/tests/testdata/import_attributes/static_export.ts
diff --git a/cli/tests/testdata/import_attributes/static_import.out b/tests/testdata/import_attributes/static_import.out
index e57dffa99..e57dffa99 100644
--- a/cli/tests/testdata/import_attributes/static_import.out
+++ b/tests/testdata/import_attributes/static_import.out
diff --git a/cli/tests/testdata/import_attributes/static_import.ts b/tests/testdata/import_attributes/static_import.ts
index d46d93b4a..d46d93b4a 100644
--- a/cli/tests/testdata/import_attributes/static_import.ts
+++ b/tests/testdata/import_attributes/static_import.ts
diff --git a/cli/tests/testdata/import_attributes/static_reexport.ts b/tests/testdata/import_attributes/static_reexport.ts
index 81af428be..81af428be 100644
--- a/cli/tests/testdata/import_attributes/static_reexport.ts
+++ b/tests/testdata/import_attributes/static_reexport.ts
diff --git a/cli/tests/testdata/import_attributes/type_check.out b/tests/testdata/import_attributes/type_check.out
index 5ecdec82d..5ecdec82d 100644
--- a/cli/tests/testdata/import_attributes/type_check.out
+++ b/tests/testdata/import_attributes/type_check.out
diff --git a/cli/tests/testdata/import_attributes/type_check.ts b/tests/testdata/import_attributes/type_check.ts
index ddf28e67a..ddf28e67a 100644
--- a/cli/tests/testdata/import_attributes/type_check.ts
+++ b/tests/testdata/import_attributes/type_check.ts
diff --git a/cli/tests/testdata/import_maps/config.json b/tests/testdata/import_maps/config.json
index b296a63c7..b296a63c7 100644
--- a/cli/tests/testdata/import_maps/config.json
+++ b/tests/testdata/import_maps/config.json
diff --git a/cli/tests/testdata/import_maps/import_map.json b/tests/testdata/import_maps/import_map.json
index 40d1d4ec2..40d1d4ec2 100644
--- a/cli/tests/testdata/import_maps/import_map.json
+++ b/tests/testdata/import_maps/import_map.json
diff --git a/cli/tests/testdata/import_maps/import_map_invalid.json b/tests/testdata/import_maps/import_map_invalid.json
index a09d280c5..a09d280c5 100644
--- a/cli/tests/testdata/import_maps/import_map_invalid.json
+++ b/tests/testdata/import_maps/import_map_invalid.json
diff --git a/cli/tests/testdata/import_maps/import_map_remote.json b/tests/testdata/import_maps/import_map_remote.json
index 51f90f69c..51f90f69c 100644
--- a/cli/tests/testdata/import_maps/import_map_remote.json
+++ b/tests/testdata/import_maps/import_map_remote.json
diff --git a/cli/tests/testdata/import_maps/lodash/lodash.ts b/tests/testdata/import_maps/lodash/lodash.ts
index 2ec04ed3c..2ec04ed3c 100644
--- a/cli/tests/testdata/import_maps/lodash/lodash.ts
+++ b/tests/testdata/import_maps/lodash/lodash.ts
diff --git a/cli/tests/testdata/import_maps/lodash/other_file.ts b/tests/testdata/import_maps/lodash/other_file.ts
index 714adae3f..714adae3f 100644
--- a/cli/tests/testdata/import_maps/lodash/other_file.ts
+++ b/tests/testdata/import_maps/lodash/other_file.ts
diff --git a/cli/tests/testdata/import_maps/moment/moment.ts b/tests/testdata/import_maps/moment/moment.ts
index 2b54a431e..2b54a431e 100644
--- a/cli/tests/testdata/import_maps/moment/moment.ts
+++ b/tests/testdata/import_maps/moment/moment.ts
diff --git a/cli/tests/testdata/import_maps/moment/other_file.ts b/tests/testdata/import_maps/moment/other_file.ts
index 24f3a0226..24f3a0226 100644
--- a/cli/tests/testdata/import_maps/moment/other_file.ts
+++ b/tests/testdata/import_maps/moment/other_file.ts
diff --git a/cli/tests/testdata/import_maps/print_hello.ts b/tests/testdata/import_maps/print_hello.ts
index 794257390..794257390 100644
--- a/cli/tests/testdata/import_maps/print_hello.ts
+++ b/tests/testdata/import_maps/print_hello.ts
diff --git a/cli/tests/testdata/import_maps/scope/scoped.ts b/tests/testdata/import_maps/scope/scoped.ts
index 9a0b5d8e3..9a0b5d8e3 100644
--- a/cli/tests/testdata/import_maps/scope/scoped.ts
+++ b/tests/testdata/import_maps/scope/scoped.ts
diff --git a/cli/tests/testdata/import_maps/scoped_moment.ts b/tests/testdata/import_maps/scoped_moment.ts
index 9f67f88d4..9f67f88d4 100644
--- a/cli/tests/testdata/import_maps/scoped_moment.ts
+++ b/tests/testdata/import_maps/scoped_moment.ts
diff --git a/cli/tests/testdata/import_maps/test.ts b/tests/testdata/import_maps/test.ts
index 9b09e9953..9b09e9953 100644
--- a/cli/tests/testdata/import_maps/test.ts
+++ b/tests/testdata/import_maps/test.ts
diff --git a/cli/tests/testdata/import_maps/test_remote.ts b/tests/testdata/import_maps/test_remote.ts
index 206bdbd5f..206bdbd5f 100644
--- a/cli/tests/testdata/import_maps/test_remote.ts
+++ b/tests/testdata/import_maps/test_remote.ts
diff --git a/cli/tests/testdata/import_maps/vue.ts b/tests/testdata/import_maps/vue.ts
index 76dbe1917..76dbe1917 100644
--- a/cli/tests/testdata/import_maps/vue.ts
+++ b/tests/testdata/import_maps/vue.ts
diff --git a/cli/tests/testdata/info/031_info_ts_error.out b/tests/testdata/info/031_info_ts_error.out
index 81edd0032..81edd0032 100644
--- a/cli/tests/testdata/info/031_info_ts_error.out
+++ b/tests/testdata/info/031_info_ts_error.out
diff --git a/cli/tests/testdata/info/031_info_ts_error.ts b/tests/testdata/info/031_info_ts_error.ts
index 9b7492dbe..9b7492dbe 100644
--- a/cli/tests/testdata/info/031_info_ts_error.ts
+++ b/tests/testdata/info/031_info_ts_error.ts
diff --git a/cli/tests/testdata/info/041_info_flag.out b/tests/testdata/info/041_info_flag.out
index 3506a29e4..3506a29e4 100644
--- a/cli/tests/testdata/info/041_info_flag.out
+++ b/tests/testdata/info/041_info_flag.out
diff --git a/cli/tests/testdata/info/041_info_flag_location.out b/tests/testdata/info/041_info_flag_location.out
index b9e72f659..b9e72f659 100644
--- a/cli/tests/testdata/info/041_info_flag_location.out
+++ b/tests/testdata/info/041_info_flag_location.out
diff --git a/cli/tests/testdata/info/049_info_flag_script_jsx.out b/tests/testdata/info/049_info_flag_script_jsx.out
index f49fc2356..f49fc2356 100644
--- a/cli/tests/testdata/info/049_info_flag_script_jsx.out
+++ b/tests/testdata/info/049_info_flag_script_jsx.out
diff --git a/cli/tests/testdata/info/054_info_local_imports.out b/tests/testdata/info/054_info_local_imports.out
index ee1773b76..ee1773b76 100644
--- a/cli/tests/testdata/info/054_info_local_imports.out
+++ b/tests/testdata/info/054_info_local_imports.out
diff --git a/cli/tests/testdata/info/065_import_map_info.out b/tests/testdata/info/065_import_map_info.out
index 68d98f14a..68d98f14a 100644
--- a/cli/tests/testdata/info/065_import_map_info.out
+++ b/tests/testdata/info/065_import_map_info.out
diff --git a/cli/tests/testdata/info/076_info_json_deps_order.out b/tests/testdata/info/076_info_json_deps_order.out
index a1b15e00c..a1b15e00c 100644
--- a/cli/tests/testdata/info/076_info_json_deps_order.out
+++ b/tests/testdata/info/076_info_json_deps_order.out
diff --git a/cli/tests/testdata/info/076_info_json_deps_order.ts b/tests/testdata/info/076_info_json_deps_order.ts
index b1ae75e68..b1ae75e68 100644
--- a/cli/tests/testdata/info/076_info_json_deps_order.ts
+++ b/tests/testdata/info/076_info_json_deps_order.ts
diff --git a/cli/tests/testdata/info/data_null_error/data_null_error.out b/tests/testdata/info/data_null_error/data_null_error.out
index 065396f18..065396f18 100644
--- a/cli/tests/testdata/info/data_null_error/data_null_error.out
+++ b/tests/testdata/info/data_null_error/data_null_error.out
diff --git a/cli/tests/testdata/info/data_null_error/mod.ts b/tests/testdata/info/data_null_error/mod.ts
index 6e3e99bd4..6e3e99bd4 100644
--- a/cli/tests/testdata/info/data_null_error/mod.ts
+++ b/tests/testdata/info/data_null_error/mod.ts
diff --git a/cli/tests/testdata/info/data_null_error/types.d.ts b/tests/testdata/info/data_null_error/types.d.ts
index 6ecc85676..6ecc85676 100644
--- a/cli/tests/testdata/info/data_null_error/types.d.ts
+++ b/tests/testdata/info/data_null_error/types.d.ts
diff --git a/cli/tests/testdata/info/error_009_missing_js_module.js b/tests/testdata/info/error_009_missing_js_module.js
index e6ca88934..e6ca88934 100644
--- a/cli/tests/testdata/info/error_009_missing_js_module.js
+++ b/tests/testdata/info/error_009_missing_js_module.js
diff --git a/cli/tests/testdata/info/error_009_missing_js_module.js.out b/tests/testdata/info/error_009_missing_js_module.js.out
index edb08da1c..edb08da1c 100644
--- a/cli/tests/testdata/info/error_009_missing_js_module.js.out
+++ b/tests/testdata/info/error_009_missing_js_module.js.out
diff --git a/cli/tests/testdata/info/info_json.out b/tests/testdata/info/info_json.out
index 3215af742..3215af742 100644
--- a/cli/tests/testdata/info/info_json.out
+++ b/tests/testdata/info/info_json.out
diff --git a/cli/tests/testdata/info/info_json_location.out b/tests/testdata/info/info_json_location.out
index 510fa7749..510fa7749 100644
--- a/cli/tests/testdata/info/info_json_location.out
+++ b/tests/testdata/info/info_json_location.out
diff --git a/cli/tests/testdata/info/info_missing_module.out b/tests/testdata/info/info_missing_module.out
index c62d690c1..c62d690c1 100644
--- a/cli/tests/testdata/info/info_missing_module.out
+++ b/tests/testdata/info/info_missing_module.out
diff --git a/cli/tests/testdata/info/info_recursive_imports_test.out b/tests/testdata/info/info_recursive_imports_test.out
index 3340f3859..3340f3859 100644
--- a/cli/tests/testdata/info/info_recursive_imports_test.out
+++ b/tests/testdata/info/info_recursive_imports_test.out
diff --git a/cli/tests/testdata/info/info_recursive_imports_test.ts b/tests/testdata/info/info_recursive_imports_test.ts
index c9ba44755..c9ba44755 100644
--- a/cli/tests/testdata/info/info_recursive_imports_test.ts
+++ b/tests/testdata/info/info_recursive_imports_test.ts
diff --git a/cli/tests/testdata/info/info_type_import.out b/tests/testdata/info/info_type_import.out
index 0423efe82..0423efe82 100644
--- a/cli/tests/testdata/info/info_type_import.out
+++ b/tests/testdata/info/info_type_import.out
diff --git a/cli/tests/testdata/info/info_type_import.ts b/tests/testdata/info/info_type_import.ts
index 4db9f3387..4db9f3387 100644
--- a/cli/tests/testdata/info/info_type_import.ts
+++ b/tests/testdata/info/info_type_import.ts
diff --git a/cli/tests/testdata/info/json_output/main.out b/tests/testdata/info/json_output/main.out
index 5a89d5cab..5a89d5cab 100644
--- a/cli/tests/testdata/info/json_output/main.out
+++ b/tests/testdata/info/json_output/main.out
diff --git a/cli/tests/testdata/info/json_output/main.ts b/tests/testdata/info/json_output/main.ts
index 927bc55ed..927bc55ed 100644
--- a/cli/tests/testdata/info/json_output/main.ts
+++ b/tests/testdata/info/json_output/main.ts
diff --git a/cli/tests/testdata/info/multiple_imports.out b/tests/testdata/info/multiple_imports.out
index cb13318ca..cb13318ca 100644
--- a/cli/tests/testdata/info/multiple_imports.out
+++ b/tests/testdata/info/multiple_imports.out
diff --git a/cli/tests/testdata/info/recursive_imports/A.ts b/tests/testdata/info/recursive_imports/A.ts
index 43ecdbe5e..43ecdbe5e 100644
--- a/cli/tests/testdata/info/recursive_imports/A.ts
+++ b/tests/testdata/info/recursive_imports/A.ts
diff --git a/cli/tests/testdata/info/recursive_imports/B.ts b/tests/testdata/info/recursive_imports/B.ts
index 9fff0fdc9..9fff0fdc9 100644
--- a/cli/tests/testdata/info/recursive_imports/B.ts
+++ b/tests/testdata/info/recursive_imports/B.ts
diff --git a/cli/tests/testdata/info/recursive_imports/C.ts b/tests/testdata/info/recursive_imports/C.ts
index e47e77b41..e47e77b41 100644
--- a/cli/tests/testdata/info/recursive_imports/C.ts
+++ b/tests/testdata/info/recursive_imports/C.ts
diff --git a/cli/tests/testdata/info/recursive_imports/common.ts b/tests/testdata/info/recursive_imports/common.ts
index 2b16a7bf1..2b16a7bf1 100644
--- a/cli/tests/testdata/info/recursive_imports/common.ts
+++ b/tests/testdata/info/recursive_imports/common.ts
diff --git a/cli/tests/testdata/info/types_header.out b/tests/testdata/info/types_header.out
index 722e02f77..722e02f77 100644
--- a/cli/tests/testdata/info/types_header.out
+++ b/tests/testdata/info/types_header.out
diff --git a/cli/tests/testdata/info/with_config/deno-override.json b/tests/testdata/info/with_config/deno-override.json
index ee44ba947..ee44ba947 100644
--- a/cli/tests/testdata/info/with_config/deno-override.json
+++ b/tests/testdata/info/with_config/deno-override.json
diff --git a/cli/tests/testdata/info/with_config/deno.json b/tests/testdata/info/with_config/deno.json
index 0967ef424..0967ef424 100644
--- a/cli/tests/testdata/info/with_config/deno.json
+++ b/tests/testdata/info/with_config/deno.json
diff --git a/cli/tests/testdata/info/with_config/import_map.json b/tests/testdata/info/with_config/import_map.json
index 0967ef424..0967ef424 100644
--- a/cli/tests/testdata/info/with_config/import_map.json
+++ b/tests/testdata/info/with_config/import_map.json
diff --git a/cli/tests/testdata/info/with_config/test.ts b/tests/testdata/info/with_config/test.ts
index 85ce559e8..85ce559e8 100644
--- a/cli/tests/testdata/info/with_config/test.ts
+++ b/tests/testdata/info/with_config/test.ts
diff --git a/cli/tests/testdata/info/with_config/with_config.out b/tests/testdata/info/with_config/with_config.out
index 95a1f30bc..95a1f30bc 100644
--- a/cli/tests/testdata/info/with_config/with_config.out
+++ b/tests/testdata/info/with_config/with_config.out
diff --git a/cli/tests/testdata/info/with_import_map/deno.json b/tests/testdata/info/with_import_map/deno.json
index aaf7260c6..aaf7260c6 100644
--- a/cli/tests/testdata/info/with_import_map/deno.json
+++ b/tests/testdata/info/with_import_map/deno.json
diff --git a/cli/tests/testdata/info/with_import_map/deno.lock b/tests/testdata/info/with_import_map/deno.lock
index 78080ede2..78080ede2 100644
--- a/cli/tests/testdata/info/with_import_map/deno.lock
+++ b/tests/testdata/info/with_import_map/deno.lock
diff --git a/cli/tests/testdata/info/with_import_map/main.tsx b/tests/testdata/info/with_import_map/main.tsx
index e38f14a58..e38f14a58 100644
--- a/cli/tests/testdata/info/with_import_map/main.tsx
+++ b/tests/testdata/info/with_import_map/main.tsx
diff --git a/cli/tests/testdata/info/with_import_map/with_import_map.out b/tests/testdata/info/with_import_map/with_import_map.out
index 29dc17737..29dc17737 100644
--- a/cli/tests/testdata/info/with_import_map/with_import_map.out
+++ b/tests/testdata/info/with_import_map/with_import_map.out
diff --git a/cli/tests/testdata/inspector/bar.js b/tests/testdata/inspector/bar.js
index 278fc9030..278fc9030 100644
--- a/cli/tests/testdata/inspector/bar.js
+++ b/tests/testdata/inspector/bar.js
diff --git a/cli/tests/testdata/inspector/error_with_npm_import.js b/tests/testdata/inspector/error_with_npm_import.js
index 9244f2cf2..9244f2cf2 100644
--- a/cli/tests/testdata/inspector/error_with_npm_import.js
+++ b/tests/testdata/inspector/error_with_npm_import.js
diff --git a/cli/tests/testdata/inspector/foo.ts b/tests/testdata/inspector/foo.ts
index c0735926f..c0735926f 100644
--- a/cli/tests/testdata/inspector/foo.ts
+++ b/tests/testdata/inspector/foo.ts
diff --git a/cli/tests/testdata/inspector/inspect_wait.js b/tests/testdata/inspector/inspect_wait.js
index e2b10199c..e2b10199c 100644
--- a/cli/tests/testdata/inspector/inspect_wait.js
+++ b/tests/testdata/inspector/inspect_wait.js
diff --git a/cli/tests/testdata/inspector/inspector1.js b/tests/testdata/inspector/inspector1.js
index 5cb059def..5cb059def 100644
--- a/cli/tests/testdata/inspector/inspector1.js
+++ b/tests/testdata/inspector/inspector1.js
diff --git a/cli/tests/testdata/inspector/inspector2.js b/tests/testdata/inspector/inspector2.js
index 57f80ef94..57f80ef94 100644
--- a/cli/tests/testdata/inspector/inspector2.js
+++ b/tests/testdata/inspector/inspector2.js
diff --git a/cli/tests/testdata/inspector/inspector3.js b/tests/testdata/inspector/inspector3.js
index 8d605a286..8d605a286 100644
--- a/cli/tests/testdata/inspector/inspector3.js
+++ b/tests/testdata/inspector/inspector3.js
diff --git a/cli/tests/testdata/inspector/inspector4.js b/tests/testdata/inspector/inspector4.js
index 1bf419650..1bf419650 100644
--- a/cli/tests/testdata/inspector/inspector4.js
+++ b/tests/testdata/inspector/inspector4.js
diff --git a/cli/tests/testdata/inspector/inspector_test.js b/tests/testdata/inspector/inspector_test.js
index 86cd48854..86cd48854 100644
--- a/cli/tests/testdata/inspector/inspector_test.js
+++ b/tests/testdata/inspector/inspector_test.js
diff --git a/cli/tests/testdata/inspector/memory.js b/tests/testdata/inspector/memory.js
index 082d6367c..082d6367c 100644
--- a/cli/tests/testdata/inspector/memory.js
+++ b/tests/testdata/inspector/memory.js
diff --git a/cli/tests/testdata/inspector/test.ts b/tests/testdata/inspector/test.ts
index 2b33f22e5..2b33f22e5 100644
--- a/cli/tests/testdata/inspector/test.ts
+++ b/tests/testdata/inspector/test.ts
diff --git a/cli/tests/testdata/install/check_local_by_default.ts b/tests/testdata/install/check_local_by_default.ts
index 2ae8c2692..2ae8c2692 100644
--- a/cli/tests/testdata/install/check_local_by_default.ts
+++ b/tests/testdata/install/check_local_by_default.ts
diff --git a/cli/tests/testdata/install/check_local_by_default2.ts b/tests/testdata/install/check_local_by_default2.ts
index 5177ff944..5177ff944 100644
--- a/cli/tests/testdata/install/check_local_by_default2.ts
+++ b/tests/testdata/install/check_local_by_default2.ts
diff --git a/cli/tests/testdata/jsr/deps/main.out b/tests/testdata/jsr/deps/main.out
index 621703c4b..621703c4b 100644
--- a/cli/tests/testdata/jsr/deps/main.out
+++ b/tests/testdata/jsr/deps/main.out
diff --git a/cli/tests/testdata/jsr/deps/main.ts b/tests/testdata/jsr/deps/main.ts
index f48255299..f48255299 100644
--- a/cli/tests/testdata/jsr/deps/main.ts
+++ b/tests/testdata/jsr/deps/main.ts
diff --git a/cli/tests/testdata/jsr/deps/main_info.out b/tests/testdata/jsr/deps/main_info.out
index c4d412707..c4d412707 100644
--- a/cli/tests/testdata/jsr/deps/main_info.out
+++ b/tests/testdata/jsr/deps/main_info.out
diff --git a/cli/tests/testdata/jsr/module_graph/main.out b/tests/testdata/jsr/module_graph/main.out
index 1cd0115b9..1cd0115b9 100644
--- a/cli/tests/testdata/jsr/module_graph/main.out
+++ b/tests/testdata/jsr/module_graph/main.out
diff --git a/cli/tests/testdata/jsr/module_graph/main.ts b/tests/testdata/jsr/module_graph/main.ts
index c92823cc2..c92823cc2 100644
--- a/cli/tests/testdata/jsr/module_graph/main.ts
+++ b/tests/testdata/jsr/module_graph/main.ts
diff --git a/cli/tests/testdata/jsr/module_graph/main_info.out b/tests/testdata/jsr/module_graph/main_info.out
index c35cca5b4..c35cca5b4 100644
--- a/cli/tests/testdata/jsr/module_graph/main_info.out
+++ b/tests/testdata/jsr/module_graph/main_info.out
diff --git a/cli/tests/testdata/jsr/no_module_graph/main.out b/tests/testdata/jsr/no_module_graph/main.out
index da9b67e11..da9b67e11 100644
--- a/cli/tests/testdata/jsr/no_module_graph/main.out
+++ b/tests/testdata/jsr/no_module_graph/main.out
diff --git a/cli/tests/testdata/jsr/no_module_graph/main.ts b/tests/testdata/jsr/no_module_graph/main.ts
index 6ea030c59..6ea030c59 100644
--- a/cli/tests/testdata/jsr/no_module_graph/main.ts
+++ b/tests/testdata/jsr/no_module_graph/main.ts
diff --git a/cli/tests/testdata/jsr/no_module_graph/main_info.out b/tests/testdata/jsr/no_module_graph/main_info.out
index 0293e4120..0293e4120 100644
--- a/cli/tests/testdata/jsr/no_module_graph/main_info.out
+++ b/tests/testdata/jsr/no_module_graph/main_info.out
diff --git a/cli/tests/testdata/jsr/no_module_graph/multiple.out b/tests/testdata/jsr/no_module_graph/multiple.out
index 8146276d0..8146276d0 100644
--- a/cli/tests/testdata/jsr/no_module_graph/multiple.out
+++ b/tests/testdata/jsr/no_module_graph/multiple.out
diff --git a/cli/tests/testdata/jsr/no_module_graph/multiple.ts b/tests/testdata/jsr/no_module_graph/multiple.ts
index 660ed8be6..660ed8be6 100644
--- a/cli/tests/testdata/jsr/no_module_graph/multiple.ts
+++ b/tests/testdata/jsr/no_module_graph/multiple.ts
diff --git a/cli/tests/testdata/jsr/registry/@denotest/add/1.0.0/mod.ts b/tests/testdata/jsr/registry/@denotest/add/1.0.0/mod.ts
index 8d9b8a22a..8d9b8a22a 100644
--- a/cli/tests/testdata/jsr/registry/@denotest/add/1.0.0/mod.ts
+++ b/tests/testdata/jsr/registry/@denotest/add/1.0.0/mod.ts
diff --git a/cli/tests/testdata/jsr/registry/@denotest/add/1.0.0_meta.json b/tests/testdata/jsr/registry/@denotest/add/1.0.0_meta.json
index 6eebe2198..6eebe2198 100644
--- a/cli/tests/testdata/jsr/registry/@denotest/add/1.0.0_meta.json
+++ b/tests/testdata/jsr/registry/@denotest/add/1.0.0_meta.json
diff --git a/cli/tests/testdata/jsr/registry/@denotest/add/meta.json b/tests/testdata/jsr/registry/@denotest/add/meta.json
index 02601e4d0..02601e4d0 100644
--- a/cli/tests/testdata/jsr/registry/@denotest/add/meta.json
+++ b/tests/testdata/jsr/registry/@denotest/add/meta.json
diff --git a/cli/tests/testdata/jsr/registry/@denotest/deps/1.0.0/mod.ts b/tests/testdata/jsr/registry/@denotest/deps/1.0.0/mod.ts
index 4ba0d8aaf..4ba0d8aaf 100644
--- a/cli/tests/testdata/jsr/registry/@denotest/deps/1.0.0/mod.ts
+++ b/tests/testdata/jsr/registry/@denotest/deps/1.0.0/mod.ts
diff --git a/cli/tests/testdata/jsr/registry/@denotest/deps/1.0.0_meta.json b/tests/testdata/jsr/registry/@denotest/deps/1.0.0_meta.json
index 914e4bd73..914e4bd73 100644
--- a/cli/tests/testdata/jsr/registry/@denotest/deps/1.0.0_meta.json
+++ b/tests/testdata/jsr/registry/@denotest/deps/1.0.0_meta.json
diff --git a/cli/tests/testdata/jsr/registry/@denotest/deps/meta.json b/tests/testdata/jsr/registry/@denotest/deps/meta.json
index 02601e4d0..02601e4d0 100644
--- a/cli/tests/testdata/jsr/registry/@denotest/deps/meta.json
+++ b/tests/testdata/jsr/registry/@denotest/deps/meta.json
diff --git a/cli/tests/testdata/jsr/registry/@denotest/module_graph/1.4.0/mod.ts b/tests/testdata/jsr/registry/@denotest/module_graph/1.4.0/mod.ts
index cb3c4a5e0..cb3c4a5e0 100644
--- a/cli/tests/testdata/jsr/registry/@denotest/module_graph/1.4.0/mod.ts
+++ b/tests/testdata/jsr/registry/@denotest/module_graph/1.4.0/mod.ts
diff --git a/cli/tests/testdata/jsr/registry/@denotest/module_graph/1.4.0/other.ts b/tests/testdata/jsr/registry/@denotest/module_graph/1.4.0/other.ts
index 57e436cf8..57e436cf8 100644
--- a/cli/tests/testdata/jsr/registry/@denotest/module_graph/1.4.0/other.ts
+++ b/tests/testdata/jsr/registry/@denotest/module_graph/1.4.0/other.ts
diff --git a/cli/tests/testdata/jsr/registry/@denotest/module_graph/1.4.0_meta.json b/tests/testdata/jsr/registry/@denotest/module_graph/1.4.0_meta.json
index ff105b58a..ff105b58a 100644
--- a/cli/tests/testdata/jsr/registry/@denotest/module_graph/1.4.0_meta.json
+++ b/tests/testdata/jsr/registry/@denotest/module_graph/1.4.0_meta.json
diff --git a/cli/tests/testdata/jsr/registry/@denotest/module_graph/meta.json b/tests/testdata/jsr/registry/@denotest/module_graph/meta.json
index 9a450c08b..9a450c08b 100644
--- a/cli/tests/testdata/jsr/registry/@denotest/module_graph/meta.json
+++ b/tests/testdata/jsr/registry/@denotest/module_graph/meta.json
diff --git a/cli/tests/testdata/jsr/registry/@denotest/no_module_graph/0.1.0/TestClass.ts b/tests/testdata/jsr/registry/@denotest/no_module_graph/0.1.0/TestClass.ts
index 88ac04c12..88ac04c12 100644
--- a/cli/tests/testdata/jsr/registry/@denotest/no_module_graph/0.1.0/TestClass.ts
+++ b/tests/testdata/jsr/registry/@denotest/no_module_graph/0.1.0/TestClass.ts
diff --git a/cli/tests/testdata/jsr/registry/@denotest/no_module_graph/0.1.0/mod.ts b/tests/testdata/jsr/registry/@denotest/no_module_graph/0.1.0/mod.ts
index 57600eb4b..57600eb4b 100644
--- a/cli/tests/testdata/jsr/registry/@denotest/no_module_graph/0.1.0/mod.ts
+++ b/tests/testdata/jsr/registry/@denotest/no_module_graph/0.1.0/mod.ts
diff --git a/cli/tests/testdata/jsr/registry/@denotest/no_module_graph/0.1.0_meta.json b/tests/testdata/jsr/registry/@denotest/no_module_graph/0.1.0_meta.json
index 631a18d0e..631a18d0e 100644
--- a/cli/tests/testdata/jsr/registry/@denotest/no_module_graph/0.1.0_meta.json
+++ b/tests/testdata/jsr/registry/@denotest/no_module_graph/0.1.0_meta.json
diff --git a/cli/tests/testdata/jsr/registry/@denotest/no_module_graph/0.1.1/TestClass.ts b/tests/testdata/jsr/registry/@denotest/no_module_graph/0.1.1/TestClass.ts
index 88ac04c12..88ac04c12 100644
--- a/cli/tests/testdata/jsr/registry/@denotest/no_module_graph/0.1.1/TestClass.ts
+++ b/tests/testdata/jsr/registry/@denotest/no_module_graph/0.1.1/TestClass.ts
diff --git a/cli/tests/testdata/jsr/registry/@denotest/no_module_graph/0.1.1/mod.ts b/tests/testdata/jsr/registry/@denotest/no_module_graph/0.1.1/mod.ts
index 5e1fd9435..5e1fd9435 100644
--- a/cli/tests/testdata/jsr/registry/@denotest/no_module_graph/0.1.1/mod.ts
+++ b/tests/testdata/jsr/registry/@denotest/no_module_graph/0.1.1/mod.ts
diff --git a/cli/tests/testdata/jsr/registry/@denotest/no_module_graph/0.1.1_meta.json b/tests/testdata/jsr/registry/@denotest/no_module_graph/0.1.1_meta.json
index 631a18d0e..631a18d0e 100644
--- a/cli/tests/testdata/jsr/registry/@denotest/no_module_graph/0.1.1_meta.json
+++ b/tests/testdata/jsr/registry/@denotest/no_module_graph/0.1.1_meta.json
diff --git a/cli/tests/testdata/jsr/registry/@denotest/no_module_graph/0.2.0/TestClass.ts b/tests/testdata/jsr/registry/@denotest/no_module_graph/0.2.0/TestClass.ts
index 88ac04c12..88ac04c12 100644
--- a/cli/tests/testdata/jsr/registry/@denotest/no_module_graph/0.2.0/TestClass.ts
+++ b/tests/testdata/jsr/registry/@denotest/no_module_graph/0.2.0/TestClass.ts
diff --git a/cli/tests/testdata/jsr/registry/@denotest/no_module_graph/0.2.0/mod.ts b/tests/testdata/jsr/registry/@denotest/no_module_graph/0.2.0/mod.ts
index edf9622fb..edf9622fb 100644
--- a/cli/tests/testdata/jsr/registry/@denotest/no_module_graph/0.2.0/mod.ts
+++ b/tests/testdata/jsr/registry/@denotest/no_module_graph/0.2.0/mod.ts
diff --git a/cli/tests/testdata/jsr/registry/@denotest/no_module_graph/0.2.0_meta.json b/tests/testdata/jsr/registry/@denotest/no_module_graph/0.2.0_meta.json
index 631a18d0e..631a18d0e 100644
--- a/cli/tests/testdata/jsr/registry/@denotest/no_module_graph/0.2.0_meta.json
+++ b/tests/testdata/jsr/registry/@denotest/no_module_graph/0.2.0_meta.json
diff --git a/cli/tests/testdata/jsr/registry/@denotest/no_module_graph/meta.json b/tests/testdata/jsr/registry/@denotest/no_module_graph/meta.json
index 0268b6c8a..0268b6c8a 100644
--- a/cli/tests/testdata/jsr/registry/@denotest/no_module_graph/meta.json
+++ b/tests/testdata/jsr/registry/@denotest/no_module_graph/meta.json
diff --git a/cli/tests/testdata/jsr/registry/@denotest/subset_type_graph/0.1.0/mod.ts b/tests/testdata/jsr/registry/@denotest/subset_type_graph/0.1.0/mod.ts
index e81b2309a..e81b2309a 100644
--- a/cli/tests/testdata/jsr/registry/@denotest/subset_type_graph/0.1.0/mod.ts
+++ b/tests/testdata/jsr/registry/@denotest/subset_type_graph/0.1.0/mod.ts
diff --git a/cli/tests/testdata/jsr/registry/@denotest/subset_type_graph/0.1.0_meta.json b/tests/testdata/jsr/registry/@denotest/subset_type_graph/0.1.0_meta.json
index 631a18d0e..631a18d0e 100644
--- a/cli/tests/testdata/jsr/registry/@denotest/subset_type_graph/0.1.0_meta.json
+++ b/tests/testdata/jsr/registry/@denotest/subset_type_graph/0.1.0_meta.json
diff --git a/cli/tests/testdata/jsr/registry/@denotest/subset_type_graph/meta.json b/tests/testdata/jsr/registry/@denotest/subset_type_graph/meta.json
index d10aa5c3a..d10aa5c3a 100644
--- a/cli/tests/testdata/jsr/registry/@denotest/subset_type_graph/meta.json
+++ b/tests/testdata/jsr/registry/@denotest/subset_type_graph/meta.json
diff --git a/cli/tests/testdata/jsr/registry/@denotest/subset_type_graph_invalid/0.1.0/mod.ts b/tests/testdata/jsr/registry/@denotest/subset_type_graph_invalid/0.1.0/mod.ts
index 6a5036bf5..6a5036bf5 100644
--- a/cli/tests/testdata/jsr/registry/@denotest/subset_type_graph_invalid/0.1.0/mod.ts
+++ b/tests/testdata/jsr/registry/@denotest/subset_type_graph_invalid/0.1.0/mod.ts
diff --git a/cli/tests/testdata/jsr/registry/@denotest/subset_type_graph_invalid/0.1.0_meta.json b/tests/testdata/jsr/registry/@denotest/subset_type_graph_invalid/0.1.0_meta.json
index 631a18d0e..631a18d0e 100644
--- a/cli/tests/testdata/jsr/registry/@denotest/subset_type_graph_invalid/0.1.0_meta.json
+++ b/tests/testdata/jsr/registry/@denotest/subset_type_graph_invalid/0.1.0_meta.json
diff --git a/cli/tests/testdata/jsr/registry/@denotest/subset_type_graph_invalid/meta.json b/tests/testdata/jsr/registry/@denotest/subset_type_graph_invalid/meta.json
index d10aa5c3a..d10aa5c3a 100644
--- a/cli/tests/testdata/jsr/registry/@denotest/subset_type_graph_invalid/meta.json
+++ b/tests/testdata/jsr/registry/@denotest/subset_type_graph_invalid/meta.json
diff --git a/cli/tests/testdata/jsr/subset_type_graph/main.check.out b/tests/testdata/jsr/subset_type_graph/main.check.out
index 278884579..278884579 100644
--- a/cli/tests/testdata/jsr/subset_type_graph/main.check.out
+++ b/tests/testdata/jsr/subset_type_graph/main.check.out
diff --git a/cli/tests/testdata/jsr/subset_type_graph/main.ts b/tests/testdata/jsr/subset_type_graph/main.ts
index 2e1614be9..2e1614be9 100644
--- a/cli/tests/testdata/jsr/subset_type_graph/main.ts
+++ b/tests/testdata/jsr/subset_type_graph/main.ts
diff --git a/cli/tests/testdata/jsr/version_not_found/main.out b/tests/testdata/jsr/version_not_found/main.out
index 6a32b5d81..6a32b5d81 100644
--- a/cli/tests/testdata/jsr/version_not_found/main.out
+++ b/tests/testdata/jsr/version_not_found/main.out
diff --git a/cli/tests/testdata/jsr/version_not_found/main.ts b/tests/testdata/jsr/version_not_found/main.ts
index a7673b744..a7673b744 100644
--- a/cli/tests/testdata/jsr/version_not_found/main.ts
+++ b/tests/testdata/jsr/version_not_found/main.ts
diff --git a/cli/tests/testdata/jsx/deno-jsx-error.jsonc b/tests/testdata/jsx/deno-jsx-error.jsonc
index 37cb4dd91..37cb4dd91 100644
--- a/cli/tests/testdata/jsx/deno-jsx-error.jsonc
+++ b/tests/testdata/jsx/deno-jsx-error.jsonc
diff --git a/cli/tests/testdata/jsx/deno-jsx-import-map.jsonc b/tests/testdata/jsx/deno-jsx-import-map.jsonc
index 5adbfa8b5..5adbfa8b5 100644
--- a/cli/tests/testdata/jsx/deno-jsx-import-map.jsonc
+++ b/tests/testdata/jsx/deno-jsx-import-map.jsonc
diff --git a/cli/tests/testdata/jsx/deno-jsx-precompile.jsonc b/tests/testdata/jsx/deno-jsx-precompile.jsonc
index 95ae1b9f3..95ae1b9f3 100644
--- a/cli/tests/testdata/jsx/deno-jsx-precompile.jsonc
+++ b/tests/testdata/jsx/deno-jsx-precompile.jsonc
diff --git a/cli/tests/testdata/jsx/deno-jsx.json b/tests/testdata/jsx/deno-jsx.json
index 311409ea3..311409ea3 100644
--- a/cli/tests/testdata/jsx/deno-jsx.json
+++ b/tests/testdata/jsx/deno-jsx.json
diff --git a/cli/tests/testdata/jsx/deno-jsx.jsonc b/tests/testdata/jsx/deno-jsx.jsonc
index 311409ea3..311409ea3 100644
--- a/cli/tests/testdata/jsx/deno-jsx.jsonc
+++ b/tests/testdata/jsx/deno-jsx.jsonc
diff --git a/cli/tests/testdata/jsx/deno-jsxdev-import-map.jsonc b/tests/testdata/jsx/deno-jsxdev-import-map.jsonc
index 7481d5a2d..7481d5a2d 100644
--- a/cli/tests/testdata/jsx/deno-jsxdev-import-map.jsonc
+++ b/tests/testdata/jsx/deno-jsxdev-import-map.jsonc
diff --git a/cli/tests/testdata/jsx/deno-jsxdev.jsonc b/tests/testdata/jsx/deno-jsxdev.jsonc
index ae5bdf9f1..ae5bdf9f1 100644
--- a/cli/tests/testdata/jsx/deno-jsxdev.jsonc
+++ b/tests/testdata/jsx/deno-jsxdev.jsonc
diff --git a/cli/tests/testdata/jsx/deno.lock b/tests/testdata/jsx/deno.lock
index 011e8fe10..011e8fe10 100644
--- a/cli/tests/testdata/jsx/deno.lock
+++ b/tests/testdata/jsx/deno.lock
diff --git a/cli/tests/testdata/jsx/import-map-scoped.json b/tests/testdata/jsx/import-map-scoped.json
index 9b2005128..9b2005128 100644
--- a/cli/tests/testdata/jsx/import-map-scoped.json
+++ b/tests/testdata/jsx/import-map-scoped.json
diff --git a/cli/tests/testdata/jsx/import-map.json b/tests/testdata/jsx/import-map.json
index 1bfa04e2f..1bfa04e2f 100644
--- a/cli/tests/testdata/jsx/import-map.json
+++ b/tests/testdata/jsx/import-map.json
diff --git a/cli/tests/testdata/jsx/jsx-dev-runtime/index.ts b/tests/testdata/jsx/jsx-dev-runtime/index.ts
index 15e2029c8..15e2029c8 100644
--- a/cli/tests/testdata/jsx/jsx-dev-runtime/index.ts
+++ b/tests/testdata/jsx/jsx-dev-runtime/index.ts
diff --git a/cli/tests/testdata/jsx/jsx-precompile/index.ts b/tests/testdata/jsx/jsx-precompile/index.ts
index 0d56095e0..0d56095e0 100644
--- a/cli/tests/testdata/jsx/jsx-precompile/index.ts
+++ b/tests/testdata/jsx/jsx-precompile/index.ts
diff --git a/cli/tests/testdata/jsx/jsx-runtime/index.ts b/tests/testdata/jsx/jsx-runtime/index.ts
index 15e2029c8..15e2029c8 100644
--- a/cli/tests/testdata/jsx/jsx-runtime/index.ts
+++ b/tests/testdata/jsx/jsx-runtime/index.ts
diff --git a/cli/tests/testdata/jupyter/install_command_not_exists.out b/tests/testdata/jupyter/install_command_not_exists.out
index 1bb176e20..1bb176e20 100644
--- a/cli/tests/testdata/jupyter/install_command_not_exists.out
+++ b/tests/testdata/jupyter/install_command_not_exists.out
diff --git a/cli/tests/testdata/jupyter/integration_test.ipynb b/tests/testdata/jupyter/integration_test.ipynb
index 19667938c..19667938c 100644
--- a/cli/tests/testdata/jupyter/integration_test.ipynb
+++ b/tests/testdata/jupyter/integration_test.ipynb
diff --git a/cli/tests/testdata/lint/Deno.compact.format.jsonc b/tests/testdata/lint/Deno.compact.format.jsonc
index f3487501a..f3487501a 100644
--- a/cli/tests/testdata/lint/Deno.compact.format.jsonc
+++ b/tests/testdata/lint/Deno.compact.format.jsonc
diff --git a/cli/tests/testdata/lint/Deno.jsonc b/tests/testdata/lint/Deno.jsonc
index e9c03cca4..e9c03cca4 100644
--- a/cli/tests/testdata/lint/Deno.jsonc
+++ b/tests/testdata/lint/Deno.jsonc
diff --git a/cli/tests/testdata/lint/Deno.malformed.jsonc b/tests/testdata/lint/Deno.malformed.jsonc
index fa71cd851..fa71cd851 100644
--- a/cli/tests/testdata/lint/Deno.malformed.jsonc
+++ b/tests/testdata/lint/Deno.malformed.jsonc
diff --git a/cli/tests/testdata/lint/Deno.malformed2.jsonc b/tests/testdata/lint/Deno.malformed2.jsonc
index fa71cd851..fa71cd851 100644
--- a/cli/tests/testdata/lint/Deno.malformed2.jsonc
+++ b/tests/testdata/lint/Deno.malformed2.jsonc
diff --git a/cli/tests/testdata/lint/Deno.no_tags.jsonc b/tests/testdata/lint/Deno.no_tags.jsonc
index b63600a90..b63600a90 100644
--- a/cli/tests/testdata/lint/Deno.no_tags.jsonc
+++ b/tests/testdata/lint/Deno.no_tags.jsonc
diff --git a/cli/tests/testdata/lint/deno.glob.json b/tests/testdata/lint/deno.glob.json
index f6781b0d8..f6781b0d8 100644
--- a/cli/tests/testdata/lint/deno.glob.json
+++ b/tests/testdata/lint/deno.glob.json
diff --git a/cli/tests/testdata/lint/expected.out b/tests/testdata/lint/expected.out
index eb8a2651a..eb8a2651a 100644
--- a/cli/tests/testdata/lint/expected.out
+++ b/tests/testdata/lint/expected.out
diff --git a/cli/tests/testdata/lint/expected_compact.out b/tests/testdata/lint/expected_compact.out
index d1b2b922b..d1b2b922b 100644
--- a/cli/tests/testdata/lint/expected_compact.out
+++ b/tests/testdata/lint/expected_compact.out
diff --git a/cli/tests/testdata/lint/expected_from_stdin.out b/tests/testdata/lint/expected_from_stdin.out
index 59f32166f..59f32166f 100644
--- a/cli/tests/testdata/lint/expected_from_stdin.out
+++ b/tests/testdata/lint/expected_from_stdin.out
diff --git a/cli/tests/testdata/lint/expected_from_stdin_json.out b/tests/testdata/lint/expected_from_stdin_json.out
index 9e1188bcd..9e1188bcd 100644
--- a/cli/tests/testdata/lint/expected_from_stdin_json.out
+++ b/tests/testdata/lint/expected_from_stdin_json.out
diff --git a/cli/tests/testdata/lint/expected_glob.out b/tests/testdata/lint/expected_glob.out
index eb8a2651a..eb8a2651a 100644
--- a/cli/tests/testdata/lint/expected_glob.out
+++ b/tests/testdata/lint/expected_glob.out
diff --git a/cli/tests/testdata/lint/expected_ignore.out b/tests/testdata/lint/expected_ignore.out
index b5f78ee04..b5f78ee04 100644
--- a/cli/tests/testdata/lint/expected_ignore.out
+++ b/tests/testdata/lint/expected_ignore.out
diff --git a/cli/tests/testdata/lint/expected_json.out b/tests/testdata/lint/expected_json.out
index 95c3d30ba..95c3d30ba 100644
--- a/cli/tests/testdata/lint/expected_json.out
+++ b/tests/testdata/lint/expected_json.out
diff --git a/cli/tests/testdata/lint/expected_quiet.out b/tests/testdata/lint/expected_quiet.out
index e46a94a2d..e46a94a2d 100644
--- a/cli/tests/testdata/lint/expected_quiet.out
+++ b/tests/testdata/lint/expected_quiet.out
diff --git a/cli/tests/testdata/lint/expected_rules.out b/tests/testdata/lint/expected_rules.out
index 4afab7b9b..4afab7b9b 100644
--- a/cli/tests/testdata/lint/expected_rules.out
+++ b/tests/testdata/lint/expected_rules.out
diff --git a/cli/tests/testdata/lint/expected_verbose.out b/tests/testdata/lint/expected_verbose.out
index eb8a2651a..eb8a2651a 100644
--- a/cli/tests/testdata/lint/expected_verbose.out
+++ b/tests/testdata/lint/expected_verbose.out
diff --git a/cli/tests/testdata/lint/glob/data/tes.ts b/tests/testdata/lint/glob/data/tes.ts
index 26f07fba5..26f07fba5 100644
--- a/cli/tests/testdata/lint/glob/data/tes.ts
+++ b/tests/testdata/lint/glob/data/tes.ts
diff --git a/cli/tests/testdata/lint/glob/data/test1.js b/tests/testdata/lint/glob/data/test1.js
index 26f07fba5..26f07fba5 100644
--- a/cli/tests/testdata/lint/glob/data/test1.js
+++ b/tests/testdata/lint/glob/data/test1.js
diff --git a/cli/tests/testdata/lint/glob/data/test1.ts b/tests/testdata/lint/glob/data/test1.ts
index 26f07fba5..26f07fba5 100644
--- a/cli/tests/testdata/lint/glob/data/test1.ts
+++ b/tests/testdata/lint/glob/data/test1.ts
diff --git a/cli/tests/testdata/lint/glob/data/test12.ts b/tests/testdata/lint/glob/data/test12.ts
index 26f07fba5..26f07fba5 100644
--- a/cli/tests/testdata/lint/glob/data/test12.ts
+++ b/tests/testdata/lint/glob/data/test12.ts
diff --git a/cli/tests/testdata/lint/glob/nested/fizz/bar.ts b/tests/testdata/lint/glob/nested/fizz/bar.ts
index 26f07fba5..26f07fba5 100644
--- a/cli/tests/testdata/lint/glob/nested/fizz/bar.ts
+++ b/tests/testdata/lint/glob/nested/fizz/bar.ts
diff --git a/cli/tests/testdata/lint/glob/nested/fizz/bazz.ts b/tests/testdata/lint/glob/nested/fizz/bazz.ts
index 26f07fba5..26f07fba5 100644
--- a/cli/tests/testdata/lint/glob/nested/fizz/bazz.ts
+++ b/tests/testdata/lint/glob/nested/fizz/bazz.ts
diff --git a/cli/tests/testdata/lint/glob/nested/fizz/fizz.ts b/tests/testdata/lint/glob/nested/fizz/fizz.ts
index 6940729e9..6940729e9 100644
--- a/cli/tests/testdata/lint/glob/nested/fizz/fizz.ts
+++ b/tests/testdata/lint/glob/nested/fizz/fizz.ts
diff --git a/cli/tests/testdata/lint/glob/nested/fizz/foo.ts b/tests/testdata/lint/glob/nested/fizz/foo.ts
index 26f07fba5..26f07fba5 100644
--- a/cli/tests/testdata/lint/glob/nested/fizz/foo.ts
+++ b/tests/testdata/lint/glob/nested/fizz/foo.ts
diff --git a/cli/tests/testdata/lint/glob/nested/foo/bar.ts b/tests/testdata/lint/glob/nested/foo/bar.ts
index 26f07fba5..26f07fba5 100644
--- a/cli/tests/testdata/lint/glob/nested/foo/bar.ts
+++ b/tests/testdata/lint/glob/nested/foo/bar.ts
diff --git a/cli/tests/testdata/lint/glob/nested/foo/bazz.ts b/tests/testdata/lint/glob/nested/foo/bazz.ts
index 26f07fba5..26f07fba5 100644
--- a/cli/tests/testdata/lint/glob/nested/foo/bazz.ts
+++ b/tests/testdata/lint/glob/nested/foo/bazz.ts
diff --git a/cli/tests/testdata/lint/glob/nested/foo/fizz.ts b/tests/testdata/lint/glob/nested/foo/fizz.ts
index 26f07fba5..26f07fba5 100644
--- a/cli/tests/testdata/lint/glob/nested/foo/fizz.ts
+++ b/tests/testdata/lint/glob/nested/foo/fizz.ts
diff --git a/cli/tests/testdata/lint/glob/nested/foo/foo.ts b/tests/testdata/lint/glob/nested/foo/foo.ts
index 26f07fba5..26f07fba5 100644
--- a/cli/tests/testdata/lint/glob/nested/foo/foo.ts
+++ b/tests/testdata/lint/glob/nested/foo/foo.ts
diff --git a/cli/tests/testdata/lint/glob/pages/[id].ts b/tests/testdata/lint/glob/pages/[id].ts
index 26f07fba5..26f07fba5 100644
--- a/cli/tests/testdata/lint/glob/pages/[id].ts
+++ b/tests/testdata/lint/glob/pages/[id].ts
diff --git a/cli/tests/testdata/lint/watch/badly_linted.js b/tests/testdata/lint/watch/badly_linted.js
index 8d1c1fe79..8d1c1fe79 100644
--- a/cli/tests/testdata/lint/watch/badly_linted.js
+++ b/tests/testdata/lint/watch/badly_linted.js
diff --git a/cli/tests/testdata/lint/watch/badly_linted.js.out b/tests/testdata/lint/watch/badly_linted.js.out
index 07ae031c3..07ae031c3 100644
--- a/cli/tests/testdata/lint/watch/badly_linted.js.out
+++ b/tests/testdata/lint/watch/badly_linted.js.out
diff --git a/cli/tests/testdata/lint/watch/badly_linted_fixed1.js b/tests/testdata/lint/watch/badly_linted_fixed1.js
index bfccee47d..bfccee47d 100644
--- a/cli/tests/testdata/lint/watch/badly_linted_fixed1.js
+++ b/tests/testdata/lint/watch/badly_linted_fixed1.js
diff --git a/cli/tests/testdata/lint/watch/badly_linted_fixed1.js.out b/tests/testdata/lint/watch/badly_linted_fixed1.js.out
index 67e3c9dd8..67e3c9dd8 100644
--- a/cli/tests/testdata/lint/watch/badly_linted_fixed1.js.out
+++ b/tests/testdata/lint/watch/badly_linted_fixed1.js.out
diff --git a/cli/tests/testdata/lint/watch/badly_linted_fixed2.js b/tests/testdata/lint/watch/badly_linted_fixed2.js
index 94fe8701b..94fe8701b 100644
--- a/cli/tests/testdata/lint/watch/badly_linted_fixed2.js
+++ b/tests/testdata/lint/watch/badly_linted_fixed2.js
diff --git a/cli/tests/testdata/lint/watch/badly_linted_fixed2.js.out b/tests/testdata/lint/watch/badly_linted_fixed2.js.out
index e69de29bb..e69de29bb 100644
--- a/cli/tests/testdata/lint/watch/badly_linted_fixed2.js.out
+++ b/tests/testdata/lint/watch/badly_linted_fixed2.js.out
diff --git a/cli/tests/testdata/lint/with_config.out b/tests/testdata/lint/with_config.out
index cffd6b9c7..cffd6b9c7 100644
--- a/cli/tests/testdata/lint/with_config.out
+++ b/tests/testdata/lint/with_config.out
diff --git a/cli/tests/testdata/lint/with_config/a.ts b/tests/testdata/lint/with_config/a.ts
index c378218a3..c378218a3 100644
--- a/cli/tests/testdata/lint/with_config/a.ts
+++ b/tests/testdata/lint/with_config/a.ts
diff --git a/cli/tests/testdata/lint/with_config/b.ts b/tests/testdata/lint/with_config/b.ts
index d5647067e..d5647067e 100644
--- a/cli/tests/testdata/lint/with_config/b.ts
+++ b/tests/testdata/lint/with_config/b.ts
diff --git a/cli/tests/testdata/lint/with_config_and_flags.out b/tests/testdata/lint/with_config_and_flags.out
index f3ad3cafb..f3ad3cafb 100644
--- a/cli/tests/testdata/lint/with_config_and_flags.out
+++ b/tests/testdata/lint/with_config_and_flags.out
diff --git a/cli/tests/testdata/lint/with_config_without_tags.out b/tests/testdata/lint/with_config_without_tags.out
index cffd6b9c7..cffd6b9c7 100644
--- a/cli/tests/testdata/lint/with_config_without_tags.out
+++ b/tests/testdata/lint/with_config_without_tags.out
diff --git a/cli/tests/testdata/lint/with_malformed_config.out b/tests/testdata/lint/with_malformed_config.out
index 1c0f0fff6..1c0f0fff6 100644
--- a/cli/tests/testdata/lint/with_malformed_config.out
+++ b/tests/testdata/lint/with_malformed_config.out
diff --git a/cli/tests/testdata/lint/with_malformed_config2.out b/tests/testdata/lint/with_malformed_config2.out
index 1c0f0fff6..1c0f0fff6 100644
--- a/cli/tests/testdata/lint/with_malformed_config2.out
+++ b/tests/testdata/lint/with_malformed_config2.out
diff --git a/cli/tests/testdata/lint/with_report_config_compact.out b/tests/testdata/lint/with_report_config_compact.out
index fe1241264..fe1241264 100644
--- a/cli/tests/testdata/lint/with_report_config_compact.out
+++ b/tests/testdata/lint/with_report_config_compact.out
diff --git a/cli/tests/testdata/lint/with_report_config_override.out b/tests/testdata/lint/with_report_config_override.out
index 7ca748158..7ca748158 100644
--- a/cli/tests/testdata/lint/with_report_config_override.out
+++ b/tests/testdata/lint/with_report_config_override.out
diff --git a/cli/tests/testdata/lint/without_config/file1.js b/tests/testdata/lint/without_config/file1.js
index 737f26818..737f26818 100644
--- a/cli/tests/testdata/lint/without_config/file1.js
+++ b/tests/testdata/lint/without_config/file1.js
diff --git a/cli/tests/testdata/lint/without_config/file2.ts b/tests/testdata/lint/without_config/file2.ts
index 73c612c35..73c612c35 100644
--- a/cli/tests/testdata/lint/without_config/file2.ts
+++ b/tests/testdata/lint/without_config/file2.ts
diff --git a/cli/tests/testdata/lint/without_config/ignored_file.ts b/tests/testdata/lint/without_config/ignored_file.ts
index 97befafa3..97befafa3 100644
--- a/cli/tests/testdata/lint/without_config/ignored_file.ts
+++ b/tests/testdata/lint/without_config/ignored_file.ts
diff --git a/cli/tests/testdata/lint/without_config/malformed.js b/tests/testdata/lint/without_config/malformed.js
index 9b64da898..9b64da898 100644
--- a/cli/tests/testdata/lint/without_config/malformed.js
+++ b/tests/testdata/lint/without_config/malformed.js
diff --git a/cli/tests/testdata/lockfile/basic/bench.nolock.out b/tests/testdata/lockfile/basic/bench.nolock.out
index 83e4de242..83e4de242 100644
--- a/cli/tests/testdata/lockfile/basic/bench.nolock.out
+++ b/tests/testdata/lockfile/basic/bench.nolock.out
diff --git a/cli/tests/testdata/lockfile/basic/deno.json b/tests/testdata/lockfile/basic/deno.json
index d6541b78e..d6541b78e 100644
--- a/cli/tests/testdata/lockfile/basic/deno.json
+++ b/tests/testdata/lockfile/basic/deno.json
diff --git a/cli/tests/testdata/lockfile/basic/deno.lock b/tests/testdata/lockfile/basic/deno.lock
index 42ab94f9b..42ab94f9b 100644
--- a/cli/tests/testdata/lockfile/basic/deno.lock
+++ b/tests/testdata/lockfile/basic/deno.lock
diff --git a/cli/tests/testdata/lockfile/basic/doc.nolock.out b/tests/testdata/lockfile/basic/doc.nolock.out
index e2d66c027..e2d66c027 100644
--- a/cli/tests/testdata/lockfile/basic/doc.nolock.out
+++ b/tests/testdata/lockfile/basic/doc.nolock.out
diff --git a/cli/tests/testdata/lockfile/basic/fail.out b/tests/testdata/lockfile/basic/fail.out
index 6a808c0a5..6a808c0a5 100644
--- a/cli/tests/testdata/lockfile/basic/fail.out
+++ b/tests/testdata/lockfile/basic/fail.out
diff --git a/cli/tests/testdata/lockfile/basic/info.nolock.out b/tests/testdata/lockfile/basic/info.nolock.out
index d1ef82e49..d1ef82e49 100644
--- a/cli/tests/testdata/lockfile/basic/info.nolock.out
+++ b/tests/testdata/lockfile/basic/info.nolock.out
diff --git a/cli/tests/testdata/lockfile/basic/main.bench.ts b/tests/testdata/lockfile/basic/main.bench.ts
index 918adde2f..918adde2f 100644
--- a/cli/tests/testdata/lockfile/basic/main.bench.ts
+++ b/tests/testdata/lockfile/basic/main.bench.ts
diff --git a/cli/tests/testdata/lockfile/basic/main.test.ts b/tests/testdata/lockfile/basic/main.test.ts
index fe45c799d..fe45c799d 100644
--- a/cli/tests/testdata/lockfile/basic/main.test.ts
+++ b/tests/testdata/lockfile/basic/main.test.ts
diff --git a/cli/tests/testdata/lockfile/basic/main.ts b/tests/testdata/lockfile/basic/main.ts
index 8d07c8153..8d07c8153 100644
--- a/cli/tests/testdata/lockfile/basic/main.ts
+++ b/tests/testdata/lockfile/basic/main.ts
diff --git a/cli/tests/testdata/lockfile/basic/mod.ts b/tests/testdata/lockfile/basic/mod.ts
index 358b4b09e..358b4b09e 100644
--- a/cli/tests/testdata/lockfile/basic/mod.ts
+++ b/tests/testdata/lockfile/basic/mod.ts
diff --git a/cli/tests/testdata/lockfile/basic/test.nolock.out b/tests/testdata/lockfile/basic/test.nolock.out
index 1332dfa8f..1332dfa8f 100644
--- a/cli/tests/testdata/lockfile/basic/test.nolock.out
+++ b/tests/testdata/lockfile/basic/test.nolock.out
diff --git a/cli/tests/testdata/lockfile/no_dts/deno.lock.out b/tests/testdata/lockfile/no_dts/deno.lock.out
index 6aa547e28..6aa547e28 100644
--- a/cli/tests/testdata/lockfile/no_dts/deno.lock.out
+++ b/tests/testdata/lockfile/no_dts/deno.lock.out
diff --git a/cli/tests/testdata/lockfile/no_dts/main.cache.out b/tests/testdata/lockfile/no_dts/main.cache.out
index ee8ad33ab..ee8ad33ab 100644
--- a/cli/tests/testdata/lockfile/no_dts/main.cache.out
+++ b/tests/testdata/lockfile/no_dts/main.cache.out
diff --git a/cli/tests/testdata/lockfile/no_dts/main.ts b/tests/testdata/lockfile/no_dts/main.ts
index 7596e1e1a..7596e1e1a 100644
--- a/cli/tests/testdata/lockfile/no_dts/main.ts
+++ b/tests/testdata/lockfile/no_dts/main.ts
diff --git a/cli/tests/testdata/lockfile/no_dts/mod.d.ts b/tests/testdata/lockfile/no_dts/mod.d.ts
index 7d3fae61c..7d3fae61c 100644
--- a/cli/tests/testdata/lockfile/no_dts/mod.d.ts
+++ b/tests/testdata/lockfile/no_dts/mod.d.ts
diff --git a/cli/tests/testdata/lockfile/no_dts/mod.js b/tests/testdata/lockfile/no_dts/mod.js
index 8ac948700..8ac948700 100644
--- a/cli/tests/testdata/lockfile/no_dts/mod.js
+++ b/tests/testdata/lockfile/no_dts/mod.js
diff --git a/cli/tests/testdata/lsp/deno.import_map.jsonc b/tests/testdata/lsp/deno.import_map.jsonc
index 1682ff6b5..1682ff6b5 100644
--- a/cli/tests/testdata/lsp/deno.import_map.jsonc
+++ b/tests/testdata/lsp/deno.import_map.jsonc
diff --git a/cli/tests/testdata/lsp/deno.lint.exclude.jsonc b/tests/testdata/lsp/deno.lint.exclude.jsonc
index 9d4ba52ad..9d4ba52ad 100644
--- a/cli/tests/testdata/lsp/deno.lint.exclude.jsonc
+++ b/tests/testdata/lsp/deno.lint.exclude.jsonc
diff --git a/cli/tests/testdata/lsp/diagnostics_deno_types.json b/tests/testdata/lsp/diagnostics_deno_types.json
index 6ab153093..6ab153093 100644
--- a/cli/tests/testdata/lsp/diagnostics_deno_types.json
+++ b/tests/testdata/lsp/diagnostics_deno_types.json
diff --git a/cli/tests/testdata/lsp/import-map.json b/tests/testdata/lsp/import-map.json
index 75d5d0849..75d5d0849 100644
--- a/cli/tests/testdata/lsp/import-map.json
+++ b/tests/testdata/lsp/import-map.json
diff --git a/cli/tests/testdata/lsp/large_file.txt b/tests/testdata/lsp/large_file.txt
index f1ca0481c..f1ca0481c 100644
--- a/cli/tests/testdata/lsp/large_file.txt
+++ b/tests/testdata/lsp/large_file.txt
diff --git a/cli/tests/testdata/lsp/registries/a_latest_.json b/tests/testdata/lsp/registries/a_latest_.json
index f9f9d111e..f9f9d111e 100644
--- a/cli/tests/testdata/lsp/registries/a_latest_.json
+++ b/tests/testdata/lsp/registries/a_latest_.json
diff --git a/cli/tests/testdata/lsp/registries/a_v1.0.0_.json b/tests/testdata/lsp/registries/a_v1.0.0_.json
index f9f9d111e..f9f9d111e 100644
--- a/cli/tests/testdata/lsp/registries/a_v1.0.0_.json
+++ b/tests/testdata/lsp/registries/a_v1.0.0_.json
diff --git a/cli/tests/testdata/lsp/registries/a_v1.0.0_b.json b/tests/testdata/lsp/registries/a_v1.0.0_b.json
index 20ec4ad90..20ec4ad90 100644
--- a/cli/tests/testdata/lsp/registries/a_v1.0.0_b.json
+++ b/tests/testdata/lsp/registries/a_v1.0.0_b.json
diff --git a/cli/tests/testdata/lsp/registries/a_v1.0.1_.json b/tests/testdata/lsp/registries/a_v1.0.1_.json
index f9f9d111e..f9f9d111e 100644
--- a/cli/tests/testdata/lsp/registries/a_v1.0.1_.json
+++ b/tests/testdata/lsp/registries/a_v1.0.1_.json
diff --git a/cli/tests/testdata/lsp/registries/a_v2.0.0_.json b/tests/testdata/lsp/registries/a_v2.0.0_.json
index f9f9d111e..f9f9d111e 100644
--- a/cli/tests/testdata/lsp/registries/a_v2.0.0_.json
+++ b/tests/testdata/lsp/registries/a_v2.0.0_.json
diff --git a/cli/tests/testdata/lsp/registries/a_versions_.json b/tests/testdata/lsp/registries/a_versions_.json
index 930e38323..930e38323 100644
--- a/cli/tests/testdata/lsp/registries/a_versions_.json
+++ b/tests/testdata/lsp/registries/a_versions_.json
diff --git a/cli/tests/testdata/lsp/registries/a_versions_v1..json b/tests/testdata/lsp/registries/a_versions_v1..json
index 1d8a865c1..1d8a865c1 100644
--- a/cli/tests/testdata/lsp/registries/a_versions_v1..json
+++ b/tests/testdata/lsp/registries/a_versions_v1..json
diff --git a/cli/tests/testdata/lsp/registries/b_latest_.json b/tests/testdata/lsp/registries/b_latest_.json
index f9f9d111e..f9f9d111e 100644
--- a/cli/tests/testdata/lsp/registries/b_latest_.json
+++ b/tests/testdata/lsp/registries/b_latest_.json
diff --git a/cli/tests/testdata/lsp/registries/b_v0.0.1_.json b/tests/testdata/lsp/registries/b_v0.0.1_.json
index f9f9d111e..f9f9d111e 100644
--- a/cli/tests/testdata/lsp/registries/b_v0.0.1_.json
+++ b/tests/testdata/lsp/registries/b_v0.0.1_.json
diff --git a/cli/tests/testdata/lsp/registries/b_v0.0.2_.json b/tests/testdata/lsp/registries/b_v0.0.2_.json
index f9f9d111e..f9f9d111e 100644
--- a/cli/tests/testdata/lsp/registries/b_v0.0.2_.json
+++ b/tests/testdata/lsp/registries/b_v0.0.2_.json
diff --git a/cli/tests/testdata/lsp/registries/b_v0.0.3_.json b/tests/testdata/lsp/registries/b_v0.0.3_.json
index f9f9d111e..f9f9d111e 100644
--- a/cli/tests/testdata/lsp/registries/b_v0.0.3_.json
+++ b/tests/testdata/lsp/registries/b_v0.0.3_.json
diff --git a/cli/tests/testdata/lsp/registries/b_versions_.json b/tests/testdata/lsp/registries/b_versions_.json
index 9532fbb85..9532fbb85 100644
--- a/cli/tests/testdata/lsp/registries/b_versions_.json
+++ b/tests/testdata/lsp/registries/b_versions_.json
diff --git a/cli/tests/testdata/lsp/registries/cde_tags.json b/tests/testdata/lsp/registries/cde_tags.json
index 24aeba56a..24aeba56a 100644
--- a/cli/tests/testdata/lsp/registries/cde_tags.json
+++ b/tests/testdata/lsp/registries/cde_tags.json
diff --git a/cli/tests/testdata/lsp/registries/cdef_tags.json b/tests/testdata/lsp/registries/cdef_tags.json
index a69cb1c55..a69cb1c55 100644
--- a/cli/tests/testdata/lsp/registries/cdef_tags.json
+++ b/tests/testdata/lsp/registries/cdef_tags.json
diff --git a/cli/tests/testdata/lsp/registries/complex.json b/tests/testdata/lsp/registries/complex.json
index b6e28649a..b6e28649a 100644
--- a/cli/tests/testdata/lsp/registries/complex.json
+++ b/tests/testdata/lsp/registries/complex.json
diff --git a/cli/tests/testdata/lsp/registries/complex_efg.json b/tests/testdata/lsp/registries/complex_efg.json
index cd170d1d8..cd170d1d8 100644
--- a/cli/tests/testdata/lsp/registries/complex_efg.json
+++ b/tests/testdata/lsp/registries/complex_efg.json
diff --git a/cli/tests/testdata/lsp/registries/complex_efg_0.2.0.json b/tests/testdata/lsp/registries/complex_efg_0.2.0.json
index d333b9e28..d333b9e28 100644
--- a/cli/tests/testdata/lsp/registries/complex_efg_0.2.0.json
+++ b/tests/testdata/lsp/registries/complex_efg_0.2.0.json
diff --git a/cli/tests/testdata/lsp/registries/def_tags.json b/tests/testdata/lsp/registries/def_tags.json
index 5a33204f2..5a33204f2 100644
--- a/cli/tests/testdata/lsp/registries/def_tags.json
+++ b/tests/testdata/lsp/registries/def_tags.json
diff --git a/cli/tests/testdata/lsp/registries/deno-import-intellisense-complex.json b/tests/testdata/lsp/registries/deno-import-intellisense-complex.json
index 98e913bdb..98e913bdb 100644
--- a/cli/tests/testdata/lsp/registries/deno-import-intellisense-complex.json
+++ b/tests/testdata/lsp/registries/deno-import-intellisense-complex.json
diff --git a/cli/tests/testdata/lsp/registries/deno-import-intellisense-key-first.json b/tests/testdata/lsp/registries/deno-import-intellisense-key-first.json
index 9aa33ecd3..9aa33ecd3 100644
--- a/cli/tests/testdata/lsp/registries/deno-import-intellisense-key-first.json
+++ b/tests/testdata/lsp/registries/deno-import-intellisense-key-first.json
diff --git a/cli/tests/testdata/lsp/registries/deno-import-intellisense.json b/tests/testdata/lsp/registries/deno-import-intellisense.json
index 5fd87085e..5fd87085e 100644
--- a/cli/tests/testdata/lsp/registries/deno-import-intellisense.json
+++ b/tests/testdata/lsp/registries/deno-import-intellisense.json
diff --git a/cli/tests/testdata/lsp/registries/doc_a.json b/tests/testdata/lsp/registries/doc_a.json
index ecddb9144..ecddb9144 100644
--- a/cli/tests/testdata/lsp/registries/doc_a.json
+++ b/tests/testdata/lsp/registries/doc_a.json
diff --git a/cli/tests/testdata/lsp/registries/doc_a_latest_mod.ts.json b/tests/testdata/lsp/registries/doc_a_latest_mod.ts.json
index 522f5b271..522f5b271 100644
--- a/cli/tests/testdata/lsp/registries/doc_a_latest_mod.ts.json
+++ b/tests/testdata/lsp/registries/doc_a_latest_mod.ts.json
diff --git a/cli/tests/testdata/lsp/registries/key_first.json b/tests/testdata/lsp/registries/key_first.json
index c95261b25..c95261b25 100644
--- a/cli/tests/testdata/lsp/registries/key_first.json
+++ b/tests/testdata/lsp/registries/key_first.json
diff --git a/cli/tests/testdata/lsp/registries/modules_.json b/tests/testdata/lsp/registries/modules_.json
index fae3b40a3..fae3b40a3 100644
--- a/cli/tests/testdata/lsp/registries/modules_.json
+++ b/tests/testdata/lsp/registries/modules_.json
diff --git a/cli/tests/testdata/lsp/registries/modules_a.json b/tests/testdata/lsp/registries/modules_a.json
index 0163f18a4..0163f18a4 100644
--- a/cli/tests/testdata/lsp/registries/modules_a.json
+++ b/tests/testdata/lsp/registries/modules_a.json
diff --git a/cli/tests/testdata/lsp/types.tsconfig.json b/tests/testdata/lsp/types.tsconfig.json
index 50de6939c..50de6939c 100644
--- a/cli/tests/testdata/lsp/types.tsconfig.json
+++ b/tests/testdata/lsp/types.tsconfig.json
diff --git a/cli/tests/testdata/lsp/x_deno_warning_redirect.js b/tests/testdata/lsp/x_deno_warning_redirect.js
index 34b950566..34b950566 100644
--- a/cli/tests/testdata/lsp/x_deno_warning_redirect.js
+++ b/tests/testdata/lsp/x_deno_warning_redirect.js
diff --git a/cli/tests/testdata/malformed_config/deno.json b/tests/testdata/malformed_config/deno.json
index 60df56527..60df56527 100644
--- a/cli/tests/testdata/malformed_config/deno.json
+++ b/tests/testdata/malformed_config/deno.json
diff --git a/cli/tests/testdata/module_graph/file_tests-a.mjs b/tests/testdata/module_graph/file_tests-a.mjs
index 72b3a67bc..72b3a67bc 100644
--- a/cli/tests/testdata/module_graph/file_tests-a.mjs
+++ b/tests/testdata/module_graph/file_tests-a.mjs
diff --git a/cli/tests/testdata/module_graph/file_tests-b-mod.js b/tests/testdata/module_graph/file_tests-b-mod.js
index 59d168993..59d168993 100644
--- a/cli/tests/testdata/module_graph/file_tests-b-mod.js
+++ b/tests/testdata/module_graph/file_tests-b-mod.js
diff --git a/cli/tests/testdata/module_graph/file_tests-b.ts b/tests/testdata/module_graph/file_tests-b.ts
index 59d168993..59d168993 100644
--- a/cli/tests/testdata/module_graph/file_tests-b.ts
+++ b/tests/testdata/module_graph/file_tests-b.ts
diff --git a/cli/tests/testdata/module_graph/file_tests-c-mod.ts b/tests/testdata/module_graph/file_tests-c-mod.ts
index 7f2cfac77..7f2cfac77 100644
--- a/cli/tests/testdata/module_graph/file_tests-c-mod.ts
+++ b/tests/testdata/module_graph/file_tests-c-mod.ts
diff --git a/cli/tests/testdata/module_graph/file_tests-checkwithconfig.ts b/tests/testdata/module_graph/file_tests-checkwithconfig.ts
index e7af5fa19..e7af5fa19 100644
--- a/cli/tests/testdata/module_graph/file_tests-checkwithconfig.ts
+++ b/tests/testdata/module_graph/file_tests-checkwithconfig.ts
diff --git a/cli/tests/testdata/module_graph/file_tests-diag.ts b/tests/testdata/module_graph/file_tests-diag.ts
index ba365234a..ba365234a 100644
--- a/cli/tests/testdata/module_graph/file_tests-diag.ts
+++ b/tests/testdata/module_graph/file_tests-diag.ts
diff --git a/cli/tests/testdata/module_graph/file_tests-dynamicimport.ts b/tests/testdata/module_graph/file_tests-dynamicimport.ts
index b5c9f080f..b5c9f080f 100644
--- a/cli/tests/testdata/module_graph/file_tests-dynamicimport.ts
+++ b/tests/testdata/module_graph/file_tests-dynamicimport.ts
diff --git a/cli/tests/testdata/module_graph/file_tests-importjson.ts b/tests/testdata/module_graph/file_tests-importjson.ts
index c2bc2bca7..c2bc2bca7 100644
--- a/cli/tests/testdata/module_graph/file_tests-importjson.ts
+++ b/tests/testdata/module_graph/file_tests-importjson.ts
diff --git a/cli/tests/testdata/module_graph/file_tests-importremap.ts b/tests/testdata/module_graph/file_tests-importremap.ts
index 17f012673..17f012673 100644
--- a/cli/tests/testdata/module_graph/file_tests-importremap.ts
+++ b/tests/testdata/module_graph/file_tests-importremap.ts
diff --git a/cli/tests/testdata/module_graph/file_tests-main.ts b/tests/testdata/module_graph/file_tests-main.ts
index aa8eef1b8..aa8eef1b8 100644
--- a/cli/tests/testdata/module_graph/file_tests-main.ts
+++ b/tests/testdata/module_graph/file_tests-main.ts
diff --git a/cli/tests/testdata/module_graph/file_tests-some.json b/tests/testdata/module_graph/file_tests-some.json
index 567c4ba21..567c4ba21 100644
--- a/cli/tests/testdata/module_graph/file_tests-some.json
+++ b/tests/testdata/module_graph/file_tests-some.json
diff --git a/cli/tests/testdata/module_graph/file_typesref.d.ts b/tests/testdata/module_graph/file_typesref.d.ts
index 8ae31dde3..8ae31dde3 100644
--- a/cli/tests/testdata/module_graph/file_typesref.d.ts
+++ b/tests/testdata/module_graph/file_typesref.d.ts
diff --git a/cli/tests/testdata/module_graph/file_typesref.js b/tests/testdata/module_graph/file_typesref.js
index 79da24cae..79da24cae 100644
--- a/cli/tests/testdata/module_graph/file_typesref.js
+++ b/tests/testdata/module_graph/file_typesref.js
diff --git a/cli/tests/testdata/module_graph/https_deno.land-std-http-server.ts b/tests/testdata/module_graph/https_deno.land-std-http-server.ts
index 0b3c995ec..0b3c995ec 100644
--- a/cli/tests/testdata/module_graph/https_deno.land-std-http-server.ts
+++ b/tests/testdata/module_graph/https_deno.land-std-http-server.ts
diff --git a/cli/tests/testdata/module_graph/https_deno.land-x-a-mod.ts b/tests/testdata/module_graph/https_deno.land-x-a-mod.ts
index 1e334d399..1e334d399 100644
--- a/cli/tests/testdata/module_graph/https_deno.land-x-a-mod.ts
+++ b/tests/testdata/module_graph/https_deno.land-x-a-mod.ts
diff --git a/cli/tests/testdata/module_graph/https_deno.land-x-a.ts b/tests/testdata/module_graph/https_deno.land-x-a.ts
index a6e3cea80..a6e3cea80 100644
--- a/cli/tests/testdata/module_graph/https_deno.land-x-a.ts
+++ b/tests/testdata/module_graph/https_deno.land-x-a.ts
diff --git a/cli/tests/testdata/module_graph/https_deno.land-x-import_map.ts b/tests/testdata/module_graph/https_deno.land-x-import_map.ts
index e285d863a..e285d863a 100644
--- a/cli/tests/testdata/module_graph/https_deno.land-x-import_map.ts
+++ b/tests/testdata/module_graph/https_deno.land-x-import_map.ts
diff --git a/cli/tests/testdata/module_graph/https_deno.land-x-jquery.js b/tests/testdata/module_graph/https_deno.land-x-jquery.js
index 71896157a..71896157a 100644
--- a/cli/tests/testdata/module_graph/https_deno.land-x-jquery.js
+++ b/tests/testdata/module_graph/https_deno.land-x-jquery.js
diff --git a/cli/tests/testdata/module_graph/https_deno.land-x-lib-a.ts b/tests/testdata/module_graph/https_deno.land-x-lib-a.ts
index a0a6f8e94..a0a6f8e94 100644
--- a/cli/tests/testdata/module_graph/https_deno.land-x-lib-a.ts
+++ b/tests/testdata/module_graph/https_deno.land-x-lib-a.ts
diff --git a/cli/tests/testdata/module_graph/https_deno.land-x-lib-b.js b/tests/testdata/module_graph/https_deno.land-x-lib-b.js
index 13cacdd8b..13cacdd8b 100644
--- a/cli/tests/testdata/module_graph/https_deno.land-x-lib-b.js
+++ b/tests/testdata/module_graph/https_deno.land-x-lib-b.js
diff --git a/cli/tests/testdata/module_graph/https_deno.land-x-lib-c.d.ts b/tests/testdata/module_graph/https_deno.land-x-lib-c.d.ts
index fac988e49..fac988e49 100644
--- a/cli/tests/testdata/module_graph/https_deno.land-x-lib-c.d.ts
+++ b/tests/testdata/module_graph/https_deno.land-x-lib-c.d.ts
diff --git a/cli/tests/testdata/module_graph/https_deno.land-x-lib-c.js b/tests/testdata/module_graph/https_deno.land-x-lib-c.js
index 620ca0b66..620ca0b66 100644
--- a/cli/tests/testdata/module_graph/https_deno.land-x-lib-c.js
+++ b/tests/testdata/module_graph/https_deno.land-x-lib-c.js
diff --git a/cli/tests/testdata/module_graph/https_deno.land-x-lib-mod.d.ts b/tests/testdata/module_graph/https_deno.land-x-lib-mod.d.ts
index 76ed81df0..76ed81df0 100644
--- a/cli/tests/testdata/module_graph/https_deno.land-x-lib-mod.d.ts
+++ b/tests/testdata/module_graph/https_deno.land-x-lib-mod.d.ts
diff --git a/cli/tests/testdata/module_graph/https_deno.land-x-lib-mod.js b/tests/testdata/module_graph/https_deno.land-x-lib-mod.js
index 505162094..505162094 100644
--- a/cli/tests/testdata/module_graph/https_deno.land-x-lib-mod.js
+++ b/tests/testdata/module_graph/https_deno.land-x-lib-mod.js
diff --git a/cli/tests/testdata/module_graph/https_deno.land-x-mod.ts b/tests/testdata/module_graph/https_deno.land-x-mod.ts
index 35d76ef75..35d76ef75 100644
--- a/cli/tests/testdata/module_graph/https_deno.land-x-mod.ts
+++ b/tests/testdata/module_graph/https_deno.land-x-mod.ts
diff --git a/cli/tests/testdata/module_graph/https_deno.land-x-transpile.tsx b/tests/testdata/module_graph/https_deno.land-x-transpile.tsx
index 02955bad8..02955bad8 100644
--- a/cli/tests/testdata/module_graph/https_deno.land-x-transpile.tsx
+++ b/tests/testdata/module_graph/https_deno.land-x-transpile.tsx
diff --git a/cli/tests/testdata/module_graph/https_unpkg.com-lodash-index.js b/tests/testdata/module_graph/https_unpkg.com-lodash-index.js
index d16c126a6..d16c126a6 100644
--- a/cli/tests/testdata/module_graph/https_unpkg.com-lodash-index.js
+++ b/tests/testdata/module_graph/https_unpkg.com-lodash-index.js
diff --git a/cli/tests/testdata/module_graph/lockfile.json b/tests/testdata/module_graph/lockfile.json
index 03cfe1185..03cfe1185 100644
--- a/cli/tests/testdata/module_graph/lockfile.json
+++ b/tests/testdata/module_graph/lockfile.json
diff --git a/cli/tests/testdata/module_graph/lockfile_fail.json b/tests/testdata/module_graph/lockfile_fail.json
index c0019fba4..c0019fba4 100644
--- a/cli/tests/testdata/module_graph/lockfile_fail.json
+++ b/tests/testdata/module_graph/lockfile_fail.json
diff --git a/cli/tests/testdata/module_graph/tsconfig.json b/tests/testdata/module_graph/tsconfig.json
index a4c5f4f33..a4c5f4f33 100644
--- a/cli/tests/testdata/module_graph/tsconfig.json
+++ b/tests/testdata/module_graph/tsconfig.json
diff --git a/cli/tests/testdata/module_graph/tsconfig_01.json b/tests/testdata/module_graph/tsconfig_01.json
index f7496d475..f7496d475 100644
--- a/cli/tests/testdata/module_graph/tsconfig_01.json
+++ b/tests/testdata/module_graph/tsconfig_01.json
diff --git a/cli/tests/testdata/navigator_language.ts b/tests/testdata/navigator_language.ts
index 1cdbc2fe6..1cdbc2fe6 100644
--- a/cli/tests/testdata/navigator_language.ts
+++ b/tests/testdata/navigator_language.ts
diff --git a/cli/tests/testdata/navigator_languages.ts b/tests/testdata/navigator_languages.ts
index 41dece950..41dece950 100644
--- a/cli/tests/testdata/navigator_languages.ts
+++ b/tests/testdata/navigator_languages.ts
diff --git a/cli/tests/testdata/node/rejection_handled_web_process.ts b/tests/testdata/node/rejection_handled_web_process.ts
index e331f8998..e331f8998 100644
--- a/cli/tests/testdata/node/rejection_handled_web_process.ts
+++ b/tests/testdata/node/rejection_handled_web_process.ts
diff --git a/cli/tests/testdata/node/rejection_handled_web_process.ts.out b/tests/testdata/node/rejection_handled_web_process.ts.out
index e6fefede2..e6fefede2 100644
--- a/cli/tests/testdata/node/rejection_handled_web_process.ts.out
+++ b/tests/testdata/node/rejection_handled_web_process.ts.out
diff --git a/cli/tests/testdata/node/require_esm_error/esm.js b/tests/testdata/node/require_esm_error/esm.js
index 0613f1911..0613f1911 100644
--- a/cli/tests/testdata/node/require_esm_error/esm.js
+++ b/tests/testdata/node/require_esm_error/esm.js
diff --git a/cli/tests/testdata/node/require_esm_error/main.out b/tests/testdata/node/require_esm_error/main.out
index 3db23ff24..3db23ff24 100644
--- a/cli/tests/testdata/node/require_esm_error/main.out
+++ b/tests/testdata/node/require_esm_error/main.out
diff --git a/cli/tests/testdata/node/require_esm_error/main.ts b/tests/testdata/node/require_esm_error/main.ts
index 612e91714..612e91714 100644
--- a/cli/tests/testdata/node/require_esm_error/main.ts
+++ b/tests/testdata/node/require_esm_error/main.ts
diff --git a/cli/tests/testdata/node/test.js b/tests/testdata/node/test.js
index 0f0f9b6b6..0f0f9b6b6 100644
--- a/cli/tests/testdata/node/test.js
+++ b/tests/testdata/node/test.js
diff --git a/cli/tests/testdata/node/test.out b/tests/testdata/node/test.out
index 2579f605d..2579f605d 100644
--- a/cli/tests/testdata/node/test.out
+++ b/tests/testdata/node/test.out
diff --git a/cli/tests/testdata/node/unhandled_rejection_web.ts b/tests/testdata/node/unhandled_rejection_web.ts
index 396c58c2a..396c58c2a 100644
--- a/cli/tests/testdata/node/unhandled_rejection_web.ts
+++ b/tests/testdata/node/unhandled_rejection_web.ts
diff --git a/cli/tests/testdata/node/unhandled_rejection_web.ts.out b/tests/testdata/node/unhandled_rejection_web.ts.out
index 19db7f90e..19db7f90e 100644
--- a/cli/tests/testdata/node/unhandled_rejection_web.ts.out
+++ b/tests/testdata/node/unhandled_rejection_web.ts.out
diff --git a/cli/tests/testdata/node/unhandled_rejection_web_process.ts b/tests/testdata/node/unhandled_rejection_web_process.ts
index 2aaacfbff..2aaacfbff 100644
--- a/cli/tests/testdata/node/unhandled_rejection_web_process.ts
+++ b/tests/testdata/node/unhandled_rejection_web_process.ts
diff --git a/cli/tests/testdata/node/unhandled_rejection_web_process.ts.out b/tests/testdata/node/unhandled_rejection_web_process.ts.out
index ea307474a..ea307474a 100644
--- a/cli/tests/testdata/node/unhandled_rejection_web_process.ts.out
+++ b/tests/testdata/node/unhandled_rejection_web_process.ts.out
diff --git a/cli/tests/testdata/npm/README.md b/tests/testdata/npm/README.md
index ba3f5f771..ba3f5f771 100644
--- a/cli/tests/testdata/npm/README.md
+++ b/tests/testdata/npm/README.md
diff --git a/cli/tests/testdata/npm/binary_package/main.js b/tests/testdata/npm/binary_package/main.js
index 8823c5a5b..8823c5a5b 100644
--- a/cli/tests/testdata/npm/binary_package/main.js
+++ b/tests/testdata/npm/binary_package/main.js
diff --git a/cli/tests/testdata/npm/builtin_module_module/main.js b/tests/testdata/npm/builtin_module_module/main.js
index 9a036791b..9a036791b 100644
--- a/cli/tests/testdata/npm/builtin_module_module/main.js
+++ b/tests/testdata/npm/builtin_module_module/main.js
diff --git a/cli/tests/testdata/npm/builtin_module_module/main.out b/tests/testdata/npm/builtin_module_module/main.out
index 160ba6503..160ba6503 100644
--- a/cli/tests/testdata/npm/builtin_module_module/main.out
+++ b/tests/testdata/npm/builtin_module_module/main.out
diff --git a/cli/tests/testdata/npm/cached_only/main.out b/tests/testdata/npm/cached_only/main.out
index d03420fee..d03420fee 100644
--- a/cli/tests/testdata/npm/cached_only/main.out
+++ b/tests/testdata/npm/cached_only/main.out
diff --git a/cli/tests/testdata/npm/cached_only/main.ts b/tests/testdata/npm/cached_only/main.ts
index 1ccc441a1..1ccc441a1 100644
--- a/cli/tests/testdata/npm/cached_only/main.ts
+++ b/tests/testdata/npm/cached_only/main.ts
diff --git a/cli/tests/testdata/npm/cached_only_after_first_run/main1.ts b/tests/testdata/npm/cached_only_after_first_run/main1.ts
index 1ccc441a1..1ccc441a1 100644
--- a/cli/tests/testdata/npm/cached_only_after_first_run/main1.ts
+++ b/tests/testdata/npm/cached_only_after_first_run/main1.ts
diff --git a/cli/tests/testdata/npm/cached_only_after_first_run/main2.ts b/tests/testdata/npm/cached_only_after_first_run/main2.ts
index 1aba1bc2c..1aba1bc2c 100644
--- a/cli/tests/testdata/npm/cached_only_after_first_run/main2.ts
+++ b/tests/testdata/npm/cached_only_after_first_run/main2.ts
diff --git a/cli/tests/testdata/npm/check_errors/main.ts b/tests/testdata/npm/check_errors/main.ts
index 4b8684195..4b8684195 100644
--- a/cli/tests/testdata/npm/check_errors/main.ts
+++ b/tests/testdata/npm/check_errors/main.ts
diff --git a/cli/tests/testdata/npm/check_errors/main_all.out b/tests/testdata/npm/check_errors/main_all.out
index 96f16d0b9..96f16d0b9 100644
--- a/cli/tests/testdata/npm/check_errors/main_all.out
+++ b/tests/testdata/npm/check_errors/main_all.out
diff --git a/cli/tests/testdata/npm/check_errors/main_local.out b/tests/testdata/npm/check_errors/main_local.out
index 1624b98bc..1624b98bc 100644
--- a/cli/tests/testdata/npm/check_errors/main_local.out
+++ b/tests/testdata/npm/check_errors/main_local.out
diff --git a/cli/tests/testdata/npm/child_process_fork_test/main.out b/tests/testdata/npm/child_process_fork_test/main.out
index d5bc57741..d5bc57741 100644
--- a/cli/tests/testdata/npm/child_process_fork_test/main.out
+++ b/tests/testdata/npm/child_process_fork_test/main.out
diff --git a/cli/tests/testdata/npm/child_process_fork_test/main.ts b/tests/testdata/npm/child_process_fork_test/main.ts
index e560edb7e..e560edb7e 100644
--- a/cli/tests/testdata/npm/child_process_fork_test/main.ts
+++ b/tests/testdata/npm/child_process_fork_test/main.ts
diff --git a/cli/tests/testdata/npm/cjs-invalid-name-exports/main.out b/tests/testdata/npm/cjs-invalid-name-exports/main.out
index 45ec15d0e..45ec15d0e 100644
--- a/cli/tests/testdata/npm/cjs-invalid-name-exports/main.out
+++ b/tests/testdata/npm/cjs-invalid-name-exports/main.out
diff --git a/cli/tests/testdata/npm/cjs-invalid-name-exports/main.ts b/tests/testdata/npm/cjs-invalid-name-exports/main.ts
index 9bdf0e43b..9bdf0e43b 100644
--- a/cli/tests/testdata/npm/cjs-invalid-name-exports/main.ts
+++ b/tests/testdata/npm/cjs-invalid-name-exports/main.ts
diff --git a/cli/tests/testdata/npm/cjs_local_global_decls/main.out b/tests/testdata/npm/cjs_local_global_decls/main.out
index f9331e2e5..f9331e2e5 100644
--- a/cli/tests/testdata/npm/cjs_local_global_decls/main.out
+++ b/tests/testdata/npm/cjs_local_global_decls/main.out
diff --git a/cli/tests/testdata/npm/cjs_local_global_decls/main.ts b/tests/testdata/npm/cjs_local_global_decls/main.ts
index 04074057b..04074057b 100644
--- a/cli/tests/testdata/npm/cjs_local_global_decls/main.ts
+++ b/tests/testdata/npm/cjs_local_global_decls/main.ts
diff --git a/cli/tests/testdata/npm/cjs_module_export_assignment/main.out b/tests/testdata/npm/cjs_module_export_assignment/main.out
index dea185e38..dea185e38 100644
--- a/cli/tests/testdata/npm/cjs_module_export_assignment/main.out
+++ b/tests/testdata/npm/cjs_module_export_assignment/main.out
diff --git a/cli/tests/testdata/npm/cjs_module_export_assignment/main.ts b/tests/testdata/npm/cjs_module_export_assignment/main.ts
index 93d3db1c3..93d3db1c3 100644
--- a/cli/tests/testdata/npm/cjs_module_export_assignment/main.ts
+++ b/tests/testdata/npm/cjs_module_export_assignment/main.ts
diff --git a/cli/tests/testdata/npm/cjs_module_export_assignment_number/main.out b/tests/testdata/npm/cjs_module_export_assignment_number/main.out
index e559775cf..e559775cf 100644
--- a/cli/tests/testdata/npm/cjs_module_export_assignment_number/main.out
+++ b/tests/testdata/npm/cjs_module_export_assignment_number/main.out
diff --git a/cli/tests/testdata/npm/cjs_module_export_assignment_number/main.ts b/tests/testdata/npm/cjs_module_export_assignment_number/main.ts
index aee24bf19..aee24bf19 100644
--- a/cli/tests/testdata/npm/cjs_module_export_assignment_number/main.ts
+++ b/tests/testdata/npm/cjs_module_export_assignment_number/main.ts
diff --git a/cli/tests/testdata/npm/cjs_reexport_collision/main.out b/tests/testdata/npm/cjs_reexport_collision/main.out
index ed3193f8d..ed3193f8d 100644
--- a/cli/tests/testdata/npm/cjs_reexport_collision/main.out
+++ b/tests/testdata/npm/cjs_reexport_collision/main.out
diff --git a/cli/tests/testdata/npm/cjs_reexport_collision/main.ts b/tests/testdata/npm/cjs_reexport_collision/main.ts
index 4bfcd89b1..4bfcd89b1 100644
--- a/cli/tests/testdata/npm/cjs_reexport_collision/main.ts
+++ b/tests/testdata/npm/cjs_reexport_collision/main.ts
diff --git a/cli/tests/testdata/npm/cjs_require_esm_error/main.out b/tests/testdata/npm/cjs_require_esm_error/main.out
index b6ade6904..b6ade6904 100644
--- a/cli/tests/testdata/npm/cjs_require_esm_error/main.out
+++ b/tests/testdata/npm/cjs_require_esm_error/main.out
diff --git a/cli/tests/testdata/npm/cjs_require_esm_error/main.ts b/tests/testdata/npm/cjs_require_esm_error/main.ts
index 3fbb1215a..3fbb1215a 100644
--- a/cli/tests/testdata/npm/cjs_require_esm_error/main.ts
+++ b/tests/testdata/npm/cjs_require_esm_error/main.ts
diff --git a/cli/tests/testdata/npm/cjs_require_esm_mjs_error/main.out b/tests/testdata/npm/cjs_require_esm_mjs_error/main.out
index e779cfaf8..e779cfaf8 100644
--- a/cli/tests/testdata/npm/cjs_require_esm_mjs_error/main.out
+++ b/tests/testdata/npm/cjs_require_esm_mjs_error/main.out
diff --git a/cli/tests/testdata/npm/cjs_require_esm_mjs_error/main.ts b/tests/testdata/npm/cjs_require_esm_mjs_error/main.ts
index 2121f1dbb..2121f1dbb 100644
--- a/cli/tests/testdata/npm/cjs_require_esm_mjs_error/main.ts
+++ b/tests/testdata/npm/cjs_require_esm_mjs_error/main.ts
diff --git a/cli/tests/testdata/npm/cjs_sub_path/main.js b/tests/testdata/npm/cjs_sub_path/main.js
index b71360959..b71360959 100644
--- a/cli/tests/testdata/npm/cjs_sub_path/main.js
+++ b/tests/testdata/npm/cjs_sub_path/main.js
diff --git a/cli/tests/testdata/npm/cjs_sub_path/main.out b/tests/testdata/npm/cjs_sub_path/main.out
index 34ec9d63f..34ec9d63f 100644
--- a/cli/tests/testdata/npm/cjs_sub_path/main.out
+++ b/tests/testdata/npm/cjs_sub_path/main.out
diff --git a/cli/tests/testdata/npm/cjs_this_in_exports/main.js b/tests/testdata/npm/cjs_this_in_exports/main.js
index 03aaabe05..03aaabe05 100644
--- a/cli/tests/testdata/npm/cjs_this_in_exports/main.js
+++ b/tests/testdata/npm/cjs_this_in_exports/main.js
diff --git a/cli/tests/testdata/npm/cjs_this_in_exports/main.out b/tests/testdata/npm/cjs_this_in_exports/main.out
index ba436bddc..ba436bddc 100644
--- a/cli/tests/testdata/npm/cjs_this_in_exports/main.out
+++ b/tests/testdata/npm/cjs_this_in_exports/main.out
diff --git a/cli/tests/testdata/npm/cjs_with_deps/main.js b/tests/testdata/npm/cjs_with_deps/main.js
index 568726874..568726874 100644
--- a/cli/tests/testdata/npm/cjs_with_deps/main.js
+++ b/tests/testdata/npm/cjs_with_deps/main.js
diff --git a/cli/tests/testdata/npm/cjs_with_deps/main.out b/tests/testdata/npm/cjs_with_deps/main.out
index aac21abba..aac21abba 100644
--- a/cli/tests/testdata/npm/cjs_with_deps/main.out
+++ b/tests/testdata/npm/cjs_with_deps/main.out
diff --git a/cli/tests/testdata/npm/cjs_with_deps/main_info.out b/tests/testdata/npm/cjs_with_deps/main_info.out
index bcaaf1eec..bcaaf1eec 100644
--- a/cli/tests/testdata/npm/cjs_with_deps/main_info.out
+++ b/tests/testdata/npm/cjs_with_deps/main_info.out
diff --git a/cli/tests/testdata/npm/cjs_with_deps/main_info_json.out b/tests/testdata/npm/cjs_with_deps/main_info_json.out
index fd850b8a1..fd850b8a1 100644
--- a/cli/tests/testdata/npm/cjs_with_deps/main_info_json.out
+++ b/tests/testdata/npm/cjs_with_deps/main_info_json.out
diff --git a/cli/tests/testdata/npm/cjs_with_deps/main_node_modules.out b/tests/testdata/npm/cjs_with_deps/main_node_modules.out
index 548f567f1..548f567f1 100644
--- a/cli/tests/testdata/npm/cjs_with_deps/main_node_modules.out
+++ b/tests/testdata/npm/cjs_with_deps/main_node_modules.out
diff --git a/cli/tests/testdata/npm/cjs_yargs/main.js b/tests/testdata/npm/cjs_yargs/main.js
index 832fd053c..832fd053c 100644
--- a/cli/tests/testdata/npm/cjs_yargs/main.js
+++ b/tests/testdata/npm/cjs_yargs/main.js
diff --git a/cli/tests/testdata/npm/cjs_yargs/main.out b/tests/testdata/npm/cjs_yargs/main.out
index 422cbb134..422cbb134 100644
--- a/cli/tests/testdata/npm/cjs_yargs/main.out
+++ b/tests/testdata/npm/cjs_yargs/main.out
diff --git a/cli/tests/testdata/npm/compare_globals/main.out b/tests/testdata/npm/compare_globals/main.out
index 0e366fae7..0e366fae7 100644
--- a/cli/tests/testdata/npm/compare_globals/main.out
+++ b/tests/testdata/npm/compare_globals/main.out
diff --git a/cli/tests/testdata/npm/compare_globals/main.ts b/tests/testdata/npm/compare_globals/main.ts
index 6f7b9ef8e..6f7b9ef8e 100644
--- a/cli/tests/testdata/npm/compare_globals/main.ts
+++ b/tests/testdata/npm/compare_globals/main.ts
diff --git a/cli/tests/testdata/npm/conditional_exports/main.js b/tests/testdata/npm/conditional_exports/main.js
index 52b78bc22..52b78bc22 100644
--- a/cli/tests/testdata/npm/conditional_exports/main.js
+++ b/tests/testdata/npm/conditional_exports/main.js
diff --git a/cli/tests/testdata/npm/conditional_exports/main.out b/tests/testdata/npm/conditional_exports/main.out
index dbd1b87fe..dbd1b87fe 100644
--- a/cli/tests/testdata/npm/conditional_exports/main.out
+++ b/tests/testdata/npm/conditional_exports/main.out
diff --git a/cli/tests/testdata/npm/conditional_exports/main_node_modules.out b/tests/testdata/npm/conditional_exports/main_node_modules.out
index 460aec0f1..460aec0f1 100644
--- a/cli/tests/testdata/npm/conditional_exports/main_node_modules.out
+++ b/tests/testdata/npm/conditional_exports/main_node_modules.out
diff --git a/cli/tests/testdata/npm/create_require/main.out b/tests/testdata/npm/create_require/main.out
index 70b0415b3..70b0415b3 100644
--- a/cli/tests/testdata/npm/create_require/main.out
+++ b/tests/testdata/npm/create_require/main.out
diff --git a/cli/tests/testdata/npm/create_require/main.ts b/tests/testdata/npm/create_require/main.ts
index 625c734aa..625c734aa 100644
--- a/cli/tests/testdata/npm/create_require/main.ts
+++ b/tests/testdata/npm/create_require/main.ts
diff --git a/cli/tests/testdata/npm/d_ext/main.out b/tests/testdata/npm/d_ext/main.out
index e96c6e392..e96c6e392 100644
--- a/cli/tests/testdata/npm/d_ext/main.out
+++ b/tests/testdata/npm/d_ext/main.out
diff --git a/cli/tests/testdata/npm/d_ext/main.ts b/tests/testdata/npm/d_ext/main.ts
index c92dbe065..c92dbe065 100644
--- a/cli/tests/testdata/npm/d_ext/main.ts
+++ b/tests/testdata/npm/d_ext/main.ts
diff --git a/cli/tests/testdata/npm/deno_cache.out b/tests/testdata/npm/deno_cache.out
index e2e68b7bb..e2e68b7bb 100644
--- a/cli/tests/testdata/npm/deno_cache.out
+++ b/tests/testdata/npm/deno_cache.out
diff --git a/cli/tests/testdata/npm/deno_run_cjs.out b/tests/testdata/npm/deno_run_cjs.out
index ffe7cbd89..ffe7cbd89 100644
--- a/cli/tests/testdata/npm/deno_run_cjs.out
+++ b/tests/testdata/npm/deno_run_cjs.out
diff --git a/cli/tests/testdata/npm/deno_run_cowsay.out b/tests/testdata/npm/deno_run_cowsay.out
index 46de82730..46de82730 100644
--- a/cli/tests/testdata/npm/deno_run_cowsay.out
+++ b/tests/testdata/npm/deno_run_cowsay.out
diff --git a/cli/tests/testdata/npm/deno_run_cowsay_no_permissions.out b/tests/testdata/npm/deno_run_cowsay_no_permissions.out
index 206ef1484..206ef1484 100644
--- a/cli/tests/testdata/npm/deno_run_cowsay_no_permissions.out
+++ b/tests/testdata/npm/deno_run_cowsay_no_permissions.out
diff --git a/cli/tests/testdata/npm/deno_run_cowthink.out b/tests/testdata/npm/deno_run_cowthink.out
index 8dd990ed6..8dd990ed6 100644
--- a/cli/tests/testdata/npm/deno_run_cowthink.out
+++ b/tests/testdata/npm/deno_run_cowthink.out
diff --git a/cli/tests/testdata/npm/deno_run_esm.out b/tests/testdata/npm/deno_run_esm.out
index ffe7cbd89..ffe7cbd89 100644
--- a/cli/tests/testdata/npm/deno_run_esm.out
+++ b/tests/testdata/npm/deno_run_esm.out
diff --git a/cli/tests/testdata/npm/deno_run_no_bin_entrypoint.out b/tests/testdata/npm/deno_run_no_bin_entrypoint.out
index 73bddfecf..73bddfecf 100644
--- a/cli/tests/testdata/npm/deno_run_no_bin_entrypoint.out
+++ b/tests/testdata/npm/deno_run_no_bin_entrypoint.out
diff --git a/cli/tests/testdata/npm/deno_run_no_bin_entrypoint_non_existent_subpath.out b/tests/testdata/npm/deno_run_no_bin_entrypoint_non_existent_subpath.out
index ea5ee3d35..ea5ee3d35 100644
--- a/cli/tests/testdata/npm/deno_run_no_bin_entrypoint_non_existent_subpath.out
+++ b/tests/testdata/npm/deno_run_no_bin_entrypoint_non_existent_subpath.out
diff --git a/cli/tests/testdata/npm/deno_run_no_ext.out b/tests/testdata/npm/deno_run_no_ext.out
index ffe7cbd89..ffe7cbd89 100644
--- a/cli/tests/testdata/npm/deno_run_no_ext.out
+++ b/tests/testdata/npm/deno_run_no_ext.out
diff --git a/cli/tests/testdata/npm/deno_run_non_existent.out b/tests/testdata/npm/deno_run_non_existent.out
index 47021e00c..47021e00c 100644
--- a/cli/tests/testdata/npm/deno_run_non_existent.out
+++ b/tests/testdata/npm/deno_run_non_existent.out
diff --git a/cli/tests/testdata/npm/deno_run_special_chars_in_bin_name.out b/tests/testdata/npm/deno_run_special_chars_in_bin_name.out
index ffe7cbd89..ffe7cbd89 100644
--- a/cli/tests/testdata/npm/deno_run_special_chars_in_bin_name.out
+++ b/tests/testdata/npm/deno_run_special_chars_in_bin_name.out
diff --git a/cli/tests/testdata/npm/different_nested_dep/main.js b/tests/testdata/npm/different_nested_dep/main.js
index 5677eb094..5677eb094 100644
--- a/cli/tests/testdata/npm/different_nested_dep/main.js
+++ b/tests/testdata/npm/different_nested_dep/main.js
diff --git a/cli/tests/testdata/npm/different_nested_dep/main.out b/tests/testdata/npm/different_nested_dep/main.out
index 1191247b6..1191247b6 100644
--- a/cli/tests/testdata/npm/different_nested_dep/main.out
+++ b/tests/testdata/npm/different_nested_dep/main.out
diff --git a/cli/tests/testdata/npm/different_nested_dep/package.json b/tests/testdata/npm/different_nested_dep/package.json
index c20425851..c20425851 100644
--- a/cli/tests/testdata/npm/different_nested_dep/package.json
+++ b/tests/testdata/npm/different_nested_dep/package.json
diff --git a/cli/tests/testdata/npm/directory_import/folder_index_js.out b/tests/testdata/npm/directory_import/folder_index_js.out
index 72f285fc0..72f285fc0 100644
--- a/cli/tests/testdata/npm/directory_import/folder_index_js.out
+++ b/tests/testdata/npm/directory_import/folder_index_js.out
diff --git a/cli/tests/testdata/npm/directory_import/folder_index_js.ts b/tests/testdata/npm/directory_import/folder_index_js.ts
index b0d51fcd9..b0d51fcd9 100644
--- a/cli/tests/testdata/npm/directory_import/folder_index_js.ts
+++ b/tests/testdata/npm/directory_import/folder_index_js.ts
diff --git a/cli/tests/testdata/npm/directory_import/folder_no_index.out b/tests/testdata/npm/directory_import/folder_no_index.out
index 86ac88207..86ac88207 100644
--- a/cli/tests/testdata/npm/directory_import/folder_no_index.out
+++ b/tests/testdata/npm/directory_import/folder_no_index.out
diff --git a/cli/tests/testdata/npm/directory_import/folder_no_index.ts b/tests/testdata/npm/directory_import/folder_no_index.ts
index 4c5fb7ec0..4c5fb7ec0 100644
--- a/cli/tests/testdata/npm/directory_import/folder_no_index.ts
+++ b/tests/testdata/npm/directory_import/folder_no_index.ts
diff --git a/cli/tests/testdata/npm/dual_cjs_esm/main.out b/tests/testdata/npm/dual_cjs_esm/main.out
index 32e232f11..32e232f11 100644
--- a/cli/tests/testdata/npm/dual_cjs_esm/main.out
+++ b/tests/testdata/npm/dual_cjs_esm/main.out
diff --git a/cli/tests/testdata/npm/dual_cjs_esm/main.ts b/tests/testdata/npm/dual_cjs_esm/main.ts
index 4f3b79667..4f3b79667 100644
--- a/cli/tests/testdata/npm/dual_cjs_esm/main.ts
+++ b/tests/testdata/npm/dual_cjs_esm/main.ts
diff --git a/cli/tests/testdata/npm/dynamic_import/main.out b/tests/testdata/npm/dynamic_import/main.out
index cefb3ad44..cefb3ad44 100644
--- a/cli/tests/testdata/npm/dynamic_import/main.out
+++ b/tests/testdata/npm/dynamic_import/main.out
diff --git a/cli/tests/testdata/npm/dynamic_import/main.ts b/tests/testdata/npm/dynamic_import/main.ts
index 8b850a8ee..8b850a8ee 100644
--- a/cli/tests/testdata/npm/dynamic_import/main.ts
+++ b/tests/testdata/npm/dynamic_import/main.ts
diff --git a/cli/tests/testdata/npm/dynamic_import/other.ts b/tests/testdata/npm/dynamic_import/other.ts
index 008f8833e..008f8833e 100644
--- a/cli/tests/testdata/npm/dynamic_import/other.ts
+++ b/tests/testdata/npm/dynamic_import/other.ts
diff --git a/cli/tests/testdata/npm/dynamic_import_deno_ts_from_npm/add.ts b/tests/testdata/npm/dynamic_import_deno_ts_from_npm/add.ts
index 3b399665d..3b399665d 100644
--- a/cli/tests/testdata/npm/dynamic_import_deno_ts_from_npm/add.ts
+++ b/tests/testdata/npm/dynamic_import_deno_ts_from_npm/add.ts
diff --git a/cli/tests/testdata/npm/dynamic_import_deno_ts_from_npm/main.out b/tests/testdata/npm/dynamic_import_deno_ts_from_npm/main.out
index 81d7aba8a..81d7aba8a 100644
--- a/cli/tests/testdata/npm/dynamic_import_deno_ts_from_npm/main.out
+++ b/tests/testdata/npm/dynamic_import_deno_ts_from_npm/main.out
diff --git a/cli/tests/testdata/npm/dynamic_import_deno_ts_from_npm/main.ts b/tests/testdata/npm/dynamic_import_deno_ts_from_npm/main.ts
index 4d5deec48..4d5deec48 100644
--- a/cli/tests/testdata/npm/dynamic_import_deno_ts_from_npm/main.ts
+++ b/tests/testdata/npm/dynamic_import_deno_ts_from_npm/main.ts
diff --git a/cli/tests/testdata/npm/dynamic_import_deno_ts_from_npm/subtract.mts b/tests/testdata/npm/dynamic_import_deno_ts_from_npm/subtract.mts
index 4bf634170..4bf634170 100644
--- a/cli/tests/testdata/npm/dynamic_import_deno_ts_from_npm/subtract.mts
+++ b/tests/testdata/npm/dynamic_import_deno_ts_from_npm/subtract.mts
diff --git a/cli/tests/testdata/npm/dynamic_import_invalid_package_name/main.out b/tests/testdata/npm/dynamic_import_invalid_package_name/main.out
index 0e9de5f25..0e9de5f25 100644
--- a/cli/tests/testdata/npm/dynamic_import_invalid_package_name/main.out
+++ b/tests/testdata/npm/dynamic_import_invalid_package_name/main.out
diff --git a/cli/tests/testdata/npm/dynamic_import_invalid_package_name/main.ts b/tests/testdata/npm/dynamic_import_invalid_package_name/main.ts
index 368ccc282..368ccc282 100644
--- a/cli/tests/testdata/npm/dynamic_import_invalid_package_name/main.ts
+++ b/tests/testdata/npm/dynamic_import_invalid_package_name/main.ts
diff --git a/cli/tests/testdata/npm/dynamic_import_json/main.js b/tests/testdata/npm/dynamic_import_json/main.js
index 6d8abfc9e..6d8abfc9e 100644
--- a/cli/tests/testdata/npm/dynamic_import_json/main.js
+++ b/tests/testdata/npm/dynamic_import_json/main.js
diff --git a/cli/tests/testdata/npm/dynamic_import_json/main.out b/tests/testdata/npm/dynamic_import_json/main.out
index 07f48e8a5..07f48e8a5 100644
--- a/cli/tests/testdata/npm/dynamic_import_json/main.out
+++ b/tests/testdata/npm/dynamic_import_json/main.out
diff --git a/cli/tests/testdata/npm/dynamic_import_reload_same_package/main.out b/tests/testdata/npm/dynamic_import_reload_same_package/main.out
index 918e7f5e8..918e7f5e8 100644
--- a/cli/tests/testdata/npm/dynamic_import_reload_same_package/main.out
+++ b/tests/testdata/npm/dynamic_import_reload_same_package/main.out
diff --git a/cli/tests/testdata/npm/dynamic_import_reload_same_package/main.ts b/tests/testdata/npm/dynamic_import_reload_same_package/main.ts
index 7c7ee7d55..7c7ee7d55 100644
--- a/cli/tests/testdata/npm/dynamic_import_reload_same_package/main.ts
+++ b/tests/testdata/npm/dynamic_import_reload_same_package/main.ts
diff --git a/cli/tests/testdata/npm/dynamic_import_reload_same_package/other.ts b/tests/testdata/npm/dynamic_import_reload_same_package/other.ts
index 28e3da14f..28e3da14f 100644
--- a/cli/tests/testdata/npm/dynamic_import_reload_same_package/other.ts
+++ b/tests/testdata/npm/dynamic_import_reload_same_package/other.ts
diff --git a/cli/tests/testdata/npm/env_var_re_export/main.js b/tests/testdata/npm/env_var_re_export/main.js
index ed91487a0..ed91487a0 100644
--- a/cli/tests/testdata/npm/env_var_re_export/main.js
+++ b/tests/testdata/npm/env_var_re_export/main.js
diff --git a/cli/tests/testdata/npm/error_version_after_subpath/main.js b/tests/testdata/npm/error_version_after_subpath/main.js
index 77c7a017c..77c7a017c 100644
--- a/cli/tests/testdata/npm/error_version_after_subpath/main.js
+++ b/tests/testdata/npm/error_version_after_subpath/main.js
diff --git a/cli/tests/testdata/npm/error_version_after_subpath/main.out b/tests/testdata/npm/error_version_after_subpath/main.out
index 0cdd1b6da..0cdd1b6da 100644
--- a/cli/tests/testdata/npm/error_version_after_subpath/main.out
+++ b/tests/testdata/npm/error_version_after_subpath/main.out
diff --git a/cli/tests/testdata/npm/esm/main.js b/tests/testdata/npm/esm/main.js
index 0f1fa2590..0f1fa2590 100644
--- a/cli/tests/testdata/npm/esm/main.js
+++ b/tests/testdata/npm/esm/main.js
diff --git a/cli/tests/testdata/npm/esm/main.out b/tests/testdata/npm/esm/main.out
index 2010a5b73..2010a5b73 100644
--- a/cli/tests/testdata/npm/esm/main.out
+++ b/tests/testdata/npm/esm/main.out
diff --git a/cli/tests/testdata/npm/esm/test.js b/tests/testdata/npm/esm/test.js
index b9c91c715..b9c91c715 100644
--- a/cli/tests/testdata/npm/esm/test.js
+++ b/tests/testdata/npm/esm/test.js
diff --git a/cli/tests/testdata/npm/esm/test.out b/tests/testdata/npm/esm/test.out
index a87924424..a87924424 100644
--- a/cli/tests/testdata/npm/esm/test.out
+++ b/tests/testdata/npm/esm/test.out
diff --git a/cli/tests/testdata/npm/esm_import_cjs_default/main.out b/tests/testdata/npm/esm_import_cjs_default/main.out
index 0f6a61e34..0f6a61e34 100644
--- a/cli/tests/testdata/npm/esm_import_cjs_default/main.out
+++ b/tests/testdata/npm/esm_import_cjs_default/main.out
diff --git a/cli/tests/testdata/npm/esm_import_cjs_default/main.ts b/tests/testdata/npm/esm_import_cjs_default/main.ts
index f9c3280e5..f9c3280e5 100644
--- a/cli/tests/testdata/npm/esm_import_cjs_default/main.ts
+++ b/tests/testdata/npm/esm_import_cjs_default/main.ts
diff --git a/cli/tests/testdata/npm/file_dts_dmts_dcts/main.out b/tests/testdata/npm/file_dts_dmts_dcts/main.out
index c92043f8b..c92043f8b 100644
--- a/cli/tests/testdata/npm/file_dts_dmts_dcts/main.out
+++ b/tests/testdata/npm/file_dts_dmts_dcts/main.out
diff --git a/cli/tests/testdata/npm/file_dts_dmts_dcts/main.ts b/tests/testdata/npm/file_dts_dmts_dcts/main.ts
index 63686e2d3..63686e2d3 100644
--- a/cli/tests/testdata/npm/file_dts_dmts_dcts/main.ts
+++ b/tests/testdata/npm/file_dts_dmts_dcts/main.ts
diff --git a/cli/tests/testdata/npm/import_json/main.js b/tests/testdata/npm/import_json/main.js
index b752bdef8..b752bdef8 100644
--- a/cli/tests/testdata/npm/import_json/main.js
+++ b/tests/testdata/npm/import_json/main.js
diff --git a/cli/tests/testdata/npm/import_json/main.out b/tests/testdata/npm/import_json/main.out
index 7db7ec4ea..7db7ec4ea 100644
--- a/cli/tests/testdata/npm/import_json/main.out
+++ b/tests/testdata/npm/import_json/main.out
diff --git a/cli/tests/testdata/npm/import_map/import_map.json b/tests/testdata/npm/import_map/import_map.json
index 1c3baacd1..1c3baacd1 100644
--- a/cli/tests/testdata/npm/import_map/import_map.json
+++ b/tests/testdata/npm/import_map/import_map.json
diff --git a/cli/tests/testdata/npm/import_map/main.js b/tests/testdata/npm/import_map/main.js
index e354b7e92..e354b7e92 100644
--- a/cli/tests/testdata/npm/import_map/main.js
+++ b/tests/testdata/npm/import_map/main.js
diff --git a/cli/tests/testdata/npm/import_map/main.out b/tests/testdata/npm/import_map/main.out
index a3d1d9f3a..a3d1d9f3a 100644
--- a/cli/tests/testdata/npm/import_map/main.out
+++ b/tests/testdata/npm/import_map/main.out
diff --git a/cli/tests/testdata/npm/imports_package_json/import_not_defined.js b/tests/testdata/npm/imports_package_json/import_not_defined.js
index dc4d2df16..dc4d2df16 100644
--- a/cli/tests/testdata/npm/imports_package_json/import_not_defined.js
+++ b/tests/testdata/npm/imports_package_json/import_not_defined.js
diff --git a/cli/tests/testdata/npm/imports_package_json/import_not_defined.out b/tests/testdata/npm/imports_package_json/import_not_defined.out
index 3580d9007..3580d9007 100644
--- a/cli/tests/testdata/npm/imports_package_json/import_not_defined.out
+++ b/tests/testdata/npm/imports_package_json/import_not_defined.out
diff --git a/cli/tests/testdata/npm/imports_package_json/main.js b/tests/testdata/npm/imports_package_json/main.js
index 53090dd94..53090dd94 100644
--- a/cli/tests/testdata/npm/imports_package_json/main.js
+++ b/tests/testdata/npm/imports_package_json/main.js
diff --git a/cli/tests/testdata/npm/imports_package_json/main.out b/tests/testdata/npm/imports_package_json/main.out
index 9f702b96b..9f702b96b 100644
--- a/cli/tests/testdata/npm/imports_package_json/main.out
+++ b/tests/testdata/npm/imports_package_json/main.out
diff --git a/cli/tests/testdata/npm/imports_package_json/package.json b/tests/testdata/npm/imports_package_json/package.json
index cb6a08d1a..cb6a08d1a 100644
--- a/cli/tests/testdata/npm/imports_package_json/package.json
+++ b/tests/testdata/npm/imports_package_json/package.json
diff --git a/cli/tests/testdata/npm/imports_package_json/sub_path_import_not_defined.js b/tests/testdata/npm/imports_package_json/sub_path_import_not_defined.js
index f1097aa06..f1097aa06 100644
--- a/cli/tests/testdata/npm/imports_package_json/sub_path_import_not_defined.js
+++ b/tests/testdata/npm/imports_package_json/sub_path_import_not_defined.js
diff --git a/cli/tests/testdata/npm/imports_package_json/sub_path_import_not_defined.out b/tests/testdata/npm/imports_package_json/sub_path_import_not_defined.out
index 04a21c99e..04a21c99e 100644
--- a/cli/tests/testdata/npm/imports_package_json/sub_path_import_not_defined.out
+++ b/tests/testdata/npm/imports_package_json/sub_path_import_not_defined.out
diff --git a/cli/tests/testdata/npm/info/chalk.out b/tests/testdata/npm/info/chalk.out
index 63fa20da5..63fa20da5 100644
--- a/cli/tests/testdata/npm/info/chalk.out
+++ b/tests/testdata/npm/info/chalk.out
diff --git a/cli/tests/testdata/npm/info/chalk_json.out b/tests/testdata/npm/info/chalk_json.out
index bffed4ad4..bffed4ad4 100644
--- a/cli/tests/testdata/npm/info/chalk_json.out
+++ b/tests/testdata/npm/info/chalk_json.out
diff --git a/cli/tests/testdata/npm/invalid_package_name/main.js b/tests/testdata/npm/invalid_package_name/main.js
index 1e3783054..1e3783054 100644
--- a/cli/tests/testdata/npm/invalid_package_name/main.js
+++ b/tests/testdata/npm/invalid_package_name/main.js
diff --git a/cli/tests/testdata/npm/invalid_package_name/main.out b/tests/testdata/npm/invalid_package_name/main.out
index b4a421bd7..b4a421bd7 100644
--- a/cli/tests/testdata/npm/invalid_package_name/main.out
+++ b/tests/testdata/npm/invalid_package_name/main.out
diff --git a/cli/tests/testdata/npm/local_dir_resolves_symlinks/index.js b/tests/testdata/npm/local_dir_resolves_symlinks/index.js
index 72d8913f5..72d8913f5 100644
--- a/cli/tests/testdata/npm/local_dir_resolves_symlinks/index.js
+++ b/tests/testdata/npm/local_dir_resolves_symlinks/index.js
diff --git a/cli/tests/testdata/npm/local_dir_resolves_symlinks/index.out b/tests/testdata/npm/local_dir_resolves_symlinks/index.out
index 25d44c6b8..25d44c6b8 100644
--- a/cli/tests/testdata/npm/local_dir_resolves_symlinks/index.out
+++ b/tests/testdata/npm/local_dir_resolves_symlinks/index.out
diff --git a/cli/tests/testdata/npm/local_dir_resolves_symlinks/package.json b/tests/testdata/npm/local_dir_resolves_symlinks/package.json
index 4c974022e..4c974022e 100644
--- a/cli/tests/testdata/npm/local_dir_resolves_symlinks/package.json
+++ b/tests/testdata/npm/local_dir_resolves_symlinks/package.json
diff --git a/cli/tests/testdata/npm/lock_file/lock.json b/tests/testdata/npm/lock_file/lock.json
index 57253314e..57253314e 100644
--- a/cli/tests/testdata/npm/lock_file/lock.json
+++ b/tests/testdata/npm/lock_file/lock.json
diff --git a/cli/tests/testdata/npm/lock_file/main.js b/tests/testdata/npm/lock_file/main.js
index a7b5960ca..a7b5960ca 100644
--- a/cli/tests/testdata/npm/lock_file/main.js
+++ b/tests/testdata/npm/lock_file/main.js
diff --git a/cli/tests/testdata/npm/lock_file/main.out b/tests/testdata/npm/lock_file/main.out
index 65e881be6..65e881be6 100644
--- a/cli/tests/testdata/npm/lock_file/main.out
+++ b/tests/testdata/npm/lock_file/main.out
diff --git a/cli/tests/testdata/npm/mixed_case_package_name/global.out b/tests/testdata/npm/mixed_case_package_name/global.out
index 33d09890b..33d09890b 100644
--- a/cli/tests/testdata/npm/mixed_case_package_name/global.out
+++ b/tests/testdata/npm/mixed_case_package_name/global.out
diff --git a/cli/tests/testdata/npm/mixed_case_package_name/global.ts b/tests/testdata/npm/mixed_case_package_name/global.ts
index a721b3d78..a721b3d78 100644
--- a/cli/tests/testdata/npm/mixed_case_package_name/global.ts
+++ b/tests/testdata/npm/mixed_case_package_name/global.ts
diff --git a/cli/tests/testdata/npm/mixed_case_package_name/local.out b/tests/testdata/npm/mixed_case_package_name/local.out
index 782107eb1..782107eb1 100644
--- a/cli/tests/testdata/npm/mixed_case_package_name/local.out
+++ b/tests/testdata/npm/mixed_case_package_name/local.out
diff --git a/cli/tests/testdata/npm/mixed_case_package_name/local.ts b/tests/testdata/npm/mixed_case_package_name/local.ts
index 6ca6cb581..6ca6cb581 100644
--- a/cli/tests/testdata/npm/mixed_case_package_name/local.ts
+++ b/tests/testdata/npm/mixed_case_package_name/local.ts
diff --git a/cli/tests/testdata/npm/no_npm_after_first_run/main1.ts b/tests/testdata/npm/no_npm_after_first_run/main1.ts
index 1ccc441a1..1ccc441a1 100644
--- a/cli/tests/testdata/npm/no_npm_after_first_run/main1.ts
+++ b/tests/testdata/npm/no_npm_after_first_run/main1.ts
diff --git a/cli/tests/testdata/npm/no_types_cjs/main.ts b/tests/testdata/npm/no_types_cjs/main.ts
index 32458e839..32458e839 100644
--- a/cli/tests/testdata/npm/no_types_cjs/main.ts
+++ b/tests/testdata/npm/no_types_cjs/main.ts
diff --git a/cli/tests/testdata/npm/no_types_in_conditional_exports/main.out b/tests/testdata/npm/no_types_in_conditional_exports/main.out
index 3c856ac09..3c856ac09 100644
--- a/cli/tests/testdata/npm/no_types_in_conditional_exports/main.out
+++ b/tests/testdata/npm/no_types_in_conditional_exports/main.out
diff --git a/cli/tests/testdata/npm/no_types_in_conditional_exports/main.ts b/tests/testdata/npm/no_types_in_conditional_exports/main.ts
index 7ec2f18fd..7ec2f18fd 100644
--- a/cli/tests/testdata/npm/no_types_in_conditional_exports/main.ts
+++ b/tests/testdata/npm/no_types_in_conditional_exports/main.ts
diff --git a/cli/tests/testdata/npm/node_modules_deno_node_modules/main.out b/tests/testdata/npm/node_modules_deno_node_modules/main.out
index 1ebdb2dd5..1ebdb2dd5 100644
--- a/cli/tests/testdata/npm/node_modules_deno_node_modules/main.out
+++ b/tests/testdata/npm/node_modules_deno_node_modules/main.out
diff --git a/cli/tests/testdata/npm/node_modules_deno_node_modules/main.ts b/tests/testdata/npm/node_modules_deno_node_modules/main.ts
index 6e4a32d8e..6e4a32d8e 100644
--- a/cli/tests/testdata/npm/node_modules_deno_node_modules/main.ts
+++ b/tests/testdata/npm/node_modules_deno_node_modules/main.ts
diff --git a/cli/tests/testdata/npm/node_modules_import/main.out b/tests/testdata/npm/node_modules_import/main.out
index 083edaac2..083edaac2 100644
--- a/cli/tests/testdata/npm/node_modules_import/main.out
+++ b/tests/testdata/npm/node_modules_import/main.out
diff --git a/cli/tests/testdata/npm/node_modules_import/main.ts b/tests/testdata/npm/node_modules_import/main.ts
index 848ca0f81..848ca0f81 100644
--- a/cli/tests/testdata/npm/node_modules_import/main.ts
+++ b/tests/testdata/npm/node_modules_import/main.ts
diff --git a/cli/tests/testdata/npm/node_modules_import/main_check.out b/tests/testdata/npm/node_modules_import/main_check.out
index cf7cc110d..cf7cc110d 100644
--- a/cli/tests/testdata/npm/node_modules_import/main_check.out
+++ b/tests/testdata/npm/node_modules_import/main_check.out
diff --git a/cli/tests/testdata/npm/node_modules_import/package.json b/tests/testdata/npm/node_modules_import/package.json
index ed77298e0..ed77298e0 100644
--- a/cli/tests/testdata/npm/node_modules_import/package.json
+++ b/tests/testdata/npm/node_modules_import/package.json
diff --git a/cli/tests/testdata/npm/nonexistent_file/main.js b/tests/testdata/npm/nonexistent_file/main.js
index c480b0548..c480b0548 100644
--- a/cli/tests/testdata/npm/nonexistent_file/main.js
+++ b/tests/testdata/npm/nonexistent_file/main.js
diff --git a/cli/tests/testdata/npm/nonexistent_file/main.out b/tests/testdata/npm/nonexistent_file/main.out
index baa79b1ce..baa79b1ce 100644
--- a/cli/tests/testdata/npm/nonexistent_file/main.out
+++ b/tests/testdata/npm/nonexistent_file/main.out
diff --git a/cli/tests/testdata/npm/peer_deps_with_copied_folders/main.out b/tests/testdata/npm/peer_deps_with_copied_folders/main.out
index 32fa3b76f..32fa3b76f 100644
--- a/cli/tests/testdata/npm/peer_deps_with_copied_folders/main.out
+++ b/tests/testdata/npm/peer_deps_with_copied_folders/main.out
diff --git a/cli/tests/testdata/npm/peer_deps_with_copied_folders/main.ts b/tests/testdata/npm/peer_deps_with_copied_folders/main.ts
index a8ea8104a..a8ea8104a 100644
--- a/cli/tests/testdata/npm/peer_deps_with_copied_folders/main.ts
+++ b/tests/testdata/npm/peer_deps_with_copied_folders/main.ts
diff --git a/cli/tests/testdata/npm/peer_deps_with_copied_folders/main_info.out b/tests/testdata/npm/peer_deps_with_copied_folders/main_info.out
index 638f9328d..638f9328d 100644
--- a/cli/tests/testdata/npm/peer_deps_with_copied_folders/main_info.out
+++ b/tests/testdata/npm/peer_deps_with_copied_folders/main_info.out
diff --git a/cli/tests/testdata/npm/peer_deps_with_copied_folders/main_info_json.out b/tests/testdata/npm/peer_deps_with_copied_folders/main_info_json.out
index a4306a6d5..a4306a6d5 100644
--- a/cli/tests/testdata/npm/peer_deps_with_copied_folders/main_info_json.out
+++ b/tests/testdata/npm/peer_deps_with_copied_folders/main_info_json.out
diff --git a/cli/tests/testdata/npm/peer_deps_with_copied_folders/main_node_modules.out b/tests/testdata/npm/peer_deps_with_copied_folders/main_node_modules.out
index 02b5cbafd..02b5cbafd 100644
--- a/cli/tests/testdata/npm/peer_deps_with_copied_folders/main_node_modules.out
+++ b/tests/testdata/npm/peer_deps_with_copied_folders/main_node_modules.out
diff --git a/cli/tests/testdata/npm/peer_deps_with_copied_folders/main_node_modules_reload.out b/tests/testdata/npm/peer_deps_with_copied_folders/main_node_modules_reload.out
index ed73c6cc2..ed73c6cc2 100644
--- a/cli/tests/testdata/npm/peer_deps_with_copied_folders/main_node_modules_reload.out
+++ b/tests/testdata/npm/peer_deps_with_copied_folders/main_node_modules_reload.out
diff --git a/cli/tests/testdata/npm/permissions_outside_package/foo/config.js b/tests/testdata/npm/permissions_outside_package/foo/config.js
index e667790d2..e667790d2 100644
--- a/cli/tests/testdata/npm/permissions_outside_package/foo/config.js
+++ b/tests/testdata/npm/permissions_outside_package/foo/config.js
diff --git a/cli/tests/testdata/npm/permissions_outside_package/foo/package.json b/tests/testdata/npm/permissions_outside_package/foo/package.json
index cc049e6ce..cc049e6ce 100644
--- a/cli/tests/testdata/npm/permissions_outside_package/foo/package.json
+++ b/tests/testdata/npm/permissions_outside_package/foo/package.json
diff --git a/cli/tests/testdata/npm/permissions_outside_package/main.out b/tests/testdata/npm/permissions_outside_package/main.out
index 4edf66ae9..4edf66ae9 100644
--- a/cli/tests/testdata/npm/permissions_outside_package/main.out
+++ b/tests/testdata/npm/permissions_outside_package/main.out
diff --git a/cli/tests/testdata/npm/permissions_outside_package/main.ts b/tests/testdata/npm/permissions_outside_package/main.ts
index b0b82b626..b0b82b626 100644
--- a/cli/tests/testdata/npm/permissions_outside_package/main.ts
+++ b/tests/testdata/npm/permissions_outside_package/main.ts
diff --git a/cli/tests/testdata/npm/registry/@babel/parser/parser-7.19.0.tgz b/tests/testdata/npm/registry/@babel/parser/parser-7.19.0.tgz
index 37a6a69e1..37a6a69e1 100644
--- a/cli/tests/testdata/npm/registry/@babel/parser/parser-7.19.0.tgz
+++ b/tests/testdata/npm/registry/@babel/parser/parser-7.19.0.tgz
Binary files differ
diff --git a/cli/tests/testdata/npm/registry/@babel/parser/registry.json b/tests/testdata/npm/registry/@babel/parser/registry.json
index 804d6af3c..804d6af3c 100644
--- a/cli/tests/testdata/npm/registry/@babel/parser/registry.json
+++ b/tests/testdata/npm/registry/@babel/parser/registry.json
diff --git a/cli/tests/testdata/npm/registry/@denotest/CAPITALS/1.0.0/index.js b/tests/testdata/npm/registry/@denotest/CAPITALS/1.0.0/index.js
index f4e8d9d29..f4e8d9d29 100644
--- a/cli/tests/testdata/npm/registry/@denotest/CAPITALS/1.0.0/index.js
+++ b/tests/testdata/npm/registry/@denotest/CAPITALS/1.0.0/index.js
diff --git a/cli/tests/testdata/npm/registry/@denotest/CAPITALS/1.0.0/package.json b/tests/testdata/npm/registry/@denotest/CAPITALS/1.0.0/package.json
index e897d0023..e897d0023 100644
--- a/cli/tests/testdata/npm/registry/@denotest/CAPITALS/1.0.0/package.json
+++ b/tests/testdata/npm/registry/@denotest/CAPITALS/1.0.0/package.json
diff --git a/cli/tests/testdata/npm/registry/@denotest/MixedCase/1.0.0/index.js b/tests/testdata/npm/registry/@denotest/MixedCase/1.0.0/index.js
index fe1cfe547..fe1cfe547 100644
--- a/cli/tests/testdata/npm/registry/@denotest/MixedCase/1.0.0/index.js
+++ b/tests/testdata/npm/registry/@denotest/MixedCase/1.0.0/index.js
diff --git a/cli/tests/testdata/npm/registry/@denotest/MixedCase/1.0.0/package.json b/tests/testdata/npm/registry/@denotest/MixedCase/1.0.0/package.json
index 2a36cb357..2a36cb357 100644
--- a/cli/tests/testdata/npm/registry/@denotest/MixedCase/1.0.0/package.json
+++ b/tests/testdata/npm/registry/@denotest/MixedCase/1.0.0/package.json
diff --git a/cli/tests/testdata/npm/registry/@denotest/bin/0.5.0/cli.mjs b/tests/testdata/npm/registry/@denotest/bin/0.5.0/cli.mjs
index 0ae8e9190..0ae8e9190 100644
--- a/cli/tests/testdata/npm/registry/@denotest/bin/0.5.0/cli.mjs
+++ b/tests/testdata/npm/registry/@denotest/bin/0.5.0/cli.mjs
diff --git a/cli/tests/testdata/npm/registry/@denotest/bin/0.5.0/package.json b/tests/testdata/npm/registry/@denotest/bin/0.5.0/package.json
index 1b077a52e..1b077a52e 100644
--- a/cli/tests/testdata/npm/registry/@denotest/bin/0.5.0/package.json
+++ b/tests/testdata/npm/registry/@denotest/bin/0.5.0/package.json
diff --git a/cli/tests/testdata/npm/registry/@denotest/bin/0.6.0/cli-cjs.js b/tests/testdata/npm/registry/@denotest/bin/0.6.0/cli-cjs.js
index 7b6ba2724..7b6ba2724 100644
--- a/cli/tests/testdata/npm/registry/@denotest/bin/0.6.0/cli-cjs.js
+++ b/tests/testdata/npm/registry/@denotest/bin/0.6.0/cli-cjs.js
diff --git a/cli/tests/testdata/npm/registry/@denotest/bin/0.6.0/cli.mjs b/tests/testdata/npm/registry/@denotest/bin/0.6.0/cli.mjs
index 0ae8e9190..0ae8e9190 100644
--- a/cli/tests/testdata/npm/registry/@denotest/bin/0.6.0/cli.mjs
+++ b/tests/testdata/npm/registry/@denotest/bin/0.6.0/cli.mjs
diff --git a/cli/tests/testdata/npm/registry/@denotest/bin/0.6.0/package.json b/tests/testdata/npm/registry/@denotest/bin/0.6.0/package.json
index a9ff2d946..a9ff2d946 100644
--- a/cli/tests/testdata/npm/registry/@denotest/bin/0.6.0/package.json
+++ b/tests/testdata/npm/registry/@denotest/bin/0.6.0/package.json
diff --git a/cli/tests/testdata/npm/registry/@denotest/bin/1.0.0/cli-cjs.js b/tests/testdata/npm/registry/@denotest/bin/1.0.0/cli-cjs.js
index 7b6ba2724..7b6ba2724 100644
--- a/cli/tests/testdata/npm/registry/@denotest/bin/1.0.0/cli-cjs.js
+++ b/tests/testdata/npm/registry/@denotest/bin/1.0.0/cli-cjs.js
diff --git a/cli/tests/testdata/npm/registry/@denotest/bin/1.0.0/cli-no-ext b/tests/testdata/npm/registry/@denotest/bin/1.0.0/cli-no-ext
index 7b6ba2724..7b6ba2724 100644
--- a/cli/tests/testdata/npm/registry/@denotest/bin/1.0.0/cli-no-ext
+++ b/tests/testdata/npm/registry/@denotest/bin/1.0.0/cli-no-ext
diff --git a/cli/tests/testdata/npm/registry/@denotest/bin/1.0.0/cli.mjs b/tests/testdata/npm/registry/@denotest/bin/1.0.0/cli.mjs
index 0ae8e9190..0ae8e9190 100644
--- a/cli/tests/testdata/npm/registry/@denotest/bin/1.0.0/cli.mjs
+++ b/tests/testdata/npm/registry/@denotest/bin/1.0.0/cli.mjs
diff --git a/cli/tests/testdata/npm/registry/@denotest/bin/1.0.0/package.json b/tests/testdata/npm/registry/@denotest/bin/1.0.0/package.json
index 27118c21a..27118c21a 100644
--- a/cli/tests/testdata/npm/registry/@denotest/bin/1.0.0/package.json
+++ b/tests/testdata/npm/registry/@denotest/bin/1.0.0/package.json
diff --git a/cli/tests/testdata/npm/registry/@denotest/binary-package-linux/1.0.0/index.js b/tests/testdata/npm/registry/@denotest/binary-package-linux/1.0.0/index.js
index 03ecfc377..03ecfc377 100644
--- a/cli/tests/testdata/npm/registry/@denotest/binary-package-linux/1.0.0/index.js
+++ b/tests/testdata/npm/registry/@denotest/binary-package-linux/1.0.0/index.js
diff --git a/cli/tests/testdata/npm/registry/@denotest/binary-package-linux/1.0.0/package.json b/tests/testdata/npm/registry/@denotest/binary-package-linux/1.0.0/package.json
index 3b450e0d9..3b450e0d9 100644
--- a/cli/tests/testdata/npm/registry/@denotest/binary-package-linux/1.0.0/package.json
+++ b/tests/testdata/npm/registry/@denotest/binary-package-linux/1.0.0/package.json
diff --git a/cli/tests/testdata/npm/registry/@denotest/binary-package-mac/1.0.0/index.js b/tests/testdata/npm/registry/@denotest/binary-package-mac/1.0.0/index.js
index ac8c91f50..ac8c91f50 100644
--- a/cli/tests/testdata/npm/registry/@denotest/binary-package-mac/1.0.0/index.js
+++ b/tests/testdata/npm/registry/@denotest/binary-package-mac/1.0.0/index.js
diff --git a/cli/tests/testdata/npm/registry/@denotest/binary-package-mac/1.0.0/package.json b/tests/testdata/npm/registry/@denotest/binary-package-mac/1.0.0/package.json
index 02916e65b..02916e65b 100644
--- a/cli/tests/testdata/npm/registry/@denotest/binary-package-mac/1.0.0/package.json
+++ b/tests/testdata/npm/registry/@denotest/binary-package-mac/1.0.0/package.json
diff --git a/cli/tests/testdata/npm/registry/@denotest/binary-package-windows/1.0.0/index.js b/tests/testdata/npm/registry/@denotest/binary-package-windows/1.0.0/index.js
index 57344ca00..57344ca00 100644
--- a/cli/tests/testdata/npm/registry/@denotest/binary-package-windows/1.0.0/index.js
+++ b/tests/testdata/npm/registry/@denotest/binary-package-windows/1.0.0/index.js
diff --git a/cli/tests/testdata/npm/registry/@denotest/binary-package-windows/1.0.0/package.json b/tests/testdata/npm/registry/@denotest/binary-package-windows/1.0.0/package.json
index 1c0af637d..1c0af637d 100644
--- a/cli/tests/testdata/npm/registry/@denotest/binary-package-windows/1.0.0/package.json
+++ b/tests/testdata/npm/registry/@denotest/binary-package-windows/1.0.0/package.json
diff --git a/cli/tests/testdata/npm/registry/@denotest/binary-package/1.0.0/index.js b/tests/testdata/npm/registry/@denotest/binary-package/1.0.0/index.js
index 5870118e7..5870118e7 100644
--- a/cli/tests/testdata/npm/registry/@denotest/binary-package/1.0.0/index.js
+++ b/tests/testdata/npm/registry/@denotest/binary-package/1.0.0/index.js
diff --git a/cli/tests/testdata/npm/registry/@denotest/binary-package/1.0.0/package.json b/tests/testdata/npm/registry/@denotest/binary-package/1.0.0/package.json
index dc8859bb4..dc8859bb4 100644
--- a/cli/tests/testdata/npm/registry/@denotest/binary-package/1.0.0/package.json
+++ b/tests/testdata/npm/registry/@denotest/binary-package/1.0.0/package.json
diff --git a/cli/tests/testdata/npm/registry/@denotest/breaking-change-between-versions/1.0.0/index.d.ts b/tests/testdata/npm/registry/@denotest/breaking-change-between-versions/1.0.0/index.d.ts
index 06dfef10d..06dfef10d 100644
--- a/cli/tests/testdata/npm/registry/@denotest/breaking-change-between-versions/1.0.0/index.d.ts
+++ b/tests/testdata/npm/registry/@denotest/breaking-change-between-versions/1.0.0/index.d.ts
diff --git a/cli/tests/testdata/npm/registry/@denotest/breaking-change-between-versions/1.0.0/index.js b/tests/testdata/npm/registry/@denotest/breaking-change-between-versions/1.0.0/index.js
index 1aca4250b..1aca4250b 100644
--- a/cli/tests/testdata/npm/registry/@denotest/breaking-change-between-versions/1.0.0/index.js
+++ b/tests/testdata/npm/registry/@denotest/breaking-change-between-versions/1.0.0/index.js
diff --git a/cli/tests/testdata/npm/registry/@denotest/breaking-change-between-versions/1.0.0/package.json b/tests/testdata/npm/registry/@denotest/breaking-change-between-versions/1.0.0/package.json
index 6eabea3af..6eabea3af 100644
--- a/cli/tests/testdata/npm/registry/@denotest/breaking-change-between-versions/1.0.0/package.json
+++ b/tests/testdata/npm/registry/@denotest/breaking-change-between-versions/1.0.0/package.json
diff --git a/cli/tests/testdata/npm/registry/@denotest/breaking-change-between-versions/2.0.0/index.d.ts b/tests/testdata/npm/registry/@denotest/breaking-change-between-versions/2.0.0/index.d.ts
index 9a96451a5..9a96451a5 100644
--- a/cli/tests/testdata/npm/registry/@denotest/breaking-change-between-versions/2.0.0/index.d.ts
+++ b/tests/testdata/npm/registry/@denotest/breaking-change-between-versions/2.0.0/index.d.ts
diff --git a/cli/tests/testdata/npm/registry/@denotest/breaking-change-between-versions/2.0.0/index.js b/tests/testdata/npm/registry/@denotest/breaking-change-between-versions/2.0.0/index.js
index 57626060d..57626060d 100644
--- a/cli/tests/testdata/npm/registry/@denotest/breaking-change-between-versions/2.0.0/index.js
+++ b/tests/testdata/npm/registry/@denotest/breaking-change-between-versions/2.0.0/index.js
diff --git a/cli/tests/testdata/npm/registry/@denotest/breaking-change-between-versions/2.0.0/package.json b/tests/testdata/npm/registry/@denotest/breaking-change-between-versions/2.0.0/package.json
index ecd5970a4..ecd5970a4 100644
--- a/cli/tests/testdata/npm/registry/@denotest/breaking-change-between-versions/2.0.0/package.json
+++ b/tests/testdata/npm/registry/@denotest/breaking-change-between-versions/2.0.0/package.json
diff --git a/cli/tests/testdata/npm/registry/@denotest/builtin-module-module/1.0.0/index.js b/tests/testdata/npm/registry/@denotest/builtin-module-module/1.0.0/index.js
index 140f5ef21..140f5ef21 100644
--- a/cli/tests/testdata/npm/registry/@denotest/builtin-module-module/1.0.0/index.js
+++ b/tests/testdata/npm/registry/@denotest/builtin-module-module/1.0.0/index.js
diff --git a/cli/tests/testdata/npm/registry/@denotest/builtin-module-module/1.0.0/package.json b/tests/testdata/npm/registry/@denotest/builtin-module-module/1.0.0/package.json
index 5167f18a3..5167f18a3 100644
--- a/cli/tests/testdata/npm/registry/@denotest/builtin-module-module/1.0.0/package.json
+++ b/tests/testdata/npm/registry/@denotest/builtin-module-module/1.0.0/package.json
diff --git a/cli/tests/testdata/npm/registry/@denotest/check-error/1.0.0/index.d.ts b/tests/testdata/npm/registry/@denotest/check-error/1.0.0/index.d.ts
index bfb0483c2..bfb0483c2 100644
--- a/cli/tests/testdata/npm/registry/@denotest/check-error/1.0.0/index.d.ts
+++ b/tests/testdata/npm/registry/@denotest/check-error/1.0.0/index.d.ts
diff --git a/cli/tests/testdata/npm/registry/@denotest/check-error/1.0.0/index.js b/tests/testdata/npm/registry/@denotest/check-error/1.0.0/index.js
index 7eb6b784d..7eb6b784d 100644
--- a/cli/tests/testdata/npm/registry/@denotest/check-error/1.0.0/index.js
+++ b/tests/testdata/npm/registry/@denotest/check-error/1.0.0/index.js
diff --git a/cli/tests/testdata/npm/registry/@denotest/check-error/1.0.0/other_dir.d.ts b/tests/testdata/npm/registry/@denotest/check-error/1.0.0/other_dir.d.ts
index e7254c16c..e7254c16c 100644
--- a/cli/tests/testdata/npm/registry/@denotest/check-error/1.0.0/other_dir.d.ts
+++ b/tests/testdata/npm/registry/@denotest/check-error/1.0.0/other_dir.d.ts
diff --git a/cli/tests/testdata/npm/registry/@denotest/check-error/1.0.0/other_dir/index.js b/tests/testdata/npm/registry/@denotest/check-error/1.0.0/other_dir/index.js
index 56259f22d..56259f22d 100644
--- a/cli/tests/testdata/npm/registry/@denotest/check-error/1.0.0/other_dir/index.js
+++ b/tests/testdata/npm/registry/@denotest/check-error/1.0.0/other_dir/index.js
diff --git a/cli/tests/testdata/npm/registry/@denotest/check-error/1.0.0/package.json b/tests/testdata/npm/registry/@denotest/check-error/1.0.0/package.json
index 295920a8f..295920a8f 100644
--- a/cli/tests/testdata/npm/registry/@denotest/check-error/1.0.0/package.json
+++ b/tests/testdata/npm/registry/@denotest/check-error/1.0.0/package.json
diff --git a/cli/tests/testdata/npm/registry/@denotest/check-error/1.0.0/sub_dir/index.d.ts b/tests/testdata/npm/registry/@denotest/check-error/1.0.0/sub_dir/index.d.ts
index f41a696fd..f41a696fd 100644
--- a/cli/tests/testdata/npm/registry/@denotest/check-error/1.0.0/sub_dir/index.d.ts
+++ b/tests/testdata/npm/registry/@denotest/check-error/1.0.0/sub_dir/index.d.ts
diff --git a/cli/tests/testdata/npm/registry/@denotest/check-error/1.0.0/sub_dir/index.js b/tests/testdata/npm/registry/@denotest/check-error/1.0.0/sub_dir/index.js
index 3dfac4c23..3dfac4c23 100644
--- a/cli/tests/testdata/npm/registry/@denotest/check-error/1.0.0/sub_dir/index.js
+++ b/tests/testdata/npm/registry/@denotest/check-error/1.0.0/sub_dir/index.js
diff --git a/cli/tests/testdata/npm/registry/@denotest/check-error/1.0.0/sub_dir/lib.d.ts b/tests/testdata/npm/registry/@denotest/check-error/1.0.0/sub_dir/lib.d.ts
index e5834b52b..e5834b52b 100644
--- a/cli/tests/testdata/npm/registry/@denotest/check-error/1.0.0/sub_dir/lib.d.ts
+++ b/tests/testdata/npm/registry/@denotest/check-error/1.0.0/sub_dir/lib.d.ts
diff --git a/cli/tests/testdata/npm/registry/@denotest/child-process-fork/1.0.0/forked_path.js b/tests/testdata/npm/registry/@denotest/child-process-fork/1.0.0/forked_path.js
index aaa106315..aaa106315 100644
--- a/cli/tests/testdata/npm/registry/@denotest/child-process-fork/1.0.0/forked_path.js
+++ b/tests/testdata/npm/registry/@denotest/child-process-fork/1.0.0/forked_path.js
diff --git a/cli/tests/testdata/npm/registry/@denotest/child-process-fork/1.0.0/index.js b/tests/testdata/npm/registry/@denotest/child-process-fork/1.0.0/index.js
index 0482be404..0482be404 100644
--- a/cli/tests/testdata/npm/registry/@denotest/child-process-fork/1.0.0/index.js
+++ b/tests/testdata/npm/registry/@denotest/child-process-fork/1.0.0/index.js
diff --git a/cli/tests/testdata/npm/registry/@denotest/child-process-fork/1.0.0/package.json b/tests/testdata/npm/registry/@denotest/child-process-fork/1.0.0/package.json
index 9ab14e3f7..9ab14e3f7 100644
--- a/cli/tests/testdata/npm/registry/@denotest/child-process-fork/1.0.0/package.json
+++ b/tests/testdata/npm/registry/@denotest/child-process-fork/1.0.0/package.json
diff --git a/cli/tests/testdata/npm/registry/@denotest/cjs-default-export/1.0.0/index.d.ts b/tests/testdata/npm/registry/@denotest/cjs-default-export/1.0.0/index.d.ts
index 90fdfe5f6..90fdfe5f6 100644
--- a/cli/tests/testdata/npm/registry/@denotest/cjs-default-export/1.0.0/index.d.ts
+++ b/tests/testdata/npm/registry/@denotest/cjs-default-export/1.0.0/index.d.ts
diff --git a/cli/tests/testdata/npm/registry/@denotest/cjs-default-export/1.0.0/index.js b/tests/testdata/npm/registry/@denotest/cjs-default-export/1.0.0/index.js
index ec4ece6b3..ec4ece6b3 100644
--- a/cli/tests/testdata/npm/registry/@denotest/cjs-default-export/1.0.0/index.js
+++ b/tests/testdata/npm/registry/@denotest/cjs-default-export/1.0.0/index.js
diff --git a/cli/tests/testdata/npm/registry/@denotest/cjs-default-export/1.0.0/package.json b/tests/testdata/npm/registry/@denotest/cjs-default-export/1.0.0/package.json
index 8da28b919..8da28b919 100644
--- a/cli/tests/testdata/npm/registry/@denotest/cjs-default-export/1.0.0/package.json
+++ b/tests/testdata/npm/registry/@denotest/cjs-default-export/1.0.0/package.json
diff --git a/cli/tests/testdata/npm/registry/@denotest/cjs-invalid-name-exports/1.0.0/index.js b/tests/testdata/npm/registry/@denotest/cjs-invalid-name-exports/1.0.0/index.js
index 75c3f2e8a..75c3f2e8a 100644
--- a/cli/tests/testdata/npm/registry/@denotest/cjs-invalid-name-exports/1.0.0/index.js
+++ b/tests/testdata/npm/registry/@denotest/cjs-invalid-name-exports/1.0.0/index.js
diff --git a/cli/tests/testdata/npm/registry/@denotest/cjs-invalid-name-exports/1.0.0/package.json b/tests/testdata/npm/registry/@denotest/cjs-invalid-name-exports/1.0.0/package.json
index fd715eeae..fd715eeae 100644
--- a/cli/tests/testdata/npm/registry/@denotest/cjs-invalid-name-exports/1.0.0/package.json
+++ b/tests/testdata/npm/registry/@denotest/cjs-invalid-name-exports/1.0.0/package.json
diff --git a/cli/tests/testdata/npm/registry/@denotest/cjs-local-global-decls/1.0.0/index.js b/tests/testdata/npm/registry/@denotest/cjs-local-global-decls/1.0.0/index.js
index 5aa546d91..5aa546d91 100644
--- a/cli/tests/testdata/npm/registry/@denotest/cjs-local-global-decls/1.0.0/index.js
+++ b/tests/testdata/npm/registry/@denotest/cjs-local-global-decls/1.0.0/index.js
diff --git a/cli/tests/testdata/npm/registry/@denotest/cjs-local-global-decls/1.0.0/other.js b/tests/testdata/npm/registry/@denotest/cjs-local-global-decls/1.0.0/other.js
index 810d852b0..810d852b0 100644
--- a/cli/tests/testdata/npm/registry/@denotest/cjs-local-global-decls/1.0.0/other.js
+++ b/tests/testdata/npm/registry/@denotest/cjs-local-global-decls/1.0.0/other.js
diff --git a/cli/tests/testdata/npm/registry/@denotest/cjs-local-global-decls/1.0.0/package.json b/tests/testdata/npm/registry/@denotest/cjs-local-global-decls/1.0.0/package.json
index 1048fe76d..1048fe76d 100644
--- a/cli/tests/testdata/npm/registry/@denotest/cjs-local-global-decls/1.0.0/package.json
+++ b/tests/testdata/npm/registry/@denotest/cjs-local-global-decls/1.0.0/package.json
diff --git a/cli/tests/testdata/npm/registry/@denotest/cjs-module-export-assignment-number/1.0.0/index.d.ts b/tests/testdata/npm/registry/@denotest/cjs-module-export-assignment-number/1.0.0/index.d.ts
index 0e1e0337d..0e1e0337d 100644
--- a/cli/tests/testdata/npm/registry/@denotest/cjs-module-export-assignment-number/1.0.0/index.d.ts
+++ b/tests/testdata/npm/registry/@denotest/cjs-module-export-assignment-number/1.0.0/index.d.ts
diff --git a/cli/tests/testdata/npm/registry/@denotest/cjs-module-export-assignment-number/1.0.0/index.js b/tests/testdata/npm/registry/@denotest/cjs-module-export-assignment-number/1.0.0/index.js
index f4e8d9d29..f4e8d9d29 100644
--- a/cli/tests/testdata/npm/registry/@denotest/cjs-module-export-assignment-number/1.0.0/index.js
+++ b/tests/testdata/npm/registry/@denotest/cjs-module-export-assignment-number/1.0.0/index.js
diff --git a/cli/tests/testdata/npm/registry/@denotest/cjs-module-export-assignment-number/1.0.0/package.json b/tests/testdata/npm/registry/@denotest/cjs-module-export-assignment-number/1.0.0/package.json
index 4b2e3a294..4b2e3a294 100644
--- a/cli/tests/testdata/npm/registry/@denotest/cjs-module-export-assignment-number/1.0.0/package.json
+++ b/tests/testdata/npm/registry/@denotest/cjs-module-export-assignment-number/1.0.0/package.json
diff --git a/cli/tests/testdata/npm/registry/@denotest/cjs-module-export-assignment/1.0.0/index.d.ts b/tests/testdata/npm/registry/@denotest/cjs-module-export-assignment/1.0.0/index.d.ts
index a7b50005e..a7b50005e 100644
--- a/cli/tests/testdata/npm/registry/@denotest/cjs-module-export-assignment/1.0.0/index.d.ts
+++ b/tests/testdata/npm/registry/@denotest/cjs-module-export-assignment/1.0.0/index.d.ts
diff --git a/cli/tests/testdata/npm/registry/@denotest/cjs-module-export-assignment/1.0.0/index.js b/tests/testdata/npm/registry/@denotest/cjs-module-export-assignment/1.0.0/index.js
index 4c0285825..4c0285825 100644
--- a/cli/tests/testdata/npm/registry/@denotest/cjs-module-export-assignment/1.0.0/index.js
+++ b/tests/testdata/npm/registry/@denotest/cjs-module-export-assignment/1.0.0/index.js
diff --git a/cli/tests/testdata/npm/registry/@denotest/cjs-module-export-assignment/1.0.0/package.json b/tests/testdata/npm/registry/@denotest/cjs-module-export-assignment/1.0.0/package.json
index b8d3bbd2b..b8d3bbd2b 100644
--- a/cli/tests/testdata/npm/registry/@denotest/cjs-module-export-assignment/1.0.0/package.json
+++ b/tests/testdata/npm/registry/@denotest/cjs-module-export-assignment/1.0.0/package.json
diff --git a/cli/tests/testdata/npm/registry/@denotest/cjs-reexport-collision/1.0.0/index.js b/tests/testdata/npm/registry/@denotest/cjs-reexport-collision/1.0.0/index.js
index 0c20973d9..0c20973d9 100644
--- a/cli/tests/testdata/npm/registry/@denotest/cjs-reexport-collision/1.0.0/index.js
+++ b/tests/testdata/npm/registry/@denotest/cjs-reexport-collision/1.0.0/index.js
diff --git a/cli/tests/testdata/npm/registry/@denotest/cjs-reexport-collision/1.0.0/other_file.js b/tests/testdata/npm/registry/@denotest/cjs-reexport-collision/1.0.0/other_file.js
index 3d8f7e812..3d8f7e812 100644
--- a/cli/tests/testdata/npm/registry/@denotest/cjs-reexport-collision/1.0.0/other_file.js
+++ b/tests/testdata/npm/registry/@denotest/cjs-reexport-collision/1.0.0/other_file.js
diff --git a/cli/tests/testdata/npm/registry/@denotest/cjs-reexport-collision/1.0.0/package.json b/tests/testdata/npm/registry/@denotest/cjs-reexport-collision/1.0.0/package.json
index 7befb31aa..7befb31aa 100644
--- a/cli/tests/testdata/npm/registry/@denotest/cjs-reexport-collision/1.0.0/package.json
+++ b/tests/testdata/npm/registry/@denotest/cjs-reexport-collision/1.0.0/package.json
diff --git a/cli/tests/testdata/npm/registry/@denotest/cjs-require-esm-error/1.0.0/esm/my_es_module.js b/tests/testdata/npm/registry/@denotest/cjs-require-esm-error/1.0.0/esm/my_es_module.js
index 0613f1911..0613f1911 100644
--- a/cli/tests/testdata/npm/registry/@denotest/cjs-require-esm-error/1.0.0/esm/my_es_module.js
+++ b/tests/testdata/npm/registry/@denotest/cjs-require-esm-error/1.0.0/esm/my_es_module.js
diff --git a/cli/tests/testdata/npm/registry/@denotest/cjs-require-esm-error/1.0.0/esm/package.json b/tests/testdata/npm/registry/@denotest/cjs-require-esm-error/1.0.0/esm/package.json
index 3dbc1ca59..3dbc1ca59 100644
--- a/cli/tests/testdata/npm/registry/@denotest/cjs-require-esm-error/1.0.0/esm/package.json
+++ b/tests/testdata/npm/registry/@denotest/cjs-require-esm-error/1.0.0/esm/package.json
diff --git a/cli/tests/testdata/npm/registry/@denotest/cjs-require-esm-error/1.0.0/esm_mjs.mjs b/tests/testdata/npm/registry/@denotest/cjs-require-esm-error/1.0.0/esm_mjs.mjs
index 0613f1911..0613f1911 100644
--- a/cli/tests/testdata/npm/registry/@denotest/cjs-require-esm-error/1.0.0/esm_mjs.mjs
+++ b/tests/testdata/npm/registry/@denotest/cjs-require-esm-error/1.0.0/esm_mjs.mjs
diff --git a/cli/tests/testdata/npm/registry/@denotest/cjs-require-esm-error/1.0.0/index.js b/tests/testdata/npm/registry/@denotest/cjs-require-esm-error/1.0.0/index.js
index ba630f93b..ba630f93b 100644
--- a/cli/tests/testdata/npm/registry/@denotest/cjs-require-esm-error/1.0.0/index.js
+++ b/tests/testdata/npm/registry/@denotest/cjs-require-esm-error/1.0.0/index.js
diff --git a/cli/tests/testdata/npm/registry/@denotest/cjs-require-esm-error/1.0.0/package.json b/tests/testdata/npm/registry/@denotest/cjs-require-esm-error/1.0.0/package.json
index 08cd025f1..08cd025f1 100644
--- a/cli/tests/testdata/npm/registry/@denotest/cjs-require-esm-error/1.0.0/package.json
+++ b/tests/testdata/npm/registry/@denotest/cjs-require-esm-error/1.0.0/package.json
diff --git a/cli/tests/testdata/npm/registry/@denotest/cjs-require-esm-error/1.0.0/require_mjs.js b/tests/testdata/npm/registry/@denotest/cjs-require-esm-error/1.0.0/require_mjs.js
index ba58e1a80..ba58e1a80 100644
--- a/cli/tests/testdata/npm/registry/@denotest/cjs-require-esm-error/1.0.0/require_mjs.js
+++ b/tests/testdata/npm/registry/@denotest/cjs-require-esm-error/1.0.0/require_mjs.js
diff --git a/cli/tests/testdata/npm/registry/@denotest/cjs-this-in-exports/1.0.0/index.js b/tests/testdata/npm/registry/@denotest/cjs-this-in-exports/1.0.0/index.js
index 21a9d7d7e..21a9d7d7e 100644
--- a/cli/tests/testdata/npm/registry/@denotest/cjs-this-in-exports/1.0.0/index.js
+++ b/tests/testdata/npm/registry/@denotest/cjs-this-in-exports/1.0.0/index.js
diff --git a/cli/tests/testdata/npm/registry/@denotest/cjs-this-in-exports/1.0.0/package.json b/tests/testdata/npm/registry/@denotest/cjs-this-in-exports/1.0.0/package.json
index 729b8c34e..729b8c34e 100644
--- a/cli/tests/testdata/npm/registry/@denotest/cjs-this-in-exports/1.0.0/package.json
+++ b/tests/testdata/npm/registry/@denotest/cjs-this-in-exports/1.0.0/package.json
diff --git a/cli/tests/testdata/npm/registry/@denotest/cjs-with-file-stem/1.0.0/index.js b/tests/testdata/npm/registry/@denotest/cjs-with-file-stem/1.0.0/index.js
index f7164182a..f7164182a 100644
--- a/cli/tests/testdata/npm/registry/@denotest/cjs-with-file-stem/1.0.0/index.js
+++ b/tests/testdata/npm/registry/@denotest/cjs-with-file-stem/1.0.0/index.js
diff --git a/cli/tests/testdata/npm/registry/@denotest/cjs-with-file-stem/1.0.0/other.service.js b/tests/testdata/npm/registry/@denotest/cjs-with-file-stem/1.0.0/other.service.js
index ba702a9af..ba702a9af 100644
--- a/cli/tests/testdata/npm/registry/@denotest/cjs-with-file-stem/1.0.0/other.service.js
+++ b/tests/testdata/npm/registry/@denotest/cjs-with-file-stem/1.0.0/other.service.js
diff --git a/cli/tests/testdata/npm/registry/@denotest/cjs-with-file-stem/1.0.0/package.json b/tests/testdata/npm/registry/@denotest/cjs-with-file-stem/1.0.0/package.json
index c72a8ae5a..c72a8ae5a 100644
--- a/cli/tests/testdata/npm/registry/@denotest/cjs-with-file-stem/1.0.0/package.json
+++ b/tests/testdata/npm/registry/@denotest/cjs-with-file-stem/1.0.0/package.json
diff --git a/cli/tests/testdata/npm/registry/@denotest/cjs-with-file-stem/1.0.0/tslib.js b/tests/testdata/npm/registry/@denotest/cjs-with-file-stem/1.0.0/tslib.js
index e5c2d6bc0..e5c2d6bc0 100644
--- a/cli/tests/testdata/npm/registry/@denotest/cjs-with-file-stem/1.0.0/tslib.js
+++ b/tests/testdata/npm/registry/@denotest/cjs-with-file-stem/1.0.0/tslib.js
diff --git a/cli/tests/testdata/npm/registry/@denotest/conditional-exports-strict/1.0.0/cjs/index.cjs b/tests/testdata/npm/registry/@denotest/conditional-exports-strict/1.0.0/cjs/index.cjs
index 16895e48c..16895e48c 100644
--- a/cli/tests/testdata/npm/registry/@denotest/conditional-exports-strict/1.0.0/cjs/index.cjs
+++ b/tests/testdata/npm/registry/@denotest/conditional-exports-strict/1.0.0/cjs/index.cjs
diff --git a/cli/tests/testdata/npm/registry/@denotest/conditional-exports-strict/1.0.0/esm/client/bar.js b/tests/testdata/npm/registry/@denotest/conditional-exports-strict/1.0.0/esm/client/bar.js
index 1474f5d29..1474f5d29 100644
--- a/cli/tests/testdata/npm/registry/@denotest/conditional-exports-strict/1.0.0/esm/client/bar.js
+++ b/tests/testdata/npm/registry/@denotest/conditional-exports-strict/1.0.0/esm/client/bar.js
diff --git a/cli/tests/testdata/npm/registry/@denotest/conditional-exports-strict/1.0.0/esm/client/foo.js b/tests/testdata/npm/registry/@denotest/conditional-exports-strict/1.0.0/esm/client/foo.js
index bb5284b15..bb5284b15 100644
--- a/cli/tests/testdata/npm/registry/@denotest/conditional-exports-strict/1.0.0/esm/client/foo.js
+++ b/tests/testdata/npm/registry/@denotest/conditional-exports-strict/1.0.0/esm/client/foo.js
diff --git a/cli/tests/testdata/npm/registry/@denotest/conditional-exports-strict/1.0.0/esm/client/index.js b/tests/testdata/npm/registry/@denotest/conditional-exports-strict/1.0.0/esm/client/index.js
index dc1ec197d..dc1ec197d 100644
--- a/cli/tests/testdata/npm/registry/@denotest/conditional-exports-strict/1.0.0/esm/client/index.js
+++ b/tests/testdata/npm/registry/@denotest/conditional-exports-strict/1.0.0/esm/client/index.js
diff --git a/cli/tests/testdata/npm/registry/@denotest/conditional-exports-strict/1.0.0/esm/client/m.js b/tests/testdata/npm/registry/@denotest/conditional-exports-strict/1.0.0/esm/client/m.js
index fec6807ac..fec6807ac 100644
--- a/cli/tests/testdata/npm/registry/@denotest/conditional-exports-strict/1.0.0/esm/client/m.js
+++ b/tests/testdata/npm/registry/@denotest/conditional-exports-strict/1.0.0/esm/client/m.js
diff --git a/cli/tests/testdata/npm/registry/@denotest/conditional-exports-strict/1.0.0/esm/index.js b/tests/testdata/npm/registry/@denotest/conditional-exports-strict/1.0.0/esm/index.js
index 38dae7d93..38dae7d93 100644
--- a/cli/tests/testdata/npm/registry/@denotest/conditional-exports-strict/1.0.0/esm/index.js
+++ b/tests/testdata/npm/registry/@denotest/conditional-exports-strict/1.0.0/esm/index.js
diff --git a/cli/tests/testdata/npm/registry/@denotest/conditional-exports-strict/1.0.0/foo.js b/tests/testdata/npm/registry/@denotest/conditional-exports-strict/1.0.0/foo.js
index 6060c8a67..6060c8a67 100644
--- a/cli/tests/testdata/npm/registry/@denotest/conditional-exports-strict/1.0.0/foo.js
+++ b/tests/testdata/npm/registry/@denotest/conditional-exports-strict/1.0.0/foo.js
diff --git a/cli/tests/testdata/npm/registry/@denotest/conditional-exports-strict/1.0.0/package.json b/tests/testdata/npm/registry/@denotest/conditional-exports-strict/1.0.0/package.json
index 3576e48f8..3576e48f8 100644
--- a/cli/tests/testdata/npm/registry/@denotest/conditional-exports-strict/1.0.0/package.json
+++ b/tests/testdata/npm/registry/@denotest/conditional-exports-strict/1.0.0/package.json
diff --git a/cli/tests/testdata/npm/registry/@denotest/conditional-exports/1.0.0/cjs/index.cjs b/tests/testdata/npm/registry/@denotest/conditional-exports/1.0.0/cjs/index.cjs
index 16895e48c..16895e48c 100644
--- a/cli/tests/testdata/npm/registry/@denotest/conditional-exports/1.0.0/cjs/index.cjs
+++ b/tests/testdata/npm/registry/@denotest/conditional-exports/1.0.0/cjs/index.cjs
diff --git a/cli/tests/testdata/npm/registry/@denotest/conditional-exports/1.0.0/esm/client/bar.js b/tests/testdata/npm/registry/@denotest/conditional-exports/1.0.0/esm/client/bar.js
index 1474f5d29..1474f5d29 100644
--- a/cli/tests/testdata/npm/registry/@denotest/conditional-exports/1.0.0/esm/client/bar.js
+++ b/tests/testdata/npm/registry/@denotest/conditional-exports/1.0.0/esm/client/bar.js
diff --git a/cli/tests/testdata/npm/registry/@denotest/conditional-exports/1.0.0/esm/client/foo.js b/tests/testdata/npm/registry/@denotest/conditional-exports/1.0.0/esm/client/foo.js
index bb5284b15..bb5284b15 100644
--- a/cli/tests/testdata/npm/registry/@denotest/conditional-exports/1.0.0/esm/client/foo.js
+++ b/tests/testdata/npm/registry/@denotest/conditional-exports/1.0.0/esm/client/foo.js
diff --git a/cli/tests/testdata/npm/registry/@denotest/conditional-exports/1.0.0/esm/client/index.js b/tests/testdata/npm/registry/@denotest/conditional-exports/1.0.0/esm/client/index.js
index dc1ec197d..dc1ec197d 100644
--- a/cli/tests/testdata/npm/registry/@denotest/conditional-exports/1.0.0/esm/client/index.js
+++ b/tests/testdata/npm/registry/@denotest/conditional-exports/1.0.0/esm/client/index.js
diff --git a/cli/tests/testdata/npm/registry/@denotest/conditional-exports/1.0.0/esm/client/m.js b/tests/testdata/npm/registry/@denotest/conditional-exports/1.0.0/esm/client/m.js
index fec6807ac..fec6807ac 100644
--- a/cli/tests/testdata/npm/registry/@denotest/conditional-exports/1.0.0/esm/client/m.js
+++ b/tests/testdata/npm/registry/@denotest/conditional-exports/1.0.0/esm/client/m.js
diff --git a/cli/tests/testdata/npm/registry/@denotest/conditional-exports/1.0.0/esm/index.js b/tests/testdata/npm/registry/@denotest/conditional-exports/1.0.0/esm/index.js
index 38dae7d93..38dae7d93 100644
--- a/cli/tests/testdata/npm/registry/@denotest/conditional-exports/1.0.0/esm/index.js
+++ b/tests/testdata/npm/registry/@denotest/conditional-exports/1.0.0/esm/index.js
diff --git a/cli/tests/testdata/npm/registry/@denotest/conditional-exports/1.0.0/foo.js b/tests/testdata/npm/registry/@denotest/conditional-exports/1.0.0/foo.js
index 6060c8a67..6060c8a67 100644
--- a/cli/tests/testdata/npm/registry/@denotest/conditional-exports/1.0.0/foo.js
+++ b/tests/testdata/npm/registry/@denotest/conditional-exports/1.0.0/foo.js
diff --git a/cli/tests/testdata/npm/registry/@denotest/conditional-exports/1.0.0/package.json b/tests/testdata/npm/registry/@denotest/conditional-exports/1.0.0/package.json
index 5a2536aa0..5a2536aa0 100644
--- a/cli/tests/testdata/npm/registry/@denotest/conditional-exports/1.0.0/package.json
+++ b/tests/testdata/npm/registry/@denotest/conditional-exports/1.0.0/package.json
diff --git a/cli/tests/testdata/npm/registry/@denotest/create-require/1.0.0/index.js b/tests/testdata/npm/registry/@denotest/create-require/1.0.0/index.js
index 2ab564366..2ab564366 100644
--- a/cli/tests/testdata/npm/registry/@denotest/create-require/1.0.0/index.js
+++ b/tests/testdata/npm/registry/@denotest/create-require/1.0.0/index.js
diff --git a/cli/tests/testdata/npm/registry/@denotest/create-require/1.0.0/package.json b/tests/testdata/npm/registry/@denotest/create-require/1.0.0/package.json
index 00539643e..00539643e 100644
--- a/cli/tests/testdata/npm/registry/@denotest/create-require/1.0.0/package.json
+++ b/tests/testdata/npm/registry/@denotest/create-require/1.0.0/package.json
diff --git a/cli/tests/testdata/npm/registry/@denotest/d-ext/1.0.0/index.d.ts b/tests/testdata/npm/registry/@denotest/d-ext/1.0.0/index.d.ts
index 47326c0f6..47326c0f6 100644
--- a/cli/tests/testdata/npm/registry/@denotest/d-ext/1.0.0/index.d.ts
+++ b/tests/testdata/npm/registry/@denotest/d-ext/1.0.0/index.d.ts
diff --git a/cli/tests/testdata/npm/registry/@denotest/d-ext/1.0.0/index.js b/tests/testdata/npm/registry/@denotest/d-ext/1.0.0/index.js
index 62b353f3d..62b353f3d 100644
--- a/cli/tests/testdata/npm/registry/@denotest/d-ext/1.0.0/index.js
+++ b/tests/testdata/npm/registry/@denotest/d-ext/1.0.0/index.js
diff --git a/cli/tests/testdata/npm/registry/@denotest/d-ext/1.0.0/package.json b/tests/testdata/npm/registry/@denotest/d-ext/1.0.0/package.json
index a0702a56b..a0702a56b 100644
--- a/cli/tests/testdata/npm/registry/@denotest/d-ext/1.0.0/package.json
+++ b/tests/testdata/npm/registry/@denotest/d-ext/1.0.0/package.json
diff --git a/cli/tests/testdata/npm/registry/@denotest/d-ext/1.0.0/types.d.ts b/tests/testdata/npm/registry/@denotest/d-ext/1.0.0/types.d.ts
index dedc54b03..dedc54b03 100644
--- a/cli/tests/testdata/npm/registry/@denotest/d-ext/1.0.0/types.d.ts
+++ b/tests/testdata/npm/registry/@denotest/d-ext/1.0.0/types.d.ts
diff --git a/cli/tests/testdata/npm/registry/@denotest/different-nested-dep-child/1.0.0/index.js b/tests/testdata/npm/registry/@denotest/different-nested-dep-child/1.0.0/index.js
index aef22247d..aef22247d 100644
--- a/cli/tests/testdata/npm/registry/@denotest/different-nested-dep-child/1.0.0/index.js
+++ b/tests/testdata/npm/registry/@denotest/different-nested-dep-child/1.0.0/index.js
diff --git a/cli/tests/testdata/npm/registry/@denotest/different-nested-dep-child/1.0.0/package.json b/tests/testdata/npm/registry/@denotest/different-nested-dep-child/1.0.0/package.json
index ca58520a4..ca58520a4 100644
--- a/cli/tests/testdata/npm/registry/@denotest/different-nested-dep-child/1.0.0/package.json
+++ b/tests/testdata/npm/registry/@denotest/different-nested-dep-child/1.0.0/package.json
diff --git a/cli/tests/testdata/npm/registry/@denotest/different-nested-dep-child/2.0.0/index.js b/tests/testdata/npm/registry/@denotest/different-nested-dep-child/2.0.0/index.js
index 842e368a0..842e368a0 100644
--- a/cli/tests/testdata/npm/registry/@denotest/different-nested-dep-child/2.0.0/index.js
+++ b/tests/testdata/npm/registry/@denotest/different-nested-dep-child/2.0.0/index.js
diff --git a/cli/tests/testdata/npm/registry/@denotest/different-nested-dep-child/2.0.0/package.json b/tests/testdata/npm/registry/@denotest/different-nested-dep-child/2.0.0/package.json
index 9d2e56975..9d2e56975 100644
--- a/cli/tests/testdata/npm/registry/@denotest/different-nested-dep-child/2.0.0/package.json
+++ b/tests/testdata/npm/registry/@denotest/different-nested-dep-child/2.0.0/package.json
diff --git a/cli/tests/testdata/npm/registry/@denotest/different-nested-dep/1.0.0/index.js b/tests/testdata/npm/registry/@denotest/different-nested-dep/1.0.0/index.js
index dee5330b7..dee5330b7 100644
--- a/cli/tests/testdata/npm/registry/@denotest/different-nested-dep/1.0.0/index.js
+++ b/tests/testdata/npm/registry/@denotest/different-nested-dep/1.0.0/index.js
diff --git a/cli/tests/testdata/npm/registry/@denotest/different-nested-dep/1.0.0/package.json b/tests/testdata/npm/registry/@denotest/different-nested-dep/1.0.0/package.json
index 879a4e012..879a4e012 100644
--- a/cli/tests/testdata/npm/registry/@denotest/different-nested-dep/1.0.0/package.json
+++ b/tests/testdata/npm/registry/@denotest/different-nested-dep/1.0.0/package.json
diff --git a/cli/tests/testdata/npm/registry/@denotest/dual-cjs-esm-dep-missing/1.0.0/index.cjs b/tests/testdata/npm/registry/@denotest/dual-cjs-esm-dep-missing/1.0.0/index.cjs
index 6d9b2bfc6..6d9b2bfc6 100644
--- a/cli/tests/testdata/npm/registry/@denotest/dual-cjs-esm-dep-missing/1.0.0/index.cjs
+++ b/tests/testdata/npm/registry/@denotest/dual-cjs-esm-dep-missing/1.0.0/index.cjs
diff --git a/cli/tests/testdata/npm/registry/@denotest/dual-cjs-esm-dep-missing/1.0.0/index.d.ts b/tests/testdata/npm/registry/@denotest/dual-cjs-esm-dep-missing/1.0.0/index.d.ts
index 4628c2774..4628c2774 100644
--- a/cli/tests/testdata/npm/registry/@denotest/dual-cjs-esm-dep-missing/1.0.0/index.d.ts
+++ b/tests/testdata/npm/registry/@denotest/dual-cjs-esm-dep-missing/1.0.0/index.d.ts
diff --git a/cli/tests/testdata/npm/registry/@denotest/dual-cjs-esm-dep-missing/1.0.0/index.mjs b/tests/testdata/npm/registry/@denotest/dual-cjs-esm-dep-missing/1.0.0/index.mjs
index 6d9b2bfc6..6d9b2bfc6 100644
--- a/cli/tests/testdata/npm/registry/@denotest/dual-cjs-esm-dep-missing/1.0.0/index.mjs
+++ b/tests/testdata/npm/registry/@denotest/dual-cjs-esm-dep-missing/1.0.0/index.mjs
diff --git a/cli/tests/testdata/npm/registry/@denotest/dual-cjs-esm-dep-missing/1.0.0/package.json b/tests/testdata/npm/registry/@denotest/dual-cjs-esm-dep-missing/1.0.0/package.json
index d17fd887b..d17fd887b 100644
--- a/cli/tests/testdata/npm/registry/@denotest/dual-cjs-esm-dep-missing/1.0.0/package.json
+++ b/tests/testdata/npm/registry/@denotest/dual-cjs-esm-dep-missing/1.0.0/package.json
diff --git a/cli/tests/testdata/npm/registry/@denotest/dual-cjs-esm-dep/1.0.0/index.cjs b/tests/testdata/npm/registry/@denotest/dual-cjs-esm-dep/1.0.0/index.cjs
index 6d9b2bfc6..6d9b2bfc6 100644
--- a/cli/tests/testdata/npm/registry/@denotest/dual-cjs-esm-dep/1.0.0/index.cjs
+++ b/tests/testdata/npm/registry/@denotest/dual-cjs-esm-dep/1.0.0/index.cjs
diff --git a/cli/tests/testdata/npm/registry/@denotest/dual-cjs-esm-dep/1.0.0/index.d.ts b/tests/testdata/npm/registry/@denotest/dual-cjs-esm-dep/1.0.0/index.d.ts
index 4628c2774..4628c2774 100644
--- a/cli/tests/testdata/npm/registry/@denotest/dual-cjs-esm-dep/1.0.0/index.d.ts
+++ b/tests/testdata/npm/registry/@denotest/dual-cjs-esm-dep/1.0.0/index.d.ts
diff --git a/cli/tests/testdata/npm/registry/@denotest/dual-cjs-esm-dep/1.0.0/index.mjs b/tests/testdata/npm/registry/@denotest/dual-cjs-esm-dep/1.0.0/index.mjs
index 6d9b2bfc6..6d9b2bfc6 100644
--- a/cli/tests/testdata/npm/registry/@denotest/dual-cjs-esm-dep/1.0.0/index.mjs
+++ b/tests/testdata/npm/registry/@denotest/dual-cjs-esm-dep/1.0.0/index.mjs
diff --git a/cli/tests/testdata/npm/registry/@denotest/dual-cjs-esm-dep/1.0.0/package.json b/tests/testdata/npm/registry/@denotest/dual-cjs-esm-dep/1.0.0/package.json
index 80c69f87a..80c69f87a 100644
--- a/cli/tests/testdata/npm/registry/@denotest/dual-cjs-esm-dep/1.0.0/package.json
+++ b/tests/testdata/npm/registry/@denotest/dual-cjs-esm-dep/1.0.0/package.json
diff --git a/cli/tests/testdata/npm/registry/@denotest/dual-cjs-esm/1.0.0/cjs/main.cjs b/tests/testdata/npm/registry/@denotest/dual-cjs-esm/1.0.0/cjs/main.cjs
index 51d32ff89..51d32ff89 100644
--- a/cli/tests/testdata/npm/registry/@denotest/dual-cjs-esm/1.0.0/cjs/main.cjs
+++ b/tests/testdata/npm/registry/@denotest/dual-cjs-esm/1.0.0/cjs/main.cjs
diff --git a/cli/tests/testdata/npm/registry/@denotest/dual-cjs-esm/1.0.0/cjs/package.json b/tests/testdata/npm/registry/@denotest/dual-cjs-esm/1.0.0/cjs/package.json
index 73847e365..73847e365 100644
--- a/cli/tests/testdata/npm/registry/@denotest/dual-cjs-esm/1.0.0/cjs/package.json
+++ b/tests/testdata/npm/registry/@denotest/dual-cjs-esm/1.0.0/cjs/package.json
diff --git a/cli/tests/testdata/npm/registry/@denotest/dual-cjs-esm/1.0.0/main.cjs b/tests/testdata/npm/registry/@denotest/dual-cjs-esm/1.0.0/main.cjs
index 990605527..990605527 100644
--- a/cli/tests/testdata/npm/registry/@denotest/dual-cjs-esm/1.0.0/main.cjs
+++ b/tests/testdata/npm/registry/@denotest/dual-cjs-esm/1.0.0/main.cjs
diff --git a/cli/tests/testdata/npm/registry/@denotest/dual-cjs-esm/1.0.0/main.d.cts b/tests/testdata/npm/registry/@denotest/dual-cjs-esm/1.0.0/main.d.cts
index f969ba996..f969ba996 100644
--- a/cli/tests/testdata/npm/registry/@denotest/dual-cjs-esm/1.0.0/main.d.cts
+++ b/tests/testdata/npm/registry/@denotest/dual-cjs-esm/1.0.0/main.d.cts
diff --git a/cli/tests/testdata/npm/registry/@denotest/dual-cjs-esm/1.0.0/main.d.mts b/tests/testdata/npm/registry/@denotest/dual-cjs-esm/1.0.0/main.d.mts
index f969ba996..f969ba996 100644
--- a/cli/tests/testdata/npm/registry/@denotest/dual-cjs-esm/1.0.0/main.d.mts
+++ b/tests/testdata/npm/registry/@denotest/dual-cjs-esm/1.0.0/main.d.mts
diff --git a/cli/tests/testdata/npm/registry/@denotest/dual-cjs-esm/1.0.0/main.mjs b/tests/testdata/npm/registry/@denotest/dual-cjs-esm/1.0.0/main.mjs
index b48b9a3a6..b48b9a3a6 100644
--- a/cli/tests/testdata/npm/registry/@denotest/dual-cjs-esm/1.0.0/main.mjs
+++ b/tests/testdata/npm/registry/@denotest/dual-cjs-esm/1.0.0/main.mjs
diff --git a/cli/tests/testdata/npm/registry/@denotest/dual-cjs-esm/1.0.0/package.json b/tests/testdata/npm/registry/@denotest/dual-cjs-esm/1.0.0/package.json
index 18b72e97a..18b72e97a 100644
--- a/cli/tests/testdata/npm/registry/@denotest/dual-cjs-esm/1.0.0/package.json
+++ b/tests/testdata/npm/registry/@denotest/dual-cjs-esm/1.0.0/package.json
diff --git a/cli/tests/testdata/npm/registry/@denotest/dual-cjs-esm/1.0.0/subpath/main.cjs b/tests/testdata/npm/registry/@denotest/dual-cjs-esm/1.0.0/subpath/main.cjs
index 18a22e6f1..18a22e6f1 100644
--- a/cli/tests/testdata/npm/registry/@denotest/dual-cjs-esm/1.0.0/subpath/main.cjs
+++ b/tests/testdata/npm/registry/@denotest/dual-cjs-esm/1.0.0/subpath/main.cjs
diff --git a/cli/tests/testdata/npm/registry/@denotest/dual-cjs-esm/1.0.0/subpath/main.mjs b/tests/testdata/npm/registry/@denotest/dual-cjs-esm/1.0.0/subpath/main.mjs
index 47e8cd516..47e8cd516 100644
--- a/cli/tests/testdata/npm/registry/@denotest/dual-cjs-esm/1.0.0/subpath/main.mjs
+++ b/tests/testdata/npm/registry/@denotest/dual-cjs-esm/1.0.0/subpath/main.mjs
diff --git a/cli/tests/testdata/npm/registry/@denotest/dual-cjs-esm/1.0.0/subpath/package.json b/tests/testdata/npm/registry/@denotest/dual-cjs-esm/1.0.0/subpath/package.json
index 149ce36a3..149ce36a3 100644
--- a/cli/tests/testdata/npm/registry/@denotest/dual-cjs-esm/1.0.0/subpath/package.json
+++ b/tests/testdata/npm/registry/@denotest/dual-cjs-esm/1.0.0/subpath/package.json
diff --git a/cli/tests/testdata/npm/registry/@denotest/dynamic-import/1.0.0/index.js b/tests/testdata/npm/registry/@denotest/dynamic-import/1.0.0/index.js
index 4dc3831f9..4dc3831f9 100644
--- a/cli/tests/testdata/npm/registry/@denotest/dynamic-import/1.0.0/index.js
+++ b/tests/testdata/npm/registry/@denotest/dynamic-import/1.0.0/index.js
diff --git a/cli/tests/testdata/npm/registry/@denotest/dynamic-import/1.0.0/package.json b/tests/testdata/npm/registry/@denotest/dynamic-import/1.0.0/package.json
index fa970177c..fa970177c 100644
--- a/cli/tests/testdata/npm/registry/@denotest/dynamic-import/1.0.0/package.json
+++ b/tests/testdata/npm/registry/@denotest/dynamic-import/1.0.0/package.json
diff --git a/cli/tests/testdata/npm/registry/@denotest/env-var-re-export/1.0.0/dev.cjs b/tests/testdata/npm/registry/@denotest/env-var-re-export/1.0.0/dev.cjs
index cf7b90970..cf7b90970 100644
--- a/cli/tests/testdata/npm/registry/@denotest/env-var-re-export/1.0.0/dev.cjs
+++ b/tests/testdata/npm/registry/@denotest/env-var-re-export/1.0.0/dev.cjs
diff --git a/cli/tests/testdata/npm/registry/@denotest/env-var-re-export/1.0.0/index.cjs b/tests/testdata/npm/registry/@denotest/env-var-re-export/1.0.0/index.cjs
index 6258d7c05..6258d7c05 100644
--- a/cli/tests/testdata/npm/registry/@denotest/env-var-re-export/1.0.0/index.cjs
+++ b/tests/testdata/npm/registry/@denotest/env-var-re-export/1.0.0/index.cjs
diff --git a/cli/tests/testdata/npm/registry/@denotest/env-var-re-export/1.0.0/package.json b/tests/testdata/npm/registry/@denotest/env-var-re-export/1.0.0/package.json
index 84f87be0d..84f87be0d 100644
--- a/cli/tests/testdata/npm/registry/@denotest/env-var-re-export/1.0.0/package.json
+++ b/tests/testdata/npm/registry/@denotest/env-var-re-export/1.0.0/package.json
diff --git a/cli/tests/testdata/npm/registry/@denotest/env-var-re-export/1.0.0/prod.cjs b/tests/testdata/npm/registry/@denotest/env-var-re-export/1.0.0/prod.cjs
index a84c76543..a84c76543 100644
--- a/cli/tests/testdata/npm/registry/@denotest/env-var-re-export/1.0.0/prod.cjs
+++ b/tests/testdata/npm/registry/@denotest/env-var-re-export/1.0.0/prod.cjs
diff --git a/cli/tests/testdata/npm/registry/@denotest/esm-basic/1.0.0/main.d.mts b/tests/testdata/npm/registry/@denotest/esm-basic/1.0.0/main.d.mts
index 29da1e6d7..29da1e6d7 100644
--- a/cli/tests/testdata/npm/registry/@denotest/esm-basic/1.0.0/main.d.mts
+++ b/tests/testdata/npm/registry/@denotest/esm-basic/1.0.0/main.d.mts
diff --git a/cli/tests/testdata/npm/registry/@denotest/esm-basic/1.0.0/main.mjs b/tests/testdata/npm/registry/@denotest/esm-basic/1.0.0/main.mjs
index 0a44f7585..0a44f7585 100644
--- a/cli/tests/testdata/npm/registry/@denotest/esm-basic/1.0.0/main.mjs
+++ b/tests/testdata/npm/registry/@denotest/esm-basic/1.0.0/main.mjs
diff --git a/cli/tests/testdata/npm/registry/@denotest/esm-basic/1.0.0/other.mjs b/tests/testdata/npm/registry/@denotest/esm-basic/1.0.0/other.mjs
index 00ed99da4..00ed99da4 100644
--- a/cli/tests/testdata/npm/registry/@denotest/esm-basic/1.0.0/other.mjs
+++ b/tests/testdata/npm/registry/@denotest/esm-basic/1.0.0/other.mjs
diff --git a/cli/tests/testdata/npm/registry/@denotest/esm-basic/1.0.0/package.json b/tests/testdata/npm/registry/@denotest/esm-basic/1.0.0/package.json
index 757ac2db9..757ac2db9 100644
--- a/cli/tests/testdata/npm/registry/@denotest/esm-basic/1.0.0/package.json
+++ b/tests/testdata/npm/registry/@denotest/esm-basic/1.0.0/package.json
diff --git a/cli/tests/testdata/npm/registry/@denotest/esm-import-cjs-default/1.0.0/index.mjs b/tests/testdata/npm/registry/@denotest/esm-import-cjs-default/1.0.0/index.mjs
index 11e545ae5..11e545ae5 100644
--- a/cli/tests/testdata/npm/registry/@denotest/esm-import-cjs-default/1.0.0/index.mjs
+++ b/tests/testdata/npm/registry/@denotest/esm-import-cjs-default/1.0.0/index.mjs
diff --git a/cli/tests/testdata/npm/registry/@denotest/esm-import-cjs-default/1.0.0/local.cjs b/tests/testdata/npm/registry/@denotest/esm-import-cjs-default/1.0.0/local.cjs
index 8d2772dc6..8d2772dc6 100644
--- a/cli/tests/testdata/npm/registry/@denotest/esm-import-cjs-default/1.0.0/local.cjs
+++ b/tests/testdata/npm/registry/@denotest/esm-import-cjs-default/1.0.0/local.cjs
diff --git a/cli/tests/testdata/npm/registry/@denotest/esm-import-cjs-default/1.0.0/package.json b/tests/testdata/npm/registry/@denotest/esm-import-cjs-default/1.0.0/package.json
index f757a08fb..f757a08fb 100644
--- a/cli/tests/testdata/npm/registry/@denotest/esm-import-cjs-default/1.0.0/package.json
+++ b/tests/testdata/npm/registry/@denotest/esm-import-cjs-default/1.0.0/package.json
diff --git a/cli/tests/testdata/npm/registry/@denotest/file-dts-dmts-dcts/1.0.0/main.cjs b/tests/testdata/npm/registry/@denotest/file-dts-dmts-dcts/1.0.0/main.cjs
index e69de29bb..e69de29bb 100644
--- a/cli/tests/testdata/npm/registry/@denotest/file-dts-dmts-dcts/1.0.0/main.cjs
+++ b/tests/testdata/npm/registry/@denotest/file-dts-dmts-dcts/1.0.0/main.cjs
diff --git a/cli/tests/testdata/npm/registry/@denotest/file-dts-dmts-dcts/1.0.0/main.d.cts b/tests/testdata/npm/registry/@denotest/file-dts-dmts-dcts/1.0.0/main.d.cts
index 43a5ebe9b..43a5ebe9b 100644
--- a/cli/tests/testdata/npm/registry/@denotest/file-dts-dmts-dcts/1.0.0/main.d.cts
+++ b/tests/testdata/npm/registry/@denotest/file-dts-dmts-dcts/1.0.0/main.d.cts
diff --git a/cli/tests/testdata/npm/registry/@denotest/file-dts-dmts-dcts/1.0.0/main.d.mts b/tests/testdata/npm/registry/@denotest/file-dts-dmts-dcts/1.0.0/main.d.mts
index b762ebd4a..b762ebd4a 100644
--- a/cli/tests/testdata/npm/registry/@denotest/file-dts-dmts-dcts/1.0.0/main.d.mts
+++ b/tests/testdata/npm/registry/@denotest/file-dts-dmts-dcts/1.0.0/main.d.mts
diff --git a/cli/tests/testdata/npm/registry/@denotest/file-dts-dmts-dcts/1.0.0/main.d.ts b/tests/testdata/npm/registry/@denotest/file-dts-dmts-dcts/1.0.0/main.d.ts
index 1d1cd270b..1d1cd270b 100644
--- a/cli/tests/testdata/npm/registry/@denotest/file-dts-dmts-dcts/1.0.0/main.d.ts
+++ b/tests/testdata/npm/registry/@denotest/file-dts-dmts-dcts/1.0.0/main.d.ts
diff --git a/cli/tests/testdata/npm/registry/@denotest/file-dts-dmts-dcts/1.0.0/main.js b/tests/testdata/npm/registry/@denotest/file-dts-dmts-dcts/1.0.0/main.js
index e69de29bb..e69de29bb 100644
--- a/cli/tests/testdata/npm/registry/@denotest/file-dts-dmts-dcts/1.0.0/main.js
+++ b/tests/testdata/npm/registry/@denotest/file-dts-dmts-dcts/1.0.0/main.js
diff --git a/cli/tests/testdata/npm/registry/@denotest/file-dts-dmts-dcts/1.0.0/main.mjs b/tests/testdata/npm/registry/@denotest/file-dts-dmts-dcts/1.0.0/main.mjs
index e69de29bb..e69de29bb 100644
--- a/cli/tests/testdata/npm/registry/@denotest/file-dts-dmts-dcts/1.0.0/main.mjs
+++ b/tests/testdata/npm/registry/@denotest/file-dts-dmts-dcts/1.0.0/main.mjs
diff --git a/cli/tests/testdata/npm/registry/@denotest/file-dts-dmts-dcts/1.0.0/package.json b/tests/testdata/npm/registry/@denotest/file-dts-dmts-dcts/1.0.0/package.json
index 1884b65e4..1884b65e4 100644
--- a/cli/tests/testdata/npm/registry/@denotest/file-dts-dmts-dcts/1.0.0/package.json
+++ b/tests/testdata/npm/registry/@denotest/file-dts-dmts-dcts/1.0.0/package.json
diff --git a/cli/tests/testdata/npm/registry/@denotest/globals/1.0.0/index.d.ts b/tests/testdata/npm/registry/@denotest/globals/1.0.0/index.d.ts
index 1bbb82047..1bbb82047 100644
--- a/cli/tests/testdata/npm/registry/@denotest/globals/1.0.0/index.d.ts
+++ b/tests/testdata/npm/registry/@denotest/globals/1.0.0/index.d.ts
diff --git a/cli/tests/testdata/npm/registry/@denotest/globals/1.0.0/index.js b/tests/testdata/npm/registry/@denotest/globals/1.0.0/index.js
index b946bbd2a..b946bbd2a 100644
--- a/cli/tests/testdata/npm/registry/@denotest/globals/1.0.0/index.js
+++ b/tests/testdata/npm/registry/@denotest/globals/1.0.0/index.js
diff --git a/cli/tests/testdata/npm/registry/@denotest/globals/1.0.0/package.json b/tests/testdata/npm/registry/@denotest/globals/1.0.0/package.json
index 1ce42ded4..1ce42ded4 100644
--- a/cli/tests/testdata/npm/registry/@denotest/globals/1.0.0/package.json
+++ b/tests/testdata/npm/registry/@denotest/globals/1.0.0/package.json
diff --git a/cli/tests/testdata/npm/registry/@denotest/imports-package-json/1.0.0/hi.js b/tests/testdata/npm/registry/@denotest/imports-package-json/1.0.0/hi.js
index 407090812..407090812 100644
--- a/cli/tests/testdata/npm/registry/@denotest/imports-package-json/1.0.0/hi.js
+++ b/tests/testdata/npm/registry/@denotest/imports-package-json/1.0.0/hi.js
diff --git a/cli/tests/testdata/npm/registry/@denotest/imports-package-json/1.0.0/import_not_defined.js b/tests/testdata/npm/registry/@denotest/imports-package-json/1.0.0/import_not_defined.js
index 07864fd2c..07864fd2c 100644
--- a/cli/tests/testdata/npm/registry/@denotest/imports-package-json/1.0.0/import_not_defined.js
+++ b/tests/testdata/npm/registry/@denotest/imports-package-json/1.0.0/import_not_defined.js
diff --git a/cli/tests/testdata/npm/registry/@denotest/imports-package-json/1.0.0/main.js b/tests/testdata/npm/registry/@denotest/imports-package-json/1.0.0/main.js
index 9e7c247b7..9e7c247b7 100644
--- a/cli/tests/testdata/npm/registry/@denotest/imports-package-json/1.0.0/main.js
+++ b/tests/testdata/npm/registry/@denotest/imports-package-json/1.0.0/main.js
diff --git a/cli/tests/testdata/npm/registry/@denotest/imports-package-json/1.0.0/package.json b/tests/testdata/npm/registry/@denotest/imports-package-json/1.0.0/package.json
index 2c294e680..2c294e680 100644
--- a/cli/tests/testdata/npm/registry/@denotest/imports-package-json/1.0.0/package.json
+++ b/tests/testdata/npm/registry/@denotest/imports-package-json/1.0.0/package.json
diff --git a/cli/tests/testdata/npm/registry/@denotest/imports-package-json/1.0.0/sub_path/bye.js b/tests/testdata/npm/registry/@denotest/imports-package-json/1.0.0/sub_path/bye.js
index 6fc719e48..6fc719e48 100644
--- a/cli/tests/testdata/npm/registry/@denotest/imports-package-json/1.0.0/sub_path/bye.js
+++ b/tests/testdata/npm/registry/@denotest/imports-package-json/1.0.0/sub_path/bye.js
diff --git a/cli/tests/testdata/npm/registry/@denotest/imports-package-json/1.0.0/sub_path/import_not_defined.js b/tests/testdata/npm/registry/@denotest/imports-package-json/1.0.0/sub_path/import_not_defined.js
index ffaa2b1ad..ffaa2b1ad 100644
--- a/cli/tests/testdata/npm/registry/@denotest/imports-package-json/1.0.0/sub_path/import_not_defined.js
+++ b/tests/testdata/npm/registry/@denotest/imports-package-json/1.0.0/sub_path/import_not_defined.js
diff --git a/cli/tests/testdata/npm/registry/@denotest/imports-package-json/1.0.0/sub_path/main.js b/tests/testdata/npm/registry/@denotest/imports-package-json/1.0.0/sub_path/main.js
index 260ca79ae..260ca79ae 100644
--- a/cli/tests/testdata/npm/registry/@denotest/imports-package-json/1.0.0/sub_path/main.js
+++ b/tests/testdata/npm/registry/@denotest/imports-package-json/1.0.0/sub_path/main.js
diff --git a/cli/tests/testdata/npm/registry/@denotest/imports-package-json/1.0.0/sub_path/package.json b/tests/testdata/npm/registry/@denotest/imports-package-json/1.0.0/sub_path/package.json
index 3f2c2bbd8..3f2c2bbd8 100644
--- a/cli/tests/testdata/npm/registry/@denotest/imports-package-json/1.0.0/sub_path/package.json
+++ b/tests/testdata/npm/registry/@denotest/imports-package-json/1.0.0/sub_path/package.json
diff --git a/cli/tests/testdata/npm/registry/@denotest/no-types-cjs/1.0.0/main.js b/tests/testdata/npm/registry/@denotest/no-types-cjs/1.0.0/main.js
index bb6cbdb02..bb6cbdb02 100644
--- a/cli/tests/testdata/npm/registry/@denotest/no-types-cjs/1.0.0/main.js
+++ b/tests/testdata/npm/registry/@denotest/no-types-cjs/1.0.0/main.js
diff --git a/cli/tests/testdata/npm/registry/@denotest/no-types-cjs/1.0.0/package.json b/tests/testdata/npm/registry/@denotest/no-types-cjs/1.0.0/package.json
index 60b8a0285..60b8a0285 100644
--- a/cli/tests/testdata/npm/registry/@denotest/no-types-cjs/1.0.0/package.json
+++ b/tests/testdata/npm/registry/@denotest/no-types-cjs/1.0.0/package.json
diff --git a/cli/tests/testdata/npm/registry/@denotest/no-types-in-conditional-exports/1.0.0/lib/foo-esm.js b/tests/testdata/npm/registry/@denotest/no-types-in-conditional-exports/1.0.0/lib/foo-esm.js
index 0ead93520..0ead93520 100644
--- a/cli/tests/testdata/npm/registry/@denotest/no-types-in-conditional-exports/1.0.0/lib/foo-esm.js
+++ b/tests/testdata/npm/registry/@denotest/no-types-in-conditional-exports/1.0.0/lib/foo-esm.js
diff --git a/cli/tests/testdata/npm/registry/@denotest/no-types-in-conditional-exports/1.0.0/lib/foo.js b/tests/testdata/npm/registry/@denotest/no-types-in-conditional-exports/1.0.0/lib/foo.js
index dca03a472..dca03a472 100644
--- a/cli/tests/testdata/npm/registry/@denotest/no-types-in-conditional-exports/1.0.0/lib/foo.js
+++ b/tests/testdata/npm/registry/@denotest/no-types-in-conditional-exports/1.0.0/lib/foo.js
diff --git a/cli/tests/testdata/npm/registry/@denotest/no-types-in-conditional-exports/1.0.0/package.json b/tests/testdata/npm/registry/@denotest/no-types-in-conditional-exports/1.0.0/package.json
index 524394480..524394480 100644
--- a/cli/tests/testdata/npm/registry/@denotest/no-types-in-conditional-exports/1.0.0/package.json
+++ b/tests/testdata/npm/registry/@denotest/no-types-in-conditional-exports/1.0.0/package.json
diff --git a/cli/tests/testdata/npm/registry/@denotest/non-existent-dep-version/1.0.0/index.js b/tests/testdata/npm/registry/@denotest/non-existent-dep-version/1.0.0/index.js
index f4e8d9d29..f4e8d9d29 100644
--- a/cli/tests/testdata/npm/registry/@denotest/non-existent-dep-version/1.0.0/index.js
+++ b/tests/testdata/npm/registry/@denotest/non-existent-dep-version/1.0.0/index.js
diff --git a/cli/tests/testdata/npm/registry/@denotest/non-existent-dep-version/1.0.0/package.json b/tests/testdata/npm/registry/@denotest/non-existent-dep-version/1.0.0/package.json
index 0533da432..0533da432 100644
--- a/cli/tests/testdata/npm/registry/@denotest/non-existent-dep-version/1.0.0/package.json
+++ b/tests/testdata/npm/registry/@denotest/non-existent-dep-version/1.0.0/package.json
diff --git a/cli/tests/testdata/npm/registry/@denotest/non-existent-dep/1.0.0/index.js b/tests/testdata/npm/registry/@denotest/non-existent-dep/1.0.0/index.js
index f4e8d9d29..f4e8d9d29 100644
--- a/cli/tests/testdata/npm/registry/@denotest/non-existent-dep/1.0.0/index.js
+++ b/tests/testdata/npm/registry/@denotest/non-existent-dep/1.0.0/index.js
diff --git a/cli/tests/testdata/npm/registry/@denotest/non-existent-dep/1.0.0/package.json b/tests/testdata/npm/registry/@denotest/non-existent-dep/1.0.0/package.json
index 4d5f8c5a2..4d5f8c5a2 100644
--- a/cli/tests/testdata/npm/registry/@denotest/non-existent-dep/1.0.0/package.json
+++ b/tests/testdata/npm/registry/@denotest/non-existent-dep/1.0.0/package.json
diff --git a/cli/tests/testdata/npm/registry/@denotest/peer-dep-test-child/1.0.0/index.js b/tests/testdata/npm/registry/@denotest/peer-dep-test-child/1.0.0/index.js
index 636ec3c35..636ec3c35 100644
--- a/cli/tests/testdata/npm/registry/@denotest/peer-dep-test-child/1.0.0/index.js
+++ b/tests/testdata/npm/registry/@denotest/peer-dep-test-child/1.0.0/index.js
diff --git a/cli/tests/testdata/npm/registry/@denotest/peer-dep-test-child/1.0.0/package.json b/tests/testdata/npm/registry/@denotest/peer-dep-test-child/1.0.0/package.json
index 32eb49851..32eb49851 100644
--- a/cli/tests/testdata/npm/registry/@denotest/peer-dep-test-child/1.0.0/package.json
+++ b/tests/testdata/npm/registry/@denotest/peer-dep-test-child/1.0.0/package.json
diff --git a/cli/tests/testdata/npm/registry/@denotest/peer-dep-test-child/2.0.0/index.js b/tests/testdata/npm/registry/@denotest/peer-dep-test-child/2.0.0/index.js
index 636ec3c35..636ec3c35 100644
--- a/cli/tests/testdata/npm/registry/@denotest/peer-dep-test-child/2.0.0/index.js
+++ b/tests/testdata/npm/registry/@denotest/peer-dep-test-child/2.0.0/index.js
diff --git a/cli/tests/testdata/npm/registry/@denotest/peer-dep-test-child/2.0.0/package.json b/tests/testdata/npm/registry/@denotest/peer-dep-test-child/2.0.0/package.json
index 3c82c01f9..3c82c01f9 100644
--- a/cli/tests/testdata/npm/registry/@denotest/peer-dep-test-child/2.0.0/package.json
+++ b/tests/testdata/npm/registry/@denotest/peer-dep-test-child/2.0.0/package.json
diff --git a/cli/tests/testdata/npm/registry/@denotest/peer-dep-test-grandchild/1.0.0/dist/index.js b/tests/testdata/npm/registry/@denotest/peer-dep-test-grandchild/1.0.0/dist/index.js
index 9a0d9730b..9a0d9730b 100644
--- a/cli/tests/testdata/npm/registry/@denotest/peer-dep-test-grandchild/1.0.0/dist/index.js
+++ b/tests/testdata/npm/registry/@denotest/peer-dep-test-grandchild/1.0.0/dist/index.js
diff --git a/cli/tests/testdata/npm/registry/@denotest/peer-dep-test-grandchild/1.0.0/index.js b/tests/testdata/npm/registry/@denotest/peer-dep-test-grandchild/1.0.0/index.js
index 7d44863df..7d44863df 100644
--- a/cli/tests/testdata/npm/registry/@denotest/peer-dep-test-grandchild/1.0.0/index.js
+++ b/tests/testdata/npm/registry/@denotest/peer-dep-test-grandchild/1.0.0/index.js
diff --git a/cli/tests/testdata/npm/registry/@denotest/peer-dep-test-grandchild/1.0.0/package.json b/tests/testdata/npm/registry/@denotest/peer-dep-test-grandchild/1.0.0/package.json
index 845ef414d..845ef414d 100644
--- a/cli/tests/testdata/npm/registry/@denotest/peer-dep-test-grandchild/1.0.0/package.json
+++ b/tests/testdata/npm/registry/@denotest/peer-dep-test-grandchild/1.0.0/package.json
diff --git a/cli/tests/testdata/npm/registry/@denotest/peer-dep-test-peer/1.0.0/index.js b/tests/testdata/npm/registry/@denotest/peer-dep-test-peer/1.0.0/index.js
index bd816eaba..bd816eaba 100644
--- a/cli/tests/testdata/npm/registry/@denotest/peer-dep-test-peer/1.0.0/index.js
+++ b/tests/testdata/npm/registry/@denotest/peer-dep-test-peer/1.0.0/index.js
diff --git a/cli/tests/testdata/npm/registry/@denotest/peer-dep-test-peer/1.0.0/package.json b/tests/testdata/npm/registry/@denotest/peer-dep-test-peer/1.0.0/package.json
index cedb3609e..cedb3609e 100644
--- a/cli/tests/testdata/npm/registry/@denotest/peer-dep-test-peer/1.0.0/package.json
+++ b/tests/testdata/npm/registry/@denotest/peer-dep-test-peer/1.0.0/package.json
diff --git a/cli/tests/testdata/npm/registry/@denotest/peer-dep-test-peer/2.0.0/index.js b/tests/testdata/npm/registry/@denotest/peer-dep-test-peer/2.0.0/index.js
index 4bbffde10..4bbffde10 100644
--- a/cli/tests/testdata/npm/registry/@denotest/peer-dep-test-peer/2.0.0/index.js
+++ b/tests/testdata/npm/registry/@denotest/peer-dep-test-peer/2.0.0/index.js
diff --git a/cli/tests/testdata/npm/registry/@denotest/peer-dep-test-peer/2.0.0/package.json b/tests/testdata/npm/registry/@denotest/peer-dep-test-peer/2.0.0/package.json
index 90c24f875..90c24f875 100644
--- a/cli/tests/testdata/npm/registry/@denotest/peer-dep-test-peer/2.0.0/package.json
+++ b/tests/testdata/npm/registry/@denotest/peer-dep-test-peer/2.0.0/package.json
diff --git a/cli/tests/testdata/npm/registry/@denotest/permissions-outside-package/1.0.0/index.js b/tests/testdata/npm/registry/@denotest/permissions-outside-package/1.0.0/index.js
index ec854713f..ec854713f 100644
--- a/cli/tests/testdata/npm/registry/@denotest/permissions-outside-package/1.0.0/index.js
+++ b/tests/testdata/npm/registry/@denotest/permissions-outside-package/1.0.0/index.js
diff --git a/cli/tests/testdata/npm/registry/@denotest/permissions-outside-package/1.0.0/package.json b/tests/testdata/npm/registry/@denotest/permissions-outside-package/1.0.0/package.json
index 447a119e4..447a119e4 100644
--- a/cli/tests/testdata/npm/registry/@denotest/permissions-outside-package/1.0.0/package.json
+++ b/tests/testdata/npm/registry/@denotest/permissions-outside-package/1.0.0/package.json
diff --git a/cli/tests/testdata/npm/registry/@denotest/require-added-nm-folder/1.0.0/index.js b/tests/testdata/npm/registry/@denotest/require-added-nm-folder/1.0.0/index.js
index 8c8c4a0fa..8c8c4a0fa 100644
--- a/cli/tests/testdata/npm/registry/@denotest/require-added-nm-folder/1.0.0/index.js
+++ b/tests/testdata/npm/registry/@denotest/require-added-nm-folder/1.0.0/index.js
diff --git a/cli/tests/testdata/npm/registry/@denotest/require-added-nm-folder/1.0.0/package.json b/tests/testdata/npm/registry/@denotest/require-added-nm-folder/1.0.0/package.json
index 718f1eb8c..718f1eb8c 100644
--- a/cli/tests/testdata/npm/registry/@denotest/require-added-nm-folder/1.0.0/package.json
+++ b/tests/testdata/npm/registry/@denotest/require-added-nm-folder/1.0.0/package.json
diff --git a/cli/tests/testdata/npm/registry/@denotest/reserved-word-exports/1.0.0/index.cjs b/tests/testdata/npm/registry/@denotest/reserved-word-exports/1.0.0/index.cjs
index 73f00fad4..73f00fad4 100644
--- a/cli/tests/testdata/npm/registry/@denotest/reserved-word-exports/1.0.0/index.cjs
+++ b/tests/testdata/npm/registry/@denotest/reserved-word-exports/1.0.0/index.cjs
diff --git a/cli/tests/testdata/npm/registry/@denotest/reserved-word-exports/1.0.0/package.json b/tests/testdata/npm/registry/@denotest/reserved-word-exports/1.0.0/package.json
index 215b561d3..215b561d3 100644
--- a/cli/tests/testdata/npm/registry/@denotest/reserved-word-exports/1.0.0/package.json
+++ b/tests/testdata/npm/registry/@denotest/reserved-word-exports/1.0.0/package.json
diff --git a/cli/tests/testdata/npm/registry/@denotest/special-chars-in-bin-name/1.0.0/main.mjs b/tests/testdata/npm/registry/@denotest/special-chars-in-bin-name/1.0.0/main.mjs
index 0ae8e9190..0ae8e9190 100644
--- a/cli/tests/testdata/npm/registry/@denotest/special-chars-in-bin-name/1.0.0/main.mjs
+++ b/tests/testdata/npm/registry/@denotest/special-chars-in-bin-name/1.0.0/main.mjs
diff --git a/cli/tests/testdata/npm/registry/@denotest/special-chars-in-bin-name/1.0.0/package.json b/tests/testdata/npm/registry/@denotest/special-chars-in-bin-name/1.0.0/package.json
index 2dce473b5..2dce473b5 100644
--- a/cli/tests/testdata/npm/registry/@denotest/special-chars-in-bin-name/1.0.0/package.json
+++ b/tests/testdata/npm/registry/@denotest/special-chars-in-bin-name/1.0.0/package.json
diff --git a/cli/tests/testdata/npm/registry/@denotest/sub-folders/1.0.0/folder_index_js/index.d.ts b/tests/testdata/npm/registry/@denotest/sub-folders/1.0.0/folder_index_js/index.d.ts
index c3ec6ac2e..c3ec6ac2e 100644
--- a/cli/tests/testdata/npm/registry/@denotest/sub-folders/1.0.0/folder_index_js/index.d.ts
+++ b/tests/testdata/npm/registry/@denotest/sub-folders/1.0.0/folder_index_js/index.d.ts
diff --git a/cli/tests/testdata/npm/registry/@denotest/sub-folders/1.0.0/folder_index_js/index.js b/tests/testdata/npm/registry/@denotest/sub-folders/1.0.0/folder_index_js/index.js
index 71a2da49a..71a2da49a 100644
--- a/cli/tests/testdata/npm/registry/@denotest/sub-folders/1.0.0/folder_index_js/index.js
+++ b/tests/testdata/npm/registry/@denotest/sub-folders/1.0.0/folder_index_js/index.js
diff --git a/cli/tests/testdata/npm/registry/@denotest/sub-folders/1.0.0/folder_no_index/random_name.js b/tests/testdata/npm/registry/@denotest/sub-folders/1.0.0/folder_no_index/random_name.js
index f4e8d9d29..f4e8d9d29 100644
--- a/cli/tests/testdata/npm/registry/@denotest/sub-folders/1.0.0/folder_no_index/random_name.js
+++ b/tests/testdata/npm/registry/@denotest/sub-folders/1.0.0/folder_no_index/random_name.js
diff --git a/cli/tests/testdata/npm/registry/@denotest/sub-folders/1.0.0/main.mjs b/tests/testdata/npm/registry/@denotest/sub-folders/1.0.0/main.mjs
index 358b4b09e..358b4b09e 100644
--- a/cli/tests/testdata/npm/registry/@denotest/sub-folders/1.0.0/main.mjs
+++ b/tests/testdata/npm/registry/@denotest/sub-folders/1.0.0/main.mjs
diff --git a/cli/tests/testdata/npm/registry/@denotest/sub-folders/1.0.0/package.json b/tests/testdata/npm/registry/@denotest/sub-folders/1.0.0/package.json
index 1402e346c..1402e346c 100644
--- a/cli/tests/testdata/npm/registry/@denotest/sub-folders/1.0.0/package.json
+++ b/tests/testdata/npm/registry/@denotest/sub-folders/1.0.0/package.json
diff --git a/cli/tests/testdata/npm/registry/@denotest/types-ambient/1.0.0/index.d.ts b/tests/testdata/npm/registry/@denotest/types-ambient/1.0.0/index.d.ts
index fc2199884..fc2199884 100644
--- a/cli/tests/testdata/npm/registry/@denotest/types-ambient/1.0.0/index.d.ts
+++ b/tests/testdata/npm/registry/@denotest/types-ambient/1.0.0/index.d.ts
diff --git a/cli/tests/testdata/npm/registry/@denotest/types-ambient/1.0.0/index.js b/tests/testdata/npm/registry/@denotest/types-ambient/1.0.0/index.js
index 47ff7adb2..47ff7adb2 100644
--- a/cli/tests/testdata/npm/registry/@denotest/types-ambient/1.0.0/index.js
+++ b/tests/testdata/npm/registry/@denotest/types-ambient/1.0.0/index.js
diff --git a/cli/tests/testdata/npm/registry/@denotest/types-ambient/1.0.0/package.json b/tests/testdata/npm/registry/@denotest/types-ambient/1.0.0/package.json
index ef927cbe3..ef927cbe3 100644
--- a/cli/tests/testdata/npm/registry/@denotest/types-ambient/1.0.0/package.json
+++ b/tests/testdata/npm/registry/@denotest/types-ambient/1.0.0/package.json
diff --git a/cli/tests/testdata/npm/registry/@denotest/types-entry-value-not-exists/1.0.0/dist/main.d.ts b/tests/testdata/npm/registry/@denotest/types-entry-value-not-exists/1.0.0/dist/main.d.ts
index 2341a14f0..2341a14f0 100644
--- a/cli/tests/testdata/npm/registry/@denotest/types-entry-value-not-exists/1.0.0/dist/main.d.ts
+++ b/tests/testdata/npm/registry/@denotest/types-entry-value-not-exists/1.0.0/dist/main.d.ts
diff --git a/cli/tests/testdata/npm/registry/@denotest/types-entry-value-not-exists/1.0.0/dist/main.js b/tests/testdata/npm/registry/@denotest/types-entry-value-not-exists/1.0.0/dist/main.js
index d0c5dbc70..d0c5dbc70 100644
--- a/cli/tests/testdata/npm/registry/@denotest/types-entry-value-not-exists/1.0.0/dist/main.js
+++ b/tests/testdata/npm/registry/@denotest/types-entry-value-not-exists/1.0.0/dist/main.js
diff --git a/cli/tests/testdata/npm/registry/@denotest/types-entry-value-not-exists/1.0.0/package.json b/tests/testdata/npm/registry/@denotest/types-entry-value-not-exists/1.0.0/package.json
index 5eb859c4e..5eb859c4e 100644
--- a/cli/tests/testdata/npm/registry/@denotest/types-entry-value-not-exists/1.0.0/package.json
+++ b/tests/testdata/npm/registry/@denotest/types-entry-value-not-exists/1.0.0/package.json
diff --git a/cli/tests/testdata/npm/registry/@denotest/types-exports-import-types/1.0.0/dist/main.d.ts b/tests/testdata/npm/registry/@denotest/types-exports-import-types/1.0.0/dist/main.d.ts
index 2341a14f0..2341a14f0 100644
--- a/cli/tests/testdata/npm/registry/@denotest/types-exports-import-types/1.0.0/dist/main.d.ts
+++ b/tests/testdata/npm/registry/@denotest/types-exports-import-types/1.0.0/dist/main.d.ts
diff --git a/cli/tests/testdata/npm/registry/@denotest/types-exports-import-types/1.0.0/dist/main.mjs b/tests/testdata/npm/registry/@denotest/types-exports-import-types/1.0.0/dist/main.mjs
index 358b4b09e..358b4b09e 100644
--- a/cli/tests/testdata/npm/registry/@denotest/types-exports-import-types/1.0.0/dist/main.mjs
+++ b/tests/testdata/npm/registry/@denotest/types-exports-import-types/1.0.0/dist/main.mjs
diff --git a/cli/tests/testdata/npm/registry/@denotest/types-exports-import-types/1.0.0/package.json b/tests/testdata/npm/registry/@denotest/types-exports-import-types/1.0.0/package.json
index 202a2c784..202a2c784 100644
--- a/cli/tests/testdata/npm/registry/@denotest/types-exports-import-types/1.0.0/package.json
+++ b/tests/testdata/npm/registry/@denotest/types-exports-import-types/1.0.0/package.json
diff --git a/cli/tests/testdata/npm/registry/@denotest/types-exports-subpaths/1.0.0/client.d.ts b/tests/testdata/npm/registry/@denotest/types-exports-subpaths/1.0.0/client.d.ts
index 2d156f5bb..2d156f5bb 100644
--- a/cli/tests/testdata/npm/registry/@denotest/types-exports-subpaths/1.0.0/client.d.ts
+++ b/tests/testdata/npm/registry/@denotest/types-exports-subpaths/1.0.0/client.d.ts
diff --git a/cli/tests/testdata/npm/registry/@denotest/types-exports-subpaths/1.0.0/dist/client.mjs b/tests/testdata/npm/registry/@denotest/types-exports-subpaths/1.0.0/dist/client.mjs
index 938238d95..938238d95 100644
--- a/cli/tests/testdata/npm/registry/@denotest/types-exports-subpaths/1.0.0/dist/client.mjs
+++ b/tests/testdata/npm/registry/@denotest/types-exports-subpaths/1.0.0/dist/client.mjs
diff --git a/cli/tests/testdata/npm/registry/@denotest/types-exports-subpaths/1.0.0/dist/entry-a.d.ts b/tests/testdata/npm/registry/@denotest/types-exports-subpaths/1.0.0/dist/entry-a.d.ts
index f49faf22f..f49faf22f 100644
--- a/cli/tests/testdata/npm/registry/@denotest/types-exports-subpaths/1.0.0/dist/entry-a.d.ts
+++ b/tests/testdata/npm/registry/@denotest/types-exports-subpaths/1.0.0/dist/entry-a.d.ts
diff --git a/cli/tests/testdata/npm/registry/@denotest/types-exports-subpaths/1.0.0/dist/entry-a.js b/tests/testdata/npm/registry/@denotest/types-exports-subpaths/1.0.0/dist/entry-a.js
index 84f1f2c94..84f1f2c94 100644
--- a/cli/tests/testdata/npm/registry/@denotest/types-exports-subpaths/1.0.0/dist/entry-a.js
+++ b/tests/testdata/npm/registry/@denotest/types-exports-subpaths/1.0.0/dist/entry-a.js
diff --git a/cli/tests/testdata/npm/registry/@denotest/types-exports-subpaths/1.0.0/dist/entry-b.d.ts b/tests/testdata/npm/registry/@denotest/types-exports-subpaths/1.0.0/dist/entry-b.d.ts
index 382d1995e..382d1995e 100644
--- a/cli/tests/testdata/npm/registry/@denotest/types-exports-subpaths/1.0.0/dist/entry-b.d.ts
+++ b/tests/testdata/npm/registry/@denotest/types-exports-subpaths/1.0.0/dist/entry-b.d.ts
diff --git a/cli/tests/testdata/npm/registry/@denotest/types-exports-subpaths/1.0.0/dist/entry-b.js b/tests/testdata/npm/registry/@denotest/types-exports-subpaths/1.0.0/dist/entry-b.js
index 162d4f190..162d4f190 100644
--- a/cli/tests/testdata/npm/registry/@denotest/types-exports-subpaths/1.0.0/dist/entry-b.js
+++ b/tests/testdata/npm/registry/@denotest/types-exports-subpaths/1.0.0/dist/entry-b.js
diff --git a/cli/tests/testdata/npm/registry/@denotest/types-exports-subpaths/1.0.0/entry-import.d.ts b/tests/testdata/npm/registry/@denotest/types-exports-subpaths/1.0.0/entry-import.d.ts
index 253279e6c..253279e6c 100644
--- a/cli/tests/testdata/npm/registry/@denotest/types-exports-subpaths/1.0.0/entry-import.d.ts
+++ b/tests/testdata/npm/registry/@denotest/types-exports-subpaths/1.0.0/entry-import.d.ts
diff --git a/cli/tests/testdata/npm/registry/@denotest/types-exports-subpaths/1.0.0/entry-import.js b/tests/testdata/npm/registry/@denotest/types-exports-subpaths/1.0.0/entry-import.js
index e69de29bb..e69de29bb 100644
--- a/cli/tests/testdata/npm/registry/@denotest/types-exports-subpaths/1.0.0/entry-import.js
+++ b/tests/testdata/npm/registry/@denotest/types-exports-subpaths/1.0.0/entry-import.js
diff --git a/cli/tests/testdata/npm/registry/@denotest/types-exports-subpaths/1.0.0/entry-js-only.js b/tests/testdata/npm/registry/@denotest/types-exports-subpaths/1.0.0/entry-js-only.js
index e69de29bb..e69de29bb 100644
--- a/cli/tests/testdata/npm/registry/@denotest/types-exports-subpaths/1.0.0/entry-js-only.js
+++ b/tests/testdata/npm/registry/@denotest/types-exports-subpaths/1.0.0/entry-js-only.js
diff --git a/cli/tests/testdata/npm/registry/@denotest/types-exports-subpaths/1.0.0/entry-types.d.ts b/tests/testdata/npm/registry/@denotest/types-exports-subpaths/1.0.0/entry-types.d.ts
index bd1ff702f..bd1ff702f 100644
--- a/cli/tests/testdata/npm/registry/@denotest/types-exports-subpaths/1.0.0/entry-types.d.ts
+++ b/tests/testdata/npm/registry/@denotest/types-exports-subpaths/1.0.0/entry-types.d.ts
diff --git a/cli/tests/testdata/npm/registry/@denotest/types-exports-subpaths/1.0.0/package.json b/tests/testdata/npm/registry/@denotest/types-exports-subpaths/1.0.0/package.json
index cc43cf2ed..cc43cf2ed 100644
--- a/cli/tests/testdata/npm/registry/@denotest/types-exports-subpaths/1.0.0/package.json
+++ b/tests/testdata/npm/registry/@denotest/types-exports-subpaths/1.0.0/package.json
diff --git a/cli/tests/testdata/npm/registry/@denotest/types-no-types-entry/1.0.0/dist/main.d.ts b/tests/testdata/npm/registry/@denotest/types-no-types-entry/1.0.0/dist/main.d.ts
index 8942f08dd..8942f08dd 100644
--- a/cli/tests/testdata/npm/registry/@denotest/types-no-types-entry/1.0.0/dist/main.d.ts
+++ b/tests/testdata/npm/registry/@denotest/types-no-types-entry/1.0.0/dist/main.d.ts
diff --git a/cli/tests/testdata/npm/registry/@denotest/types-no-types-entry/1.0.0/dist/main.js b/tests/testdata/npm/registry/@denotest/types-no-types-entry/1.0.0/dist/main.js
index 63c7ef0ce..63c7ef0ce 100644
--- a/cli/tests/testdata/npm/registry/@denotest/types-no-types-entry/1.0.0/dist/main.js
+++ b/tests/testdata/npm/registry/@denotest/types-no-types-entry/1.0.0/dist/main.js
diff --git a/cli/tests/testdata/npm/registry/@denotest/types-no-types-entry/1.0.0/package.json b/tests/testdata/npm/registry/@denotest/types-no-types-entry/1.0.0/package.json
index 6abccec98..6abccec98 100644
--- a/cli/tests/testdata/npm/registry/@denotest/types-no-types-entry/1.0.0/package.json
+++ b/tests/testdata/npm/registry/@denotest/types-no-types-entry/1.0.0/package.json
diff --git a/cli/tests/testdata/npm/registry/@denotest/types/1.0.0/index.d.ts b/tests/testdata/npm/registry/@denotest/types/1.0.0/index.d.ts
index afe876c4d..afe876c4d 100644
--- a/cli/tests/testdata/npm/registry/@denotest/types/1.0.0/index.d.ts
+++ b/tests/testdata/npm/registry/@denotest/types/1.0.0/index.d.ts
diff --git a/cli/tests/testdata/npm/registry/@denotest/types/1.0.0/package.json b/tests/testdata/npm/registry/@denotest/types/1.0.0/package.json
index ef927cbe3..ef927cbe3 100644
--- a/cli/tests/testdata/npm/registry/@denotest/types/1.0.0/package.json
+++ b/tests/testdata/npm/registry/@denotest/types/1.0.0/package.json
diff --git a/cli/tests/testdata/npm/registry/@denotest/types_imported/1.0.0/index.d.ts b/tests/testdata/npm/registry/@denotest/types_imported/1.0.0/index.d.ts
index 559cdb2ec..559cdb2ec 100644
--- a/cli/tests/testdata/npm/registry/@denotest/types_imported/1.0.0/index.d.ts
+++ b/tests/testdata/npm/registry/@denotest/types_imported/1.0.0/index.d.ts
diff --git a/cli/tests/testdata/npm/registry/@denotest/types_imported/1.0.0/package.json b/tests/testdata/npm/registry/@denotest/types_imported/1.0.0/package.json
index ef927cbe3..ef927cbe3 100644
--- a/cli/tests/testdata/npm/registry/@denotest/types_imported/1.0.0/package.json
+++ b/tests/testdata/npm/registry/@denotest/types_imported/1.0.0/package.json
diff --git a/cli/tests/testdata/npm/registry/@denotest/types_imported/1.0.0/subpath.d.ts b/tests/testdata/npm/registry/@denotest/types_imported/1.0.0/subpath.d.ts
index 883cf037a..883cf037a 100644
--- a/cli/tests/testdata/npm/registry/@denotest/types_imported/1.0.0/subpath.d.ts
+++ b/tests/testdata/npm/registry/@denotest/types_imported/1.0.0/subpath.d.ts
diff --git a/cli/tests/testdata/npm/registry/@denotest/typescript-file/1.0.0/index.ts b/tests/testdata/npm/registry/@denotest/typescript-file/1.0.0/index.ts
index 44b441a1e..44b441a1e 100644
--- a/cli/tests/testdata/npm/registry/@denotest/typescript-file/1.0.0/index.ts
+++ b/tests/testdata/npm/registry/@denotest/typescript-file/1.0.0/index.ts
diff --git a/cli/tests/testdata/npm/registry/@denotest/typescript-file/1.0.0/package.json b/tests/testdata/npm/registry/@denotest/typescript-file/1.0.0/package.json
index e899f4100..e899f4100 100644
--- a/cli/tests/testdata/npm/registry/@denotest/typescript-file/1.0.0/package.json
+++ b/tests/testdata/npm/registry/@denotest/typescript-file/1.0.0/package.json
diff --git a/cli/tests/testdata/npm/registry/@ljharb/has-package-exports-patterns/has-package-exports-patterns-0.0.2.tgz b/tests/testdata/npm/registry/@ljharb/has-package-exports-patterns/has-package-exports-patterns-0.0.2.tgz
index 7daff8ff1..7daff8ff1 100644
--- a/cli/tests/testdata/npm/registry/@ljharb/has-package-exports-patterns/has-package-exports-patterns-0.0.2.tgz
+++ b/tests/testdata/npm/registry/@ljharb/has-package-exports-patterns/has-package-exports-patterns-0.0.2.tgz
Binary files differ
diff --git a/cli/tests/testdata/npm/registry/@ljharb/has-package-exports-patterns/registry.json b/tests/testdata/npm/registry/@ljharb/has-package-exports-patterns/registry.json
index 9a0b27f3f..9a0b27f3f 100644
--- a/cli/tests/testdata/npm/registry/@ljharb/has-package-exports-patterns/registry.json
+++ b/tests/testdata/npm/registry/@ljharb/has-package-exports-patterns/registry.json
diff --git a/cli/tests/testdata/npm/registry/@types/node/node-18.8.2.tgz b/tests/testdata/npm/registry/@types/node/node-18.8.2.tgz
index 8afc9d21d..8afc9d21d 100644
--- a/cli/tests/testdata/npm/registry/@types/node/node-18.8.2.tgz
+++ b/tests/testdata/npm/registry/@types/node/node-18.8.2.tgz
Binary files differ
diff --git a/cli/tests/testdata/npm/registry/@types/node/registry.json b/tests/testdata/npm/registry/@types/node/registry.json
index 3fff1578e..3fff1578e 100644
--- a/cli/tests/testdata/npm/registry/@types/node/registry.json
+++ b/tests/testdata/npm/registry/@types/node/registry.json
diff --git a/cli/tests/testdata/npm/registry/@vue/compiler-core/compiler-core-3.2.38.tgz b/tests/testdata/npm/registry/@vue/compiler-core/compiler-core-3.2.38.tgz
index d316a32f9..d316a32f9 100644
--- a/cli/tests/testdata/npm/registry/@vue/compiler-core/compiler-core-3.2.38.tgz
+++ b/tests/testdata/npm/registry/@vue/compiler-core/compiler-core-3.2.38.tgz
Binary files differ
diff --git a/cli/tests/testdata/npm/registry/@vue/compiler-core/registry.json b/tests/testdata/npm/registry/@vue/compiler-core/registry.json
index b7e9ed04a..b7e9ed04a 100644
--- a/cli/tests/testdata/npm/registry/@vue/compiler-core/registry.json
+++ b/tests/testdata/npm/registry/@vue/compiler-core/registry.json
diff --git a/cli/tests/testdata/npm/registry/@vue/compiler-dom/compiler-dom-3.2.38.tgz b/tests/testdata/npm/registry/@vue/compiler-dom/compiler-dom-3.2.38.tgz
index e3cd8a3a1..e3cd8a3a1 100644
--- a/cli/tests/testdata/npm/registry/@vue/compiler-dom/compiler-dom-3.2.38.tgz
+++ b/tests/testdata/npm/registry/@vue/compiler-dom/compiler-dom-3.2.38.tgz
Binary files differ
diff --git a/cli/tests/testdata/npm/registry/@vue/compiler-dom/registry.json b/tests/testdata/npm/registry/@vue/compiler-dom/registry.json
index 48dfe2360..48dfe2360 100644
--- a/cli/tests/testdata/npm/registry/@vue/compiler-dom/registry.json
+++ b/tests/testdata/npm/registry/@vue/compiler-dom/registry.json
diff --git a/cli/tests/testdata/npm/registry/@vue/compiler-sfc/compiler-sfc-3.2.38.tgz b/tests/testdata/npm/registry/@vue/compiler-sfc/compiler-sfc-3.2.38.tgz
index a12455d3b..a12455d3b 100644
--- a/cli/tests/testdata/npm/registry/@vue/compiler-sfc/compiler-sfc-3.2.38.tgz
+++ b/tests/testdata/npm/registry/@vue/compiler-sfc/compiler-sfc-3.2.38.tgz
Binary files differ
diff --git a/cli/tests/testdata/npm/registry/@vue/compiler-sfc/registry.json b/tests/testdata/npm/registry/@vue/compiler-sfc/registry.json
index ec24f27e5..ec24f27e5 100644
--- a/cli/tests/testdata/npm/registry/@vue/compiler-sfc/registry.json
+++ b/tests/testdata/npm/registry/@vue/compiler-sfc/registry.json
diff --git a/cli/tests/testdata/npm/registry/@vue/compiler-ssr/compiler-ssr-3.2.38.tgz b/tests/testdata/npm/registry/@vue/compiler-ssr/compiler-ssr-3.2.38.tgz
index 9c30d8ab4..9c30d8ab4 100644
--- a/cli/tests/testdata/npm/registry/@vue/compiler-ssr/compiler-ssr-3.2.38.tgz
+++ b/tests/testdata/npm/registry/@vue/compiler-ssr/compiler-ssr-3.2.38.tgz
Binary files differ
diff --git a/cli/tests/testdata/npm/registry/@vue/compiler-ssr/registry.json b/tests/testdata/npm/registry/@vue/compiler-ssr/registry.json
index 53f311c77..53f311c77 100644
--- a/cli/tests/testdata/npm/registry/@vue/compiler-ssr/registry.json
+++ b/tests/testdata/npm/registry/@vue/compiler-ssr/registry.json
diff --git a/cli/tests/testdata/npm/registry/@vue/reactivity-transform/reactivity-transform-3.2.38.tgz b/tests/testdata/npm/registry/@vue/reactivity-transform/reactivity-transform-3.2.38.tgz
index 3fcf21c21..3fcf21c21 100644
--- a/cli/tests/testdata/npm/registry/@vue/reactivity-transform/reactivity-transform-3.2.38.tgz
+++ b/tests/testdata/npm/registry/@vue/reactivity-transform/reactivity-transform-3.2.38.tgz
Binary files differ
diff --git a/cli/tests/testdata/npm/registry/@vue/reactivity-transform/registry.json b/tests/testdata/npm/registry/@vue/reactivity-transform/registry.json
index 1b98491a9..1b98491a9 100644
--- a/cli/tests/testdata/npm/registry/@vue/reactivity-transform/registry.json
+++ b/tests/testdata/npm/registry/@vue/reactivity-transform/registry.json
diff --git a/cli/tests/testdata/npm/registry/@vue/reactivity/reactivity-3.2.38.tgz b/tests/testdata/npm/registry/@vue/reactivity/reactivity-3.2.38.tgz
index 9c7f17ba1..9c7f17ba1 100644
--- a/cli/tests/testdata/npm/registry/@vue/reactivity/reactivity-3.2.38.tgz
+++ b/tests/testdata/npm/registry/@vue/reactivity/reactivity-3.2.38.tgz
Binary files differ
diff --git a/cli/tests/testdata/npm/registry/@vue/reactivity/registry.json b/tests/testdata/npm/registry/@vue/reactivity/registry.json
index fe116a5b8..fe116a5b8 100644
--- a/cli/tests/testdata/npm/registry/@vue/reactivity/registry.json
+++ b/tests/testdata/npm/registry/@vue/reactivity/registry.json
diff --git a/cli/tests/testdata/npm/registry/@vue/runtime-core/registry.json b/tests/testdata/npm/registry/@vue/runtime-core/registry.json
index 546068610..546068610 100644
--- a/cli/tests/testdata/npm/registry/@vue/runtime-core/registry.json
+++ b/tests/testdata/npm/registry/@vue/runtime-core/registry.json
diff --git a/cli/tests/testdata/npm/registry/@vue/runtime-core/runtime-core-3.2.38.tgz b/tests/testdata/npm/registry/@vue/runtime-core/runtime-core-3.2.38.tgz
index 4cfa0899f..4cfa0899f 100644
--- a/cli/tests/testdata/npm/registry/@vue/runtime-core/runtime-core-3.2.38.tgz
+++ b/tests/testdata/npm/registry/@vue/runtime-core/runtime-core-3.2.38.tgz
Binary files differ
diff --git a/cli/tests/testdata/npm/registry/@vue/runtime-dom/registry.json b/tests/testdata/npm/registry/@vue/runtime-dom/registry.json
index 1e4ab2d01..1e4ab2d01 100644
--- a/cli/tests/testdata/npm/registry/@vue/runtime-dom/registry.json
+++ b/tests/testdata/npm/registry/@vue/runtime-dom/registry.json
diff --git a/cli/tests/testdata/npm/registry/@vue/runtime-dom/runtime-dom-3.2.38.tgz b/tests/testdata/npm/registry/@vue/runtime-dom/runtime-dom-3.2.38.tgz
index fa6097b17..fa6097b17 100644
--- a/cli/tests/testdata/npm/registry/@vue/runtime-dom/runtime-dom-3.2.38.tgz
+++ b/tests/testdata/npm/registry/@vue/runtime-dom/runtime-dom-3.2.38.tgz
Binary files differ
diff --git a/cli/tests/testdata/npm/registry/@vue/server-renderer/registry.json b/tests/testdata/npm/registry/@vue/server-renderer/registry.json
index f910f4a0b..f910f4a0b 100644
--- a/cli/tests/testdata/npm/registry/@vue/server-renderer/registry.json
+++ b/tests/testdata/npm/registry/@vue/server-renderer/registry.json
diff --git a/cli/tests/testdata/npm/registry/@vue/server-renderer/server-renderer-3.2.38.tgz b/tests/testdata/npm/registry/@vue/server-renderer/server-renderer-3.2.38.tgz
index e3d1603f5..e3d1603f5 100644
--- a/cli/tests/testdata/npm/registry/@vue/server-renderer/server-renderer-3.2.38.tgz
+++ b/tests/testdata/npm/registry/@vue/server-renderer/server-renderer-3.2.38.tgz
Binary files differ
diff --git a/cli/tests/testdata/npm/registry/@vue/shared/registry.json b/tests/testdata/npm/registry/@vue/shared/registry.json
index 55132d401..55132d401 100644
--- a/cli/tests/testdata/npm/registry/@vue/shared/registry.json
+++ b/tests/testdata/npm/registry/@vue/shared/registry.json
diff --git a/cli/tests/testdata/npm/registry/@vue/shared/shared-3.2.38.tgz b/tests/testdata/npm/registry/@vue/shared/shared-3.2.38.tgz
index 99112c2dd..99112c2dd 100644
--- a/cli/tests/testdata/npm/registry/@vue/shared/shared-3.2.38.tgz
+++ b/tests/testdata/npm/registry/@vue/shared/shared-3.2.38.tgz
Binary files differ
diff --git a/cli/tests/testdata/npm/registry/ajv-formats/ajv-formats-2.1.1.tgz b/tests/testdata/npm/registry/ajv-formats/ajv-formats-2.1.1.tgz
index ff6708c53..ff6708c53 100644
--- a/cli/tests/testdata/npm/registry/ajv-formats/ajv-formats-2.1.1.tgz
+++ b/tests/testdata/npm/registry/ajv-formats/ajv-formats-2.1.1.tgz
Binary files differ
diff --git a/cli/tests/testdata/npm/registry/ajv-formats/registry.json b/tests/testdata/npm/registry/ajv-formats/registry.json
index a34350100..a34350100 100644
--- a/cli/tests/testdata/npm/registry/ajv-formats/registry.json
+++ b/tests/testdata/npm/registry/ajv-formats/registry.json
diff --git a/cli/tests/testdata/npm/registry/ajv/ajv-8.11.0.tgz b/tests/testdata/npm/registry/ajv/ajv-8.11.0.tgz
index 57f893c52..57f893c52 100644
--- a/cli/tests/testdata/npm/registry/ajv/ajv-8.11.0.tgz
+++ b/tests/testdata/npm/registry/ajv/ajv-8.11.0.tgz
Binary files differ
diff --git a/cli/tests/testdata/npm/registry/ajv/registry.json b/tests/testdata/npm/registry/ajv/registry.json
index d3d3884d1..d3d3884d1 100644
--- a/cli/tests/testdata/npm/registry/ajv/registry.json
+++ b/tests/testdata/npm/registry/ajv/registry.json
diff --git a/cli/tests/testdata/npm/registry/ansi-regex/ansi-regex-3.0.1.tgz b/tests/testdata/npm/registry/ansi-regex/ansi-regex-3.0.1.tgz
index 336d9dcef..336d9dcef 100644
--- a/cli/tests/testdata/npm/registry/ansi-regex/ansi-regex-3.0.1.tgz
+++ b/tests/testdata/npm/registry/ansi-regex/ansi-regex-3.0.1.tgz
Binary files differ
diff --git a/cli/tests/testdata/npm/registry/ansi-regex/ansi-regex-5.0.1.tgz b/tests/testdata/npm/registry/ansi-regex/ansi-regex-5.0.1.tgz
index e1095e4d1..e1095e4d1 100644
--- a/cli/tests/testdata/npm/registry/ansi-regex/ansi-regex-5.0.1.tgz
+++ b/tests/testdata/npm/registry/ansi-regex/ansi-regex-5.0.1.tgz
Binary files differ
diff --git a/cli/tests/testdata/npm/registry/ansi-regex/registry.json b/tests/testdata/npm/registry/ansi-regex/registry.json
index 594ae03ee..594ae03ee 100644
--- a/cli/tests/testdata/npm/registry/ansi-regex/registry.json
+++ b/tests/testdata/npm/registry/ansi-regex/registry.json
diff --git a/cli/tests/testdata/npm/registry/ansi-styles/ansi-styles-4.3.0.tgz b/tests/testdata/npm/registry/ansi-styles/ansi-styles-4.3.0.tgz
index 39e6a7843..39e6a7843 100644
--- a/cli/tests/testdata/npm/registry/ansi-styles/ansi-styles-4.3.0.tgz
+++ b/tests/testdata/npm/registry/ansi-styles/ansi-styles-4.3.0.tgz
Binary files differ
diff --git a/cli/tests/testdata/npm/registry/ansi-styles/registry.json b/tests/testdata/npm/registry/ansi-styles/registry.json
index 2cdcc7c3f..2cdcc7c3f 100644
--- a/cli/tests/testdata/npm/registry/ansi-styles/registry.json
+++ b/tests/testdata/npm/registry/ansi-styles/registry.json
diff --git a/cli/tests/testdata/npm/registry/asn1/asn1-0.2.6.tgz b/tests/testdata/npm/registry/asn1/asn1-0.2.6.tgz
index a3d0923f0..a3d0923f0 100644
--- a/cli/tests/testdata/npm/registry/asn1/asn1-0.2.6.tgz
+++ b/tests/testdata/npm/registry/asn1/asn1-0.2.6.tgz
Binary files differ
diff --git a/cli/tests/testdata/npm/registry/asn1/registry.json b/tests/testdata/npm/registry/asn1/registry.json
index 5d424a9fd..5d424a9fd 100644
--- a/cli/tests/testdata/npm/registry/asn1/registry.json
+++ b/tests/testdata/npm/registry/asn1/registry.json
diff --git a/cli/tests/testdata/npm/registry/assertion-error/assertion-error-1.1.0.tgz b/tests/testdata/npm/registry/assertion-error/assertion-error-1.1.0.tgz
index e3a821f6a..e3a821f6a 100644
--- a/cli/tests/testdata/npm/registry/assertion-error/assertion-error-1.1.0.tgz
+++ b/tests/testdata/npm/registry/assertion-error/assertion-error-1.1.0.tgz
Binary files differ
diff --git a/cli/tests/testdata/npm/registry/assertion-error/registry.json b/tests/testdata/npm/registry/assertion-error/registry.json
index 9f5b89fae..9f5b89fae 100644
--- a/cli/tests/testdata/npm/registry/assertion-error/registry.json
+++ b/tests/testdata/npm/registry/assertion-error/registry.json
diff --git a/cli/tests/testdata/npm/registry/autoprefixer/autoprefixer-10.4.14.tgz b/tests/testdata/npm/registry/autoprefixer/autoprefixer-10.4.14.tgz
index b5dd92a33..b5dd92a33 100644
--- a/cli/tests/testdata/npm/registry/autoprefixer/autoprefixer-10.4.14.tgz
+++ b/tests/testdata/npm/registry/autoprefixer/autoprefixer-10.4.14.tgz
Binary files differ
diff --git a/cli/tests/testdata/npm/registry/autoprefixer/registry.json b/tests/testdata/npm/registry/autoprefixer/registry.json
index 82f869ab3..82f869ab3 100644
--- a/cli/tests/testdata/npm/registry/autoprefixer/registry.json
+++ b/tests/testdata/npm/registry/autoprefixer/registry.json
diff --git a/cli/tests/testdata/npm/registry/bcrypt-pbkdf/bcrypt-pbkdf-1.0.2.tgz b/tests/testdata/npm/registry/bcrypt-pbkdf/bcrypt-pbkdf-1.0.2.tgz
index a3d682b9a..a3d682b9a 100644
--- a/cli/tests/testdata/npm/registry/bcrypt-pbkdf/bcrypt-pbkdf-1.0.2.tgz
+++ b/tests/testdata/npm/registry/bcrypt-pbkdf/bcrypt-pbkdf-1.0.2.tgz
Binary files differ
diff --git a/cli/tests/testdata/npm/registry/bcrypt-pbkdf/registry.json b/tests/testdata/npm/registry/bcrypt-pbkdf/registry.json
index 85f96ff84..85f96ff84 100644
--- a/cli/tests/testdata/npm/registry/bcrypt-pbkdf/registry.json
+++ b/tests/testdata/npm/registry/bcrypt-pbkdf/registry.json
diff --git a/cli/tests/testdata/npm/registry/browserslist/browserslist-4.21.5.tgz b/tests/testdata/npm/registry/browserslist/browserslist-4.21.5.tgz
index 7c98d1564..7c98d1564 100644
--- a/cli/tests/testdata/npm/registry/browserslist/browserslist-4.21.5.tgz
+++ b/tests/testdata/npm/registry/browserslist/browserslist-4.21.5.tgz
Binary files differ
diff --git a/cli/tests/testdata/npm/registry/browserslist/registry.json b/tests/testdata/npm/registry/browserslist/registry.json
index 4f0aea9b3..4f0aea9b3 100644
--- a/cli/tests/testdata/npm/registry/browserslist/registry.json
+++ b/tests/testdata/npm/registry/browserslist/registry.json
diff --git a/cli/tests/testdata/npm/registry/buildcheck/buildcheck-0.0.3.tgz b/tests/testdata/npm/registry/buildcheck/buildcheck-0.0.3.tgz
index 0681fd738..0681fd738 100644
--- a/cli/tests/testdata/npm/registry/buildcheck/buildcheck-0.0.3.tgz
+++ b/tests/testdata/npm/registry/buildcheck/buildcheck-0.0.3.tgz
Binary files differ
diff --git a/cli/tests/testdata/npm/registry/buildcheck/registry.json b/tests/testdata/npm/registry/buildcheck/registry.json
index 99839b0ad..99839b0ad 100644
--- a/cli/tests/testdata/npm/registry/buildcheck/registry.json
+++ b/tests/testdata/npm/registry/buildcheck/registry.json
diff --git a/cli/tests/testdata/npm/registry/camelcase/camelcase-5.3.1.tgz b/tests/testdata/npm/registry/camelcase/camelcase-5.3.1.tgz
index f57b4f1f4..f57b4f1f4 100644
--- a/cli/tests/testdata/npm/registry/camelcase/camelcase-5.3.1.tgz
+++ b/tests/testdata/npm/registry/camelcase/camelcase-5.3.1.tgz
Binary files differ
diff --git a/cli/tests/testdata/npm/registry/camelcase/registry.json b/tests/testdata/npm/registry/camelcase/registry.json
index 7492725af..7492725af 100644
--- a/cli/tests/testdata/npm/registry/camelcase/registry.json
+++ b/tests/testdata/npm/registry/camelcase/registry.json
diff --git a/cli/tests/testdata/npm/registry/caniuse-lite/caniuse-lite-1.0.30001473.tgz b/tests/testdata/npm/registry/caniuse-lite/caniuse-lite-1.0.30001473.tgz
index c80b88220..c80b88220 100644
--- a/cli/tests/testdata/npm/registry/caniuse-lite/caniuse-lite-1.0.30001473.tgz
+++ b/tests/testdata/npm/registry/caniuse-lite/caniuse-lite-1.0.30001473.tgz
Binary files differ
diff --git a/cli/tests/testdata/npm/registry/caniuse-lite/registry.json b/tests/testdata/npm/registry/caniuse-lite/registry.json
index bd61c7114..bd61c7114 100644
--- a/cli/tests/testdata/npm/registry/caniuse-lite/registry.json
+++ b/tests/testdata/npm/registry/caniuse-lite/registry.json
diff --git a/cli/tests/testdata/npm/registry/chai/chai-4.3.6.tgz b/tests/testdata/npm/registry/chai/chai-4.3.6.tgz
index 5f1dd8f1d..5f1dd8f1d 100644
--- a/cli/tests/testdata/npm/registry/chai/chai-4.3.6.tgz
+++ b/tests/testdata/npm/registry/chai/chai-4.3.6.tgz
Binary files differ
diff --git a/cli/tests/testdata/npm/registry/chai/registry.json b/tests/testdata/npm/registry/chai/registry.json
index 931e9dfc3..931e9dfc3 100644
--- a/cli/tests/testdata/npm/registry/chai/registry.json
+++ b/tests/testdata/npm/registry/chai/registry.json
diff --git a/cli/tests/testdata/npm/registry/chalk/chalk-4.1.2.tgz b/tests/testdata/npm/registry/chalk/chalk-4.1.2.tgz
index 8d34872c0..8d34872c0 100644
--- a/cli/tests/testdata/npm/registry/chalk/chalk-4.1.2.tgz
+++ b/tests/testdata/npm/registry/chalk/chalk-4.1.2.tgz
Binary files differ
diff --git a/cli/tests/testdata/npm/registry/chalk/chalk-5.0.1.tgz b/tests/testdata/npm/registry/chalk/chalk-5.0.1.tgz
index 01e179059..01e179059 100644
--- a/cli/tests/testdata/npm/registry/chalk/chalk-5.0.1.tgz
+++ b/tests/testdata/npm/registry/chalk/chalk-5.0.1.tgz
Binary files differ
diff --git a/cli/tests/testdata/npm/registry/chalk/registry.json b/tests/testdata/npm/registry/chalk/registry.json
index 65c4b0621..65c4b0621 100644
--- a/cli/tests/testdata/npm/registry/chalk/registry.json
+++ b/tests/testdata/npm/registry/chalk/registry.json
diff --git a/cli/tests/testdata/npm/registry/check-error/check-error-1.0.2.tgz b/tests/testdata/npm/registry/check-error/check-error-1.0.2.tgz
index eb5b02846..eb5b02846 100644
--- a/cli/tests/testdata/npm/registry/check-error/check-error-1.0.2.tgz
+++ b/tests/testdata/npm/registry/check-error/check-error-1.0.2.tgz
Binary files differ
diff --git a/cli/tests/testdata/npm/registry/check-error/registry.json b/tests/testdata/npm/registry/check-error/registry.json
index a0bc1c621..a0bc1c621 100644
--- a/cli/tests/testdata/npm/registry/check-error/registry.json
+++ b/tests/testdata/npm/registry/check-error/registry.json
diff --git a/cli/tests/testdata/npm/registry/cliui/cliui-6.0.0.tgz b/tests/testdata/npm/registry/cliui/cliui-6.0.0.tgz
index 8be5cdd96..8be5cdd96 100644
--- a/cli/tests/testdata/npm/registry/cliui/cliui-6.0.0.tgz
+++ b/tests/testdata/npm/registry/cliui/cliui-6.0.0.tgz
Binary files differ
diff --git a/cli/tests/testdata/npm/registry/cliui/registry.json b/tests/testdata/npm/registry/cliui/registry.json
index 273a71287..273a71287 100644
--- a/cli/tests/testdata/npm/registry/cliui/registry.json
+++ b/tests/testdata/npm/registry/cliui/registry.json
diff --git a/cli/tests/testdata/npm/registry/color-convert/color-convert-2.0.1.tgz b/tests/testdata/npm/registry/color-convert/color-convert-2.0.1.tgz
index f656c5d7f..f656c5d7f 100644
--- a/cli/tests/testdata/npm/registry/color-convert/color-convert-2.0.1.tgz
+++ b/tests/testdata/npm/registry/color-convert/color-convert-2.0.1.tgz
Binary files differ
diff --git a/cli/tests/testdata/npm/registry/color-convert/registry.json b/tests/testdata/npm/registry/color-convert/registry.json
index 261d04bac..261d04bac 100644
--- a/cli/tests/testdata/npm/registry/color-convert/registry.json
+++ b/tests/testdata/npm/registry/color-convert/registry.json
diff --git a/cli/tests/testdata/npm/registry/color-name/color-name-1.1.4.tgz b/tests/testdata/npm/registry/color-name/color-name-1.1.4.tgz
index 98fca076d..98fca076d 100644
--- a/cli/tests/testdata/npm/registry/color-name/color-name-1.1.4.tgz
+++ b/tests/testdata/npm/registry/color-name/color-name-1.1.4.tgz
Binary files differ
diff --git a/cli/tests/testdata/npm/registry/color-name/registry.json b/tests/testdata/npm/registry/color-name/registry.json
index 786b8df94..786b8df94 100644
--- a/cli/tests/testdata/npm/registry/color-name/registry.json
+++ b/tests/testdata/npm/registry/color-name/registry.json
diff --git a/cli/tests/testdata/npm/registry/cowsay/cowsay-1.5.0.tgz b/tests/testdata/npm/registry/cowsay/cowsay-1.5.0.tgz
index e78660fde..e78660fde 100644
--- a/cli/tests/testdata/npm/registry/cowsay/cowsay-1.5.0.tgz
+++ b/tests/testdata/npm/registry/cowsay/cowsay-1.5.0.tgz
Binary files differ
diff --git a/cli/tests/testdata/npm/registry/cowsay/registry.json b/tests/testdata/npm/registry/cowsay/registry.json
index d3c549124..d3c549124 100644
--- a/cli/tests/testdata/npm/registry/cowsay/registry.json
+++ b/tests/testdata/npm/registry/cowsay/registry.json
diff --git a/cli/tests/testdata/npm/registry/cpu-features/cpu-features-0.0.4.tgz b/tests/testdata/npm/registry/cpu-features/cpu-features-0.0.4.tgz
index b63b3cc3b..b63b3cc3b 100644
--- a/cli/tests/testdata/npm/registry/cpu-features/cpu-features-0.0.4.tgz
+++ b/tests/testdata/npm/registry/cpu-features/cpu-features-0.0.4.tgz
Binary files differ
diff --git a/cli/tests/testdata/npm/registry/cpu-features/registry.json b/tests/testdata/npm/registry/cpu-features/registry.json
index 5076d0060..5076d0060 100644
--- a/cli/tests/testdata/npm/registry/cpu-features/registry.json
+++ b/tests/testdata/npm/registry/cpu-features/registry.json
diff --git a/cli/tests/testdata/npm/registry/crypto-js/crypto-js-4.1.1.tgz b/tests/testdata/npm/registry/crypto-js/crypto-js-4.1.1.tgz
index d60fbc5db..d60fbc5db 100644
--- a/cli/tests/testdata/npm/registry/crypto-js/crypto-js-4.1.1.tgz
+++ b/tests/testdata/npm/registry/crypto-js/crypto-js-4.1.1.tgz
Binary files differ
diff --git a/cli/tests/testdata/npm/registry/crypto-js/registry.json b/tests/testdata/npm/registry/crypto-js/registry.json
index cbe46de2d..cbe46de2d 100644
--- a/cli/tests/testdata/npm/registry/crypto-js/registry.json
+++ b/tests/testdata/npm/registry/crypto-js/registry.json
diff --git a/cli/tests/testdata/npm/registry/csstype/csstype-2.6.20.tgz b/tests/testdata/npm/registry/csstype/csstype-2.6.20.tgz
index ecc42c27f..ecc42c27f 100644
--- a/cli/tests/testdata/npm/registry/csstype/csstype-2.6.20.tgz
+++ b/tests/testdata/npm/registry/csstype/csstype-2.6.20.tgz
Binary files differ
diff --git a/cli/tests/testdata/npm/registry/csstype/registry.json b/tests/testdata/npm/registry/csstype/registry.json
index 326499b7e..326499b7e 100644
--- a/cli/tests/testdata/npm/registry/csstype/registry.json
+++ b/tests/testdata/npm/registry/csstype/registry.json
diff --git a/cli/tests/testdata/npm/registry/decamelize/decamelize-1.2.0.tgz b/tests/testdata/npm/registry/decamelize/decamelize-1.2.0.tgz
index 8b51d0650..8b51d0650 100644
--- a/cli/tests/testdata/npm/registry/decamelize/decamelize-1.2.0.tgz
+++ b/tests/testdata/npm/registry/decamelize/decamelize-1.2.0.tgz
Binary files differ
diff --git a/cli/tests/testdata/npm/registry/decamelize/registry.json b/tests/testdata/npm/registry/decamelize/registry.json
index 6f2a465ab..6f2a465ab 100644
--- a/cli/tests/testdata/npm/registry/decamelize/registry.json
+++ b/tests/testdata/npm/registry/decamelize/registry.json
diff --git a/cli/tests/testdata/npm/registry/deep-eql/deep-eql-3.0.1.tgz b/tests/testdata/npm/registry/deep-eql/deep-eql-3.0.1.tgz
index 62f93692c..62f93692c 100644
--- a/cli/tests/testdata/npm/registry/deep-eql/deep-eql-3.0.1.tgz
+++ b/tests/testdata/npm/registry/deep-eql/deep-eql-3.0.1.tgz
Binary files differ
diff --git a/cli/tests/testdata/npm/registry/deep-eql/registry.json b/tests/testdata/npm/registry/deep-eql/registry.json
index fd3d887f8..fd3d887f8 100644
--- a/cli/tests/testdata/npm/registry/deep-eql/registry.json
+++ b/tests/testdata/npm/registry/deep-eql/registry.json
diff --git a/cli/tests/testdata/npm/registry/define-properties/define-properties-1.2.0.tgz b/tests/testdata/npm/registry/define-properties/define-properties-1.2.0.tgz
index 69b5e1875..69b5e1875 100644
--- a/cli/tests/testdata/npm/registry/define-properties/define-properties-1.2.0.tgz
+++ b/tests/testdata/npm/registry/define-properties/define-properties-1.2.0.tgz
Binary files differ
diff --git a/cli/tests/testdata/npm/registry/define-properties/registry.json b/tests/testdata/npm/registry/define-properties/registry.json
index f25eb5f05..f25eb5f05 100644
--- a/cli/tests/testdata/npm/registry/define-properties/registry.json
+++ b/tests/testdata/npm/registry/define-properties/registry.json
diff --git a/cli/tests/testdata/npm/registry/electron-to-chromium/electron-to-chromium-1.4.348.tgz b/tests/testdata/npm/registry/electron-to-chromium/electron-to-chromium-1.4.348.tgz
index 29485240b..29485240b 100644
--- a/cli/tests/testdata/npm/registry/electron-to-chromium/electron-to-chromium-1.4.348.tgz
+++ b/tests/testdata/npm/registry/electron-to-chromium/electron-to-chromium-1.4.348.tgz
Binary files differ
diff --git a/cli/tests/testdata/npm/registry/electron-to-chromium/registry.json b/tests/testdata/npm/registry/electron-to-chromium/registry.json
index 61dc31014..61dc31014 100644
--- a/cli/tests/testdata/npm/registry/electron-to-chromium/registry.json
+++ b/tests/testdata/npm/registry/electron-to-chromium/registry.json
diff --git a/cli/tests/testdata/npm/registry/emoji-regex/emoji-regex-8.0.0.tgz b/tests/testdata/npm/registry/emoji-regex/emoji-regex-8.0.0.tgz
index 2c77dccef..2c77dccef 100644
--- a/cli/tests/testdata/npm/registry/emoji-regex/emoji-regex-8.0.0.tgz
+++ b/tests/testdata/npm/registry/emoji-regex/emoji-regex-8.0.0.tgz
Binary files differ
diff --git a/cli/tests/testdata/npm/registry/emoji-regex/registry.json b/tests/testdata/npm/registry/emoji-regex/registry.json
index b3309bcfa..b3309bcfa 100644
--- a/cli/tests/testdata/npm/registry/emoji-regex/registry.json
+++ b/tests/testdata/npm/registry/emoji-regex/registry.json
diff --git a/cli/tests/testdata/npm/registry/escalade/escalade-3.1.1.tgz b/tests/testdata/npm/registry/escalade/escalade-3.1.1.tgz
index 56df047ab..56df047ab 100644
--- a/cli/tests/testdata/npm/registry/escalade/escalade-3.1.1.tgz
+++ b/tests/testdata/npm/registry/escalade/escalade-3.1.1.tgz
Binary files differ
diff --git a/cli/tests/testdata/npm/registry/escalade/registry.json b/tests/testdata/npm/registry/escalade/registry.json
index d7ff9cd39..d7ff9cd39 100644
--- a/cli/tests/testdata/npm/registry/escalade/registry.json
+++ b/tests/testdata/npm/registry/escalade/registry.json
diff --git a/cli/tests/testdata/npm/registry/estree-walker/estree-walker-2.0.2.tgz b/tests/testdata/npm/registry/estree-walker/estree-walker-2.0.2.tgz
index dd0fd457d..dd0fd457d 100644
--- a/cli/tests/testdata/npm/registry/estree-walker/estree-walker-2.0.2.tgz
+++ b/tests/testdata/npm/registry/estree-walker/estree-walker-2.0.2.tgz
Binary files differ
diff --git a/cli/tests/testdata/npm/registry/estree-walker/registry.json b/tests/testdata/npm/registry/estree-walker/registry.json
index 2e30c2169..2e30c2169 100644
--- a/cli/tests/testdata/npm/registry/estree-walker/registry.json
+++ b/tests/testdata/npm/registry/estree-walker/registry.json
diff --git a/cli/tests/testdata/npm/registry/fast-deep-equal/fast-deep-equal-3.1.3.tgz b/tests/testdata/npm/registry/fast-deep-equal/fast-deep-equal-3.1.3.tgz
index dbc9d8dcc..dbc9d8dcc 100644
--- a/cli/tests/testdata/npm/registry/fast-deep-equal/fast-deep-equal-3.1.3.tgz
+++ b/tests/testdata/npm/registry/fast-deep-equal/fast-deep-equal-3.1.3.tgz
Binary files differ
diff --git a/cli/tests/testdata/npm/registry/fast-deep-equal/registry.json b/tests/testdata/npm/registry/fast-deep-equal/registry.json
index 457e453b3..457e453b3 100644
--- a/cli/tests/testdata/npm/registry/fast-deep-equal/registry.json
+++ b/tests/testdata/npm/registry/fast-deep-equal/registry.json
diff --git a/cli/tests/testdata/npm/registry/find-up/find-up-4.1.0.tgz b/tests/testdata/npm/registry/find-up/find-up-4.1.0.tgz
index 92166bd31..92166bd31 100644
--- a/cli/tests/testdata/npm/registry/find-up/find-up-4.1.0.tgz
+++ b/tests/testdata/npm/registry/find-up/find-up-4.1.0.tgz
Binary files differ
diff --git a/cli/tests/testdata/npm/registry/find-up/registry.json b/tests/testdata/npm/registry/find-up/registry.json
index 61325e7ce..61325e7ce 100644
--- a/cli/tests/testdata/npm/registry/find-up/registry.json
+++ b/tests/testdata/npm/registry/find-up/registry.json
diff --git a/cli/tests/testdata/npm/registry/fraction.js/fraction.js-4.2.0.tgz b/tests/testdata/npm/registry/fraction.js/fraction.js-4.2.0.tgz
index 8bb9ec3b6..8bb9ec3b6 100644
--- a/cli/tests/testdata/npm/registry/fraction.js/fraction.js-4.2.0.tgz
+++ b/tests/testdata/npm/registry/fraction.js/fraction.js-4.2.0.tgz
Binary files differ
diff --git a/cli/tests/testdata/npm/registry/fraction.js/registry.json b/tests/testdata/npm/registry/fraction.js/registry.json
index fae0b27b7..fae0b27b7 100644
--- a/cli/tests/testdata/npm/registry/fraction.js/registry.json
+++ b/tests/testdata/npm/registry/fraction.js/registry.json
diff --git a/cli/tests/testdata/npm/registry/fs-extra/fs-extra-10.1.0.tgz b/tests/testdata/npm/registry/fs-extra/fs-extra-10.1.0.tgz
index 02cb6b891..02cb6b891 100644
--- a/cli/tests/testdata/npm/registry/fs-extra/fs-extra-10.1.0.tgz
+++ b/tests/testdata/npm/registry/fs-extra/fs-extra-10.1.0.tgz
Binary files differ
diff --git a/cli/tests/testdata/npm/registry/fs-extra/registry.json b/tests/testdata/npm/registry/fs-extra/registry.json
index b94c2feba..b94c2feba 100644
--- a/cli/tests/testdata/npm/registry/fs-extra/registry.json
+++ b/tests/testdata/npm/registry/fs-extra/registry.json
diff --git a/cli/tests/testdata/npm/registry/function-bind/function-bind-1.1.1.tgz b/tests/testdata/npm/registry/function-bind/function-bind-1.1.1.tgz
index 44bef1635..44bef1635 100644
--- a/cli/tests/testdata/npm/registry/function-bind/function-bind-1.1.1.tgz
+++ b/tests/testdata/npm/registry/function-bind/function-bind-1.1.1.tgz
Binary files differ
diff --git a/cli/tests/testdata/npm/registry/function-bind/registry.json b/tests/testdata/npm/registry/function-bind/registry.json
index b606d42f5..b606d42f5 100644
--- a/cli/tests/testdata/npm/registry/function-bind/registry.json
+++ b/tests/testdata/npm/registry/function-bind/registry.json
diff --git a/cli/tests/testdata/npm/registry/get-caller-file/get-caller-file-2.0.5.tgz b/tests/testdata/npm/registry/get-caller-file/get-caller-file-2.0.5.tgz
index 2df8b82e0..2df8b82e0 100644
--- a/cli/tests/testdata/npm/registry/get-caller-file/get-caller-file-2.0.5.tgz
+++ b/tests/testdata/npm/registry/get-caller-file/get-caller-file-2.0.5.tgz
Binary files differ
diff --git a/cli/tests/testdata/npm/registry/get-caller-file/registry.json b/tests/testdata/npm/registry/get-caller-file/registry.json
index ad4892978..ad4892978 100644
--- a/cli/tests/testdata/npm/registry/get-caller-file/registry.json
+++ b/tests/testdata/npm/registry/get-caller-file/registry.json
diff --git a/cli/tests/testdata/npm/registry/get-func-name/get-func-name-2.0.0.tgz b/tests/testdata/npm/registry/get-func-name/get-func-name-2.0.0.tgz
index 28705cc07..28705cc07 100644
--- a/cli/tests/testdata/npm/registry/get-func-name/get-func-name-2.0.0.tgz
+++ b/tests/testdata/npm/registry/get-func-name/get-func-name-2.0.0.tgz
Binary files differ
diff --git a/cli/tests/testdata/npm/registry/get-func-name/registry.json b/tests/testdata/npm/registry/get-func-name/registry.json
index 7f65ac9c0..7f65ac9c0 100644
--- a/cli/tests/testdata/npm/registry/get-func-name/registry.json
+++ b/tests/testdata/npm/registry/get-func-name/registry.json
diff --git a/cli/tests/testdata/npm/registry/get-intrinsic/get-intrinsic-1.2.0.tgz b/tests/testdata/npm/registry/get-intrinsic/get-intrinsic-1.2.0.tgz
index b55e814a0..b55e814a0 100644
--- a/cli/tests/testdata/npm/registry/get-intrinsic/get-intrinsic-1.2.0.tgz
+++ b/tests/testdata/npm/registry/get-intrinsic/get-intrinsic-1.2.0.tgz
Binary files differ
diff --git a/cli/tests/testdata/npm/registry/get-intrinsic/registry.json b/tests/testdata/npm/registry/get-intrinsic/registry.json
index b09a472f6..b09a472f6 100644
--- a/cli/tests/testdata/npm/registry/get-intrinsic/registry.json
+++ b/tests/testdata/npm/registry/get-intrinsic/registry.json
diff --git a/cli/tests/testdata/npm/registry/get-stdin/get-stdin-8.0.0.tgz b/tests/testdata/npm/registry/get-stdin/get-stdin-8.0.0.tgz
index 60dc7c66c..60dc7c66c 100644
--- a/cli/tests/testdata/npm/registry/get-stdin/get-stdin-8.0.0.tgz
+++ b/tests/testdata/npm/registry/get-stdin/get-stdin-8.0.0.tgz
Binary files differ
diff --git a/cli/tests/testdata/npm/registry/get-stdin/registry.json b/tests/testdata/npm/registry/get-stdin/registry.json
index d28eb15fb..d28eb15fb 100644
--- a/cli/tests/testdata/npm/registry/get-stdin/registry.json
+++ b/tests/testdata/npm/registry/get-stdin/registry.json
diff --git a/cli/tests/testdata/npm/registry/globals/globals-13.17.0.tgz b/tests/testdata/npm/registry/globals/globals-13.17.0.tgz
index de205587e..de205587e 100644
--- a/cli/tests/testdata/npm/registry/globals/globals-13.17.0.tgz
+++ b/tests/testdata/npm/registry/globals/globals-13.17.0.tgz
Binary files differ
diff --git a/cli/tests/testdata/npm/registry/globals/registry.json b/tests/testdata/npm/registry/globals/registry.json
index 0ffad6d66..0ffad6d66 100644
--- a/cli/tests/testdata/npm/registry/globals/registry.json
+++ b/tests/testdata/npm/registry/globals/registry.json
diff --git a/cli/tests/testdata/npm/registry/graceful-fs/graceful-fs-4.2.10.tgz b/tests/testdata/npm/registry/graceful-fs/graceful-fs-4.2.10.tgz
index 6f27e707c..6f27e707c 100644
--- a/cli/tests/testdata/npm/registry/graceful-fs/graceful-fs-4.2.10.tgz
+++ b/tests/testdata/npm/registry/graceful-fs/graceful-fs-4.2.10.tgz
Binary files differ
diff --git a/cli/tests/testdata/npm/registry/graceful-fs/registry.json b/tests/testdata/npm/registry/graceful-fs/registry.json
index 201501a5b..201501a5b 100644
--- a/cli/tests/testdata/npm/registry/graceful-fs/registry.json
+++ b/tests/testdata/npm/registry/graceful-fs/registry.json
diff --git a/cli/tests/testdata/npm/registry/has-flag/has-flag-4.0.0.tgz b/tests/testdata/npm/registry/has-flag/has-flag-4.0.0.tgz
index 509ae0c0f..509ae0c0f 100644
--- a/cli/tests/testdata/npm/registry/has-flag/has-flag-4.0.0.tgz
+++ b/tests/testdata/npm/registry/has-flag/has-flag-4.0.0.tgz
Binary files differ
diff --git a/cli/tests/testdata/npm/registry/has-flag/registry.json b/tests/testdata/npm/registry/has-flag/registry.json
index 6f3f70d94..6f3f70d94 100644
--- a/cli/tests/testdata/npm/registry/has-flag/registry.json
+++ b/tests/testdata/npm/registry/has-flag/registry.json
diff --git a/cli/tests/testdata/npm/registry/has-package-exports/has-package-exports-1.3.0.tgz b/tests/testdata/npm/registry/has-package-exports/has-package-exports-1.3.0.tgz
index 2069c9a10..2069c9a10 100644
--- a/cli/tests/testdata/npm/registry/has-package-exports/has-package-exports-1.3.0.tgz
+++ b/tests/testdata/npm/registry/has-package-exports/has-package-exports-1.3.0.tgz
Binary files differ
diff --git a/cli/tests/testdata/npm/registry/has-package-exports/registry.json b/tests/testdata/npm/registry/has-package-exports/registry.json
index f664bed54..f664bed54 100644
--- a/cli/tests/testdata/npm/registry/has-package-exports/registry.json
+++ b/tests/testdata/npm/registry/has-package-exports/registry.json
diff --git a/cli/tests/testdata/npm/registry/has-property-descriptors/has-property-descriptors-1.0.0.tgz b/tests/testdata/npm/registry/has-property-descriptors/has-property-descriptors-1.0.0.tgz
index ee60a4f9e..ee60a4f9e 100644
--- a/cli/tests/testdata/npm/registry/has-property-descriptors/has-property-descriptors-1.0.0.tgz
+++ b/tests/testdata/npm/registry/has-property-descriptors/has-property-descriptors-1.0.0.tgz
Binary files differ
diff --git a/cli/tests/testdata/npm/registry/has-property-descriptors/registry.json b/tests/testdata/npm/registry/has-property-descriptors/registry.json
index 6cc2fae10..6cc2fae10 100644
--- a/cli/tests/testdata/npm/registry/has-property-descriptors/registry.json
+++ b/tests/testdata/npm/registry/has-property-descriptors/registry.json
diff --git a/cli/tests/testdata/npm/registry/has-symbols/has-symbols-1.0.3.tgz b/tests/testdata/npm/registry/has-symbols/has-symbols-1.0.3.tgz
index a5f34be72..a5f34be72 100644
--- a/cli/tests/testdata/npm/registry/has-symbols/has-symbols-1.0.3.tgz
+++ b/tests/testdata/npm/registry/has-symbols/has-symbols-1.0.3.tgz
Binary files differ
diff --git a/cli/tests/testdata/npm/registry/has-symbols/registry.json b/tests/testdata/npm/registry/has-symbols/registry.json
index c8602cac7..c8602cac7 100644
--- a/cli/tests/testdata/npm/registry/has-symbols/registry.json
+++ b/tests/testdata/npm/registry/has-symbols/registry.json
diff --git a/cli/tests/testdata/npm/registry/has/has-1.0.3.tgz b/tests/testdata/npm/registry/has/has-1.0.3.tgz
index 90c33297e..90c33297e 100644
--- a/cli/tests/testdata/npm/registry/has/has-1.0.3.tgz
+++ b/tests/testdata/npm/registry/has/has-1.0.3.tgz
Binary files differ
diff --git a/cli/tests/testdata/npm/registry/has/registry.json b/tests/testdata/npm/registry/has/registry.json
index 137122e4a..137122e4a 100644
--- a/cli/tests/testdata/npm/registry/has/registry.json
+++ b/tests/testdata/npm/registry/has/registry.json
diff --git a/cli/tests/testdata/npm/registry/is-fullwidth-code-point/is-fullwidth-code-point-2.0.0.tgz b/tests/testdata/npm/registry/is-fullwidth-code-point/is-fullwidth-code-point-2.0.0.tgz
index 712d49d09..712d49d09 100644
--- a/cli/tests/testdata/npm/registry/is-fullwidth-code-point/is-fullwidth-code-point-2.0.0.tgz
+++ b/tests/testdata/npm/registry/is-fullwidth-code-point/is-fullwidth-code-point-2.0.0.tgz
Binary files differ
diff --git a/cli/tests/testdata/npm/registry/is-fullwidth-code-point/is-fullwidth-code-point-3.0.0.tgz b/tests/testdata/npm/registry/is-fullwidth-code-point/is-fullwidth-code-point-3.0.0.tgz
index 5009bc401..5009bc401 100644
--- a/cli/tests/testdata/npm/registry/is-fullwidth-code-point/is-fullwidth-code-point-3.0.0.tgz
+++ b/tests/testdata/npm/registry/is-fullwidth-code-point/is-fullwidth-code-point-3.0.0.tgz
Binary files differ
diff --git a/cli/tests/testdata/npm/registry/is-fullwidth-code-point/registry.json b/tests/testdata/npm/registry/is-fullwidth-code-point/registry.json
index f8503b377..f8503b377 100644
--- a/cli/tests/testdata/npm/registry/is-fullwidth-code-point/registry.json
+++ b/tests/testdata/npm/registry/is-fullwidth-code-point/registry.json
diff --git a/cli/tests/testdata/npm/registry/js-tokens/js-tokens-4.0.0.tgz b/tests/testdata/npm/registry/js-tokens/js-tokens-4.0.0.tgz
index 5a06ecbe8..5a06ecbe8 100644
--- a/cli/tests/testdata/npm/registry/js-tokens/js-tokens-4.0.0.tgz
+++ b/tests/testdata/npm/registry/js-tokens/js-tokens-4.0.0.tgz
Binary files differ
diff --git a/cli/tests/testdata/npm/registry/js-tokens/registry.json b/tests/testdata/npm/registry/js-tokens/registry.json
index b7a67c29e..b7a67c29e 100644
--- a/cli/tests/testdata/npm/registry/js-tokens/registry.json
+++ b/tests/testdata/npm/registry/js-tokens/registry.json
diff --git a/cli/tests/testdata/npm/registry/json-schema-traverse/json-schema-traverse-1.0.0.tgz b/tests/testdata/npm/registry/json-schema-traverse/json-schema-traverse-1.0.0.tgz
index ef3a92464..ef3a92464 100644
--- a/cli/tests/testdata/npm/registry/json-schema-traverse/json-schema-traverse-1.0.0.tgz
+++ b/tests/testdata/npm/registry/json-schema-traverse/json-schema-traverse-1.0.0.tgz
Binary files differ
diff --git a/cli/tests/testdata/npm/registry/json-schema-traverse/registry.json b/tests/testdata/npm/registry/json-schema-traverse/registry.json
index 3c6ef138b..3c6ef138b 100644
--- a/cli/tests/testdata/npm/registry/json-schema-traverse/registry.json
+++ b/tests/testdata/npm/registry/json-schema-traverse/registry.json
diff --git a/cli/tests/testdata/npm/registry/jsonfile/jsonfile-6.1.0.tgz b/tests/testdata/npm/registry/jsonfile/jsonfile-6.1.0.tgz
index a38a22598..a38a22598 100644
--- a/cli/tests/testdata/npm/registry/jsonfile/jsonfile-6.1.0.tgz
+++ b/tests/testdata/npm/registry/jsonfile/jsonfile-6.1.0.tgz
Binary files differ
diff --git a/cli/tests/testdata/npm/registry/jsonfile/registry.json b/tests/testdata/npm/registry/jsonfile/registry.json
index 480aa0466..480aa0466 100644
--- a/cli/tests/testdata/npm/registry/jsonfile/registry.json
+++ b/tests/testdata/npm/registry/jsonfile/registry.json
diff --git a/cli/tests/testdata/npm/registry/locate-path/locate-path-5.0.0.tgz b/tests/testdata/npm/registry/locate-path/locate-path-5.0.0.tgz
index b0af46ef5..b0af46ef5 100644
--- a/cli/tests/testdata/npm/registry/locate-path/locate-path-5.0.0.tgz
+++ b/tests/testdata/npm/registry/locate-path/locate-path-5.0.0.tgz
Binary files differ
diff --git a/cli/tests/testdata/npm/registry/locate-path/registry.json b/tests/testdata/npm/registry/locate-path/registry.json
index 0f9fac7bd..0f9fac7bd 100644
--- a/cli/tests/testdata/npm/registry/locate-path/registry.json
+++ b/tests/testdata/npm/registry/locate-path/registry.json
diff --git a/cli/tests/testdata/npm/registry/loose-envify/loose-envify-1.4.0.tgz b/tests/testdata/npm/registry/loose-envify/loose-envify-1.4.0.tgz
index cc1d1e415..cc1d1e415 100644
--- a/cli/tests/testdata/npm/registry/loose-envify/loose-envify-1.4.0.tgz
+++ b/tests/testdata/npm/registry/loose-envify/loose-envify-1.4.0.tgz
Binary files differ
diff --git a/cli/tests/testdata/npm/registry/loose-envify/registry.json b/tests/testdata/npm/registry/loose-envify/registry.json
index 37ff16f38..37ff16f38 100644
--- a/cli/tests/testdata/npm/registry/loose-envify/registry.json
+++ b/tests/testdata/npm/registry/loose-envify/registry.json
diff --git a/cli/tests/testdata/npm/registry/loupe/loupe-2.3.4.tgz b/tests/testdata/npm/registry/loupe/loupe-2.3.4.tgz
index 030649758..030649758 100644
--- a/cli/tests/testdata/npm/registry/loupe/loupe-2.3.4.tgz
+++ b/tests/testdata/npm/registry/loupe/loupe-2.3.4.tgz
Binary files differ
diff --git a/cli/tests/testdata/npm/registry/loupe/registry.json b/tests/testdata/npm/registry/loupe/registry.json
index 50df710e2..50df710e2 100644
--- a/cli/tests/testdata/npm/registry/loupe/registry.json
+++ b/tests/testdata/npm/registry/loupe/registry.json
diff --git a/cli/tests/testdata/npm/registry/magic-string/magic-string-0.25.9.tgz b/tests/testdata/npm/registry/magic-string/magic-string-0.25.9.tgz
index 20410aa3f..20410aa3f 100644
--- a/cli/tests/testdata/npm/registry/magic-string/magic-string-0.25.9.tgz
+++ b/tests/testdata/npm/registry/magic-string/magic-string-0.25.9.tgz
Binary files differ
diff --git a/cli/tests/testdata/npm/registry/magic-string/registry.json b/tests/testdata/npm/registry/magic-string/registry.json
index f69832980..f69832980 100644
--- a/cli/tests/testdata/npm/registry/magic-string/registry.json
+++ b/tests/testdata/npm/registry/magic-string/registry.json
diff --git a/cli/tests/testdata/npm/registry/mkdirp/mkdirp-1.0.4.tgz b/tests/testdata/npm/registry/mkdirp/mkdirp-1.0.4.tgz
index bf8eca6e2..bf8eca6e2 100644
--- a/cli/tests/testdata/npm/registry/mkdirp/mkdirp-1.0.4.tgz
+++ b/tests/testdata/npm/registry/mkdirp/mkdirp-1.0.4.tgz
Binary files differ
diff --git a/cli/tests/testdata/npm/registry/mkdirp/registry.json b/tests/testdata/npm/registry/mkdirp/registry.json
index 945147c1a..945147c1a 100644
--- a/cli/tests/testdata/npm/registry/mkdirp/registry.json
+++ b/tests/testdata/npm/registry/mkdirp/registry.json
diff --git a/cli/tests/testdata/npm/registry/nan/nan-2.16.0.tgz b/tests/testdata/npm/registry/nan/nan-2.16.0.tgz
index 26925e88a..26925e88a 100644
--- a/cli/tests/testdata/npm/registry/nan/nan-2.16.0.tgz
+++ b/tests/testdata/npm/registry/nan/nan-2.16.0.tgz
Binary files differ
diff --git a/cli/tests/testdata/npm/registry/nan/registry.json b/tests/testdata/npm/registry/nan/registry.json
index a26c7cd9f..a26c7cd9f 100644
--- a/cli/tests/testdata/npm/registry/nan/registry.json
+++ b/tests/testdata/npm/registry/nan/registry.json
diff --git a/cli/tests/testdata/npm/registry/nanoid/nanoid-3.3.4.tgz b/tests/testdata/npm/registry/nanoid/nanoid-3.3.4.tgz
index e5e4bb4a3..e5e4bb4a3 100644
--- a/cli/tests/testdata/npm/registry/nanoid/nanoid-3.3.4.tgz
+++ b/tests/testdata/npm/registry/nanoid/nanoid-3.3.4.tgz
Binary files differ
diff --git a/cli/tests/testdata/npm/registry/nanoid/registry.json b/tests/testdata/npm/registry/nanoid/registry.json
index 2e0a943cb..2e0a943cb 100644
--- a/cli/tests/testdata/npm/registry/nanoid/registry.json
+++ b/tests/testdata/npm/registry/nanoid/registry.json
diff --git a/cli/tests/testdata/npm/registry/node-releases/node-releases-2.0.10.tgz b/tests/testdata/npm/registry/node-releases/node-releases-2.0.10.tgz
index 077911115..077911115 100644
--- a/cli/tests/testdata/npm/registry/node-releases/node-releases-2.0.10.tgz
+++ b/tests/testdata/npm/registry/node-releases/node-releases-2.0.10.tgz
Binary files differ
diff --git a/cli/tests/testdata/npm/registry/node-releases/registry.json b/tests/testdata/npm/registry/node-releases/registry.json
index 46602c366..46602c366 100644
--- a/cli/tests/testdata/npm/registry/node-releases/registry.json
+++ b/tests/testdata/npm/registry/node-releases/registry.json
diff --git a/cli/tests/testdata/npm/registry/normalize-range/normalize-range-0.1.2.tgz b/tests/testdata/npm/registry/normalize-range/normalize-range-0.1.2.tgz
index 4747cd49e..4747cd49e 100644
--- a/cli/tests/testdata/npm/registry/normalize-range/normalize-range-0.1.2.tgz
+++ b/tests/testdata/npm/registry/normalize-range/normalize-range-0.1.2.tgz
Binary files differ
diff --git a/cli/tests/testdata/npm/registry/normalize-range/registry.json b/tests/testdata/npm/registry/normalize-range/registry.json
index 1222b80b9..1222b80b9 100644
--- a/cli/tests/testdata/npm/registry/normalize-range/registry.json
+++ b/tests/testdata/npm/registry/normalize-range/registry.json
diff --git a/cli/tests/testdata/npm/registry/object-keys/object-keys-1.1.1.tgz b/tests/testdata/npm/registry/object-keys/object-keys-1.1.1.tgz
index 3e52f10df..3e52f10df 100644
--- a/cli/tests/testdata/npm/registry/object-keys/object-keys-1.1.1.tgz
+++ b/tests/testdata/npm/registry/object-keys/object-keys-1.1.1.tgz
Binary files differ
diff --git a/cli/tests/testdata/npm/registry/object-keys/registry.json b/tests/testdata/npm/registry/object-keys/registry.json
index bbfedec12..bbfedec12 100644
--- a/cli/tests/testdata/npm/registry/object-keys/registry.json
+++ b/tests/testdata/npm/registry/object-keys/registry.json
diff --git a/cli/tests/testdata/npm/registry/p-limit/p-limit-2.3.0.tgz b/tests/testdata/npm/registry/p-limit/p-limit-2.3.0.tgz
index 2a7b2b386..2a7b2b386 100644
--- a/cli/tests/testdata/npm/registry/p-limit/p-limit-2.3.0.tgz
+++ b/tests/testdata/npm/registry/p-limit/p-limit-2.3.0.tgz
Binary files differ
diff --git a/cli/tests/testdata/npm/registry/p-limit/registry.json b/tests/testdata/npm/registry/p-limit/registry.json
index c6ec683fd..c6ec683fd 100644
--- a/cli/tests/testdata/npm/registry/p-limit/registry.json
+++ b/tests/testdata/npm/registry/p-limit/registry.json
diff --git a/cli/tests/testdata/npm/registry/p-locate/p-locate-4.1.0.tgz b/tests/testdata/npm/registry/p-locate/p-locate-4.1.0.tgz
index 15bb2f253..15bb2f253 100644
--- a/cli/tests/testdata/npm/registry/p-locate/p-locate-4.1.0.tgz
+++ b/tests/testdata/npm/registry/p-locate/p-locate-4.1.0.tgz
Binary files differ
diff --git a/cli/tests/testdata/npm/registry/p-locate/registry.json b/tests/testdata/npm/registry/p-locate/registry.json
index d9ff28bc7..d9ff28bc7 100644
--- a/cli/tests/testdata/npm/registry/p-locate/registry.json
+++ b/tests/testdata/npm/registry/p-locate/registry.json
diff --git a/cli/tests/testdata/npm/registry/p-try/p-try-2.2.0.tgz b/tests/testdata/npm/registry/p-try/p-try-2.2.0.tgz
index 058e57967..058e57967 100644
--- a/cli/tests/testdata/npm/registry/p-try/p-try-2.2.0.tgz
+++ b/tests/testdata/npm/registry/p-try/p-try-2.2.0.tgz
Binary files differ
diff --git a/cli/tests/testdata/npm/registry/p-try/registry.json b/tests/testdata/npm/registry/p-try/registry.json
index 511394563..511394563 100644
--- a/cli/tests/testdata/npm/registry/p-try/registry.json
+++ b/tests/testdata/npm/registry/p-try/registry.json
diff --git a/cli/tests/testdata/npm/registry/path-exists/path-exists-4.0.0.tgz b/tests/testdata/npm/registry/path-exists/path-exists-4.0.0.tgz
index eb702860d..eb702860d 100644
--- a/cli/tests/testdata/npm/registry/path-exists/path-exists-4.0.0.tgz
+++ b/tests/testdata/npm/registry/path-exists/path-exists-4.0.0.tgz
Binary files differ
diff --git a/cli/tests/testdata/npm/registry/path-exists/registry.json b/tests/testdata/npm/registry/path-exists/registry.json
index d363874d7..d363874d7 100644
--- a/cli/tests/testdata/npm/registry/path-exists/registry.json
+++ b/tests/testdata/npm/registry/path-exists/registry.json
diff --git a/cli/tests/testdata/npm/registry/pathval/pathval-1.1.1.tgz b/tests/testdata/npm/registry/pathval/pathval-1.1.1.tgz
index 270690cb3..270690cb3 100644
--- a/cli/tests/testdata/npm/registry/pathval/pathval-1.1.1.tgz
+++ b/tests/testdata/npm/registry/pathval/pathval-1.1.1.tgz
Binary files differ
diff --git a/cli/tests/testdata/npm/registry/pathval/registry.json b/tests/testdata/npm/registry/pathval/registry.json
index 9ea21129c..9ea21129c 100644
--- a/cli/tests/testdata/npm/registry/pathval/registry.json
+++ b/tests/testdata/npm/registry/pathval/registry.json
diff --git a/cli/tests/testdata/npm/registry/picocolors/picocolors-1.0.0.tgz b/tests/testdata/npm/registry/picocolors/picocolors-1.0.0.tgz
index d16f9ff2d..d16f9ff2d 100644
--- a/cli/tests/testdata/npm/registry/picocolors/picocolors-1.0.0.tgz
+++ b/tests/testdata/npm/registry/picocolors/picocolors-1.0.0.tgz
Binary files differ
diff --git a/cli/tests/testdata/npm/registry/picocolors/registry.json b/tests/testdata/npm/registry/picocolors/registry.json
index 3cfd4ee2b..3cfd4ee2b 100644
--- a/cli/tests/testdata/npm/registry/picocolors/registry.json
+++ b/tests/testdata/npm/registry/picocolors/registry.json
diff --git a/cli/tests/testdata/npm/registry/postcss-value-parser/postcss-value-parser-4.2.0.tgz b/tests/testdata/npm/registry/postcss-value-parser/postcss-value-parser-4.2.0.tgz
index a9fb27c1e..a9fb27c1e 100644
--- a/cli/tests/testdata/npm/registry/postcss-value-parser/postcss-value-parser-4.2.0.tgz
+++ b/tests/testdata/npm/registry/postcss-value-parser/postcss-value-parser-4.2.0.tgz
Binary files differ
diff --git a/cli/tests/testdata/npm/registry/postcss-value-parser/registry.json b/tests/testdata/npm/registry/postcss-value-parser/registry.json
index fd8eb2aa0..fd8eb2aa0 100644
--- a/cli/tests/testdata/npm/registry/postcss-value-parser/registry.json
+++ b/tests/testdata/npm/registry/postcss-value-parser/registry.json
diff --git a/cli/tests/testdata/npm/registry/postcss/postcss-8.4.16.tgz b/tests/testdata/npm/registry/postcss/postcss-8.4.16.tgz
index 007e88abf..007e88abf 100644
--- a/cli/tests/testdata/npm/registry/postcss/postcss-8.4.16.tgz
+++ b/tests/testdata/npm/registry/postcss/postcss-8.4.16.tgz
Binary files differ
diff --git a/cli/tests/testdata/npm/registry/postcss/registry.json b/tests/testdata/npm/registry/postcss/registry.json
index 046eb3066..046eb3066 100644
--- a/cli/tests/testdata/npm/registry/postcss/registry.json
+++ b/tests/testdata/npm/registry/postcss/registry.json
diff --git a/cli/tests/testdata/npm/registry/punycode/punycode-2.1.1.tgz b/tests/testdata/npm/registry/punycode/punycode-2.1.1.tgz
index 575229dc5..575229dc5 100644
--- a/cli/tests/testdata/npm/registry/punycode/punycode-2.1.1.tgz
+++ b/tests/testdata/npm/registry/punycode/punycode-2.1.1.tgz
Binary files differ
diff --git a/cli/tests/testdata/npm/registry/punycode/registry.json b/tests/testdata/npm/registry/punycode/registry.json
index f1dd9cb95..f1dd9cb95 100644
--- a/cli/tests/testdata/npm/registry/punycode/registry.json
+++ b/tests/testdata/npm/registry/punycode/registry.json
diff --git a/cli/tests/testdata/npm/registry/react-dom/react-dom-18.2.0.tgz b/tests/testdata/npm/registry/react-dom/react-dom-18.2.0.tgz
index 9fb92cb2e..9fb92cb2e 100644
--- a/cli/tests/testdata/npm/registry/react-dom/react-dom-18.2.0.tgz
+++ b/tests/testdata/npm/registry/react-dom/react-dom-18.2.0.tgz
Binary files differ
diff --git a/cli/tests/testdata/npm/registry/react-dom/registry.json b/tests/testdata/npm/registry/react-dom/registry.json
index 177f93527..177f93527 100644
--- a/cli/tests/testdata/npm/registry/react-dom/registry.json
+++ b/tests/testdata/npm/registry/react-dom/registry.json
diff --git a/cli/tests/testdata/npm/registry/react/react-18.2.0.tgz b/tests/testdata/npm/registry/react/react-18.2.0.tgz
index 6cb2cb98c..6cb2cb98c 100644
--- a/cli/tests/testdata/npm/registry/react/react-18.2.0.tgz
+++ b/tests/testdata/npm/registry/react/react-18.2.0.tgz
Binary files differ
diff --git a/cli/tests/testdata/npm/registry/react/registry.json b/tests/testdata/npm/registry/react/registry.json
index 3bbccd0c0..3bbccd0c0 100644
--- a/cli/tests/testdata/npm/registry/react/registry.json
+++ b/tests/testdata/npm/registry/react/registry.json
diff --git a/cli/tests/testdata/npm/registry/require-directory/registry.json b/tests/testdata/npm/registry/require-directory/registry.json
index 49b6c318d..49b6c318d 100644
--- a/cli/tests/testdata/npm/registry/require-directory/registry.json
+++ b/tests/testdata/npm/registry/require-directory/registry.json
diff --git a/cli/tests/testdata/npm/registry/require-directory/require-directory-2.1.1.tgz b/tests/testdata/npm/registry/require-directory/require-directory-2.1.1.tgz
index ce48f4895..ce48f4895 100644
--- a/cli/tests/testdata/npm/registry/require-directory/require-directory-2.1.1.tgz
+++ b/tests/testdata/npm/registry/require-directory/require-directory-2.1.1.tgz
Binary files differ
diff --git a/cli/tests/testdata/npm/registry/require-from-string/registry.json b/tests/testdata/npm/registry/require-from-string/registry.json
index a348e30df..a348e30df 100644
--- a/cli/tests/testdata/npm/registry/require-from-string/registry.json
+++ b/tests/testdata/npm/registry/require-from-string/registry.json
diff --git a/cli/tests/testdata/npm/registry/require-from-string/require-from-string-2.0.2.tgz b/tests/testdata/npm/registry/require-from-string/require-from-string-2.0.2.tgz
index 918da97ed..918da97ed 100644
--- a/cli/tests/testdata/npm/registry/require-from-string/require-from-string-2.0.2.tgz
+++ b/tests/testdata/npm/registry/require-from-string/require-from-string-2.0.2.tgz
Binary files differ
diff --git a/cli/tests/testdata/npm/registry/require-main-filename/registry.json b/tests/testdata/npm/registry/require-main-filename/registry.json
index b2c6f2edd..b2c6f2edd 100644
--- a/cli/tests/testdata/npm/registry/require-main-filename/registry.json
+++ b/tests/testdata/npm/registry/require-main-filename/registry.json
diff --git a/cli/tests/testdata/npm/registry/require-main-filename/require-main-filename-2.0.0.tgz b/tests/testdata/npm/registry/require-main-filename/require-main-filename-2.0.0.tgz
index 88daf52ed..88daf52ed 100644
--- a/cli/tests/testdata/npm/registry/require-main-filename/require-main-filename-2.0.0.tgz
+++ b/tests/testdata/npm/registry/require-main-filename/require-main-filename-2.0.0.tgz
Binary files differ
diff --git a/cli/tests/testdata/npm/registry/safer-buffer/registry.json b/tests/testdata/npm/registry/safer-buffer/registry.json
index a992a08a6..a992a08a6 100644
--- a/cli/tests/testdata/npm/registry/safer-buffer/registry.json
+++ b/tests/testdata/npm/registry/safer-buffer/registry.json
diff --git a/cli/tests/testdata/npm/registry/safer-buffer/safer-buffer-2.1.2.tgz b/tests/testdata/npm/registry/safer-buffer/safer-buffer-2.1.2.tgz
index ca15817bb..ca15817bb 100644
--- a/cli/tests/testdata/npm/registry/safer-buffer/safer-buffer-2.1.2.tgz
+++ b/tests/testdata/npm/registry/safer-buffer/safer-buffer-2.1.2.tgz
Binary files differ
diff --git a/cli/tests/testdata/npm/registry/scheduler/registry.json b/tests/testdata/npm/registry/scheduler/registry.json
index 02b5fb3c6..02b5fb3c6 100644
--- a/cli/tests/testdata/npm/registry/scheduler/registry.json
+++ b/tests/testdata/npm/registry/scheduler/registry.json
diff --git a/cli/tests/testdata/npm/registry/scheduler/scheduler-0.23.0.tgz b/tests/testdata/npm/registry/scheduler/scheduler-0.23.0.tgz
index 23561b07c..23561b07c 100644
--- a/cli/tests/testdata/npm/registry/scheduler/scheduler-0.23.0.tgz
+++ b/tests/testdata/npm/registry/scheduler/scheduler-0.23.0.tgz
Binary files differ
diff --git a/cli/tests/testdata/npm/registry/set-blocking/registry.json b/tests/testdata/npm/registry/set-blocking/registry.json
index 9ca16a014..9ca16a014 100644
--- a/cli/tests/testdata/npm/registry/set-blocking/registry.json
+++ b/tests/testdata/npm/registry/set-blocking/registry.json
diff --git a/cli/tests/testdata/npm/registry/set-blocking/set-blocking-2.0.0.tgz b/tests/testdata/npm/registry/set-blocking/set-blocking-2.0.0.tgz
index 2f61349cc..2f61349cc 100644
--- a/cli/tests/testdata/npm/registry/set-blocking/set-blocking-2.0.0.tgz
+++ b/tests/testdata/npm/registry/set-blocking/set-blocking-2.0.0.tgz
Binary files differ
diff --git a/cli/tests/testdata/npm/registry/source-map-js/registry.json b/tests/testdata/npm/registry/source-map-js/registry.json
index d91922c97..d91922c97 100644
--- a/cli/tests/testdata/npm/registry/source-map-js/registry.json
+++ b/tests/testdata/npm/registry/source-map-js/registry.json
diff --git a/cli/tests/testdata/npm/registry/source-map-js/source-map-js-1.0.2.tgz b/tests/testdata/npm/registry/source-map-js/source-map-js-1.0.2.tgz
index 518aeeb7d..518aeeb7d 100644
--- a/cli/tests/testdata/npm/registry/source-map-js/source-map-js-1.0.2.tgz
+++ b/tests/testdata/npm/registry/source-map-js/source-map-js-1.0.2.tgz
Binary files differ
diff --git a/cli/tests/testdata/npm/registry/source-map/registry.json b/tests/testdata/npm/registry/source-map/registry.json
index 6dd57b84f..6dd57b84f 100644
--- a/cli/tests/testdata/npm/registry/source-map/registry.json
+++ b/tests/testdata/npm/registry/source-map/registry.json
diff --git a/cli/tests/testdata/npm/registry/source-map/source-map-0.6.1.tgz b/tests/testdata/npm/registry/source-map/source-map-0.6.1.tgz
index 7833490ca..7833490ca 100644
--- a/cli/tests/testdata/npm/registry/source-map/source-map-0.6.1.tgz
+++ b/tests/testdata/npm/registry/source-map/source-map-0.6.1.tgz
Binary files differ
diff --git a/cli/tests/testdata/npm/registry/sourcemap-codec/registry.json b/tests/testdata/npm/registry/sourcemap-codec/registry.json
index 8f7c5bb88..8f7c5bb88 100644
--- a/cli/tests/testdata/npm/registry/sourcemap-codec/registry.json
+++ b/tests/testdata/npm/registry/sourcemap-codec/registry.json
diff --git a/cli/tests/testdata/npm/registry/sourcemap-codec/sourcemap-codec-1.4.8.tgz b/tests/testdata/npm/registry/sourcemap-codec/sourcemap-codec-1.4.8.tgz
index 9be3ae95d..9be3ae95d 100644
--- a/cli/tests/testdata/npm/registry/sourcemap-codec/sourcemap-codec-1.4.8.tgz
+++ b/tests/testdata/npm/registry/sourcemap-codec/sourcemap-codec-1.4.8.tgz
Binary files differ
diff --git a/cli/tests/testdata/npm/registry/ssh2/registry.json b/tests/testdata/npm/registry/ssh2/registry.json
index 3c8a38c69..3c8a38c69 100644
--- a/cli/tests/testdata/npm/registry/ssh2/registry.json
+++ b/tests/testdata/npm/registry/ssh2/registry.json
diff --git a/cli/tests/testdata/npm/registry/ssh2/ssh2-1.11.0.tgz b/tests/testdata/npm/registry/ssh2/ssh2-1.11.0.tgz
index 661eb6b3d..661eb6b3d 100644
--- a/cli/tests/testdata/npm/registry/ssh2/ssh2-1.11.0.tgz
+++ b/tests/testdata/npm/registry/ssh2/ssh2-1.11.0.tgz
Binary files differ
diff --git a/cli/tests/testdata/npm/registry/string-width/registry.json b/tests/testdata/npm/registry/string-width/registry.json
index 2c634b154..2c634b154 100644
--- a/cli/tests/testdata/npm/registry/string-width/registry.json
+++ b/tests/testdata/npm/registry/string-width/registry.json
diff --git a/cli/tests/testdata/npm/registry/string-width/string-width-2.1.1.tgz b/tests/testdata/npm/registry/string-width/string-width-2.1.1.tgz
index e698b1bec..e698b1bec 100644
--- a/cli/tests/testdata/npm/registry/string-width/string-width-2.1.1.tgz
+++ b/tests/testdata/npm/registry/string-width/string-width-2.1.1.tgz
Binary files differ
diff --git a/cli/tests/testdata/npm/registry/string-width/string-width-4.2.3.tgz b/tests/testdata/npm/registry/string-width/string-width-4.2.3.tgz
index a62235171..a62235171 100644
--- a/cli/tests/testdata/npm/registry/string-width/string-width-4.2.3.tgz
+++ b/tests/testdata/npm/registry/string-width/string-width-4.2.3.tgz
Binary files differ
diff --git a/cli/tests/testdata/npm/registry/strip-ansi/registry.json b/tests/testdata/npm/registry/strip-ansi/registry.json
index ddccbdb99..ddccbdb99 100644
--- a/cli/tests/testdata/npm/registry/strip-ansi/registry.json
+++ b/tests/testdata/npm/registry/strip-ansi/registry.json
diff --git a/cli/tests/testdata/npm/registry/strip-ansi/strip-ansi-4.0.0.tgz b/tests/testdata/npm/registry/strip-ansi/strip-ansi-4.0.0.tgz
index 94b6f2533..94b6f2533 100644
--- a/cli/tests/testdata/npm/registry/strip-ansi/strip-ansi-4.0.0.tgz
+++ b/tests/testdata/npm/registry/strip-ansi/strip-ansi-4.0.0.tgz
Binary files differ
diff --git a/cli/tests/testdata/npm/registry/strip-ansi/strip-ansi-6.0.1.tgz b/tests/testdata/npm/registry/strip-ansi/strip-ansi-6.0.1.tgz
index 14041ae05..14041ae05 100644
--- a/cli/tests/testdata/npm/registry/strip-ansi/strip-ansi-6.0.1.tgz
+++ b/tests/testdata/npm/registry/strip-ansi/strip-ansi-6.0.1.tgz
Binary files differ
diff --git a/cli/tests/testdata/npm/registry/strip-final-newline/registry.json b/tests/testdata/npm/registry/strip-final-newline/registry.json
index 67fe7b81e..67fe7b81e 100644
--- a/cli/tests/testdata/npm/registry/strip-final-newline/registry.json
+++ b/tests/testdata/npm/registry/strip-final-newline/registry.json
diff --git a/cli/tests/testdata/npm/registry/strip-final-newline/strip-final-newline-2.0.0.tgz b/tests/testdata/npm/registry/strip-final-newline/strip-final-newline-2.0.0.tgz
index 97ab3f643..97ab3f643 100644
--- a/cli/tests/testdata/npm/registry/strip-final-newline/strip-final-newline-2.0.0.tgz
+++ b/tests/testdata/npm/registry/strip-final-newline/strip-final-newline-2.0.0.tgz
Binary files differ
diff --git a/cli/tests/testdata/npm/registry/supports-color/registry.json b/tests/testdata/npm/registry/supports-color/registry.json
index 2853617f3..2853617f3 100644
--- a/cli/tests/testdata/npm/registry/supports-color/registry.json
+++ b/tests/testdata/npm/registry/supports-color/registry.json
diff --git a/cli/tests/testdata/npm/registry/supports-color/supports-color-7.2.0.tgz b/tests/testdata/npm/registry/supports-color/supports-color-7.2.0.tgz
index 07183d297..07183d297 100644
--- a/cli/tests/testdata/npm/registry/supports-color/supports-color-7.2.0.tgz
+++ b/tests/testdata/npm/registry/supports-color/supports-color-7.2.0.tgz
Binary files differ
diff --git a/cli/tests/testdata/npm/registry/supports-esm/registry.json b/tests/testdata/npm/registry/supports-esm/registry.json
index 0114ddad4..0114ddad4 100644
--- a/cli/tests/testdata/npm/registry/supports-esm/registry.json
+++ b/tests/testdata/npm/registry/supports-esm/registry.json
diff --git a/cli/tests/testdata/npm/registry/supports-esm/supports-esm-1.0.0.tgz b/tests/testdata/npm/registry/supports-esm/supports-esm-1.0.0.tgz
index 64e085fa3..64e085fa3 100644
--- a/cli/tests/testdata/npm/registry/supports-esm/supports-esm-1.0.0.tgz
+++ b/tests/testdata/npm/registry/supports-esm/supports-esm-1.0.0.tgz
Binary files differ
diff --git a/cli/tests/testdata/npm/registry/tweetnacl/registry.json b/tests/testdata/npm/registry/tweetnacl/registry.json
index 7ab22ff73..7ab22ff73 100644
--- a/cli/tests/testdata/npm/registry/tweetnacl/registry.json
+++ b/tests/testdata/npm/registry/tweetnacl/registry.json
diff --git a/cli/tests/testdata/npm/registry/tweetnacl/tweetnacl-0.14.5.tgz b/tests/testdata/npm/registry/tweetnacl/tweetnacl-0.14.5.tgz
index c2955148e..c2955148e 100644
--- a/cli/tests/testdata/npm/registry/tweetnacl/tweetnacl-0.14.5.tgz
+++ b/tests/testdata/npm/registry/tweetnacl/tweetnacl-0.14.5.tgz
Binary files differ
diff --git a/cli/tests/testdata/npm/registry/type-detect/registry.json b/tests/testdata/npm/registry/type-detect/registry.json
index 8a335f240..8a335f240 100644
--- a/cli/tests/testdata/npm/registry/type-detect/registry.json
+++ b/tests/testdata/npm/registry/type-detect/registry.json
diff --git a/cli/tests/testdata/npm/registry/type-detect/type-detect-4.0.8.tgz b/tests/testdata/npm/registry/type-detect/type-detect-4.0.8.tgz
index a8f95abf8..a8f95abf8 100644
--- a/cli/tests/testdata/npm/registry/type-detect/type-detect-4.0.8.tgz
+++ b/tests/testdata/npm/registry/type-detect/type-detect-4.0.8.tgz
Binary files differ
diff --git a/cli/tests/testdata/npm/registry/type-fest/registry.json b/tests/testdata/npm/registry/type-fest/registry.json
index ea1ff9b7e..ea1ff9b7e 100644
--- a/cli/tests/testdata/npm/registry/type-fest/registry.json
+++ b/tests/testdata/npm/registry/type-fest/registry.json
diff --git a/cli/tests/testdata/npm/registry/type-fest/type-fest-0.20.2.tgz b/tests/testdata/npm/registry/type-fest/type-fest-0.20.2.tgz
index 0ac67554d..0ac67554d 100644
--- a/cli/tests/testdata/npm/registry/type-fest/type-fest-0.20.2.tgz
+++ b/tests/testdata/npm/registry/type-fest/type-fest-0.20.2.tgz
Binary files differ
diff --git a/cli/tests/testdata/npm/registry/universalify/registry.json b/tests/testdata/npm/registry/universalify/registry.json
index 4331737c1..4331737c1 100644
--- a/cli/tests/testdata/npm/registry/universalify/registry.json
+++ b/tests/testdata/npm/registry/universalify/registry.json
diff --git a/cli/tests/testdata/npm/registry/universalify/universalify-2.0.0.tgz b/tests/testdata/npm/registry/universalify/universalify-2.0.0.tgz
index 2b9ae90b2..2b9ae90b2 100644
--- a/cli/tests/testdata/npm/registry/universalify/universalify-2.0.0.tgz
+++ b/tests/testdata/npm/registry/universalify/universalify-2.0.0.tgz
Binary files differ
diff --git a/cli/tests/testdata/npm/registry/update-browserslist-db/registry.json b/tests/testdata/npm/registry/update-browserslist-db/registry.json
index 820a404e1..820a404e1 100644
--- a/cli/tests/testdata/npm/registry/update-browserslist-db/registry.json
+++ b/tests/testdata/npm/registry/update-browserslist-db/registry.json
diff --git a/cli/tests/testdata/npm/registry/update-browserslist-db/update-browserslist-db-1.0.10.tgz b/tests/testdata/npm/registry/update-browserslist-db/update-browserslist-db-1.0.10.tgz
index e479fb923..e479fb923 100644
--- a/cli/tests/testdata/npm/registry/update-browserslist-db/update-browserslist-db-1.0.10.tgz
+++ b/tests/testdata/npm/registry/update-browserslist-db/update-browserslist-db-1.0.10.tgz
Binary files differ
diff --git a/cli/tests/testdata/npm/registry/uri-js/registry.json b/tests/testdata/npm/registry/uri-js/registry.json
index af182d9d7..af182d9d7 100644
--- a/cli/tests/testdata/npm/registry/uri-js/registry.json
+++ b/tests/testdata/npm/registry/uri-js/registry.json
diff --git a/cli/tests/testdata/npm/registry/uri-js/uri-js-4.4.1.tgz b/tests/testdata/npm/registry/uri-js/uri-js-4.4.1.tgz
index 9886fbe4d..9886fbe4d 100644
--- a/cli/tests/testdata/npm/registry/uri-js/uri-js-4.4.1.tgz
+++ b/tests/testdata/npm/registry/uri-js/uri-js-4.4.1.tgz
Binary files differ
diff --git a/cli/tests/testdata/npm/registry/vue/registry.json b/tests/testdata/npm/registry/vue/registry.json
index 4a600902f..4a600902f 100644
--- a/cli/tests/testdata/npm/registry/vue/registry.json
+++ b/tests/testdata/npm/registry/vue/registry.json
diff --git a/cli/tests/testdata/npm/registry/vue/vue-3.2.38.tgz b/tests/testdata/npm/registry/vue/vue-3.2.38.tgz
index 5e9453cd4..5e9453cd4 100644
--- a/cli/tests/testdata/npm/registry/vue/vue-3.2.38.tgz
+++ b/tests/testdata/npm/registry/vue/vue-3.2.38.tgz
Binary files differ
diff --git a/cli/tests/testdata/npm/registry/which-module/registry.json b/tests/testdata/npm/registry/which-module/registry.json
index 432f5ac7b..432f5ac7b 100644
--- a/cli/tests/testdata/npm/registry/which-module/registry.json
+++ b/tests/testdata/npm/registry/which-module/registry.json
diff --git a/cli/tests/testdata/npm/registry/which-module/which-module-2.0.0.tgz b/tests/testdata/npm/registry/which-module/which-module-2.0.0.tgz
index 8a8bb3238..8a8bb3238 100644
--- a/cli/tests/testdata/npm/registry/which-module/which-module-2.0.0.tgz
+++ b/tests/testdata/npm/registry/which-module/which-module-2.0.0.tgz
Binary files differ
diff --git a/cli/tests/testdata/npm/registry/wrap-ansi/registry.json b/tests/testdata/npm/registry/wrap-ansi/registry.json
index 3297b213f..3297b213f 100644
--- a/cli/tests/testdata/npm/registry/wrap-ansi/registry.json
+++ b/tests/testdata/npm/registry/wrap-ansi/registry.json
diff --git a/cli/tests/testdata/npm/registry/wrap-ansi/wrap-ansi-6.2.0.tgz b/tests/testdata/npm/registry/wrap-ansi/wrap-ansi-6.2.0.tgz
index bed5c97e6..bed5c97e6 100644
--- a/cli/tests/testdata/npm/registry/wrap-ansi/wrap-ansi-6.2.0.tgz
+++ b/tests/testdata/npm/registry/wrap-ansi/wrap-ansi-6.2.0.tgz
Binary files differ
diff --git a/cli/tests/testdata/npm/registry/y18n/registry.json b/tests/testdata/npm/registry/y18n/registry.json
index 179b763e0..179b763e0 100644
--- a/cli/tests/testdata/npm/registry/y18n/registry.json
+++ b/tests/testdata/npm/registry/y18n/registry.json
diff --git a/cli/tests/testdata/npm/registry/y18n/y18n-4.0.3.tgz b/tests/testdata/npm/registry/y18n/y18n-4.0.3.tgz
index 390ae5b2b..390ae5b2b 100644
--- a/cli/tests/testdata/npm/registry/y18n/y18n-4.0.3.tgz
+++ b/tests/testdata/npm/registry/y18n/y18n-4.0.3.tgz
Binary files differ
diff --git a/cli/tests/testdata/npm/registry/yargs-parser/registry.json b/tests/testdata/npm/registry/yargs-parser/registry.json
index c877f7fd0..c877f7fd0 100644
--- a/cli/tests/testdata/npm/registry/yargs-parser/registry.json
+++ b/tests/testdata/npm/registry/yargs-parser/registry.json
diff --git a/cli/tests/testdata/npm/registry/yargs-parser/yargs-parser-18.1.3.tgz b/tests/testdata/npm/registry/yargs-parser/yargs-parser-18.1.3.tgz
index 6824ba401..6824ba401 100644
--- a/cli/tests/testdata/npm/registry/yargs-parser/yargs-parser-18.1.3.tgz
+++ b/tests/testdata/npm/registry/yargs-parser/yargs-parser-18.1.3.tgz
Binary files differ
diff --git a/cli/tests/testdata/npm/registry/yargs/registry.json b/tests/testdata/npm/registry/yargs/registry.json
index 717d8801e..717d8801e 100644
--- a/cli/tests/testdata/npm/registry/yargs/registry.json
+++ b/tests/testdata/npm/registry/yargs/registry.json
diff --git a/cli/tests/testdata/npm/registry/yargs/yargs-15.4.1.tgz b/tests/testdata/npm/registry/yargs/yargs-15.4.1.tgz
index fe9253139..fe9253139 100644
--- a/cli/tests/testdata/npm/registry/yargs/yargs-15.4.1.tgz
+++ b/tests/testdata/npm/registry/yargs/yargs-15.4.1.tgz
Binary files differ
diff --git a/cli/tests/testdata/npm/reload/main.ts b/tests/testdata/npm/reload/main.ts
index 1ccc441a1..1ccc441a1 100644
--- a/cli/tests/testdata/npm/reload/main.ts
+++ b/tests/testdata/npm/reload/main.ts
diff --git a/cli/tests/testdata/npm/remote_npm_specifier/main.out b/tests/testdata/npm/remote_npm_specifier/main.out
index 9daeafb98..9daeafb98 100644
--- a/cli/tests/testdata/npm/remote_npm_specifier/main.out
+++ b/tests/testdata/npm/remote_npm_specifier/main.out
diff --git a/cli/tests/testdata/npm/remote_npm_specifier/main.ts b/tests/testdata/npm/remote_npm_specifier/main.ts
index 20a99b688..20a99b688 100644
--- a/cli/tests/testdata/npm/remote_npm_specifier/main.ts
+++ b/tests/testdata/npm/remote_npm_specifier/main.ts
diff --git a/cli/tests/testdata/npm/remote_npm_specifier/remote.ts b/tests/testdata/npm/remote_npm_specifier/remote.ts
index 923ed3ed8..923ed3ed8 100644
--- a/cli/tests/testdata/npm/remote_npm_specifier/remote.ts
+++ b/tests/testdata/npm/remote_npm_specifier/remote.ts
diff --git a/cli/tests/testdata/npm/require_added_nm_folder/main.js b/tests/testdata/npm/require_added_nm_folder/main.js
index 723b2023a..723b2023a 100644
--- a/cli/tests/testdata/npm/require_added_nm_folder/main.js
+++ b/tests/testdata/npm/require_added_nm_folder/main.js
diff --git a/cli/tests/testdata/npm/require_added_nm_folder/main.out b/tests/testdata/npm/require_added_nm_folder/main.out
index 7ed6ff82d..7ed6ff82d 100644
--- a/cli/tests/testdata/npm/require_added_nm_folder/main.out
+++ b/tests/testdata/npm/require_added_nm_folder/main.out
diff --git a/cli/tests/testdata/npm/require_json/main.js b/tests/testdata/npm/require_json/main.js
index d11e85305..d11e85305 100644
--- a/cli/tests/testdata/npm/require_json/main.js
+++ b/tests/testdata/npm/require_json/main.js
diff --git a/cli/tests/testdata/npm/require_json/main.out b/tests/testdata/npm/require_json/main.out
index 97db68e1b..97db68e1b 100644
--- a/cli/tests/testdata/npm/require_json/main.out
+++ b/tests/testdata/npm/require_json/main.out
diff --git a/cli/tests/testdata/npm/require_main/main.js b/tests/testdata/npm/require_main/main.js
index ddecd4fdb..ddecd4fdb 100644
--- a/cli/tests/testdata/npm/require_main/main.js
+++ b/tests/testdata/npm/require_main/main.js
diff --git a/cli/tests/testdata/npm/require_main/main.out b/tests/testdata/npm/require_main/main.out
index e2dbde096..e2dbde096 100644
--- a/cli/tests/testdata/npm/require_main/main.out
+++ b/tests/testdata/npm/require_main/main.out
diff --git a/cli/tests/testdata/npm/require_resolve_url/package.json b/tests/testdata/npm/require_resolve_url/package.json
index 814c77a5b..814c77a5b 100644
--- a/cli/tests/testdata/npm/require_resolve_url/package.json
+++ b/tests/testdata/npm/require_resolve_url/package.json
diff --git a/cli/tests/testdata/npm/require_resolve_url/url_paths.out b/tests/testdata/npm/require_resolve_url/url_paths.out
index 404d7dcba..404d7dcba 100644
--- a/cli/tests/testdata/npm/require_resolve_url/url_paths.out
+++ b/tests/testdata/npm/require_resolve_url/url_paths.out
diff --git a/cli/tests/testdata/npm/require_resolve_url/url_paths.ts b/tests/testdata/npm/require_resolve_url/url_paths.ts
index 7826568fe..7826568fe 100644
--- a/cli/tests/testdata/npm/require_resolve_url/url_paths.ts
+++ b/tests/testdata/npm/require_resolve_url/url_paths.ts
diff --git a/cli/tests/testdata/npm/reserved_word_exports/main.out b/tests/testdata/npm/reserved_word_exports/main.out
index 345a7012f..345a7012f 100644
--- a/cli/tests/testdata/npm/reserved_word_exports/main.out
+++ b/tests/testdata/npm/reserved_word_exports/main.out
diff --git a/cli/tests/testdata/npm/reserved_word_exports/main.ts b/tests/testdata/npm/reserved_word_exports/main.ts
index 33cf183d3..33cf183d3 100644
--- a/cli/tests/testdata/npm/reserved_word_exports/main.ts
+++ b/tests/testdata/npm/reserved_word_exports/main.ts
diff --git a/cli/tests/testdata/npm/run_existing_npm_package/main.out b/tests/testdata/npm/run_existing_npm_package/main.out
index baf7b7afd..baf7b7afd 100644
--- a/cli/tests/testdata/npm/run_existing_npm_package/main.out
+++ b/tests/testdata/npm/run_existing_npm_package/main.out
diff --git a/cli/tests/testdata/npm/run_existing_npm_package/package.json b/tests/testdata/npm/run_existing_npm_package/package.json
index 1cd6d749d..1cd6d749d 100644
--- a/cli/tests/testdata/npm/run_existing_npm_package/package.json
+++ b/tests/testdata/npm/run_existing_npm_package/package.json
diff --git a/cli/tests/testdata/npm/run_existing_npm_package_with_subpath/main.out b/tests/testdata/npm/run_existing_npm_package_with_subpath/main.out
index bec78df94..bec78df94 100644
--- a/cli/tests/testdata/npm/run_existing_npm_package_with_subpath/main.out
+++ b/tests/testdata/npm/run_existing_npm_package_with_subpath/main.out
diff --git a/cli/tests/testdata/npm/run_existing_npm_package_with_subpath/package.json b/tests/testdata/npm/run_existing_npm_package_with_subpath/package.json
index e9a7e84ce..e9a7e84ce 100644
--- a/cli/tests/testdata/npm/run_existing_npm_package_with_subpath/package.json
+++ b/tests/testdata/npm/run_existing_npm_package_with_subpath/package.json
diff --git a/cli/tests/testdata/npm/sub_paths/main.jsx b/tests/testdata/npm/sub_paths/main.jsx
index 0c712b9ff..0c712b9ff 100644
--- a/cli/tests/testdata/npm/sub_paths/main.jsx
+++ b/tests/testdata/npm/sub_paths/main.jsx
diff --git a/cli/tests/testdata/npm/sub_paths/main.out b/tests/testdata/npm/sub_paths/main.out
index f034585a7..f034585a7 100644
--- a/cli/tests/testdata/npm/sub_paths/main.out
+++ b/tests/testdata/npm/sub_paths/main.out
diff --git a/cli/tests/testdata/npm/tarball_with_global_header/main.js b/tests/testdata/npm/tarball_with_global_header/main.js
index d1bb40fbc..d1bb40fbc 100644
--- a/cli/tests/testdata/npm/tarball_with_global_header/main.js
+++ b/tests/testdata/npm/tarball_with_global_header/main.js
diff --git a/cli/tests/testdata/npm/tarball_with_global_header/main.out b/tests/testdata/npm/tarball_with_global_header/main.out
index ff211087b..ff211087b 100644
--- a/cli/tests/testdata/npm/tarball_with_global_header/main.out
+++ b/tests/testdata/npm/tarball_with_global_header/main.out
diff --git a/cli/tests/testdata/npm/translate_cjs_to_esm/main.js b/tests/testdata/npm/translate_cjs_to_esm/main.js
index 04a86fbf1..04a86fbf1 100644
--- a/cli/tests/testdata/npm/translate_cjs_to_esm/main.js
+++ b/tests/testdata/npm/translate_cjs_to_esm/main.js
diff --git a/cli/tests/testdata/npm/translate_cjs_to_esm/main.out b/tests/testdata/npm/translate_cjs_to_esm/main.out
index c21a965b8..c21a965b8 100644
--- a/cli/tests/testdata/npm/translate_cjs_to_esm/main.out
+++ b/tests/testdata/npm/translate_cjs_to_esm/main.out
diff --git a/cli/tests/testdata/npm/types/main.out b/tests/testdata/npm/types/main.out
index de1f2c145..de1f2c145 100644
--- a/cli/tests/testdata/npm/types/main.out
+++ b/tests/testdata/npm/types/main.out
diff --git a/cli/tests/testdata/npm/types/main.ts b/tests/testdata/npm/types/main.ts
index ae420f6d6..ae420f6d6 100644
--- a/cli/tests/testdata/npm/types/main.ts
+++ b/tests/testdata/npm/types/main.ts
diff --git a/cli/tests/testdata/npm/types_ambient_module/import_map.json b/tests/testdata/npm/types_ambient_module/import_map.json
index f61d99b47..f61d99b47 100644
--- a/cli/tests/testdata/npm/types_ambient_module/import_map.json
+++ b/tests/testdata/npm/types_ambient_module/import_map.json
diff --git a/cli/tests/testdata/npm/types_ambient_module/main.out b/tests/testdata/npm/types_ambient_module/main.out
index c84130707..c84130707 100644
--- a/cli/tests/testdata/npm/types_ambient_module/main.out
+++ b/tests/testdata/npm/types_ambient_module/main.out
diff --git a/cli/tests/testdata/npm/types_ambient_module/main.ts b/tests/testdata/npm/types_ambient_module/main.ts
index 8f77cabe8..8f77cabe8 100644
--- a/cli/tests/testdata/npm/types_ambient_module/main.ts
+++ b/tests/testdata/npm/types_ambient_module/main.ts
diff --git a/cli/tests/testdata/npm/types_ambient_module/main_import_map.out b/tests/testdata/npm/types_ambient_module/main_import_map.out
index 548f9b479..548f9b479 100644
--- a/cli/tests/testdata/npm/types_ambient_module/main_import_map.out
+++ b/tests/testdata/npm/types_ambient_module/main_import_map.out
diff --git a/cli/tests/testdata/npm/types_ambient_module/main_import_map.ts b/tests/testdata/npm/types_ambient_module/main_import_map.ts
index 2694c94b7..2694c94b7 100644
--- a/cli/tests/testdata/npm/types_ambient_module/main_import_map.ts
+++ b/tests/testdata/npm/types_ambient_module/main_import_map.ts
diff --git a/cli/tests/testdata/npm/types_entry_value_not_exists/main.out b/tests/testdata/npm/types_entry_value_not_exists/main.out
index 0bb31a195..0bb31a195 100644
--- a/cli/tests/testdata/npm/types_entry_value_not_exists/main.out
+++ b/tests/testdata/npm/types_entry_value_not_exists/main.out
diff --git a/cli/tests/testdata/npm/types_entry_value_not_exists/main.ts b/tests/testdata/npm/types_entry_value_not_exists/main.ts
index 04374ef87..04374ef87 100644
--- a/cli/tests/testdata/npm/types_entry_value_not_exists/main.ts
+++ b/tests/testdata/npm/types_entry_value_not_exists/main.ts
diff --git a/cli/tests/testdata/npm/types_exports_import_types/main.out b/tests/testdata/npm/types_exports_import_types/main.out
index a3db009ca..a3db009ca 100644
--- a/cli/tests/testdata/npm/types_exports_import_types/main.out
+++ b/tests/testdata/npm/types_exports_import_types/main.out
diff --git a/cli/tests/testdata/npm/types_exports_import_types/main.ts b/tests/testdata/npm/types_exports_import_types/main.ts
index 3ae3e92a3..3ae3e92a3 100644
--- a/cli/tests/testdata/npm/types_exports_import_types/main.ts
+++ b/tests/testdata/npm/types_exports_import_types/main.ts
diff --git a/cli/tests/testdata/npm/types_no_types_entry/main.out b/tests/testdata/npm/types_no_types_entry/main.out
index 059009d3f..059009d3f 100644
--- a/cli/tests/testdata/npm/types_no_types_entry/main.out
+++ b/tests/testdata/npm/types_no_types_entry/main.out
diff --git a/cli/tests/testdata/npm/types_no_types_entry/main.ts b/tests/testdata/npm/types_no_types_entry/main.ts
index eef53b681..eef53b681 100644
--- a/cli/tests/testdata/npm/types_no_types_entry/main.ts
+++ b/tests/testdata/npm/types_no_types_entry/main.ts
diff --git a/cli/tests/testdata/npm/typescript_file_in_package/main.out b/tests/testdata/npm/typescript_file_in_package/main.out
index 0d6f53cd9..0d6f53cd9 100644
--- a/cli/tests/testdata/npm/typescript_file_in_package/main.out
+++ b/tests/testdata/npm/typescript_file_in_package/main.out
diff --git a/cli/tests/testdata/npm/typescript_file_in_package/main.ts b/tests/testdata/npm/typescript_file_in_package/main.ts
index aefc38ebe..aefc38ebe 100644
--- a/cli/tests/testdata/npm/typescript_file_in_package/main.ts
+++ b/tests/testdata/npm/typescript_file_in_package/main.ts
diff --git a/cli/tests/testdata/package_json/basic/fail_check.check.out b/tests/testdata/package_json/basic/fail_check.check.out
index 03997a051..03997a051 100644
--- a/cli/tests/testdata/package_json/basic/fail_check.check.out
+++ b/tests/testdata/package_json/basic/fail_check.check.out
diff --git a/cli/tests/testdata/package_json/basic/fail_check.ts b/tests/testdata/package_json/basic/fail_check.ts
index cef10763d..cef10763d 100644
--- a/cli/tests/testdata/package_json/basic/fail_check.ts
+++ b/tests/testdata/package_json/basic/fail_check.ts
diff --git a/cli/tests/testdata/package_json/basic/lib.bench.out b/tests/testdata/package_json/basic/lib.bench.out
index fa9c5efc6..fa9c5efc6 100644
--- a/cli/tests/testdata/package_json/basic/lib.bench.out
+++ b/tests/testdata/package_json/basic/lib.bench.out
diff --git a/cli/tests/testdata/package_json/basic/lib.bench.ts b/tests/testdata/package_json/basic/lib.bench.ts
index e6b79d025..e6b79d025 100644
--- a/cli/tests/testdata/package_json/basic/lib.bench.ts
+++ b/tests/testdata/package_json/basic/lib.bench.ts
diff --git a/cli/tests/testdata/package_json/basic/lib.test.out b/tests/testdata/package_json/basic/lib.test.out
index fa1cbb0f7..fa1cbb0f7 100644
--- a/cli/tests/testdata/package_json/basic/lib.test.out
+++ b/tests/testdata/package_json/basic/lib.test.out
diff --git a/cli/tests/testdata/package_json/basic/lib.test.ts b/tests/testdata/package_json/basic/lib.test.ts
index 4e833e1f3..4e833e1f3 100644
--- a/cli/tests/testdata/package_json/basic/lib.test.ts
+++ b/tests/testdata/package_json/basic/lib.test.ts
diff --git a/cli/tests/testdata/package_json/basic/lib.ts b/tests/testdata/package_json/basic/lib.ts
index 1deed81f7..1deed81f7 100644
--- a/cli/tests/testdata/package_json/basic/lib.ts
+++ b/tests/testdata/package_json/basic/lib.ts
diff --git a/cli/tests/testdata/package_json/basic/main.cache.out b/tests/testdata/package_json/basic/main.cache.out
index 1c729e2a3..1c729e2a3 100644
--- a/cli/tests/testdata/package_json/basic/main.cache.out
+++ b/tests/testdata/package_json/basic/main.cache.out
diff --git a/cli/tests/testdata/package_json/basic/main.check.out b/tests/testdata/package_json/basic/main.check.out
index a506cb0ed..a506cb0ed 100644
--- a/cli/tests/testdata/package_json/basic/main.check.out
+++ b/tests/testdata/package_json/basic/main.check.out
diff --git a/cli/tests/testdata/package_json/basic/main.info.out b/tests/testdata/package_json/basic/main.info.out
index 892c0612a..892c0612a 100644
--- a/cli/tests/testdata/package_json/basic/main.info.out
+++ b/tests/testdata/package_json/basic/main.info.out
diff --git a/cli/tests/testdata/package_json/basic/main.ts b/tests/testdata/package_json/basic/main.ts
index e241f3002..e241f3002 100644
--- a/cli/tests/testdata/package_json/basic/main.ts
+++ b/tests/testdata/package_json/basic/main.ts
diff --git a/cli/tests/testdata/package_json/basic/package.json b/tests/testdata/package_json/basic/package.json
index 54ca824d6..54ca824d6 100644
--- a/cli/tests/testdata/package_json/basic/package.json
+++ b/tests/testdata/package_json/basic/package.json
diff --git a/cli/tests/testdata/package_json/deno_json/deno.json b/tests/testdata/package_json/deno_json/deno.json
index 8a89da280..8a89da280 100644
--- a/cli/tests/testdata/package_json/deno_json/deno.json
+++ b/tests/testdata/package_json/deno_json/deno.json
diff --git a/cli/tests/testdata/package_json/deno_json/main.check.out b/tests/testdata/package_json/deno_json/main.check.out
index 53b6869c0..53b6869c0 100644
--- a/cli/tests/testdata/package_json/deno_json/main.check.out
+++ b/tests/testdata/package_json/deno_json/main.check.out
diff --git a/cli/tests/testdata/package_json/deno_json/main.out b/tests/testdata/package_json/deno_json/main.out
index 1191247b6..1191247b6 100644
--- a/cli/tests/testdata/package_json/deno_json/main.out
+++ b/tests/testdata/package_json/deno_json/main.out
diff --git a/cli/tests/testdata/package_json/deno_json/main.ts b/tests/testdata/package_json/deno_json/main.ts
index 7768ff3fc..7768ff3fc 100644
--- a/cli/tests/testdata/package_json/deno_json/main.ts
+++ b/tests/testdata/package_json/deno_json/main.ts
diff --git a/cli/tests/testdata/package_json/deno_json/other.ts b/tests/testdata/package_json/deno_json/other.ts
index 997d84adf..997d84adf 100644
--- a/cli/tests/testdata/package_json/deno_json/other.ts
+++ b/tests/testdata/package_json/deno_json/other.ts
diff --git a/cli/tests/testdata/package_json/deno_json/package.json b/tests/testdata/package_json/deno_json/package.json
index 54ca824d6..54ca824d6 100644
--- a/cli/tests/testdata/package_json/deno_json/package.json
+++ b/tests/testdata/package_json/deno_json/package.json
diff --git a/cli/tests/testdata/package_json/invalid_value/error.ts b/tests/testdata/package_json/invalid_value/error.ts
index fd75d633c..fd75d633c 100644
--- a/cli/tests/testdata/package_json/invalid_value/error.ts
+++ b/tests/testdata/package_json/invalid_value/error.ts
diff --git a/cli/tests/testdata/package_json/invalid_value/error.ts.out b/tests/testdata/package_json/invalid_value/error.ts.out
index faa811a30..faa811a30 100644
--- a/cli/tests/testdata/package_json/invalid_value/error.ts.out
+++ b/tests/testdata/package_json/invalid_value/error.ts.out
diff --git a/cli/tests/testdata/package_json/invalid_value/ok.ts b/tests/testdata/package_json/invalid_value/ok.ts
index ce517439f..ce517439f 100644
--- a/cli/tests/testdata/package_json/invalid_value/ok.ts
+++ b/tests/testdata/package_json/invalid_value/ok.ts
diff --git a/cli/tests/testdata/package_json/invalid_value/ok.ts.out b/tests/testdata/package_json/invalid_value/ok.ts.out
index 17d9bba00..17d9bba00 100644
--- a/cli/tests/testdata/package_json/invalid_value/ok.ts.out
+++ b/tests/testdata/package_json/invalid_value/ok.ts.out
diff --git a/cli/tests/testdata/package_json/invalid_value/package.json b/tests/testdata/package_json/invalid_value/package.json
index c8857649e..c8857649e 100644
--- a/cli/tests/testdata/package_json/invalid_value/package.json
+++ b/tests/testdata/package_json/invalid_value/package.json
diff --git a/cli/tests/testdata/package_json/invalid_value/task.out b/tests/testdata/package_json/invalid_value/task.out
index 28e3c770d..28e3c770d 100644
--- a/cli/tests/testdata/package_json/invalid_value/task.out
+++ b/tests/testdata/package_json/invalid_value/task.out
diff --git a/cli/tests/testdata/publish/deno_jsonc.out b/tests/testdata/publish/deno_jsonc.out
index 2d5e4ffea..2d5e4ffea 100644
--- a/cli/tests/testdata/publish/deno_jsonc.out
+++ b/tests/testdata/publish/deno_jsonc.out
diff --git a/cli/tests/testdata/publish/deno_jsonc/deno.jsonc b/tests/testdata/publish/deno_jsonc/deno.jsonc
index 4c9dfb08c..4c9dfb08c 100644
--- a/cli/tests/testdata/publish/deno_jsonc/deno.jsonc
+++ b/tests/testdata/publish/deno_jsonc/deno.jsonc
diff --git a/cli/tests/testdata/publish/deno_jsonc/mod.ts b/tests/testdata/publish/deno_jsonc/mod.ts
index 4bb6da255..4bb6da255 100644
--- a/cli/tests/testdata/publish/deno_jsonc/mod.ts
+++ b/tests/testdata/publish/deno_jsonc/mod.ts
diff --git a/cli/tests/testdata/publish/deno_jsonc/std_http.ts b/tests/testdata/publish/deno_jsonc/std_http.ts
index 9d57b36f3..9d57b36f3 100644
--- a/cli/tests/testdata/publish/deno_jsonc/std_http.ts
+++ b/tests/testdata/publish/deno_jsonc/std_http.ts
diff --git a/cli/tests/testdata/publish/dry_run.out b/tests/testdata/publish/dry_run.out
index f9f4df72e..f9f4df72e 100644
--- a/cli/tests/testdata/publish/dry_run.out
+++ b/tests/testdata/publish/dry_run.out
diff --git a/cli/tests/testdata/publish/invalid_fast_check.out b/tests/testdata/publish/invalid_fast_check.out
index d18be45fe..d18be45fe 100644
--- a/cli/tests/testdata/publish/invalid_fast_check.out
+++ b/tests/testdata/publish/invalid_fast_check.out
diff --git a/cli/tests/testdata/publish/invalid_fast_check/deno.json b/tests/testdata/publish/invalid_fast_check/deno.json
index 5826e5529..5826e5529 100644
--- a/cli/tests/testdata/publish/invalid_fast_check/deno.json
+++ b/tests/testdata/publish/invalid_fast_check/deno.json
diff --git a/cli/tests/testdata/publish/invalid_fast_check/mod.ts b/tests/testdata/publish/invalid_fast_check/mod.ts
index 025311049..025311049 100644
--- a/cli/tests/testdata/publish/invalid_fast_check/mod.ts
+++ b/tests/testdata/publish/invalid_fast_check/mod.ts
diff --git a/cli/tests/testdata/publish/invalid_import.out b/tests/testdata/publish/invalid_import.out
index ca9d20eed..ca9d20eed 100644
--- a/cli/tests/testdata/publish/invalid_import.out
+++ b/tests/testdata/publish/invalid_import.out
diff --git a/cli/tests/testdata/publish/invalid_import/deno.json b/tests/testdata/publish/invalid_import/deno.json
index 49b666d22..49b666d22 100644
--- a/cli/tests/testdata/publish/invalid_import/deno.json
+++ b/tests/testdata/publish/invalid_import/deno.json
diff --git a/cli/tests/testdata/publish/invalid_import/mod.ts b/tests/testdata/publish/invalid_import/mod.ts
index bdaf010e2..bdaf010e2 100644
--- a/cli/tests/testdata/publish/invalid_import/mod.ts
+++ b/tests/testdata/publish/invalid_import/mod.ts
diff --git a/cli/tests/testdata/publish/invalid_path.out b/tests/testdata/publish/invalid_path.out
index cd3e92e0c..cd3e92e0c 100644
--- a/cli/tests/testdata/publish/invalid_path.out
+++ b/tests/testdata/publish/invalid_path.out
diff --git a/cli/tests/testdata/publish/invalid_path/deno.json b/tests/testdata/publish/invalid_path/deno.json
index 213a7cec6..213a7cec6 100644
--- a/cli/tests/testdata/publish/invalid_path/deno.json
+++ b/tests/testdata/publish/invalid_path/deno.json
diff --git a/cli/tests/testdata/publish/invalid_path/mod.ts b/tests/testdata/publish/invalid_path/mod.ts
index 9e217d9b0..9e217d9b0 100644
--- a/cli/tests/testdata/publish/invalid_path/mod.ts
+++ b/tests/testdata/publish/invalid_path/mod.ts
diff --git a/cli/tests/testdata/publish/invalid_path/path with spaces.txt b/tests/testdata/publish/invalid_path/path with spaces.txt
index e69de29bb..e69de29bb 100644
--- a/cli/tests/testdata/publish/invalid_path/path with spaces.txt
+++ b/tests/testdata/publish/invalid_path/path with spaces.txt
diff --git a/cli/tests/testdata/publish/javascript_decl_file.out b/tests/testdata/publish/javascript_decl_file.out
index deb66eba0..deb66eba0 100644
--- a/cli/tests/testdata/publish/javascript_decl_file.out
+++ b/tests/testdata/publish/javascript_decl_file.out
diff --git a/cli/tests/testdata/publish/javascript_decl_file/deno.json b/tests/testdata/publish/javascript_decl_file/deno.json
index e5dbfa8d3..e5dbfa8d3 100644
--- a/cli/tests/testdata/publish/javascript_decl_file/deno.json
+++ b/tests/testdata/publish/javascript_decl_file/deno.json
diff --git a/cli/tests/testdata/publish/javascript_decl_file/mod.d.ts b/tests/testdata/publish/javascript_decl_file/mod.d.ts
index b2f6c69a8..b2f6c69a8 100644
--- a/cli/tests/testdata/publish/javascript_decl_file/mod.d.ts
+++ b/tests/testdata/publish/javascript_decl_file/mod.d.ts
diff --git a/cli/tests/testdata/publish/javascript_decl_file/mod.js b/tests/testdata/publish/javascript_decl_file/mod.js
index 2395e622b..2395e622b 100644
--- a/cli/tests/testdata/publish/javascript_decl_file/mod.js
+++ b/tests/testdata/publish/javascript_decl_file/mod.js
diff --git a/cli/tests/testdata/publish/javascript_missing_decl_file.out b/tests/testdata/publish/javascript_missing_decl_file.out
index 557451b29..557451b29 100644
--- a/cli/tests/testdata/publish/javascript_missing_decl_file.out
+++ b/tests/testdata/publish/javascript_missing_decl_file.out
diff --git a/cli/tests/testdata/publish/javascript_missing_decl_file/deno.json b/tests/testdata/publish/javascript_missing_decl_file/deno.json
index e12927c26..e12927c26 100644
--- a/cli/tests/testdata/publish/javascript_missing_decl_file/deno.json
+++ b/tests/testdata/publish/javascript_missing_decl_file/deno.json
diff --git a/cli/tests/testdata/publish/javascript_missing_decl_file/mod.js b/tests/testdata/publish/javascript_missing_decl_file/mod.js
index 4a62fa5b4..4a62fa5b4 100644
--- a/cli/tests/testdata/publish/javascript_missing_decl_file/mod.js
+++ b/tests/testdata/publish/javascript_missing_decl_file/mod.js
diff --git a/cli/tests/testdata/publish/javascript_missing_decl_file/other.js b/tests/testdata/publish/javascript_missing_decl_file/other.js
index 89ffb80ba..89ffb80ba 100644
--- a/cli/tests/testdata/publish/javascript_missing_decl_file/other.js
+++ b/tests/testdata/publish/javascript_missing_decl_file/other.js
diff --git a/cli/tests/testdata/publish/missing_deno_json.out b/tests/testdata/publish/missing_deno_json.out
index adb472c71..adb472c71 100644
--- a/cli/tests/testdata/publish/missing_deno_json.out
+++ b/tests/testdata/publish/missing_deno_json.out
diff --git a/cli/tests/testdata/publish/missing_deno_json/main.ts b/tests/testdata/publish/missing_deno_json/main.ts
index 8d9b8a22a..8d9b8a22a 100644
--- a/cli/tests/testdata/publish/missing_deno_json/main.ts
+++ b/tests/testdata/publish/missing_deno_json/main.ts
diff --git a/cli/tests/testdata/publish/no_token.out b/tests/testdata/publish/no_token.out
index 41415094c..41415094c 100644
--- a/cli/tests/testdata/publish/no_token.out
+++ b/tests/testdata/publish/no_token.out
diff --git a/cli/tests/testdata/publish/no_zap.out b/tests/testdata/publish/no_zap.out
index 109964903..109964903 100644
--- a/cli/tests/testdata/publish/no_zap.out
+++ b/tests/testdata/publish/no_zap.out
diff --git a/cli/tests/testdata/publish/node_specifier.out b/tests/testdata/publish/node_specifier.out
index 7acb5b5ba..7acb5b5ba 100644
--- a/cli/tests/testdata/publish/node_specifier.out
+++ b/tests/testdata/publish/node_specifier.out
diff --git a/cli/tests/testdata/publish/node_specifier/deno.json b/tests/testdata/publish/node_specifier/deno.json
index 213a7cec6..213a7cec6 100644
--- a/cli/tests/testdata/publish/node_specifier/deno.json
+++ b/tests/testdata/publish/node_specifier/deno.json
diff --git a/cli/tests/testdata/publish/node_specifier/mod.ts b/tests/testdata/publish/node_specifier/mod.ts
index 9d8263709..9d8263709 100644
--- a/cli/tests/testdata/publish/node_specifier/mod.ts
+++ b/tests/testdata/publish/node_specifier/mod.ts
diff --git a/cli/tests/testdata/publish/successful.out b/tests/testdata/publish/successful.out
index 7dbe16807..7dbe16807 100644
--- a/cli/tests/testdata/publish/successful.out
+++ b/tests/testdata/publish/successful.out
diff --git a/cli/tests/testdata/publish/successful/deno.json b/tests/testdata/publish/successful/deno.json
index fefab899b..fefab899b 100644
--- a/cli/tests/testdata/publish/successful/deno.json
+++ b/tests/testdata/publish/successful/deno.json
diff --git a/cli/tests/testdata/publish/successful/mod.ts b/tests/testdata/publish/successful/mod.ts
index 4bb6da255..4bb6da255 100644
--- a/cli/tests/testdata/publish/successful/mod.ts
+++ b/tests/testdata/publish/successful/mod.ts
diff --git a/cli/tests/testdata/publish/successful/std_http.ts b/tests/testdata/publish/successful/std_http.ts
index 9d57b36f3..9d57b36f3 100644
--- a/cli/tests/testdata/publish/successful/std_http.ts
+++ b/tests/testdata/publish/successful/std_http.ts
diff --git a/cli/tests/testdata/publish/symlink.out b/tests/testdata/publish/symlink.out
index d226fa18e..d226fa18e 100644
--- a/cli/tests/testdata/publish/symlink.out
+++ b/tests/testdata/publish/symlink.out
diff --git a/cli/tests/testdata/publish/symlink/deno.json b/tests/testdata/publish/symlink/deno.json
index 213a7cec6..213a7cec6 100644
--- a/cli/tests/testdata/publish/symlink/deno.json
+++ b/tests/testdata/publish/symlink/deno.json
diff --git a/cli/tests/testdata/publish/symlink/mod.ts b/tests/testdata/publish/symlink/mod.ts
index 9e217d9b0..9e217d9b0 100644
--- a/cli/tests/testdata/publish/symlink/mod.ts
+++ b/tests/testdata/publish/symlink/mod.ts
diff --git a/cli/tests/testdata/publish/symlink/symlink b/tests/testdata/publish/symlink/symlink
index 0df9bcd04..0df9bcd04 120000
--- a/cli/tests/testdata/publish/symlink/symlink
+++ b/tests/testdata/publish/symlink/symlink
diff --git a/cli/tests/testdata/publish/unanalyzable_dynamic_import.out b/tests/testdata/publish/unanalyzable_dynamic_import.out
index 3be7ece87..3be7ece87 100644
--- a/cli/tests/testdata/publish/unanalyzable_dynamic_import.out
+++ b/tests/testdata/publish/unanalyzable_dynamic_import.out
diff --git a/cli/tests/testdata/publish/unanalyzable_dynamic_import/deno.json b/tests/testdata/publish/unanalyzable_dynamic_import/deno.json
index 213a7cec6..213a7cec6 100644
--- a/cli/tests/testdata/publish/unanalyzable_dynamic_import/deno.json
+++ b/tests/testdata/publish/unanalyzable_dynamic_import/deno.json
diff --git a/cli/tests/testdata/publish/unanalyzable_dynamic_import/mod.ts b/tests/testdata/publish/unanalyzable_dynamic_import/mod.ts
index fd53cb2c8..fd53cb2c8 100644
--- a/cli/tests/testdata/publish/unanalyzable_dynamic_import/mod.ts
+++ b/tests/testdata/publish/unanalyzable_dynamic_import/mod.ts
diff --git a/cli/tests/testdata/publish/workspace.out b/tests/testdata/publish/workspace.out
index 588c22bbc..588c22bbc 100644
--- a/cli/tests/testdata/publish/workspace.out
+++ b/tests/testdata/publish/workspace.out
diff --git a/cli/tests/testdata/publish/workspace/bar/deno.json b/tests/testdata/publish/workspace/bar/deno.json
index 213a7cec6..213a7cec6 100644
--- a/cli/tests/testdata/publish/workspace/bar/deno.json
+++ b/tests/testdata/publish/workspace/bar/deno.json
diff --git a/cli/tests/testdata/publish/workspace/bar/mod.ts b/tests/testdata/publish/workspace/bar/mod.ts
index 8d9b8a22a..8d9b8a22a 100644
--- a/cli/tests/testdata/publish/workspace/bar/mod.ts
+++ b/tests/testdata/publish/workspace/bar/mod.ts
diff --git a/cli/tests/testdata/publish/workspace/deno.json b/tests/testdata/publish/workspace/deno.json
index 57602aab5..57602aab5 100644
--- a/cli/tests/testdata/publish/workspace/deno.json
+++ b/tests/testdata/publish/workspace/deno.json
diff --git a/cli/tests/testdata/publish/workspace/foo/deno.json b/tests/testdata/publish/workspace/foo/deno.json
index 79563d36c..79563d36c 100644
--- a/cli/tests/testdata/publish/workspace/foo/deno.json
+++ b/tests/testdata/publish/workspace/foo/deno.json
diff --git a/cli/tests/testdata/publish/workspace/foo/mod.ts b/tests/testdata/publish/workspace/foo/mod.ts
index adf584463..adf584463 100644
--- a/cli/tests/testdata/publish/workspace/foo/mod.ts
+++ b/tests/testdata/publish/workspace/foo/mod.ts
diff --git a/cli/tests/testdata/publish/workspace_individual.out b/tests/testdata/publish/workspace_individual.out
index 4eadb45af..4eadb45af 100644
--- a/cli/tests/testdata/publish/workspace_individual.out
+++ b/tests/testdata/publish/workspace_individual.out
diff --git a/cli/tests/testdata/repl/import_type.ts b/tests/testdata/repl/import_type.ts
index 851ebad86..851ebad86 100644
--- a/cli/tests/testdata/repl/import_type.ts
+++ b/tests/testdata/repl/import_type.ts
diff --git a/cli/tests/testdata/run/001_hello.js b/tests/testdata/run/001_hello.js
index accefceba..accefceba 100644
--- a/cli/tests/testdata/run/001_hello.js
+++ b/tests/testdata/run/001_hello.js
diff --git a/cli/tests/testdata/run/001_hello.js.out b/tests/testdata/run/001_hello.js.out
index 557db03de..557db03de 100644
--- a/cli/tests/testdata/run/001_hello.js.out
+++ b/tests/testdata/run/001_hello.js.out
diff --git a/cli/tests/testdata/run/002_hello.ts b/tests/testdata/run/002_hello.ts
index accefceba..accefceba 100644
--- a/cli/tests/testdata/run/002_hello.ts
+++ b/tests/testdata/run/002_hello.ts
diff --git a/cli/tests/testdata/run/002_hello.ts.out b/tests/testdata/run/002_hello.ts.out
index 557db03de..557db03de 100644
--- a/cli/tests/testdata/run/002_hello.ts.out
+++ b/tests/testdata/run/002_hello.ts.out
diff --git a/cli/tests/testdata/run/003_relative_import.ts b/tests/testdata/run/003_relative_import.ts
index 840121bfe..840121bfe 100644
--- a/cli/tests/testdata/run/003_relative_import.ts
+++ b/tests/testdata/run/003_relative_import.ts
diff --git a/cli/tests/testdata/run/003_relative_import.ts.out b/tests/testdata/run/003_relative_import.ts.out
index e965047ad..e965047ad 100644
--- a/cli/tests/testdata/run/003_relative_import.ts.out
+++ b/tests/testdata/run/003_relative_import.ts.out
diff --git a/cli/tests/testdata/run/004_set_timeout.ts b/tests/testdata/run/004_set_timeout.ts
index 214b25086..214b25086 100644
--- a/cli/tests/testdata/run/004_set_timeout.ts
+++ b/tests/testdata/run/004_set_timeout.ts
diff --git a/cli/tests/testdata/run/004_set_timeout.ts.out b/tests/testdata/run/004_set_timeout.ts.out
index f9264f7fb..f9264f7fb 100644
--- a/cli/tests/testdata/run/004_set_timeout.ts.out
+++ b/tests/testdata/run/004_set_timeout.ts.out
diff --git a/cli/tests/testdata/run/005_more_imports.ts b/tests/testdata/run/005_more_imports.ts
index 6c96fac64..6c96fac64 100644
--- a/cli/tests/testdata/run/005_more_imports.ts
+++ b/tests/testdata/run/005_more_imports.ts
diff --git a/cli/tests/testdata/run/005_more_imports.ts.out b/tests/testdata/run/005_more_imports.ts.out
index e965047ad..e965047ad 100644
--- a/cli/tests/testdata/run/005_more_imports.ts.out
+++ b/tests/testdata/run/005_more_imports.ts.out
diff --git a/cli/tests/testdata/run/006_url_imports.ts b/tests/testdata/run/006_url_imports.ts
index 4036f27ed..4036f27ed 100644
--- a/cli/tests/testdata/run/006_url_imports.ts
+++ b/tests/testdata/run/006_url_imports.ts
diff --git a/cli/tests/testdata/run/006_url_imports.ts.out b/tests/testdata/run/006_url_imports.ts.out
index 989ce33e9..989ce33e9 100644
--- a/cli/tests/testdata/run/006_url_imports.ts.out
+++ b/tests/testdata/run/006_url_imports.ts.out
diff --git a/cli/tests/testdata/run/012_async.ts b/tests/testdata/run/012_async.ts
index 536197b68..536197b68 100644
--- a/cli/tests/testdata/run/012_async.ts
+++ b/tests/testdata/run/012_async.ts
diff --git a/cli/tests/testdata/run/012_async.ts.out b/tests/testdata/run/012_async.ts.out
index 01e79c32a..01e79c32a 100644
--- a/cli/tests/testdata/run/012_async.ts.out
+++ b/tests/testdata/run/012_async.ts.out
diff --git a/cli/tests/testdata/run/013_dynamic_import.ts b/tests/testdata/run/013_dynamic_import.ts
index fc231936c..fc231936c 100644
--- a/cli/tests/testdata/run/013_dynamic_import.ts
+++ b/tests/testdata/run/013_dynamic_import.ts
diff --git a/cli/tests/testdata/run/013_dynamic_import.ts.out b/tests/testdata/run/013_dynamic_import.ts.out
index e965047ad..e965047ad 100644
--- a/cli/tests/testdata/run/013_dynamic_import.ts.out
+++ b/tests/testdata/run/013_dynamic_import.ts.out
diff --git a/cli/tests/testdata/run/014_duplicate_import.ts b/tests/testdata/run/014_duplicate_import.ts
index c7dd881cf..c7dd881cf 100644
--- a/cli/tests/testdata/run/014_duplicate_import.ts
+++ b/tests/testdata/run/014_duplicate_import.ts
diff --git a/cli/tests/testdata/run/014_duplicate_import.ts.out b/tests/testdata/run/014_duplicate_import.ts.out
index 4effa19f4..4effa19f4 100644
--- a/cli/tests/testdata/run/014_duplicate_import.ts.out
+++ b/tests/testdata/run/014_duplicate_import.ts.out
diff --git a/cli/tests/testdata/run/015_duplicate_parallel_import.js b/tests/testdata/run/015_duplicate_parallel_import.js
index 2fbe2c732..2fbe2c732 100644
--- a/cli/tests/testdata/run/015_duplicate_parallel_import.js
+++ b/tests/testdata/run/015_duplicate_parallel_import.js
diff --git a/cli/tests/testdata/run/015_duplicate_parallel_import.js.out b/tests/testdata/run/015_duplicate_parallel_import.js.out
index e965047ad..e965047ad 100644
--- a/cli/tests/testdata/run/015_duplicate_parallel_import.js.out
+++ b/tests/testdata/run/015_duplicate_parallel_import.js.out
diff --git a/cli/tests/testdata/run/016_double_await.ts b/tests/testdata/run/016_double_await.ts
index 457a53ff3..457a53ff3 100644
--- a/cli/tests/testdata/run/016_double_await.ts
+++ b/tests/testdata/run/016_double_await.ts
diff --git a/cli/tests/testdata/run/016_double_await.ts.out b/tests/testdata/run/016_double_await.ts.out
index da29283aa..da29283aa 100644
--- a/cli/tests/testdata/run/016_double_await.ts.out
+++ b/tests/testdata/run/016_double_await.ts.out
diff --git a/cli/tests/testdata/run/017_import_redirect.ts b/tests/testdata/run/017_import_redirect.ts
index 1265dd4ed..1265dd4ed 100644
--- a/cli/tests/testdata/run/017_import_redirect.ts
+++ b/tests/testdata/run/017_import_redirect.ts
diff --git a/cli/tests/testdata/run/017_import_redirect.ts.out b/tests/testdata/run/017_import_redirect.ts.out
index e965047ad..e965047ad 100644
--- a/cli/tests/testdata/run/017_import_redirect.ts.out
+++ b/tests/testdata/run/017_import_redirect.ts.out
diff --git a/cli/tests/testdata/run/017_import_redirect_info.out b/tests/testdata/run/017_import_redirect_info.out
index d1850ccb5..d1850ccb5 100644
--- a/cli/tests/testdata/run/017_import_redirect_info.out
+++ b/tests/testdata/run/017_import_redirect_info.out
diff --git a/cli/tests/testdata/run/018_async_catch.ts b/tests/testdata/run/018_async_catch.ts
index ac43a52e8..ac43a52e8 100644
--- a/cli/tests/testdata/run/018_async_catch.ts
+++ b/tests/testdata/run/018_async_catch.ts
diff --git a/cli/tests/testdata/run/018_async_catch.ts.out b/tests/testdata/run/018_async_catch.ts.out
index 4fc219973..4fc219973 100644
--- a/cli/tests/testdata/run/018_async_catch.ts.out
+++ b/tests/testdata/run/018_async_catch.ts.out
diff --git a/cli/tests/testdata/run/019_media_types.ts b/tests/testdata/run/019_media_types.ts
index d985bd249..d985bd249 100644
--- a/cli/tests/testdata/run/019_media_types.ts
+++ b/tests/testdata/run/019_media_types.ts
diff --git a/cli/tests/testdata/run/019_media_types.ts.out b/tests/testdata/run/019_media_types.ts.out
index b3e94678c..b3e94678c 100644
--- a/cli/tests/testdata/run/019_media_types.ts.out
+++ b/tests/testdata/run/019_media_types.ts.out
diff --git a/cli/tests/testdata/run/020_json_modules.ts b/tests/testdata/run/020_json_modules.ts
index b4ae60665..b4ae60665 100644
--- a/cli/tests/testdata/run/020_json_modules.ts
+++ b/tests/testdata/run/020_json_modules.ts
diff --git a/cli/tests/testdata/run/020_json_modules.ts.out b/tests/testdata/run/020_json_modules.ts.out
index 948901724..948901724 100644
--- a/cli/tests/testdata/run/020_json_modules.ts.out
+++ b/tests/testdata/run/020_json_modules.ts.out
diff --git a/cli/tests/testdata/run/021_mjs_modules.ts b/tests/testdata/run/021_mjs_modules.ts
index 838cd2c38..838cd2c38 100644
--- a/cli/tests/testdata/run/021_mjs_modules.ts
+++ b/tests/testdata/run/021_mjs_modules.ts
diff --git a/cli/tests/testdata/run/021_mjs_modules.ts.out b/tests/testdata/run/021_mjs_modules.ts.out
index 27ba77dda..27ba77dda 100644
--- a/cli/tests/testdata/run/021_mjs_modules.ts.out
+++ b/tests/testdata/run/021_mjs_modules.ts.out
diff --git a/cli/tests/testdata/run/023_no_ext b/tests/testdata/run/023_no_ext
index d2cd6a037..d2cd6a037 100644
--- a/cli/tests/testdata/run/023_no_ext
+++ b/tests/testdata/run/023_no_ext
diff --git a/cli/tests/testdata/run/023_no_ext.out b/tests/testdata/run/023_no_ext.out
index 27ba77dda..27ba77dda 100644
--- a/cli/tests/testdata/run/023_no_ext.out
+++ b/tests/testdata/run/023_no_ext.out
diff --git a/cli/tests/testdata/run/025_hrtime.ts b/tests/testdata/run/025_hrtime.ts
index b69d61488..b69d61488 100644
--- a/cli/tests/testdata/run/025_hrtime.ts
+++ b/tests/testdata/run/025_hrtime.ts
diff --git a/cli/tests/testdata/run/025_hrtime.ts.out b/tests/testdata/run/025_hrtime.ts.out
index bb101b641..bb101b641 100644
--- a/cli/tests/testdata/run/025_hrtime.ts.out
+++ b/tests/testdata/run/025_hrtime.ts.out
diff --git a/cli/tests/testdata/run/025_reload_js_type_error.js b/tests/testdata/run/025_reload_js_type_error.js
index 3b7c23cc9..3b7c23cc9 100644
--- a/cli/tests/testdata/run/025_reload_js_type_error.js
+++ b/tests/testdata/run/025_reload_js_type_error.js
diff --git a/cli/tests/testdata/run/025_reload_js_type_error.js.out b/tests/testdata/run/025_reload_js_type_error.js.out
index ce0136250..ce0136250 100644
--- a/cli/tests/testdata/run/025_reload_js_type_error.js.out
+++ b/tests/testdata/run/025_reload_js_type_error.js.out
diff --git a/cli/tests/testdata/run/026_redirect_javascript.js b/tests/testdata/run/026_redirect_javascript.js
index 226a6b622..226a6b622 100644
--- a/cli/tests/testdata/run/026_redirect_javascript.js
+++ b/tests/testdata/run/026_redirect_javascript.js
diff --git a/cli/tests/testdata/run/026_redirect_javascript.js.out b/tests/testdata/run/026_redirect_javascript.js.out
index 290864299..290864299 100644
--- a/cli/tests/testdata/run/026_redirect_javascript.js.out
+++ b/tests/testdata/run/026_redirect_javascript.js.out
diff --git a/cli/tests/testdata/run/027_redirect_typescript.ts b/tests/testdata/run/027_redirect_typescript.ts
index 584341975..584341975 100644
--- a/cli/tests/testdata/run/027_redirect_typescript.ts
+++ b/tests/testdata/run/027_redirect_typescript.ts
diff --git a/cli/tests/testdata/run/027_redirect_typescript.ts.out b/tests/testdata/run/027_redirect_typescript.ts.out
index 480d4e8ca..480d4e8ca 100644
--- a/cli/tests/testdata/run/027_redirect_typescript.ts.out
+++ b/tests/testdata/run/027_redirect_typescript.ts.out
diff --git a/cli/tests/testdata/run/028_args.ts b/tests/testdata/run/028_args.ts
index ec41d52f9..ec41d52f9 100644
--- a/cli/tests/testdata/run/028_args.ts
+++ b/tests/testdata/run/028_args.ts
diff --git a/cli/tests/testdata/run/028_args.ts.out b/tests/testdata/run/028_args.ts.out
index 0f1b5c59e..0f1b5c59e 100644
--- a/cli/tests/testdata/run/028_args.ts.out
+++ b/tests/testdata/run/028_args.ts.out
diff --git a/cli/tests/testdata/run/033_import_map.out b/tests/testdata/run/033_import_map.out
index e9b9160e9..e9b9160e9 100644
--- a/cli/tests/testdata/run/033_import_map.out
+++ b/tests/testdata/run/033_import_map.out
diff --git a/cli/tests/testdata/run/033_import_map_in_config_file.out b/tests/testdata/run/033_import_map_in_config_file.out
index 72df124a2..72df124a2 100644
--- a/cli/tests/testdata/run/033_import_map_in_config_file.out
+++ b/tests/testdata/run/033_import_map_in_config_file.out
diff --git a/cli/tests/testdata/run/033_import_map_in_flag_has_precedence.out b/tests/testdata/run/033_import_map_in_flag_has_precedence.out
index e9b183ee6..e9b183ee6 100644
--- a/cli/tests/testdata/run/033_import_map_in_flag_has_precedence.out
+++ b/tests/testdata/run/033_import_map_in_flag_has_precedence.out
diff --git a/cli/tests/testdata/run/033_import_map_remote.out b/tests/testdata/run/033_import_map_remote.out
index 804fa0d57..804fa0d57 100644
--- a/cli/tests/testdata/run/033_import_map_remote.out
+++ b/tests/testdata/run/033_import_map_remote.out
diff --git a/cli/tests/testdata/run/035_cached_only_flag.out b/tests/testdata/run/035_cached_only_flag.out
index f677ec915..f677ec915 100644
--- a/cli/tests/testdata/run/035_cached_only_flag.out
+++ b/tests/testdata/run/035_cached_only_flag.out
diff --git a/cli/tests/testdata/run/038_checkjs.js b/tests/testdata/run/038_checkjs.js
index f0856d94c..f0856d94c 100644
--- a/cli/tests/testdata/run/038_checkjs.js
+++ b/tests/testdata/run/038_checkjs.js
diff --git a/cli/tests/testdata/run/038_checkjs.js.out b/tests/testdata/run/038_checkjs.js.out
index 4ea473e4f..4ea473e4f 100644
--- a/cli/tests/testdata/run/038_checkjs.js.out
+++ b/tests/testdata/run/038_checkjs.js.out
diff --git a/cli/tests/testdata/run/042_dyn_import_evalcontext.ts b/tests/testdata/run/042_dyn_import_evalcontext.ts
index 386ae48ec..386ae48ec 100644
--- a/cli/tests/testdata/run/042_dyn_import_evalcontext.ts
+++ b/tests/testdata/run/042_dyn_import_evalcontext.ts
diff --git a/cli/tests/testdata/run/042_dyn_import_evalcontext.ts.out b/tests/testdata/run/042_dyn_import_evalcontext.ts.out
index 89e16b478..89e16b478 100644
--- a/cli/tests/testdata/run/042_dyn_import_evalcontext.ts.out
+++ b/tests/testdata/run/042_dyn_import_evalcontext.ts.out
diff --git a/cli/tests/testdata/run/044_bad_resource.ts b/tests/testdata/run/044_bad_resource.ts
index b956a3e3f..b956a3e3f 100644
--- a/cli/tests/testdata/run/044_bad_resource.ts
+++ b/tests/testdata/run/044_bad_resource.ts
diff --git a/cli/tests/testdata/run/044_bad_resource.ts.out b/tests/testdata/run/044_bad_resource.ts.out
index c9912711d..c9912711d 100644
--- a/cli/tests/testdata/run/044_bad_resource.ts.out
+++ b/tests/testdata/run/044_bad_resource.ts.out
diff --git a/cli/tests/testdata/run/045_mod.ts b/tests/testdata/run/045_mod.ts
index b5f2a0b5b..b5f2a0b5b 100644
--- a/cli/tests/testdata/run/045_mod.ts
+++ b/tests/testdata/run/045_mod.ts
diff --git a/cli/tests/testdata/run/045_output.ts b/tests/testdata/run/045_output.ts
index 398760ca0..398760ca0 100644
--- a/cli/tests/testdata/run/045_output.ts
+++ b/tests/testdata/run/045_output.ts
diff --git a/cli/tests/testdata/run/045_programmatic_proxy_client.ts b/tests/testdata/run/045_programmatic_proxy_client.ts
index 73af590c7..73af590c7 100644
--- a/cli/tests/testdata/run/045_programmatic_proxy_client.ts
+++ b/tests/testdata/run/045_programmatic_proxy_client.ts
diff --git a/cli/tests/testdata/run/045_proxy_client.ts b/tests/testdata/run/045_proxy_client.ts
index 41deae2a5..41deae2a5 100644
--- a/cli/tests/testdata/run/045_proxy_client.ts
+++ b/tests/testdata/run/045_proxy_client.ts
diff --git a/tests/testdata/run/045_proxy_test.ts b/tests/testdata/run/045_proxy_test.ts
new file mode 100644
index 000000000..1929ed6bc
--- /dev/null
+++ b/tests/testdata/run/045_proxy_test.ts
@@ -0,0 +1,121 @@
+// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
+import { Server } from "../../../test_util/std/http/server.ts";
+import { assertEquals } from "../../../test_util/std/assert/mod.ts";
+
+const addr = Deno.args[1] || "localhost:4555";
+
+async function proxyServer() {
+ const [hostname, p] = addr.split(":");
+ const port = parseInt(p ?? 4555);
+ const server = new Server({ hostname, port, handler });
+ console.log(`Proxy server listening on http://${addr}/`);
+ await server.listenAndServe();
+}
+
+async function handler(req: Request): Promise<Response> {
+ console.log(`Proxy request to: ${req.url}`);
+ const headers = new Headers(req.headers);
+ const proxyAuthorization = headers.get("proxy-authorization");
+ if (proxyAuthorization) {
+ console.log(`proxy-authorization: ${proxyAuthorization}`);
+ headers.delete("proxy-authorization");
+ }
+ const resp = await fetch(req.url, {
+ method: req.method,
+ headers: headers,
+ });
+ return new Response(new Uint8Array(await resp.arrayBuffer()), {
+ status: resp.status,
+ headers: resp.headers,
+ });
+}
+
+async function testFetch() {
+ const { code } = await new Deno.Command(Deno.execPath(), {
+ args: [
+ "run",
+ "--quiet",
+ "--reload",
+ "--allow-net",
+ "run/045_proxy_client.ts",
+ ],
+ env: {
+ HTTP_PROXY: `http://${addr}`,
+ },
+ }).output();
+
+ assertEquals(code, 0);
+}
+
+async function testModuleDownload() {
+ const { code } = await new Deno.Command(Deno.execPath(), {
+ args: [
+ "cache",
+ "--reload",
+ "--quiet",
+ "http://localhost:4545/run/045_mod.ts",
+ ],
+ env: {
+ HTTP_PROXY: `http://${addr}`,
+ },
+ }).output();
+
+ assertEquals(code, 0);
+}
+
+async function testFetchNoProxy() {
+ const { code } = await new Deno.Command(Deno.execPath(), {
+ args: [
+ "run",
+ "--quiet",
+ "--reload",
+ "--allow-net",
+ "run/045_proxy_client.ts",
+ ],
+ env: {
+ HTTP_PROXY: "http://not.exising.proxy.server",
+ NO_PROXY: "localhost",
+ },
+ }).output();
+
+ assertEquals(code, 0);
+}
+
+async function testModuleDownloadNoProxy() {
+ const { code } = await new Deno.Command(Deno.execPath(), {
+ args: [
+ "cache",
+ "--reload",
+ "--quiet",
+ "http://localhost:4545/run/045_mod.ts",
+ ],
+ env: {
+ HTTP_PROXY: "http://not.exising.proxy.server",
+ NO_PROXY: "localhost",
+ },
+ }).output();
+
+ assertEquals(code, 0);
+}
+
+async function testFetchProgrammaticProxy() {
+ const { code } = await new Deno.Command(Deno.execPath(), {
+ args: [
+ "run",
+ "--quiet",
+ "--reload",
+ "--allow-net=localhost:4545,localhost:4555",
+ "--unstable",
+ "run/045_programmatic_proxy_client.ts",
+ ],
+ }).output();
+ assertEquals(code, 0);
+}
+
+proxyServer();
+await testFetch();
+await testModuleDownload();
+await testFetchNoProxy();
+await testModuleDownloadNoProxy();
+await testFetchProgrammaticProxy();
+Deno.exit(0);
diff --git a/cli/tests/testdata/run/045_proxy_test.ts.out b/tests/testdata/run/045_proxy_test.ts.out
index a1e567a14..a1e567a14 100644
--- a/cli/tests/testdata/run/045_proxy_test.ts.out
+++ b/tests/testdata/run/045_proxy_test.ts.out
diff --git a/cli/tests/testdata/run/046_jsx_test.tsx b/tests/testdata/run/046_jsx_test.tsx
index 5ed3ff2fa..5ed3ff2fa 100644
--- a/cli/tests/testdata/run/046_jsx_test.tsx
+++ b/tests/testdata/run/046_jsx_test.tsx
diff --git a/cli/tests/testdata/run/046_jsx_test.tsx.out b/tests/testdata/run/046_jsx_test.tsx.out
index 85cfe824b..85cfe824b 100644
--- a/cli/tests/testdata/run/046_jsx_test.tsx.out
+++ b/tests/testdata/run/046_jsx_test.tsx.out
diff --git a/cli/tests/testdata/run/047_jsx_test.jsx b/tests/testdata/run/047_jsx_test.jsx
index 4c2314072..4c2314072 100644
--- a/cli/tests/testdata/run/047_jsx_test.jsx
+++ b/tests/testdata/run/047_jsx_test.jsx
diff --git a/cli/tests/testdata/run/047_jsx_test.jsx.out b/tests/testdata/run/047_jsx_test.jsx.out
index 85cfe824b..85cfe824b 100644
--- a/cli/tests/testdata/run/047_jsx_test.jsx.out
+++ b/tests/testdata/run/047_jsx_test.jsx.out
diff --git a/cli/tests/testdata/run/048_media_types_jsx.ts b/tests/testdata/run/048_media_types_jsx.ts
index 8dcd0ad68..8dcd0ad68 100644
--- a/cli/tests/testdata/run/048_media_types_jsx.ts
+++ b/tests/testdata/run/048_media_types_jsx.ts
diff --git a/cli/tests/testdata/run/048_media_types_jsx.ts.out b/tests/testdata/run/048_media_types_jsx.ts.out
index 266cc5741..266cc5741 100644
--- a/cli/tests/testdata/run/048_media_types_jsx.ts.out
+++ b/tests/testdata/run/048_media_types_jsx.ts.out
diff --git a/cli/tests/testdata/run/052_no_remote_flag.out b/tests/testdata/run/052_no_remote_flag.out
index 2f5950ee8..2f5950ee8 100644
--- a/cli/tests/testdata/run/052_no_remote_flag.out
+++ b/tests/testdata/run/052_no_remote_flag.out
diff --git a/cli/tests/testdata/run/056_make_temp_file_write_perm.out b/tests/testdata/run/056_make_temp_file_write_perm.out
index c56aae43f..c56aae43f 100644
--- a/cli/tests/testdata/run/056_make_temp_file_write_perm.out
+++ b/tests/testdata/run/056_make_temp_file_write_perm.out
diff --git a/cli/tests/testdata/run/056_make_temp_file_write_perm.ts b/tests/testdata/run/056_make_temp_file_write_perm.ts
index c0deda8a2..c0deda8a2 100644
--- a/cli/tests/testdata/run/056_make_temp_file_write_perm.ts
+++ b/tests/testdata/run/056_make_temp_file_write_perm.ts
diff --git a/cli/tests/testdata/run/058_tasks_microtasks_close.ts b/tests/testdata/run/058_tasks_microtasks_close.ts
index 38e156044..38e156044 100644
--- a/cli/tests/testdata/run/058_tasks_microtasks_close.ts
+++ b/tests/testdata/run/058_tasks_microtasks_close.ts
diff --git a/cli/tests/testdata/run/058_tasks_microtasks_close.ts.out b/tests/testdata/run/058_tasks_microtasks_close.ts.out
index 218273cab..218273cab 100644
--- a/cli/tests/testdata/run/058_tasks_microtasks_close.ts.out
+++ b/tests/testdata/run/058_tasks_microtasks_close.ts.out
diff --git a/cli/tests/testdata/run/059_fs_relative_path_perm.ts b/tests/testdata/run/059_fs_relative_path_perm.ts
index 26630fe1c..26630fe1c 100644
--- a/cli/tests/testdata/run/059_fs_relative_path_perm.ts
+++ b/tests/testdata/run/059_fs_relative_path_perm.ts
diff --git a/cli/tests/testdata/run/059_fs_relative_path_perm.ts.out b/tests/testdata/run/059_fs_relative_path_perm.ts.out
index b23628cd6..b23628cd6 100644
--- a/cli/tests/testdata/run/059_fs_relative_path_perm.ts.out
+++ b/tests/testdata/run/059_fs_relative_path_perm.ts.out
diff --git a/cli/tests/testdata/run/061_permissions_request.ts b/tests/testdata/run/061_permissions_request.ts
index c31e7ac42..c31e7ac42 100644
--- a/cli/tests/testdata/run/061_permissions_request.ts
+++ b/tests/testdata/run/061_permissions_request.ts
diff --git a/cli/tests/testdata/run/061_permissions_request_sync.ts b/tests/testdata/run/061_permissions_request_sync.ts
index 52d225c47..52d225c47 100644
--- a/cli/tests/testdata/run/061_permissions_request_sync.ts
+++ b/tests/testdata/run/061_permissions_request_sync.ts
diff --git a/cli/tests/testdata/run/062_permissions_request_global.ts b/tests/testdata/run/062_permissions_request_global.ts
index e431bc31b..e431bc31b 100644
--- a/cli/tests/testdata/run/062_permissions_request_global.ts
+++ b/tests/testdata/run/062_permissions_request_global.ts
diff --git a/cli/tests/testdata/run/062_permissions_request_global_sync.ts b/tests/testdata/run/062_permissions_request_global_sync.ts
index d0e17c7ed..d0e17c7ed 100644
--- a/cli/tests/testdata/run/062_permissions_request_global_sync.ts
+++ b/tests/testdata/run/062_permissions_request_global_sync.ts
diff --git a/cli/tests/testdata/run/063_permissions_revoke.ts b/tests/testdata/run/063_permissions_revoke.ts
index a81eee7cb..a81eee7cb 100644
--- a/cli/tests/testdata/run/063_permissions_revoke.ts
+++ b/tests/testdata/run/063_permissions_revoke.ts
diff --git a/cli/tests/testdata/run/063_permissions_revoke.ts.out b/tests/testdata/run/063_permissions_revoke.ts.out
index bbd64c557..bbd64c557 100644
--- a/cli/tests/testdata/run/063_permissions_revoke.ts.out
+++ b/tests/testdata/run/063_permissions_revoke.ts.out
diff --git a/cli/tests/testdata/run/063_permissions_revoke_sync.ts b/tests/testdata/run/063_permissions_revoke_sync.ts
index 267ef3785..267ef3785 100644
--- a/cli/tests/testdata/run/063_permissions_revoke_sync.ts
+++ b/tests/testdata/run/063_permissions_revoke_sync.ts
diff --git a/cli/tests/testdata/run/064_permissions_revoke_global.ts b/tests/testdata/run/064_permissions_revoke_global.ts
index a9b1fcd40..a9b1fcd40 100644
--- a/cli/tests/testdata/run/064_permissions_revoke_global.ts
+++ b/tests/testdata/run/064_permissions_revoke_global.ts
diff --git a/cli/tests/testdata/run/064_permissions_revoke_global.ts.out b/tests/testdata/run/064_permissions_revoke_global.ts.out
index f7e389a76..f7e389a76 100644
--- a/cli/tests/testdata/run/064_permissions_revoke_global.ts.out
+++ b/tests/testdata/run/064_permissions_revoke_global.ts.out
diff --git a/cli/tests/testdata/run/064_permissions_revoke_global_sync.ts b/tests/testdata/run/064_permissions_revoke_global_sync.ts
index 597b1481d..597b1481d 100644
--- a/cli/tests/testdata/run/064_permissions_revoke_global_sync.ts
+++ b/tests/testdata/run/064_permissions_revoke_global_sync.ts
diff --git a/cli/tests/testdata/run/065_permissions_revoke_net.ts b/tests/testdata/run/065_permissions_revoke_net.ts
index 40c9d413a..40c9d413a 100644
--- a/cli/tests/testdata/run/065_permissions_revoke_net.ts
+++ b/tests/testdata/run/065_permissions_revoke_net.ts
diff --git a/cli/tests/testdata/run/065_permissions_revoke_net.ts.out b/tests/testdata/run/065_permissions_revoke_net.ts.out
index a9c941ecd..a9c941ecd 100644
--- a/cli/tests/testdata/run/065_permissions_revoke_net.ts.out
+++ b/tests/testdata/run/065_permissions_revoke_net.ts.out
diff --git a/cli/tests/testdata/run/066_prompt.ts b/tests/testdata/run/066_prompt.ts
index f059be685..f059be685 100644
--- a/cli/tests/testdata/run/066_prompt.ts
+++ b/tests/testdata/run/066_prompt.ts
diff --git a/cli/tests/testdata/run/070_location.ts b/tests/testdata/run/070_location.ts
index 05e5abdf1..05e5abdf1 100644
--- a/cli/tests/testdata/run/070_location.ts
+++ b/tests/testdata/run/070_location.ts
diff --git a/cli/tests/testdata/run/070_location.ts.out b/tests/testdata/run/070_location.ts.out
index a03cf6477..a03cf6477 100644
--- a/cli/tests/testdata/run/070_location.ts.out
+++ b/tests/testdata/run/070_location.ts.out
diff --git a/cli/tests/testdata/run/071_location_unset.ts b/tests/testdata/run/071_location_unset.ts
index f560d2716..f560d2716 100644
--- a/cli/tests/testdata/run/071_location_unset.ts
+++ b/tests/testdata/run/071_location_unset.ts
diff --git a/cli/tests/testdata/run/071_location_unset.ts.out b/tests/testdata/run/071_location_unset.ts.out
index c9482011f..c9482011f 100644
--- a/cli/tests/testdata/run/071_location_unset.ts.out
+++ b/tests/testdata/run/071_location_unset.ts.out
diff --git a/cli/tests/testdata/run/072_location_relative_fetch.ts b/tests/testdata/run/072_location_relative_fetch.ts
index b2a291693..b2a291693 100644
--- a/cli/tests/testdata/run/072_location_relative_fetch.ts
+++ b/tests/testdata/run/072_location_relative_fetch.ts
diff --git a/cli/tests/testdata/run/072_location_relative_fetch.ts.out b/tests/testdata/run/072_location_relative_fetch.ts.out
index 8151f6f88..8151f6f88 100644
--- a/cli/tests/testdata/run/072_location_relative_fetch.ts.out
+++ b/tests/testdata/run/072_location_relative_fetch.ts.out
diff --git a/cli/tests/testdata/run/075_import_local_query_hash.ts b/tests/testdata/run/075_import_local_query_hash.ts
index 99c7ceab4..99c7ceab4 100644
--- a/cli/tests/testdata/run/075_import_local_query_hash.ts
+++ b/tests/testdata/run/075_import_local_query_hash.ts
diff --git a/cli/tests/testdata/run/075_import_local_query_hash.ts.out b/tests/testdata/run/075_import_local_query_hash.ts.out
index 340777742..340777742 100644
--- a/cli/tests/testdata/run/075_import_local_query_hash.ts.out
+++ b/tests/testdata/run/075_import_local_query_hash.ts.out
diff --git a/cli/tests/testdata/run/077_fetch_empty.ts b/tests/testdata/run/077_fetch_empty.ts
index b10a9094e..b10a9094e 100644
--- a/cli/tests/testdata/run/077_fetch_empty.ts
+++ b/tests/testdata/run/077_fetch_empty.ts
diff --git a/cli/tests/testdata/run/077_fetch_empty.ts.out b/tests/testdata/run/077_fetch_empty.ts.out
index f11e0f563..f11e0f563 100644
--- a/cli/tests/testdata/run/077_fetch_empty.ts.out
+++ b/tests/testdata/run/077_fetch_empty.ts.out
diff --git a/cli/tests/testdata/run/078_unload_on_exit.ts b/tests/testdata/run/078_unload_on_exit.ts
index 43d33eb25..43d33eb25 100644
--- a/cli/tests/testdata/run/078_unload_on_exit.ts
+++ b/tests/testdata/run/078_unload_on_exit.ts
diff --git a/cli/tests/testdata/run/078_unload_on_exit.ts.out b/tests/testdata/run/078_unload_on_exit.ts.out
index e213f9632..e213f9632 100644
--- a/cli/tests/testdata/run/078_unload_on_exit.ts.out
+++ b/tests/testdata/run/078_unload_on_exit.ts.out
diff --git a/cli/tests/testdata/run/079_location_authentication.ts b/tests/testdata/run/079_location_authentication.ts
index 4989312ac..4989312ac 100644
--- a/cli/tests/testdata/run/079_location_authentication.ts
+++ b/tests/testdata/run/079_location_authentication.ts
diff --git a/cli/tests/testdata/run/079_location_authentication.ts.out b/tests/testdata/run/079_location_authentication.ts.out
index 0dd73f999..0dd73f999 100644
--- a/cli/tests/testdata/run/079_location_authentication.ts.out
+++ b/tests/testdata/run/079_location_authentication.ts.out
diff --git a/cli/tests/testdata/run/081_location_relative_fetch_redirect.ts b/tests/testdata/run/081_location_relative_fetch_redirect.ts
index 742ef0afb..742ef0afb 100644
--- a/cli/tests/testdata/run/081_location_relative_fetch_redirect.ts
+++ b/tests/testdata/run/081_location_relative_fetch_redirect.ts
diff --git a/cli/tests/testdata/run/081_location_relative_fetch_redirect.ts.out b/tests/testdata/run/081_location_relative_fetch_redirect.ts.out
index f62b93195..f62b93195 100644
--- a/cli/tests/testdata/run/081_location_relative_fetch_redirect.ts.out
+++ b/tests/testdata/run/081_location_relative_fetch_redirect.ts.out
diff --git a/cli/tests/testdata/run/082_prepare_stack_trace_throw.js b/tests/testdata/run/082_prepare_stack_trace_throw.js
index 8137bfdc8..8137bfdc8 100644
--- a/cli/tests/testdata/run/082_prepare_stack_trace_throw.js
+++ b/tests/testdata/run/082_prepare_stack_trace_throw.js
diff --git a/cli/tests/testdata/run/082_prepare_stack_trace_throw.js.out b/tests/testdata/run/082_prepare_stack_trace_throw.js.out
index b6715c749..b6715c749 100644
--- a/cli/tests/testdata/run/082_prepare_stack_trace_throw.js.out
+++ b/tests/testdata/run/082_prepare_stack_trace_throw.js.out
diff --git a/cli/tests/testdata/run/083_legacy_external_source_map.ts b/tests/testdata/run/083_legacy_external_source_map.ts
index 73d267b87..73d267b87 100644
--- a/cli/tests/testdata/run/083_legacy_external_source_map.ts
+++ b/tests/testdata/run/083_legacy_external_source_map.ts
diff --git a/cli/tests/testdata/run/088_dynamic_import_already_evaluating.ts b/tests/testdata/run/088_dynamic_import_already_evaluating.ts
index 272163a5d..272163a5d 100644
--- a/cli/tests/testdata/run/088_dynamic_import_already_evaluating.ts
+++ b/tests/testdata/run/088_dynamic_import_already_evaluating.ts
diff --git a/cli/tests/testdata/run/088_dynamic_import_already_evaluating.ts.out b/tests/testdata/run/088_dynamic_import_already_evaluating.ts.out
index a36dd11e7..a36dd11e7 100644
--- a/cli/tests/testdata/run/088_dynamic_import_already_evaluating.ts.out
+++ b/tests/testdata/run/088_dynamic_import_already_evaluating.ts.out
diff --git a/cli/tests/testdata/run/088_dynamic_import_target.ts b/tests/testdata/run/088_dynamic_import_target.ts
index 226f1851a..226f1851a 100644
--- a/cli/tests/testdata/run/088_dynamic_import_target.ts
+++ b/tests/testdata/run/088_dynamic_import_target.ts
diff --git a/cli/tests/testdata/run/089_run_allow_list.ts b/tests/testdata/run/089_run_allow_list.ts
index d9cabba84..d9cabba84 100644
--- a/cli/tests/testdata/run/089_run_allow_list.ts
+++ b/tests/testdata/run/089_run_allow_list.ts
diff --git a/cli/tests/testdata/run/089_run_allow_list.ts.out b/tests/testdata/run/089_run_allow_list.ts.out
index 68a4a2ac5..68a4a2ac5 100644
--- a/cli/tests/testdata/run/089_run_allow_list.ts.out
+++ b/tests/testdata/run/089_run_allow_list.ts.out
diff --git a/cli/tests/testdata/run/090_run_permissions_request.ts b/tests/testdata/run/090_run_permissions_request.ts
index 8ecad2b3b..8ecad2b3b 100644
--- a/cli/tests/testdata/run/090_run_permissions_request.ts
+++ b/tests/testdata/run/090_run_permissions_request.ts
diff --git a/cli/tests/testdata/run/090_run_permissions_request_sync.ts b/tests/testdata/run/090_run_permissions_request_sync.ts
index 40ff84522..40ff84522 100644
--- a/cli/tests/testdata/run/090_run_permissions_request_sync.ts
+++ b/tests/testdata/run/090_run_permissions_request_sync.ts
diff --git a/cli/tests/testdata/run/091_use_define_for_class_fields.ts b/tests/testdata/run/091_use_define_for_class_fields.ts
index 46be3ac0b..46be3ac0b 100644
--- a/cli/tests/testdata/run/091_use_define_for_class_fields.ts
+++ b/tests/testdata/run/091_use_define_for_class_fields.ts
diff --git a/cli/tests/testdata/run/091_use_define_for_class_fields.ts.out b/tests/testdata/run/091_use_define_for_class_fields.ts.out
index 08f94a967..08f94a967 100644
--- a/cli/tests/testdata/run/091_use_define_for_class_fields.ts.out
+++ b/tests/testdata/run/091_use_define_for_class_fields.ts.out
diff --git a/cli/tests/testdata/run/092_import_map_unmapped_bare_specifier.ts b/tests/testdata/run/092_import_map_unmapped_bare_specifier.ts
index 87684430d..87684430d 100644
--- a/cli/tests/testdata/run/092_import_map_unmapped_bare_specifier.ts
+++ b/tests/testdata/run/092_import_map_unmapped_bare_specifier.ts
diff --git a/cli/tests/testdata/run/092_import_map_unmapped_bare_specifier.ts.out b/tests/testdata/run/092_import_map_unmapped_bare_specifier.ts.out
index 7f35b8b4f..7f35b8b4f 100644
--- a/cli/tests/testdata/run/092_import_map_unmapped_bare_specifier.ts.out
+++ b/tests/testdata/run/092_import_map_unmapped_bare_specifier.ts.out
diff --git a/cli/tests/testdata/run/aggregate_error.out b/tests/testdata/run/aggregate_error.out
index 59c0fb2a5..59c0fb2a5 100644
--- a/cli/tests/testdata/run/aggregate_error.out
+++ b/tests/testdata/run/aggregate_error.out
diff --git a/cli/tests/testdata/run/aggregate_error.ts b/tests/testdata/run/aggregate_error.ts
index ce4b54376..ce4b54376 100644
--- a/cli/tests/testdata/run/aggregate_error.ts
+++ b/tests/testdata/run/aggregate_error.ts
diff --git a/cli/tests/testdata/run/async_error.ts b/tests/testdata/run/async_error.ts
index b55c73aeb..b55c73aeb 100644
--- a/cli/tests/testdata/run/async_error.ts
+++ b/tests/testdata/run/async_error.ts
diff --git a/cli/tests/testdata/run/async_error.ts.out b/tests/testdata/run/async_error.ts.out
index b424f9072..b424f9072 100644
--- a/cli/tests/testdata/run/async_error.ts.out
+++ b/tests/testdata/run/async_error.ts.out
diff --git a/cli/tests/testdata/run/auto_discover_lockfile/deno.json b/tests/testdata/run/auto_discover_lockfile/deno.json
index 90faa728a..90faa728a 100644
--- a/cli/tests/testdata/run/auto_discover_lockfile/deno.json
+++ b/tests/testdata/run/auto_discover_lockfile/deno.json
diff --git a/cli/tests/testdata/run/auto_discover_lockfile/deno.lock b/tests/testdata/run/auto_discover_lockfile/deno.lock
index 059f66789..059f66789 100644
--- a/cli/tests/testdata/run/auto_discover_lockfile/deno.lock
+++ b/tests/testdata/run/auto_discover_lockfile/deno.lock
diff --git a/cli/tests/testdata/run/auto_discover_lockfile/main.out b/tests/testdata/run/auto_discover_lockfile/main.out
index 28f4724e9..28f4724e9 100644
--- a/cli/tests/testdata/run/auto_discover_lockfile/main.out
+++ b/tests/testdata/run/auto_discover_lockfile/main.out
diff --git a/cli/tests/testdata/run/auto_discover_lockfile/main.ts b/tests/testdata/run/auto_discover_lockfile/main.ts
index baa52775d..baa52775d 100644
--- a/cli/tests/testdata/run/auto_discover_lockfile/main.ts
+++ b/tests/testdata/run/auto_discover_lockfile/main.ts
diff --git a/cli/tests/testdata/run/before_unload.js b/tests/testdata/run/before_unload.js
index 2572e512b..2572e512b 100644
--- a/cli/tests/testdata/run/before_unload.js
+++ b/tests/testdata/run/before_unload.js
diff --git a/cli/tests/testdata/run/before_unload.js.out b/tests/testdata/run/before_unload.js.out
index f1f2ab49a..f1f2ab49a 100644
--- a/cli/tests/testdata/run/before_unload.js.out
+++ b/tests/testdata/run/before_unload.js.out
diff --git a/cli/tests/testdata/run/blob_gc_finalization.js b/tests/testdata/run/blob_gc_finalization.js
index c721e6b45..c721e6b45 100644
--- a/cli/tests/testdata/run/blob_gc_finalization.js
+++ b/tests/testdata/run/blob_gc_finalization.js
diff --git a/cli/tests/testdata/run/blob_gc_finalization.js.out b/tests/testdata/run/blob_gc_finalization.js.out
index dcc4500f8..dcc4500f8 100644
--- a/cli/tests/testdata/run/blob_gc_finalization.js.out
+++ b/tests/testdata/run/blob_gc_finalization.js.out
diff --git a/cli/tests/testdata/run/byte_order_mark.out b/tests/testdata/run/byte_order_mark.out
index 557db03de..557db03de 100644
--- a/cli/tests/testdata/run/byte_order_mark.out
+++ b/tests/testdata/run/byte_order_mark.out
diff --git a/cli/tests/testdata/run/byte_order_mark.ts b/tests/testdata/run/byte_order_mark.ts
index 40eb23c1d..40eb23c1d 100644
--- a/cli/tests/testdata/run/byte_order_mark.ts
+++ b/tests/testdata/run/byte_order_mark.ts
diff --git a/cli/tests/testdata/run/check_js_points_to_ts/bar.ts b/tests/testdata/run/check_js_points_to_ts/bar.ts
index 026cd2f1e..026cd2f1e 100644
--- a/cli/tests/testdata/run/check_js_points_to_ts/bar.ts
+++ b/tests/testdata/run/check_js_points_to_ts/bar.ts
diff --git a/cli/tests/testdata/run/check_js_points_to_ts/foo.d.ts b/tests/testdata/run/check_js_points_to_ts/foo.d.ts
index e69de29bb..e69de29bb 100644
--- a/cli/tests/testdata/run/check_js_points_to_ts/foo.d.ts
+++ b/tests/testdata/run/check_js_points_to_ts/foo.d.ts
diff --git a/cli/tests/testdata/run/check_js_points_to_ts/foo.js b/tests/testdata/run/check_js_points_to_ts/foo.js
index 9ac1a14ff..9ac1a14ff 100644
--- a/cli/tests/testdata/run/check_js_points_to_ts/foo.js
+++ b/tests/testdata/run/check_js_points_to_ts/foo.js
diff --git a/cli/tests/testdata/run/check_js_points_to_ts/test.js b/tests/testdata/run/check_js_points_to_ts/test.js
index 00d894451..00d894451 100644
--- a/cli/tests/testdata/run/check_js_points_to_ts/test.js
+++ b/tests/testdata/run/check_js_points_to_ts/test.js
diff --git a/cli/tests/testdata/run/check_js_points_to_ts/test.js.out b/tests/testdata/run/check_js_points_to_ts/test.js.out
index 67cda9a65..67cda9a65 100644
--- a/cli/tests/testdata/run/check_js_points_to_ts/test.js.out
+++ b/tests/testdata/run/check_js_points_to_ts/test.js.out
diff --git a/cli/tests/testdata/run/checkjs.tsconfig.json b/tests/testdata/run/checkjs.tsconfig.json
index 46d96db9e..46d96db9e 100644
--- a/cli/tests/testdata/run/checkjs.tsconfig.json
+++ b/tests/testdata/run/checkjs.tsconfig.json
diff --git a/cli/tests/testdata/run/cjs_imports/commonjs.cjs b/tests/testdata/run/cjs_imports/commonjs.cjs
index accefceba..accefceba 100644
--- a/cli/tests/testdata/run/cjs_imports/commonjs.cjs
+++ b/tests/testdata/run/cjs_imports/commonjs.cjs
diff --git a/cli/tests/testdata/run/cjs_imports/main.out b/tests/testdata/run/cjs_imports/main.out
index 557db03de..557db03de 100644
--- a/cli/tests/testdata/run/cjs_imports/main.out
+++ b/tests/testdata/run/cjs_imports/main.out
diff --git a/cli/tests/testdata/run/cjs_imports/main.ts b/tests/testdata/run/cjs_imports/main.ts
index d8b77c22e..d8b77c22e 100644
--- a/cli/tests/testdata/run/cjs_imports/main.ts
+++ b/tests/testdata/run/cjs_imports/main.ts
diff --git a/cli/tests/testdata/run/classic_workers_event_loop.js b/tests/testdata/run/classic_workers_event_loop.js
index 810a6df7f..810a6df7f 100644
--- a/cli/tests/testdata/run/classic_workers_event_loop.js
+++ b/tests/testdata/run/classic_workers_event_loop.js
diff --git a/cli/tests/testdata/run/classic_workers_event_loop.js.out b/tests/testdata/run/classic_workers_event_loop.js.out
index 19f86f493..19f86f493 100644
--- a/cli/tests/testdata/run/classic_workers_event_loop.js.out
+++ b/tests/testdata/run/classic_workers_event_loop.js.out
diff --git a/cli/tests/testdata/run/colors_without_globalThis.js b/tests/testdata/run/colors_without_globalThis.js
index f9d4b68fc..f9d4b68fc 100644
--- a/cli/tests/testdata/run/colors_without_globalThis.js
+++ b/tests/testdata/run/colors_without_globalThis.js
diff --git a/cli/tests/testdata/run/complex_error.ts b/tests/testdata/run/complex_error.ts
index b462992ac..b462992ac 100644
--- a/cli/tests/testdata/run/complex_error.ts
+++ b/tests/testdata/run/complex_error.ts
diff --git a/cli/tests/testdata/run/complex_error.ts.out b/tests/testdata/run/complex_error.ts.out
index 3c3c26eaf..3c3c26eaf 100644
--- a/cli/tests/testdata/run/complex_error.ts.out
+++ b/tests/testdata/run/complex_error.ts.out
diff --git a/cli/tests/testdata/run/complex_permissions_test.ts b/tests/testdata/run/complex_permissions_test.ts
index bae157246..bae157246 100644
--- a/cli/tests/testdata/run/complex_permissions_test.ts
+++ b/tests/testdata/run/complex_permissions_test.ts
diff --git a/cli/tests/testdata/run/config/main.out b/tests/testdata/run/config/main.out
index 277314807..277314807 100644
--- a/cli/tests/testdata/run/config/main.out
+++ b/tests/testdata/run/config/main.out
diff --git a/cli/tests/testdata/run/config/main.ts b/tests/testdata/run/config/main.ts
index 51a61e447..51a61e447 100644
--- a/cli/tests/testdata/run/config/main.ts
+++ b/tests/testdata/run/config/main.ts
diff --git a/cli/tests/testdata/run/config/tsconfig.json b/tests/testdata/run/config/tsconfig.json
index 0f0881920..0f0881920 100644
--- a/cli/tests/testdata/run/config/tsconfig.json
+++ b/tests/testdata/run/config/tsconfig.json
diff --git a/cli/tests/testdata/run/config_file_lock_boolean/deno.lock b/tests/testdata/run/config_file_lock_boolean/deno.lock
index 059f66789..059f66789 100644
--- a/cli/tests/testdata/run/config_file_lock_boolean/deno.lock
+++ b/tests/testdata/run/config_file_lock_boolean/deno.lock
diff --git a/cli/tests/testdata/run/config_file_lock_boolean/false.json b/tests/testdata/run/config_file_lock_boolean/false.json
index 358b7d299..358b7d299 100644
--- a/cli/tests/testdata/run/config_file_lock_boolean/false.json
+++ b/tests/testdata/run/config_file_lock_boolean/false.json
diff --git a/cli/tests/testdata/run/config_file_lock_boolean/false.main.out b/tests/testdata/run/config_file_lock_boolean/false.main.out
index 0d8f0a237..0d8f0a237 100644
--- a/cli/tests/testdata/run/config_file_lock_boolean/false.main.out
+++ b/tests/testdata/run/config_file_lock_boolean/false.main.out
diff --git a/cli/tests/testdata/run/config_file_lock_boolean/main.ts b/tests/testdata/run/config_file_lock_boolean/main.ts
index baa52775d..baa52775d 100644
--- a/cli/tests/testdata/run/config_file_lock_boolean/main.ts
+++ b/tests/testdata/run/config_file_lock_boolean/main.ts
diff --git a/cli/tests/testdata/run/config_file_lock_boolean/true.json b/tests/testdata/run/config_file_lock_boolean/true.json
index 090481af9..090481af9 100644
--- a/cli/tests/testdata/run/config_file_lock_boolean/true.json
+++ b/tests/testdata/run/config_file_lock_boolean/true.json
diff --git a/cli/tests/testdata/run/config_file_lock_boolean/true.main.out b/tests/testdata/run/config_file_lock_boolean/true.main.out
index 313c0eb0c..313c0eb0c 100644
--- a/cli/tests/testdata/run/config_file_lock_boolean/true.main.out
+++ b/tests/testdata/run/config_file_lock_boolean/true.main.out
diff --git a/cli/tests/testdata/run/config_file_lock_path.json b/tests/testdata/run/config_file_lock_path.json
index 2c393f76e..2c393f76e 100644
--- a/cli/tests/testdata/run/config_file_lock_path.json
+++ b/tests/testdata/run/config_file_lock_path.json
diff --git a/cli/tests/testdata/run/config_file_lock_path.out b/tests/testdata/run/config_file_lock_path.out
index 97d35337f..97d35337f 100644
--- a/cli/tests/testdata/run/config_file_lock_path.out
+++ b/tests/testdata/run/config_file_lock_path.out
diff --git a/cli/tests/testdata/run/config_json_import.ts b/tests/testdata/run/config_json_import.ts
index 9cf1cceaa..9cf1cceaa 100644
--- a/cli/tests/testdata/run/config_json_import.ts
+++ b/tests/testdata/run/config_json_import.ts
diff --git a/cli/tests/testdata/run/config_json_import.ts.out b/tests/testdata/run/config_json_import.ts.out
index aa55be7d5..aa55be7d5 100644
--- a/cli/tests/testdata/run/config_json_import.ts.out
+++ b/tests/testdata/run/config_json_import.ts.out
diff --git a/cli/tests/testdata/run/config_types/deno.lock b/tests/testdata/run/config_types/deno.lock
index 157bd98a2..157bd98a2 100644
--- a/cli/tests/testdata/run/config_types/deno.lock
+++ b/tests/testdata/run/config_types/deno.lock
diff --git a/cli/tests/testdata/run/config_types/main.out b/tests/testdata/run/config_types/main.out
index 417b7b537..417b7b537 100644
--- a/cli/tests/testdata/run/config_types/main.out
+++ b/tests/testdata/run/config_types/main.out
diff --git a/cli/tests/testdata/run/config_types/main.ts b/tests/testdata/run/config_types/main.ts
index f1a8d6583..f1a8d6583 100644
--- a/cli/tests/testdata/run/config_types/main.ts
+++ b/tests/testdata/run/config_types/main.ts
diff --git a/cli/tests/testdata/run/config_types/remote.tsconfig.json b/tests/testdata/run/config_types/remote.tsconfig.json
index 255ff5def..255ff5def 100644
--- a/cli/tests/testdata/run/config_types/remote.tsconfig.json
+++ b/tests/testdata/run/config_types/remote.tsconfig.json
diff --git a/cli/tests/testdata/run/config_types/tsconfig.json b/tests/testdata/run/config_types/tsconfig.json
index 85f1549e0..85f1549e0 100644
--- a/cli/tests/testdata/run/config_types/tsconfig.json
+++ b/tests/testdata/run/config_types/tsconfig.json
diff --git a/cli/tests/testdata/run/config_types/types.d.ts b/tests/testdata/run/config_types/types.d.ts
index 536a6d0a6..536a6d0a6 100644
--- a/cli/tests/testdata/run/config_types/types.d.ts
+++ b/tests/testdata/run/config_types/types.d.ts
diff --git a/cli/tests/testdata/run/custom_inspect_url.js b/tests/testdata/run/custom_inspect_url.js
index 69aa2dc49..69aa2dc49 100644
--- a/cli/tests/testdata/run/custom_inspect_url.js
+++ b/tests/testdata/run/custom_inspect_url.js
diff --git a/cli/tests/testdata/run/custom_inspect_url.js.out b/tests/testdata/run/custom_inspect_url.js.out
index 1c714e34e..1c714e34e 100644
--- a/cli/tests/testdata/run/custom_inspect_url.js.out
+++ b/tests/testdata/run/custom_inspect_url.js.out
diff --git a/cli/tests/testdata/run/decorators/experimental/deno.json b/tests/testdata/run/decorators/experimental/deno.json
index 504cd646e..504cd646e 100644
--- a/cli/tests/testdata/run/decorators/experimental/deno.json
+++ b/tests/testdata/run/decorators/experimental/deno.json
diff --git a/cli/tests/testdata/run/decorators/experimental/no_check/main.out b/tests/testdata/run/decorators/experimental/no_check/main.out
index 015f7076e..015f7076e 100644
--- a/cli/tests/testdata/run/decorators/experimental/no_check/main.out
+++ b/tests/testdata/run/decorators/experimental/no_check/main.out
diff --git a/cli/tests/testdata/run/decorators/experimental/no_check/main.ts b/tests/testdata/run/decorators/experimental/no_check/main.ts
index 9f7ec550d..9f7ec550d 100644
--- a/cli/tests/testdata/run/decorators/experimental/no_check/main.ts
+++ b/tests/testdata/run/decorators/experimental/no_check/main.ts
diff --git a/cli/tests/testdata/run/decorators/experimental/runtime/main.out b/tests/testdata/run/decorators/experimental/runtime/main.out
index 0fc1d4590..0fc1d4590 100644
--- a/cli/tests/testdata/run/decorators/experimental/runtime/main.out
+++ b/tests/testdata/run/decorators/experimental/runtime/main.out
diff --git a/cli/tests/testdata/run/decorators/experimental/runtime/main.ts b/tests/testdata/run/decorators/experimental/runtime/main.ts
index 40a26bbd4..40a26bbd4 100644
--- a/cli/tests/testdata/run/decorators/experimental/runtime/main.ts
+++ b/tests/testdata/run/decorators/experimental/runtime/main.ts
diff --git a/cli/tests/testdata/run/decorators/experimental/ts/main.out b/tests/testdata/run/decorators/experimental/ts/main.out
index ee77417cf..ee77417cf 100644
--- a/cli/tests/testdata/run/decorators/experimental/ts/main.out
+++ b/tests/testdata/run/decorators/experimental/ts/main.out
diff --git a/cli/tests/testdata/run/decorators/experimental/ts/main.ts b/tests/testdata/run/decorators/experimental/ts/main.ts
index 95fba6cd4..95fba6cd4 100644
--- a/cli/tests/testdata/run/decorators/experimental/ts/main.ts
+++ b/tests/testdata/run/decorators/experimental/ts/main.ts
diff --git a/cli/tests/testdata/run/decorators/tc39_proposal/main.out b/tests/testdata/run/decorators/tc39_proposal/main.out
index 39394952e..39394952e 100644
--- a/cli/tests/testdata/run/decorators/tc39_proposal/main.out
+++ b/tests/testdata/run/decorators/tc39_proposal/main.out
diff --git a/cli/tests/testdata/run/decorators/tc39_proposal/main.ts b/tests/testdata/run/decorators/tc39_proposal/main.ts
index 00c8a8502..00c8a8502 100644
--- a/cli/tests/testdata/run/decorators/tc39_proposal/main.ts
+++ b/tests/testdata/run/decorators/tc39_proposal/main.ts
diff --git a/cli/tests/testdata/run/delete_window.js b/tests/testdata/run/delete_window.js
index f2f16820d..f2f16820d 100644
--- a/cli/tests/testdata/run/delete_window.js
+++ b/tests/testdata/run/delete_window.js
diff --git a/cli/tests/testdata/run/deno_exit_tampering.ts b/tests/testdata/run/deno_exit_tampering.ts
index 3b24261e2..3b24261e2 100644
--- a/cli/tests/testdata/run/deno_exit_tampering.ts
+++ b/tests/testdata/run/deno_exit_tampering.ts
diff --git a/cli/tests/testdata/run/deny_all_permission_args.js b/tests/testdata/run/deny_all_permission_args.js
index b0ca864fb..b0ca864fb 100644
--- a/cli/tests/testdata/run/deny_all_permission_args.js
+++ b/tests/testdata/run/deny_all_permission_args.js
diff --git a/cli/tests/testdata/run/deny_all_permission_args.out b/tests/testdata/run/deny_all_permission_args.out
index 2a5228d62..2a5228d62 100644
--- a/cli/tests/testdata/run/deny_all_permission_args.out
+++ b/tests/testdata/run/deny_all_permission_args.out
diff --git a/cli/tests/testdata/run/deny_some_permission_args.js b/tests/testdata/run/deny_some_permission_args.js
index 320376b6f..320376b6f 100644
--- a/cli/tests/testdata/run/deny_some_permission_args.js
+++ b/tests/testdata/run/deny_some_permission_args.js
diff --git a/cli/tests/testdata/run/deny_some_permission_args.out b/tests/testdata/run/deny_some_permission_args.out
index 80c37159b..80c37159b 100644
--- a/cli/tests/testdata/run/deny_some_permission_args.out
+++ b/tests/testdata/run/deny_some_permission_args.out
diff --git a/cli/tests/testdata/run/disallow_http_from_https.js b/tests/testdata/run/disallow_http_from_https.js
index b8ddff170..b8ddff170 100644
--- a/cli/tests/testdata/run/disallow_http_from_https.js
+++ b/tests/testdata/run/disallow_http_from_https.js
diff --git a/cli/tests/testdata/run/disallow_http_from_https.ts b/tests/testdata/run/disallow_http_from_https.ts
index b8ddff170..b8ddff170 100644
--- a/cli/tests/testdata/run/disallow_http_from_https.ts
+++ b/tests/testdata/run/disallow_http_from_https.ts
diff --git a/cli/tests/testdata/run/disallow_http_from_https_js.out b/tests/testdata/run/disallow_http_from_https_js.out
index 5dc327975..5dc327975 100644
--- a/cli/tests/testdata/run/disallow_http_from_https_js.out
+++ b/tests/testdata/run/disallow_http_from_https_js.out
diff --git a/cli/tests/testdata/run/disallow_http_from_https_ts.out b/tests/testdata/run/disallow_http_from_https_ts.out
index e3b8f4390..e3b8f4390 100644
--- a/cli/tests/testdata/run/disallow_http_from_https_ts.out
+++ b/tests/testdata/run/disallow_http_from_https_ts.out
diff --git a/cli/tests/testdata/run/dom_exception_formatting.ts b/tests/testdata/run/dom_exception_formatting.ts
index 0209ec81e..0209ec81e 100644
--- a/cli/tests/testdata/run/dom_exception_formatting.ts
+++ b/tests/testdata/run/dom_exception_formatting.ts
diff --git a/cli/tests/testdata/run/dom_exception_formatting.ts.out b/tests/testdata/run/dom_exception_formatting.ts.out
index 75615d0a8..75615d0a8 100644
--- a/cli/tests/testdata/run/dom_exception_formatting.ts.out
+++ b/tests/testdata/run/dom_exception_formatting.ts.out
diff --git a/cli/tests/testdata/run/dynamic_import_already_rejected/error_001.ts b/tests/testdata/run/dynamic_import_already_rejected/error_001.ts
index b01068bc0..b01068bc0 100644
--- a/cli/tests/testdata/run/dynamic_import_already_rejected/error_001.ts
+++ b/tests/testdata/run/dynamic_import_already_rejected/error_001.ts
diff --git a/cli/tests/testdata/run/dynamic_import_already_rejected/main.out b/tests/testdata/run/dynamic_import_already_rejected/main.out
index c3eb66f9e..c3eb66f9e 100644
--- a/cli/tests/testdata/run/dynamic_import_already_rejected/main.out
+++ b/tests/testdata/run/dynamic_import_already_rejected/main.out
diff --git a/cli/tests/testdata/run/dynamic_import_already_rejected/main.ts b/tests/testdata/run/dynamic_import_already_rejected/main.ts
index 249de8d8b..249de8d8b 100644
--- a/cli/tests/testdata/run/dynamic_import_already_rejected/main.ts
+++ b/tests/testdata/run/dynamic_import_already_rejected/main.ts
diff --git a/cli/tests/testdata/run/dynamic_import_async_error/delayed_error.ts b/tests/testdata/run/dynamic_import_async_error/delayed_error.ts
index 76057e627..76057e627 100644
--- a/cli/tests/testdata/run/dynamic_import_async_error/delayed_error.ts
+++ b/tests/testdata/run/dynamic_import_async_error/delayed_error.ts
diff --git a/cli/tests/testdata/run/dynamic_import_async_error/main.out b/tests/testdata/run/dynamic_import_async_error/main.out
index 974c2e426..974c2e426 100644
--- a/cli/tests/testdata/run/dynamic_import_async_error/main.out
+++ b/tests/testdata/run/dynamic_import_async_error/main.out
diff --git a/cli/tests/testdata/run/dynamic_import_async_error/main.ts b/tests/testdata/run/dynamic_import_async_error/main.ts
index 998e7ed3e..998e7ed3e 100644
--- a/cli/tests/testdata/run/dynamic_import_async_error/main.ts
+++ b/tests/testdata/run/dynamic_import_async_error/main.ts
diff --git a/cli/tests/testdata/run/dynamic_import_concurrent_non_statically_analyzable/main.out b/tests/testdata/run/dynamic_import_concurrent_non_statically_analyzable/main.out
index c344d0aae..c344d0aae 100644
--- a/cli/tests/testdata/run/dynamic_import_concurrent_non_statically_analyzable/main.out
+++ b/tests/testdata/run/dynamic_import_concurrent_non_statically_analyzable/main.out
diff --git a/cli/tests/testdata/run/dynamic_import_concurrent_non_statically_analyzable/main.ts b/tests/testdata/run/dynamic_import_concurrent_non_statically_analyzable/main.ts
index 0832e40be..0832e40be 100644
--- a/cli/tests/testdata/run/dynamic_import_concurrent_non_statically_analyzable/main.ts
+++ b/tests/testdata/run/dynamic_import_concurrent_non_statically_analyzable/main.ts
diff --git a/cli/tests/testdata/run/dynamic_import_concurrent_non_statically_analyzable/mod.ts b/tests/testdata/run/dynamic_import_concurrent_non_statically_analyzable/mod.ts
index 56f2002ed..56f2002ed 100644
--- a/cli/tests/testdata/run/dynamic_import_concurrent_non_statically_analyzable/mod.ts
+++ b/tests/testdata/run/dynamic_import_concurrent_non_statically_analyzable/mod.ts
diff --git a/cli/tests/testdata/run/dynamic_import_conditional.js b/tests/testdata/run/dynamic_import_conditional.js
index 1b4193e3e..1b4193e3e 100644
--- a/cli/tests/testdata/run/dynamic_import_conditional.js
+++ b/tests/testdata/run/dynamic_import_conditional.js
diff --git a/cli/tests/testdata/run/dynamic_import_conditional.js.out b/tests/testdata/run/dynamic_import_conditional.js.out
index 27ba77dda..27ba77dda 100644
--- a/cli/tests/testdata/run/dynamic_import_conditional.js.out
+++ b/tests/testdata/run/dynamic_import_conditional.js.out
diff --git a/cli/tests/testdata/run/dynamic_import_syntax_error.js b/tests/testdata/run/dynamic_import_syntax_error.js
index be8ec132f..be8ec132f 100644
--- a/cli/tests/testdata/run/dynamic_import_syntax_error.js
+++ b/tests/testdata/run/dynamic_import_syntax_error.js
diff --git a/cli/tests/testdata/run/dynamic_import_syntax_error.js.out b/tests/testdata/run/dynamic_import_syntax_error.js.out
index 91e69eac7..91e69eac7 100644
--- a/cli/tests/testdata/run/dynamic_import_syntax_error.js.out
+++ b/tests/testdata/run/dynamic_import_syntax_error.js.out
diff --git a/cli/tests/testdata/run/dynamic_import_syntax_error_import.js b/tests/testdata/run/dynamic_import_syntax_error_import.js
index bcf075638..bcf075638 100644
--- a/cli/tests/testdata/run/dynamic_import_syntax_error_import.js
+++ b/tests/testdata/run/dynamic_import_syntax_error_import.js
diff --git a/cli/tests/testdata/run/empty.ts b/tests/testdata/run/empty.ts
index e69de29bb..e69de29bb 100644
--- a/cli/tests/testdata/run/empty.ts
+++ b/tests/testdata/run/empty.ts
diff --git a/cli/tests/testdata/run/env_file.out b/tests/testdata/run/env_file.out
index 54a0bf25d..54a0bf25d 100644
--- a/cli/tests/testdata/run/env_file.out
+++ b/tests/testdata/run/env_file.out
diff --git a/cli/tests/testdata/run/env_file.ts b/tests/testdata/run/env_file.ts
index 48488ce72..48488ce72 100644
--- a/cli/tests/testdata/run/env_file.ts
+++ b/tests/testdata/run/env_file.ts
diff --git a/cli/tests/testdata/run/env_file_missing.out b/tests/testdata/run/env_file_missing.out
index ae1f8f595..ae1f8f595 100644
--- a/cli/tests/testdata/run/env_file_missing.out
+++ b/tests/testdata/run/env_file_missing.out
diff --git a/cli/tests/testdata/run/error_001.ts b/tests/testdata/run/error_001.ts
index b01068bc0..b01068bc0 100644
--- a/cli/tests/testdata/run/error_001.ts
+++ b/tests/testdata/run/error_001.ts
diff --git a/cli/tests/testdata/run/error_001.ts.out b/tests/testdata/run/error_001.ts.out
index 9d8559917..9d8559917 100644
--- a/cli/tests/testdata/run/error_001.ts.out
+++ b/tests/testdata/run/error_001.ts.out
diff --git a/cli/tests/testdata/run/error_002.ts b/tests/testdata/run/error_002.ts
index 5f8179bbe..5f8179bbe 100644
--- a/cli/tests/testdata/run/error_002.ts
+++ b/tests/testdata/run/error_002.ts
diff --git a/cli/tests/testdata/run/error_002.ts.out b/tests/testdata/run/error_002.ts.out
index 9fec5d968..9fec5d968 100644
--- a/cli/tests/testdata/run/error_002.ts.out
+++ b/tests/testdata/run/error_002.ts.out
diff --git a/cli/tests/testdata/run/error_003_typescript.ts b/tests/testdata/run/error_003_typescript.ts
index e1f882123..e1f882123 100644
--- a/cli/tests/testdata/run/error_003_typescript.ts
+++ b/tests/testdata/run/error_003_typescript.ts
diff --git a/cli/tests/testdata/run/error_003_typescript.ts.out b/tests/testdata/run/error_003_typescript.ts.out
index bbb2ec470..bbb2ec470 100644
--- a/cli/tests/testdata/run/error_003_typescript.ts.out
+++ b/tests/testdata/run/error_003_typescript.ts.out
diff --git a/cli/tests/testdata/run/error_004_missing_module.ts b/tests/testdata/run/error_004_missing_module.ts
index 82b281181..82b281181 100644
--- a/cli/tests/testdata/run/error_004_missing_module.ts
+++ b/tests/testdata/run/error_004_missing_module.ts
diff --git a/cli/tests/testdata/run/error_004_missing_module.ts.out b/tests/testdata/run/error_004_missing_module.ts.out
index 9a2cfb8a8..9a2cfb8a8 100644
--- a/cli/tests/testdata/run/error_004_missing_module.ts.out
+++ b/tests/testdata/run/error_004_missing_module.ts.out
diff --git a/cli/tests/testdata/run/error_005_missing_dynamic_import.ts b/tests/testdata/run/error_005_missing_dynamic_import.ts
index 8ea8ff94e..8ea8ff94e 100644
--- a/cli/tests/testdata/run/error_005_missing_dynamic_import.ts
+++ b/tests/testdata/run/error_005_missing_dynamic_import.ts
diff --git a/cli/tests/testdata/run/error_005_missing_dynamic_import.ts.out b/tests/testdata/run/error_005_missing_dynamic_import.ts.out
index 55e4a8524..55e4a8524 100644
--- a/cli/tests/testdata/run/error_005_missing_dynamic_import.ts.out
+++ b/tests/testdata/run/error_005_missing_dynamic_import.ts.out
diff --git a/cli/tests/testdata/run/error_006_import_ext_failure.ts b/tests/testdata/run/error_006_import_ext_failure.ts
index 3c32303a3..3c32303a3 100644
--- a/cli/tests/testdata/run/error_006_import_ext_failure.ts
+++ b/tests/testdata/run/error_006_import_ext_failure.ts
diff --git a/cli/tests/testdata/run/error_006_import_ext_failure.ts.out b/tests/testdata/run/error_006_import_ext_failure.ts.out
index 667579bd8..667579bd8 100644
--- a/cli/tests/testdata/run/error_006_import_ext_failure.ts.out
+++ b/tests/testdata/run/error_006_import_ext_failure.ts.out
diff --git a/cli/tests/testdata/run/error_007_any.ts b/tests/testdata/run/error_007_any.ts
index bfef1289b..bfef1289b 100644
--- a/cli/tests/testdata/run/error_007_any.ts
+++ b/tests/testdata/run/error_007_any.ts
diff --git a/cli/tests/testdata/run/error_007_any.ts.out b/tests/testdata/run/error_007_any.ts.out
index 8d13dadb9..8d13dadb9 100644
--- a/cli/tests/testdata/run/error_007_any.ts.out
+++ b/tests/testdata/run/error_007_any.ts.out
diff --git a/cli/tests/testdata/run/error_008_checkjs.js b/tests/testdata/run/error_008_checkjs.js
index f0856d94c..f0856d94c 100644
--- a/cli/tests/testdata/run/error_008_checkjs.js
+++ b/tests/testdata/run/error_008_checkjs.js
diff --git a/cli/tests/testdata/run/error_008_checkjs.js.out b/tests/testdata/run/error_008_checkjs.js.out
index bab481422..bab481422 100644
--- a/cli/tests/testdata/run/error_008_checkjs.js.out
+++ b/tests/testdata/run/error_008_checkjs.js.out
diff --git a/cli/tests/testdata/run/error_009_extensions_error.js b/tests/testdata/run/error_009_extensions_error.js
index 01b97ea38..01b97ea38 100644
--- a/cli/tests/testdata/run/error_009_extensions_error.js
+++ b/tests/testdata/run/error_009_extensions_error.js
diff --git a/cli/tests/testdata/run/error_009_extensions_error.js.out b/tests/testdata/run/error_009_extensions_error.js.out
index 0fd1306de..0fd1306de 100644
--- a/cli/tests/testdata/run/error_009_extensions_error.js.out
+++ b/tests/testdata/run/error_009_extensions_error.js.out
diff --git a/cli/tests/testdata/run/error_009_missing_js_module.disabled b/tests/testdata/run/error_009_missing_js_module.disabled
index 3156fc94b..3156fc94b 100644
--- a/cli/tests/testdata/run/error_009_missing_js_module.disabled
+++ b/tests/testdata/run/error_009_missing_js_module.disabled
diff --git a/cli/tests/testdata/run/error_011_bad_module_specifier.ts b/tests/testdata/run/error_011_bad_module_specifier.ts
index 1c57e37a5..1c57e37a5 100644
--- a/cli/tests/testdata/run/error_011_bad_module_specifier.ts
+++ b/tests/testdata/run/error_011_bad_module_specifier.ts
diff --git a/cli/tests/testdata/run/error_011_bad_module_specifier.ts.out b/tests/testdata/run/error_011_bad_module_specifier.ts.out
index 81be915d1..81be915d1 100644
--- a/cli/tests/testdata/run/error_011_bad_module_specifier.ts.out
+++ b/tests/testdata/run/error_011_bad_module_specifier.ts.out
diff --git a/cli/tests/testdata/run/error_012_bad_dynamic_import_specifier.ts b/tests/testdata/run/error_012_bad_dynamic_import_specifier.ts
index 5f39f407c..5f39f407c 100644
--- a/cli/tests/testdata/run/error_012_bad_dynamic_import_specifier.ts
+++ b/tests/testdata/run/error_012_bad_dynamic_import_specifier.ts
diff --git a/cli/tests/testdata/run/error_012_bad_dynamic_import_specifier.ts.out b/tests/testdata/run/error_012_bad_dynamic_import_specifier.ts.out
index 7acd66713..7acd66713 100644
--- a/cli/tests/testdata/run/error_012_bad_dynamic_import_specifier.ts.out
+++ b/tests/testdata/run/error_012_bad_dynamic_import_specifier.ts.out
diff --git a/cli/tests/testdata/run/error_013_missing_script.out b/tests/testdata/run/error_013_missing_script.out
index 7ee268de4..7ee268de4 100644
--- a/cli/tests/testdata/run/error_013_missing_script.out
+++ b/tests/testdata/run/error_013_missing_script.out
diff --git a/cli/tests/testdata/run/error_014_catch_dynamic_import_error.js b/tests/testdata/run/error_014_catch_dynamic_import_error.js
index c58e54dcb..c58e54dcb 100644
--- a/cli/tests/testdata/run/error_014_catch_dynamic_import_error.js
+++ b/tests/testdata/run/error_014_catch_dynamic_import_error.js
diff --git a/cli/tests/testdata/run/error_014_catch_dynamic_import_error.js.out b/tests/testdata/run/error_014_catch_dynamic_import_error.js.out
index 868c97194..868c97194 100644
--- a/cli/tests/testdata/run/error_014_catch_dynamic_import_error.js.out
+++ b/tests/testdata/run/error_014_catch_dynamic_import_error.js.out
diff --git a/cli/tests/testdata/run/error_015_dynamic_import_permissions.js b/tests/testdata/run/error_015_dynamic_import_permissions.js
index 47961cf63..47961cf63 100644
--- a/cli/tests/testdata/run/error_015_dynamic_import_permissions.js
+++ b/tests/testdata/run/error_015_dynamic_import_permissions.js
diff --git a/cli/tests/testdata/run/error_015_dynamic_import_permissions.out b/tests/testdata/run/error_015_dynamic_import_permissions.out
index 87ce43e9c..87ce43e9c 100644
--- a/cli/tests/testdata/run/error_015_dynamic_import_permissions.out
+++ b/tests/testdata/run/error_015_dynamic_import_permissions.out
diff --git a/cli/tests/testdata/run/error_016_dynamic_import_permissions2.js b/tests/testdata/run/error_016_dynamic_import_permissions2.js
index f018d4a2e..f018d4a2e 100644
--- a/cli/tests/testdata/run/error_016_dynamic_import_permissions2.js
+++ b/tests/testdata/run/error_016_dynamic_import_permissions2.js
diff --git a/cli/tests/testdata/run/error_016_dynamic_import_permissions2.out b/tests/testdata/run/error_016_dynamic_import_permissions2.out
index 710871f41..710871f41 100644
--- a/cli/tests/testdata/run/error_016_dynamic_import_permissions2.out
+++ b/tests/testdata/run/error_016_dynamic_import_permissions2.out
diff --git a/cli/tests/testdata/run/error_017_hide_long_source_ts.ts b/tests/testdata/run/error_017_hide_long_source_ts.ts
index d61cb1277..d61cb1277 100644
--- a/cli/tests/testdata/run/error_017_hide_long_source_ts.ts
+++ b/tests/testdata/run/error_017_hide_long_source_ts.ts
diff --git a/cli/tests/testdata/run/error_017_hide_long_source_ts.ts.out b/tests/testdata/run/error_017_hide_long_source_ts.ts.out
index 917061ab9..917061ab9 100644
--- a/cli/tests/testdata/run/error_017_hide_long_source_ts.ts.out
+++ b/tests/testdata/run/error_017_hide_long_source_ts.ts.out
diff --git a/cli/tests/testdata/run/error_018_hide_long_source_js.js b/tests/testdata/run/error_018_hide_long_source_js.js
index d61cb1277..d61cb1277 100644
--- a/cli/tests/testdata/run/error_018_hide_long_source_js.js
+++ b/tests/testdata/run/error_018_hide_long_source_js.js
diff --git a/cli/tests/testdata/run/error_018_hide_long_source_js.js.out b/tests/testdata/run/error_018_hide_long_source_js.js.out
index 0897a100c..0897a100c 100644
--- a/cli/tests/testdata/run/error_018_hide_long_source_js.js.out
+++ b/tests/testdata/run/error_018_hide_long_source_js.js.out
diff --git a/cli/tests/testdata/run/error_019_stack_function.ts b/tests/testdata/run/error_019_stack_function.ts
index a6a69d146..a6a69d146 100644
--- a/cli/tests/testdata/run/error_019_stack_function.ts
+++ b/tests/testdata/run/error_019_stack_function.ts
diff --git a/cli/tests/testdata/run/error_019_stack_function.ts.out b/tests/testdata/run/error_019_stack_function.ts.out
index edaff27c0..edaff27c0 100644
--- a/cli/tests/testdata/run/error_019_stack_function.ts.out
+++ b/tests/testdata/run/error_019_stack_function.ts.out
diff --git a/cli/tests/testdata/run/error_020_stack_constructor.ts b/tests/testdata/run/error_020_stack_constructor.ts
index 526d1a661..526d1a661 100644
--- a/cli/tests/testdata/run/error_020_stack_constructor.ts
+++ b/tests/testdata/run/error_020_stack_constructor.ts
diff --git a/cli/tests/testdata/run/error_020_stack_constructor.ts.out b/tests/testdata/run/error_020_stack_constructor.ts.out
index 9e48b8f98..9e48b8f98 100644
--- a/cli/tests/testdata/run/error_020_stack_constructor.ts.out
+++ b/tests/testdata/run/error_020_stack_constructor.ts.out
diff --git a/cli/tests/testdata/run/error_021_stack_method.ts b/tests/testdata/run/error_021_stack_method.ts
index b6ebe1f5e..b6ebe1f5e 100644
--- a/cli/tests/testdata/run/error_021_stack_method.ts
+++ b/tests/testdata/run/error_021_stack_method.ts
diff --git a/cli/tests/testdata/run/error_021_stack_method.ts.out b/tests/testdata/run/error_021_stack_method.ts.out
index 9df9b1b7c..9df9b1b7c 100644
--- a/cli/tests/testdata/run/error_021_stack_method.ts.out
+++ b/tests/testdata/run/error_021_stack_method.ts.out
diff --git a/cli/tests/testdata/run/error_022_stack_custom_error.ts b/tests/testdata/run/error_022_stack_custom_error.ts
index b95743503..b95743503 100644
--- a/cli/tests/testdata/run/error_022_stack_custom_error.ts
+++ b/tests/testdata/run/error_022_stack_custom_error.ts
diff --git a/cli/tests/testdata/run/error_022_stack_custom_error.ts.out b/tests/testdata/run/error_022_stack_custom_error.ts.out
index 73e033e52..73e033e52 100644
--- a/cli/tests/testdata/run/error_022_stack_custom_error.ts.out
+++ b/tests/testdata/run/error_022_stack_custom_error.ts.out
diff --git a/cli/tests/testdata/run/error_023_stack_async.ts b/tests/testdata/run/error_023_stack_async.ts
index fdabaa5df..fdabaa5df 100644
--- a/cli/tests/testdata/run/error_023_stack_async.ts
+++ b/tests/testdata/run/error_023_stack_async.ts
diff --git a/cli/tests/testdata/run/error_023_stack_async.ts.out b/tests/testdata/run/error_023_stack_async.ts.out
index 2d122d986..2d122d986 100644
--- a/cli/tests/testdata/run/error_023_stack_async.ts.out
+++ b/tests/testdata/run/error_023_stack_async.ts.out
diff --git a/cli/tests/testdata/run/error_024_stack_promise_all.ts b/tests/testdata/run/error_024_stack_promise_all.ts
index 8ca7b203c..8ca7b203c 100644
--- a/cli/tests/testdata/run/error_024_stack_promise_all.ts
+++ b/tests/testdata/run/error_024_stack_promise_all.ts
diff --git a/cli/tests/testdata/run/error_024_stack_promise_all.ts.out b/tests/testdata/run/error_024_stack_promise_all.ts.out
index c7d10a649..c7d10a649 100644
--- a/cli/tests/testdata/run/error_024_stack_promise_all.ts.out
+++ b/tests/testdata/run/error_024_stack_promise_all.ts.out
diff --git a/cli/tests/testdata/run/error_025_tab_indent b/tests/testdata/run/error_025_tab_indent
index 35a25bcea..35a25bcea 100644
--- a/cli/tests/testdata/run/error_025_tab_indent
+++ b/tests/testdata/run/error_025_tab_indent
diff --git a/cli/tests/testdata/run/error_025_tab_indent.out b/tests/testdata/run/error_025_tab_indent.out
index edf525c90..edf525c90 100644
--- a/cli/tests/testdata/run/error_025_tab_indent.out
+++ b/tests/testdata/run/error_025_tab_indent.out
diff --git a/cli/tests/testdata/run/error_026_remote_import_error.ts b/tests/testdata/run/error_026_remote_import_error.ts
index 1b230d06b..1b230d06b 100644
--- a/cli/tests/testdata/run/error_026_remote_import_error.ts
+++ b/tests/testdata/run/error_026_remote_import_error.ts
diff --git a/cli/tests/testdata/run/error_026_remote_import_error.ts.out b/tests/testdata/run/error_026_remote_import_error.ts.out
index f3f8c0068..f3f8c0068 100644
--- a/cli/tests/testdata/run/error_026_remote_import_error.ts.out
+++ b/tests/testdata/run/error_026_remote_import_error.ts.out
diff --git a/cli/tests/testdata/run/error_cause.ts b/tests/testdata/run/error_cause.ts
index 385ce2a03..385ce2a03 100644
--- a/cli/tests/testdata/run/error_cause.ts
+++ b/tests/testdata/run/error_cause.ts
diff --git a/cli/tests/testdata/run/error_cause.ts.out b/tests/testdata/run/error_cause.ts.out
index 4dc439ac9..4dc439ac9 100644
--- a/cli/tests/testdata/run/error_cause.ts.out
+++ b/tests/testdata/run/error_cause.ts.out
diff --git a/cli/tests/testdata/run/error_cause_recursive.ts b/tests/testdata/run/error_cause_recursive.ts
index a6999b1ff..a6999b1ff 100644
--- a/cli/tests/testdata/run/error_cause_recursive.ts
+++ b/tests/testdata/run/error_cause_recursive.ts
diff --git a/cli/tests/testdata/run/error_cause_recursive.ts.out b/tests/testdata/run/error_cause_recursive.ts.out
index 52d5a03a1..52d5a03a1 100644
--- a/cli/tests/testdata/run/error_cause_recursive.ts.out
+++ b/tests/testdata/run/error_cause_recursive.ts.out
diff --git a/cli/tests/testdata/run/error_for_await.ts b/tests/testdata/run/error_for_await.ts
index 64c81abe4..64c81abe4 100644
--- a/cli/tests/testdata/run/error_for_await.ts
+++ b/tests/testdata/run/error_for_await.ts
diff --git a/cli/tests/testdata/run/error_for_await.ts.out b/tests/testdata/run/error_for_await.ts.out
index db3cdecb4..db3cdecb4 100644
--- a/cli/tests/testdata/run/error_for_await.ts.out
+++ b/tests/testdata/run/error_for_await.ts.out
diff --git a/cli/tests/testdata/run/error_import_map_unable_to_load.out b/tests/testdata/run/error_import_map_unable_to_load.out
index 50760e438..50760e438 100644
--- a/cli/tests/testdata/run/error_import_map_unable_to_load.out
+++ b/tests/testdata/run/error_import_map_unable_to_load.out
diff --git a/cli/tests/testdata/run/error_local_static_import_from_remote.js b/tests/testdata/run/error_local_static_import_from_remote.js
index eb7fd23ba..eb7fd23ba 100644
--- a/cli/tests/testdata/run/error_local_static_import_from_remote.js
+++ b/tests/testdata/run/error_local_static_import_from_remote.js
diff --git a/cli/tests/testdata/run/error_local_static_import_from_remote.js.out b/tests/testdata/run/error_local_static_import_from_remote.js.out
index 34f9e81e1..34f9e81e1 100644
--- a/cli/tests/testdata/run/error_local_static_import_from_remote.js.out
+++ b/tests/testdata/run/error_local_static_import_from_remote.js.out
diff --git a/cli/tests/testdata/run/error_local_static_import_from_remote.ts b/tests/testdata/run/error_local_static_import_from_remote.ts
index a831db0c4..a831db0c4 100644
--- a/cli/tests/testdata/run/error_local_static_import_from_remote.ts
+++ b/tests/testdata/run/error_local_static_import_from_remote.ts
diff --git a/cli/tests/testdata/run/error_local_static_import_from_remote.ts.out b/tests/testdata/run/error_local_static_import_from_remote.ts.out
index 88990a049..88990a049 100644
--- a/cli/tests/testdata/run/error_local_static_import_from_remote.ts.out
+++ b/tests/testdata/run/error_local_static_import_from_remote.ts.out
diff --git a/cli/tests/testdata/run/error_missing_module_named_import.ts b/tests/testdata/run/error_missing_module_named_import.ts
index 9eb5239ff..9eb5239ff 100644
--- a/cli/tests/testdata/run/error_missing_module_named_import.ts
+++ b/tests/testdata/run/error_missing_module_named_import.ts
diff --git a/cli/tests/testdata/run/error_missing_module_named_import.ts.out b/tests/testdata/run/error_missing_module_named_import.ts.out
index 700377d65..700377d65 100644
--- a/cli/tests/testdata/run/error_missing_module_named_import.ts.out
+++ b/tests/testdata/run/error_missing_module_named_import.ts.out
diff --git a/cli/tests/testdata/run/error_name_non_string.js b/tests/testdata/run/error_name_non_string.js
index ae9609927..ae9609927 100644
--- a/cli/tests/testdata/run/error_name_non_string.js
+++ b/tests/testdata/run/error_name_non_string.js
diff --git a/cli/tests/testdata/run/error_name_non_string.js.out b/tests/testdata/run/error_name_non_string.js.out
index 14fa56c62..14fa56c62 100644
--- a/cli/tests/testdata/run/error_name_non_string.js.out
+++ b/tests/testdata/run/error_name_non_string.js.out
diff --git a/cli/tests/testdata/run/error_no_check.ts b/tests/testdata/run/error_no_check.ts
index 2da01e639..2da01e639 100644
--- a/cli/tests/testdata/run/error_no_check.ts
+++ b/tests/testdata/run/error_no_check.ts
diff --git a/cli/tests/testdata/run/error_no_check.ts.out b/tests/testdata/run/error_no_check.ts.out
index 78f478045..78f478045 100644
--- a/cli/tests/testdata/run/error_no_check.ts.out
+++ b/tests/testdata/run/error_no_check.ts.out
diff --git a/cli/tests/testdata/run/error_syntax.js b/tests/testdata/run/error_syntax.js
index c0414c356..c0414c356 100644
--- a/cli/tests/testdata/run/error_syntax.js
+++ b/tests/testdata/run/error_syntax.js
diff --git a/cli/tests/testdata/run/error_syntax.js.out b/tests/testdata/run/error_syntax.js.out
index fa4d51686..fa4d51686 100644
--- a/cli/tests/testdata/run/error_syntax.js.out
+++ b/tests/testdata/run/error_syntax.js.out
diff --git a/cli/tests/testdata/run/error_syntax_empty_trailing_line.mjs b/tests/testdata/run/error_syntax_empty_trailing_line.mjs
index 864dfb0c7..864dfb0c7 100644
--- a/cli/tests/testdata/run/error_syntax_empty_trailing_line.mjs
+++ b/tests/testdata/run/error_syntax_empty_trailing_line.mjs
diff --git a/cli/tests/testdata/run/error_syntax_empty_trailing_line.mjs.out b/tests/testdata/run/error_syntax_empty_trailing_line.mjs.out
index 2eb290bb5..2eb290bb5 100644
--- a/cli/tests/testdata/run/error_syntax_empty_trailing_line.mjs.out
+++ b/tests/testdata/run/error_syntax_empty_trailing_line.mjs.out
diff --git a/cli/tests/testdata/run/error_type_definitions.ts b/tests/testdata/run/error_type_definitions.ts
index 86675cbaa..86675cbaa 100644
--- a/cli/tests/testdata/run/error_type_definitions.ts
+++ b/tests/testdata/run/error_type_definitions.ts
diff --git a/cli/tests/testdata/run/error_type_definitions.ts.out b/tests/testdata/run/error_type_definitions.ts.out
index d60d4d483..d60d4d483 100644
--- a/cli/tests/testdata/run/error_type_definitions.ts.out
+++ b/tests/testdata/run/error_type_definitions.ts.out
diff --git a/cli/tests/testdata/run/error_with_errors_prop.js b/tests/testdata/run/error_with_errors_prop.js
index d1c6bbfaa..d1c6bbfaa 100644
--- a/cli/tests/testdata/run/error_with_errors_prop.js
+++ b/tests/testdata/run/error_with_errors_prop.js
diff --git a/cli/tests/testdata/run/error_with_errors_prop.js.out b/tests/testdata/run/error_with_errors_prop.js.out
index d958996af..d958996af 100644
--- a/cli/tests/testdata/run/error_with_errors_prop.js.out
+++ b/tests/testdata/run/error_with_errors_prop.js.out
diff --git a/cli/tests/testdata/run/es_private_fields.js b/tests/testdata/run/es_private_fields.js
index b5f83e39c..b5f83e39c 100644
--- a/cli/tests/testdata/run/es_private_fields.js
+++ b/tests/testdata/run/es_private_fields.js
diff --git a/cli/tests/testdata/run/es_private_fields.js.out b/tests/testdata/run/es_private_fields.js.out
index be1970b05..be1970b05 100644
--- a/cli/tests/testdata/run/es_private_fields.js.out
+++ b/tests/testdata/run/es_private_fields.js.out
diff --git a/cli/tests/testdata/run/eval_context_throw_dom_exception.js b/tests/testdata/run/eval_context_throw_dom_exception.js
index 99eaa0f4a..99eaa0f4a 100644
--- a/cli/tests/testdata/run/eval_context_throw_dom_exception.js
+++ b/tests/testdata/run/eval_context_throw_dom_exception.js
diff --git a/cli/tests/testdata/run/eval_context_throw_dom_exception.js.out b/tests/testdata/run/eval_context_throw_dom_exception.js.out
index f7d368471..f7d368471 100644
--- a/cli/tests/testdata/run/eval_context_throw_dom_exception.js.out
+++ b/tests/testdata/run/eval_context_throw_dom_exception.js.out
diff --git a/cli/tests/testdata/run/event_listener_error.ts b/tests/testdata/run/event_listener_error.ts
index 1cbdf7bc2..1cbdf7bc2 100644
--- a/cli/tests/testdata/run/event_listener_error.ts
+++ b/tests/testdata/run/event_listener_error.ts
diff --git a/cli/tests/testdata/run/event_listener_error.ts.out b/tests/testdata/run/event_listener_error.ts.out
index a20a91dfd..a20a91dfd 100644
--- a/cli/tests/testdata/run/event_listener_error.ts.out
+++ b/tests/testdata/run/event_listener_error.ts.out
diff --git a/cli/tests/testdata/run/event_listener_error_handled.ts b/tests/testdata/run/event_listener_error_handled.ts
index c4c8fd1cd..c4c8fd1cd 100644
--- a/cli/tests/testdata/run/event_listener_error_handled.ts
+++ b/tests/testdata/run/event_listener_error_handled.ts
diff --git a/cli/tests/testdata/run/event_listener_error_handled.ts.out b/tests/testdata/run/event_listener_error_handled.ts.out
index d3cf525c3..d3cf525c3 100644
--- a/cli/tests/testdata/run/event_listener_error_handled.ts.out
+++ b/tests/testdata/run/event_listener_error_handled.ts.out
diff --git a/cli/tests/testdata/run/event_listener_error_immediate_exit.ts b/tests/testdata/run/event_listener_error_immediate_exit.ts
index 292a0df00..292a0df00 100644
--- a/cli/tests/testdata/run/event_listener_error_immediate_exit.ts
+++ b/tests/testdata/run/event_listener_error_immediate_exit.ts
diff --git a/cli/tests/testdata/run/event_listener_error_immediate_exit.ts.out b/tests/testdata/run/event_listener_error_immediate_exit.ts.out
index 8f03f71b8..8f03f71b8 100644
--- a/cli/tests/testdata/run/event_listener_error_immediate_exit.ts.out
+++ b/tests/testdata/run/event_listener_error_immediate_exit.ts.out
diff --git a/cli/tests/testdata/run/event_listener_error_immediate_exit_worker.ts b/tests/testdata/run/event_listener_error_immediate_exit_worker.ts
index 58c45d1bb..58c45d1bb 100644
--- a/cli/tests/testdata/run/event_listener_error_immediate_exit_worker.ts
+++ b/tests/testdata/run/event_listener_error_immediate_exit_worker.ts
diff --git a/cli/tests/testdata/run/event_listener_error_immediate_exit_worker.ts.out b/tests/testdata/run/event_listener_error_immediate_exit_worker.ts.out
index 85b52190b..85b52190b 100644
--- a/cli/tests/testdata/run/event_listener_error_immediate_exit_worker.ts.out
+++ b/tests/testdata/run/event_listener_error_immediate_exit_worker.ts.out
diff --git a/cli/tests/testdata/run/exec_path.ts b/tests/testdata/run/exec_path.ts
index b70b23237..b70b23237 100644
--- a/cli/tests/testdata/run/exec_path.ts
+++ b/tests/testdata/run/exec_path.ts
diff --git a/cli/tests/testdata/run/exit_error42.ts b/tests/testdata/run/exit_error42.ts
index e4db41f3a..e4db41f3a 100644
--- a/cli/tests/testdata/run/exit_error42.ts
+++ b/tests/testdata/run/exit_error42.ts
diff --git a/cli/tests/testdata/run/exit_error42.ts.out b/tests/testdata/run/exit_error42.ts.out
index 90be1f305..90be1f305 100644
--- a/cli/tests/testdata/run/exit_error42.ts.out
+++ b/tests/testdata/run/exit_error42.ts.out
diff --git a/cli/tests/testdata/run/explicit_resource_management/main.out b/tests/testdata/run/explicit_resource_management/main.out
index ff5ac4b59..ff5ac4b59 100644
--- a/cli/tests/testdata/run/explicit_resource_management/main.out
+++ b/tests/testdata/run/explicit_resource_management/main.out
diff --git a/cli/tests/testdata/run/explicit_resource_management/main.ts b/tests/testdata/run/explicit_resource_management/main.ts
index 0201a51f9..0201a51f9 100644
--- a/cli/tests/testdata/run/explicit_resource_management/main.ts
+++ b/tests/testdata/run/explicit_resource_management/main.ts
diff --git a/cli/tests/testdata/run/export_type_def.ts b/tests/testdata/run/export_type_def.ts
index 9a1e2b0fe..9a1e2b0fe 100644
--- a/cli/tests/testdata/run/export_type_def.ts
+++ b/tests/testdata/run/export_type_def.ts
diff --git a/cli/tests/testdata/run/extension_dynamic_import.ts b/tests/testdata/run/extension_dynamic_import.ts
index 6fb3ac3a0..6fb3ac3a0 100644
--- a/cli/tests/testdata/run/extension_dynamic_import.ts
+++ b/tests/testdata/run/extension_dynamic_import.ts
diff --git a/cli/tests/testdata/run/extension_dynamic_import.ts.out b/tests/testdata/run/extension_dynamic_import.ts.out
index b22717d62..b22717d62 100644
--- a/cli/tests/testdata/run/extension_dynamic_import.ts.out
+++ b/tests/testdata/run/extension_dynamic_import.ts.out
diff --git a/cli/tests/testdata/run/extension_import.ts b/tests/testdata/run/extension_import.ts
index 7bbbab799..7bbbab799 100644
--- a/cli/tests/testdata/run/extension_import.ts
+++ b/tests/testdata/run/extension_import.ts
diff --git a/cli/tests/testdata/run/extension_import.ts.out b/tests/testdata/run/extension_import.ts.out
index 88039a9ce..88039a9ce 100644
--- a/cli/tests/testdata/run/extension_import.ts.out
+++ b/tests/testdata/run/extension_import.ts.out
diff --git a/cli/tests/testdata/run/fetch/hello.txt b/tests/testdata/run/fetch/hello.txt
index af5626b4a..af5626b4a 100644
--- a/cli/tests/testdata/run/fetch/hello.txt
+++ b/tests/testdata/run/fetch/hello.txt
diff --git a/cli/tests/testdata/run/fetch/other.ts b/tests/testdata/run/fetch/other.ts
index 91fe376b3..91fe376b3 100644
--- a/cli/tests/testdata/run/fetch/other.ts
+++ b/tests/testdata/run/fetch/other.ts
diff --git a/cli/tests/testdata/run/fetch/test.ts b/tests/testdata/run/fetch/test.ts
index baa52775d..baa52775d 100644
--- a/cli/tests/testdata/run/fetch/test.ts
+++ b/tests/testdata/run/fetch/test.ts
diff --git a/cli/tests/testdata/run/fetch_async_error_stack.ts b/tests/testdata/run/fetch_async_error_stack.ts
index f583192c2..f583192c2 100644
--- a/cli/tests/testdata/run/fetch_async_error_stack.ts
+++ b/tests/testdata/run/fetch_async_error_stack.ts
diff --git a/cli/tests/testdata/run/fetch_async_error_stack.ts.out b/tests/testdata/run/fetch_async_error_stack.ts.out
index e8169228f..e8169228f 100644
--- a/cli/tests/testdata/run/fetch_async_error_stack.ts.out
+++ b/tests/testdata/run/fetch_async_error_stack.ts.out
diff --git a/cli/tests/testdata/run/fetch_response_finalization.js b/tests/testdata/run/fetch_response_finalization.js
index 85fc6afa3..85fc6afa3 100644
--- a/cli/tests/testdata/run/fetch_response_finalization.js
+++ b/tests/testdata/run/fetch_response_finalization.js
diff --git a/cli/tests/testdata/run/fetch_response_finalization.js.out b/tests/testdata/run/fetch_response_finalization.js.out
index 645842a5b..645842a5b 100644
--- a/cli/tests/testdata/run/fetch_response_finalization.js.out
+++ b/tests/testdata/run/fetch_response_finalization.js.out
diff --git a/cli/tests/testdata/run/finalization_registry.js b/tests/testdata/run/finalization_registry.js
index ee9dc384f..ee9dc384f 100644
--- a/cli/tests/testdata/run/finalization_registry.js
+++ b/tests/testdata/run/finalization_registry.js
diff --git a/cli/tests/testdata/run/finalization_registry.js.out b/tests/testdata/run/finalization_registry.js.out
index fee61413a..fee61413a 100644
--- a/cli/tests/testdata/run/finalization_registry.js.out
+++ b/tests/testdata/run/finalization_registry.js.out
diff --git a/cli/tests/testdata/run/fix_dynamic_import_errors.js b/tests/testdata/run/fix_dynamic_import_errors.js
index 1d7be37e0..1d7be37e0 100644
--- a/cli/tests/testdata/run/fix_dynamic_import_errors.js
+++ b/tests/testdata/run/fix_dynamic_import_errors.js
diff --git a/cli/tests/testdata/run/fix_dynamic_import_errors.js.out b/tests/testdata/run/fix_dynamic_import_errors.js.out
index e7856fb9c..e7856fb9c 100644
--- a/cli/tests/testdata/run/fix_dynamic_import_errors.js.out
+++ b/tests/testdata/run/fix_dynamic_import_errors.js.out
diff --git a/cli/tests/testdata/run/fix_emittable_skipped.js b/tests/testdata/run/fix_emittable_skipped.js
index a4ccc9efd..a4ccc9efd 100644
--- a/cli/tests/testdata/run/fix_emittable_skipped.js
+++ b/tests/testdata/run/fix_emittable_skipped.js
diff --git a/cli/tests/testdata/run/fix_emittable_skipped.ts.out b/tests/testdata/run/fix_emittable_skipped.ts.out
index 865759299..865759299 100644
--- a/cli/tests/testdata/run/fix_emittable_skipped.ts.out
+++ b/tests/testdata/run/fix_emittable_skipped.ts.out
diff --git a/cli/tests/testdata/run/fix_js_import_js.ts b/tests/testdata/run/fix_js_import_js.ts
index 0f01877cd..0f01877cd 100644
--- a/cli/tests/testdata/run/fix_js_import_js.ts
+++ b/tests/testdata/run/fix_js_import_js.ts
diff --git a/cli/tests/testdata/run/fix_js_import_js.ts.out b/tests/testdata/run/fix_js_import_js.ts.out
index 27ba77dda..27ba77dda 100644
--- a/cli/tests/testdata/run/fix_js_import_js.ts.out
+++ b/tests/testdata/run/fix_js_import_js.ts.out
diff --git a/cli/tests/testdata/run/fix_js_imports.ts b/tests/testdata/run/fix_js_imports.ts
index 6ed13bae3..6ed13bae3 100644
--- a/cli/tests/testdata/run/fix_js_imports.ts
+++ b/tests/testdata/run/fix_js_imports.ts
diff --git a/cli/tests/testdata/run/fix_js_imports.ts.out b/tests/testdata/run/fix_js_imports.ts.out
index c427932a4..c427932a4 100644
--- a/cli/tests/testdata/run/fix_js_imports.ts.out
+++ b/tests/testdata/run/fix_js_imports.ts.out
diff --git a/cli/tests/testdata/run/fix_tsc_file_exists.out b/tests/testdata/run/fix_tsc_file_exists.out
index ce0136250..ce0136250 100644
--- a/cli/tests/testdata/run/fix_tsc_file_exists.out
+++ b/tests/testdata/run/fix_tsc_file_exists.out
diff --git a/cli/tests/testdata/run/fix_worker_dispatchevent.ts b/tests/testdata/run/fix_worker_dispatchevent.ts
index 1b73b52dc..1b73b52dc 100644
--- a/cli/tests/testdata/run/fix_worker_dispatchevent.ts
+++ b/tests/testdata/run/fix_worker_dispatchevent.ts
diff --git a/cli/tests/testdata/run/fix_worker_dispatchevent.ts.out b/tests/testdata/run/fix_worker_dispatchevent.ts.out
index 2e9ba477f..2e9ba477f 100644
--- a/cli/tests/testdata/run/fix_worker_dispatchevent.ts.out
+++ b/tests/testdata/run/fix_worker_dispatchevent.ts.out
diff --git a/cli/tests/testdata/run/followup_dyn_import_resolves/main.ts b/tests/testdata/run/followup_dyn_import_resolves/main.ts
index a8508f942..a8508f942 100644
--- a/cli/tests/testdata/run/followup_dyn_import_resolves/main.ts
+++ b/tests/testdata/run/followup_dyn_import_resolves/main.ts
diff --git a/cli/tests/testdata/run/followup_dyn_import_resolves/main.ts.out b/tests/testdata/run/followup_dyn_import_resolves/main.ts.out
index a19976d4a..a19976d4a 100644
--- a/cli/tests/testdata/run/followup_dyn_import_resolves/main.ts.out
+++ b/tests/testdata/run/followup_dyn_import_resolves/main.ts.out
diff --git a/cli/tests/testdata/run/followup_dyn_import_resolves/sub1.ts b/tests/testdata/run/followup_dyn_import_resolves/sub1.ts
index d06c30221..d06c30221 100644
--- a/cli/tests/testdata/run/followup_dyn_import_resolves/sub1.ts
+++ b/tests/testdata/run/followup_dyn_import_resolves/sub1.ts
diff --git a/cli/tests/testdata/run/followup_dyn_import_resolves/sub2.ts b/tests/testdata/run/followup_dyn_import_resolves/sub2.ts
index cce2b524c..cce2b524c 100644
--- a/cli/tests/testdata/run/followup_dyn_import_resolves/sub2.ts
+++ b/tests/testdata/run/followup_dyn_import_resolves/sub2.ts
diff --git a/cli/tests/testdata/run/heapstats.js b/tests/testdata/run/heapstats.js
index b93c9c120..b93c9c120 100644
--- a/cli/tests/testdata/run/heapstats.js
+++ b/tests/testdata/run/heapstats.js
diff --git a/cli/tests/testdata/run/heapstats.js.out b/tests/testdata/run/heapstats.js.out
index 954266333..954266333 100644
--- a/cli/tests/testdata/run/heapstats.js.out
+++ b/tests/testdata/run/heapstats.js.out
diff --git a/cli/tests/testdata/run/http2_request_url.ts b/tests/testdata/run/http2_request_url.ts
index 5acff8cc2..5acff8cc2 100644
--- a/cli/tests/testdata/run/http2_request_url.ts
+++ b/tests/testdata/run/http2_request_url.ts
diff --git a/cli/tests/testdata/run/https_import.ts b/tests/testdata/run/https_import.ts
index 3bcc90326..3bcc90326 100644
--- a/cli/tests/testdata/run/https_import.ts
+++ b/tests/testdata/run/https_import.ts
diff --git a/cli/tests/testdata/run/https_import.ts.out b/tests/testdata/run/https_import.ts.out
index e965047ad..e965047ad 100644
--- a/cli/tests/testdata/run/https_import.ts.out
+++ b/tests/testdata/run/https_import.ts.out
diff --git a/cli/tests/testdata/run/if_main.ts b/tests/testdata/run/if_main.ts
index 4dcfecea0..4dcfecea0 100644
--- a/cli/tests/testdata/run/if_main.ts
+++ b/tests/testdata/run/if_main.ts
diff --git a/cli/tests/testdata/run/if_main.ts.out b/tests/testdata/run/if_main.ts.out
index ba2906d06..ba2906d06 100644
--- a/cli/tests/testdata/run/if_main.ts.out
+++ b/tests/testdata/run/if_main.ts.out
diff --git a/cli/tests/testdata/run/import_blob_url.ts b/tests/testdata/run/import_blob_url.ts
index 86bb634e1..86bb634e1 100644
--- a/cli/tests/testdata/run/import_blob_url.ts
+++ b/tests/testdata/run/import_blob_url.ts
diff --git a/cli/tests/testdata/run/import_blob_url.ts.out b/tests/testdata/run/import_blob_url.ts.out
index bfa0b9d94..bfa0b9d94 100644
--- a/cli/tests/testdata/run/import_blob_url.ts.out
+++ b/tests/testdata/run/import_blob_url.ts.out
diff --git a/cli/tests/testdata/run/import_blob_url_error_stack.ts b/tests/testdata/run/import_blob_url_error_stack.ts
index f9c4f2e9d..f9c4f2e9d 100644
--- a/cli/tests/testdata/run/import_blob_url_error_stack.ts
+++ b/tests/testdata/run/import_blob_url_error_stack.ts
diff --git a/cli/tests/testdata/run/import_blob_url_error_stack.ts.out b/tests/testdata/run/import_blob_url_error_stack.ts.out
index 201556b8a..201556b8a 100644
--- a/cli/tests/testdata/run/import_blob_url_error_stack.ts.out
+++ b/tests/testdata/run/import_blob_url_error_stack.ts.out
diff --git a/cli/tests/testdata/run/import_blob_url_import_relative.ts b/tests/testdata/run/import_blob_url_import_relative.ts
index ad130bdac..ad130bdac 100644
--- a/cli/tests/testdata/run/import_blob_url_import_relative.ts
+++ b/tests/testdata/run/import_blob_url_import_relative.ts
diff --git a/cli/tests/testdata/run/import_blob_url_import_relative.ts.out b/tests/testdata/run/import_blob_url_import_relative.ts.out
index 59a6f07fb..59a6f07fb 100644
--- a/cli/tests/testdata/run/import_blob_url_import_relative.ts.out
+++ b/tests/testdata/run/import_blob_url_import_relative.ts.out
diff --git a/cli/tests/testdata/run/import_blob_url_imports.ts b/tests/testdata/run/import_blob_url_imports.ts
index a7c639152..a7c639152 100644
--- a/cli/tests/testdata/run/import_blob_url_imports.ts
+++ b/tests/testdata/run/import_blob_url_imports.ts
diff --git a/cli/tests/testdata/run/import_blob_url_imports.ts.out b/tests/testdata/run/import_blob_url_imports.ts.out
index e965047ad..e965047ad 100644
--- a/cli/tests/testdata/run/import_blob_url_imports.ts.out
+++ b/tests/testdata/run/import_blob_url_imports.ts.out
diff --git a/cli/tests/testdata/run/import_blob_url_jsx.ts b/tests/testdata/run/import_blob_url_jsx.ts
index 8d645796a..8d645796a 100644
--- a/cli/tests/testdata/run/import_blob_url_jsx.ts
+++ b/tests/testdata/run/import_blob_url_jsx.ts
diff --git a/cli/tests/testdata/run/import_blob_url_jsx.ts.out b/tests/testdata/run/import_blob_url_jsx.ts.out
index c1c85f250..c1c85f250 100644
--- a/cli/tests/testdata/run/import_blob_url_jsx.ts.out
+++ b/tests/testdata/run/import_blob_url_jsx.ts.out
diff --git a/cli/tests/testdata/run/import_compression/brotli b/tests/testdata/run/import_compression/brotli
index 65f679d57..65f679d57 100644
--- a/cli/tests/testdata/run/import_compression/brotli
+++ b/tests/testdata/run/import_compression/brotli
diff --git a/cli/tests/testdata/run/import_compression/gziped b/tests/testdata/run/import_compression/gziped
index 9f9a7bc69..9f9a7bc69 100644
--- a/cli/tests/testdata/run/import_compression/gziped
+++ b/tests/testdata/run/import_compression/gziped
Binary files differ
diff --git a/cli/tests/testdata/run/import_compression/main.out b/tests/testdata/run/import_compression/main.out
index 371994979..371994979 100644
--- a/cli/tests/testdata/run/import_compression/main.out
+++ b/tests/testdata/run/import_compression/main.out
diff --git a/cli/tests/testdata/run/import_compression/main.ts b/tests/testdata/run/import_compression/main.ts
index 3dcd6fa24..3dcd6fa24 100644
--- a/cli/tests/testdata/run/import_compression/main.ts
+++ b/tests/testdata/run/import_compression/main.ts
diff --git a/cli/tests/testdata/run/import_data_url.ts b/tests/testdata/run/import_data_url.ts
index 258514a5e..258514a5e 100644
--- a/cli/tests/testdata/run/import_data_url.ts
+++ b/tests/testdata/run/import_data_url.ts
diff --git a/cli/tests/testdata/run/import_data_url.ts.out b/tests/testdata/run/import_data_url.ts.out
index bfa0b9d94..bfa0b9d94 100644
--- a/cli/tests/testdata/run/import_data_url.ts.out
+++ b/tests/testdata/run/import_data_url.ts.out
diff --git a/cli/tests/testdata/run/import_data_url_error_stack.ts b/tests/testdata/run/import_data_url_error_stack.ts
index 022e49fe1..022e49fe1 100644
--- a/cli/tests/testdata/run/import_data_url_error_stack.ts
+++ b/tests/testdata/run/import_data_url_error_stack.ts
diff --git a/cli/tests/testdata/run/import_data_url_error_stack.ts.out b/tests/testdata/run/import_data_url_error_stack.ts.out
index 83eed611d..83eed611d 100644
--- a/cli/tests/testdata/run/import_data_url_error_stack.ts.out
+++ b/tests/testdata/run/import_data_url_error_stack.ts.out
diff --git a/cli/tests/testdata/run/import_data_url_import_relative.ts b/tests/testdata/run/import_data_url_import_relative.ts
index 23947fe60..23947fe60 100644
--- a/cli/tests/testdata/run/import_data_url_import_relative.ts
+++ b/tests/testdata/run/import_data_url_import_relative.ts
diff --git a/cli/tests/testdata/run/import_data_url_import_relative.ts.out b/tests/testdata/run/import_data_url_import_relative.ts.out
index 821c3e4df..821c3e4df 100644
--- a/cli/tests/testdata/run/import_data_url_import_relative.ts.out
+++ b/tests/testdata/run/import_data_url_import_relative.ts.out
diff --git a/cli/tests/testdata/run/import_data_url_imports.ts b/tests/testdata/run/import_data_url_imports.ts
index df7dae727..df7dae727 100644
--- a/cli/tests/testdata/run/import_data_url_imports.ts
+++ b/tests/testdata/run/import_data_url_imports.ts
diff --git a/cli/tests/testdata/run/import_data_url_imports.ts.out b/tests/testdata/run/import_data_url_imports.ts.out
index e965047ad..e965047ad 100644
--- a/cli/tests/testdata/run/import_data_url_imports.ts.out
+++ b/tests/testdata/run/import_data_url_imports.ts.out
diff --git a/cli/tests/testdata/run/import_data_url_jsx.ts b/tests/testdata/run/import_data_url_jsx.ts
index 1881211f9..1881211f9 100644
--- a/cli/tests/testdata/run/import_data_url_jsx.ts
+++ b/tests/testdata/run/import_data_url_jsx.ts
diff --git a/cli/tests/testdata/run/import_data_url_jsx.ts.out b/tests/testdata/run/import_data_url_jsx.ts.out
index c1c85f250..c1c85f250 100644
--- a/cli/tests/testdata/run/import_data_url_jsx.ts.out
+++ b/tests/testdata/run/import_data_url_jsx.ts.out
diff --git a/cli/tests/testdata/run/import_dynamic_data_url.ts b/tests/testdata/run/import_dynamic_data_url.ts
index 53a0fbcd3..53a0fbcd3 100644
--- a/cli/tests/testdata/run/import_dynamic_data_url.ts
+++ b/tests/testdata/run/import_dynamic_data_url.ts
diff --git a/cli/tests/testdata/run/import_dynamic_data_url.ts.out b/tests/testdata/run/import_dynamic_data_url.ts.out
index bfa0b9d94..bfa0b9d94 100644
--- a/cli/tests/testdata/run/import_dynamic_data_url.ts.out
+++ b/tests/testdata/run/import_dynamic_data_url.ts.out
diff --git a/cli/tests/testdata/run/import_extensionless.ts b/tests/testdata/run/import_extensionless.ts
index 689d553ff..689d553ff 100644
--- a/cli/tests/testdata/run/import_extensionless.ts
+++ b/tests/testdata/run/import_extensionless.ts
diff --git a/cli/tests/testdata/run/import_extensionless.ts.out b/tests/testdata/run/import_extensionless.ts.out
index e965047ad..e965047ad 100644
--- a/cli/tests/testdata/run/import_extensionless.ts.out
+++ b/tests/testdata/run/import_extensionless.ts.out
diff --git a/cli/tests/testdata/run/import_file_with_colon.ts b/tests/testdata/run/import_file_with_colon.ts
index 619bdd66d..619bdd66d 100644
--- a/cli/tests/testdata/run/import_file_with_colon.ts
+++ b/tests/testdata/run/import_file_with_colon.ts
diff --git a/cli/tests/testdata/run/import_file_with_colon.ts.out b/tests/testdata/run/import_file_with_colon.ts.out
index f60bbf4b1..f60bbf4b1 100644
--- a/cli/tests/testdata/run/import_file_with_colon.ts.out
+++ b/tests/testdata/run/import_file_with_colon.ts.out
diff --git a/cli/tests/testdata/run/import_maps/test_data.ts b/tests/testdata/run/import_maps/test_data.ts
index 5e8efea69..5e8efea69 100644
--- a/cli/tests/testdata/run/import_maps/test_data.ts
+++ b/tests/testdata/run/import_maps/test_data.ts
diff --git a/cli/tests/testdata/run/import_maps/test_data.ts.out b/tests/testdata/run/import_maps/test_data.ts.out
index da996dc0d..da996dc0d 100644
--- a/cli/tests/testdata/run/import_maps/test_data.ts.out
+++ b/tests/testdata/run/import_maps/test_data.ts.out
diff --git a/cli/tests/testdata/run/import_meta/importmap.json b/tests/testdata/run/import_meta/importmap.json
index d85fe3028..d85fe3028 100644
--- a/cli/tests/testdata/run/import_meta/importmap.json
+++ b/tests/testdata/run/import_meta/importmap.json
diff --git a/cli/tests/testdata/run/import_meta/main.out b/tests/testdata/run/import_meta/main.out
index 5a86d6240..5a86d6240 100644
--- a/cli/tests/testdata/run/import_meta/main.out
+++ b/tests/testdata/run/import_meta/main.out
diff --git a/tests/testdata/run/import_meta/main.ts b/tests/testdata/run/import_meta/main.ts
new file mode 100644
index 000000000..61880e2c1
--- /dev/null
+++ b/tests/testdata/run/import_meta/main.ts
@@ -0,0 +1,52 @@
+import { assertThrows } from "../../../../test_util/std/assert/mod.ts";
+import "http://localhost:4545/run/import_meta/other.ts";
+import "./other.ts";
+
+console.log(
+ "main",
+ import.meta.url,
+ import.meta.main,
+ import.meta.filename,
+ import.meta.dirname,
+);
+
+console.log("Resolving ./foo.js", import.meta.resolve("./foo.js"));
+console.log("Resolving bare from import map", import.meta.resolve("bare"));
+console.log(
+ "Resolving https://example.com/rewrite from import map",
+ import.meta.resolve("https://example.com/rewrite"),
+);
+console.log(
+ "Resolving without a value from import map",
+ import.meta.resolve(),
+);
+console.log(
+ "Resolving 1 from import map",
+ import.meta.resolve(1),
+);
+console.log(
+ "Resolving null from import map",
+ import.meta.resolve(null),
+);
+console.log(
+ "Resolving object from import map",
+ import.meta.resolve({}),
+);
+assertThrows(() => {
+ import.meta.resolve("too", "many", "arguments");
+}, TypeError);
+assertThrows(() => {
+ import.meta.resolve("://malformed/url?asdf");
+}, TypeError);
+console.log(
+ "Resolving npm:cowsay",
+ import.meta.resolve("npm:cowsay"),
+);
+console.log(
+ "Resolving npm:cowsay@1",
+ import.meta.resolve("npm:cowsay@1"),
+);
+console.log(
+ "Resolving npm:preact from import map",
+ import.meta.resolve("npm:preact"),
+);
diff --git a/cli/tests/testdata/run/import_meta/other.ts b/tests/testdata/run/import_meta/other.ts
index 5da6a4936..5da6a4936 100644
--- a/cli/tests/testdata/run/import_meta/other.ts
+++ b/tests/testdata/run/import_meta/other.ts
diff --git a/cli/tests/testdata/run/import_type.ts b/tests/testdata/run/import_type.ts
index 22c639cbc..22c639cbc 100644
--- a/cli/tests/testdata/run/import_type.ts
+++ b/tests/testdata/run/import_type.ts
diff --git a/cli/tests/testdata/run/import_type.ts.out b/tests/testdata/run/import_type.ts.out
index e35539e35..e35539e35 100644
--- a/cli/tests/testdata/run/import_type.ts.out
+++ b/tests/testdata/run/import_type.ts.out
diff --git a/cli/tests/testdata/run/inline_js_source_map.ts b/tests/testdata/run/inline_js_source_map.ts
index 5ae7c226a..5ae7c226a 100644
--- a/cli/tests/testdata/run/inline_js_source_map.ts
+++ b/tests/testdata/run/inline_js_source_map.ts
diff --git a/cli/tests/testdata/run/inline_js_source_map_2.js b/tests/testdata/run/inline_js_source_map_2.js
index d14d906b8..d14d906b8 100644
--- a/cli/tests/testdata/run/inline_js_source_map_2.js
+++ b/tests/testdata/run/inline_js_source_map_2.js
diff --git a/cli/tests/testdata/run/inline_js_source_map_2.js.out b/tests/testdata/run/inline_js_source_map_2.js.out
index ba3053eba..ba3053eba 100644
--- a/cli/tests/testdata/run/inline_js_source_map_2.js.out
+++ b/tests/testdata/run/inline_js_source_map_2.js.out
diff --git a/cli/tests/testdata/run/inline_js_source_map_2.ts b/tests/testdata/run/inline_js_source_map_2.ts
index fa50586e6..fa50586e6 100644
--- a/cli/tests/testdata/run/inline_js_source_map_2.ts
+++ b/tests/testdata/run/inline_js_source_map_2.ts
diff --git a/cli/tests/testdata/run/inline_js_source_map_2_with_inline_contents.js b/tests/testdata/run/inline_js_source_map_2_with_inline_contents.js
index 7660cc229..7660cc229 100644
--- a/cli/tests/testdata/run/inline_js_source_map_2_with_inline_contents.js
+++ b/tests/testdata/run/inline_js_source_map_2_with_inline_contents.js
diff --git a/cli/tests/testdata/run/inline_js_source_map_2_with_inline_contents.js.out b/tests/testdata/run/inline_js_source_map_2_with_inline_contents.js.out
index ba3053eba..ba3053eba 100644
--- a/cli/tests/testdata/run/inline_js_source_map_2_with_inline_contents.js.out
+++ b/tests/testdata/run/inline_js_source_map_2_with_inline_contents.js.out
diff --git a/cli/tests/testdata/run/inline_js_source_map_with_contents_from_graph.js b/tests/testdata/run/inline_js_source_map_with_contents_from_graph.js
index 887f02320..887f02320 100644
--- a/cli/tests/testdata/run/inline_js_source_map_with_contents_from_graph.js
+++ b/tests/testdata/run/inline_js_source_map_with_contents_from_graph.js
diff --git a/cli/tests/testdata/run/inline_js_source_map_with_contents_from_graph.js.out b/tests/testdata/run/inline_js_source_map_with_contents_from_graph.js.out
index d80a1c7bb..d80a1c7bb 100644
--- a/cli/tests/testdata/run/inline_js_source_map_with_contents_from_graph.js.out
+++ b/tests/testdata/run/inline_js_source_map_with_contents_from_graph.js.out
diff --git a/cli/tests/testdata/run/issue13562.ts b/tests/testdata/run/issue13562.ts
index afbf69f99..afbf69f99 100644
--- a/cli/tests/testdata/run/issue13562.ts
+++ b/tests/testdata/run/issue13562.ts
diff --git a/cli/tests/testdata/run/issue13562.ts.out b/tests/testdata/run/issue13562.ts.out
index e965047ad..e965047ad 100644
--- a/cli/tests/testdata/run/issue13562.ts.out
+++ b/tests/testdata/run/issue13562.ts.out
diff --git a/cli/tests/testdata/run/issue9750.js b/tests/testdata/run/issue9750.js
index 89fd61629..89fd61629 100644
--- a/cli/tests/testdata/run/issue9750.js
+++ b/tests/testdata/run/issue9750.js
diff --git a/cli/tests/testdata/run/js_import_detect.ts b/tests/testdata/run/js_import_detect.ts
index 751741996..751741996 100644
--- a/cli/tests/testdata/run/js_import_detect.ts
+++ b/tests/testdata/run/js_import_detect.ts
diff --git a/cli/tests/testdata/run/js_import_detect.ts.out b/tests/testdata/run/js_import_detect.ts.out
index 9766475a4..9766475a4 100644
--- a/cli/tests/testdata/run/js_import_detect.ts.out
+++ b/tests/testdata/run/js_import_detect.ts.out
diff --git a/cli/tests/testdata/run/js_root_with_ts_check.js b/tests/testdata/run/js_root_with_ts_check.js
index adca847ee..adca847ee 100644
--- a/cli/tests/testdata/run/js_root_with_ts_check.js
+++ b/tests/testdata/run/js_root_with_ts_check.js
diff --git a/cli/tests/testdata/run/js_root_with_ts_check.js.out b/tests/testdata/run/js_root_with_ts_check.js.out
index 34e2fa61e..34e2fa61e 100644
--- a/cli/tests/testdata/run/js_root_with_ts_check.js.out
+++ b/tests/testdata/run/js_root_with_ts_check.js.out
diff --git a/cli/tests/testdata/run/jsx_import_from_ts.App.jsx b/tests/testdata/run/jsx_import_from_ts.App.jsx
index 649230613..649230613 100644
--- a/cli/tests/testdata/run/jsx_import_from_ts.App.jsx
+++ b/tests/testdata/run/jsx_import_from_ts.App.jsx
diff --git a/cli/tests/testdata/run/jsx_import_from_ts.ts b/tests/testdata/run/jsx_import_from_ts.ts
index 3cc916698..3cc916698 100644
--- a/cli/tests/testdata/run/jsx_import_from_ts.ts
+++ b/tests/testdata/run/jsx_import_from_ts.ts
diff --git a/cli/tests/testdata/run/jsx_import_from_ts.ts.out b/tests/testdata/run/jsx_import_from_ts.ts.out
index d449b8c9a..d449b8c9a 100644
--- a/cli/tests/testdata/run/jsx_import_from_ts.ts.out
+++ b/tests/testdata/run/jsx_import_from_ts.ts.out
diff --git a/cli/tests/testdata/run/jsx_import_source.out b/tests/testdata/run/jsx_import_source.out
index b9555987a..b9555987a 100644
--- a/cli/tests/testdata/run/jsx_import_source.out
+++ b/tests/testdata/run/jsx_import_source.out
diff --git a/cli/tests/testdata/run/jsx_import_source_dev.out b/tests/testdata/run/jsx_import_source_dev.out
index 38d7a12f0..38d7a12f0 100644
--- a/cli/tests/testdata/run/jsx_import_source_dev.out
+++ b/tests/testdata/run/jsx_import_source_dev.out
diff --git a/cli/tests/testdata/run/jsx_import_source_error.out b/tests/testdata/run/jsx_import_source_error.out
index 634a5b09b..634a5b09b 100644
--- a/cli/tests/testdata/run/jsx_import_source_error.out
+++ b/tests/testdata/run/jsx_import_source_error.out
diff --git a/cli/tests/testdata/run/jsx_import_source_import_map.out b/tests/testdata/run/jsx_import_source_import_map.out
index 0d3238967..0d3238967 100644
--- a/cli/tests/testdata/run/jsx_import_source_import_map.out
+++ b/tests/testdata/run/jsx_import_source_import_map.out
diff --git a/cli/tests/testdata/run/jsx_import_source_import_map_dev.out b/tests/testdata/run/jsx_import_source_import_map_dev.out
index 56f514d90..56f514d90 100644
--- a/cli/tests/testdata/run/jsx_import_source_import_map_dev.out
+++ b/tests/testdata/run/jsx_import_source_import_map_dev.out
diff --git a/cli/tests/testdata/run/jsx_import_source_no_pragma.tsx b/tests/testdata/run/jsx_import_source_no_pragma.tsx
index 2c756054f..2c756054f 100644
--- a/cli/tests/testdata/run/jsx_import_source_no_pragma.tsx
+++ b/tests/testdata/run/jsx_import_source_no_pragma.tsx
diff --git a/cli/tests/testdata/run/jsx_import_source_pragma.tsx b/tests/testdata/run/jsx_import_source_pragma.tsx
index c19e53d4f..c19e53d4f 100644
--- a/cli/tests/testdata/run/jsx_import_source_pragma.tsx
+++ b/tests/testdata/run/jsx_import_source_pragma.tsx
diff --git a/cli/tests/testdata/run/jsx_import_source_pragma_import_map.tsx b/tests/testdata/run/jsx_import_source_pragma_import_map.tsx
index 548365f18..548365f18 100644
--- a/cli/tests/testdata/run/jsx_import_source_pragma_import_map.tsx
+++ b/tests/testdata/run/jsx_import_source_pragma_import_map.tsx
diff --git a/cli/tests/testdata/run/jsx_precompile/no_pragma.out b/tests/testdata/run/jsx_precompile/no_pragma.out
index 437995923..437995923 100644
--- a/cli/tests/testdata/run/jsx_precompile/no_pragma.out
+++ b/tests/testdata/run/jsx_precompile/no_pragma.out
diff --git a/cli/tests/testdata/run/jsx_precompile/no_pragma.tsx b/tests/testdata/run/jsx_precompile/no_pragma.tsx
index 7ba21d80d..7ba21d80d 100644
--- a/cli/tests/testdata/run/jsx_precompile/no_pragma.tsx
+++ b/tests/testdata/run/jsx_precompile/no_pragma.tsx
diff --git a/cli/tests/testdata/run/lock_check_err.json b/tests/testdata/run/lock_check_err.json
index fc6c2d45c..fc6c2d45c 100644
--- a/cli/tests/testdata/run/lock_check_err.json
+++ b/tests/testdata/run/lock_check_err.json
diff --git a/cli/tests/testdata/run/lock_check_err.out b/tests/testdata/run/lock_check_err.out
index e4cc7b81a..e4cc7b81a 100644
--- a/cli/tests/testdata/run/lock_check_err.out
+++ b/tests/testdata/run/lock_check_err.out
diff --git a/cli/tests/testdata/run/lock_check_err2.json b/tests/testdata/run/lock_check_err2.json
index a59cbc9e3..a59cbc9e3 100644
--- a/cli/tests/testdata/run/lock_check_err2.json
+++ b/tests/testdata/run/lock_check_err2.json
diff --git a/cli/tests/testdata/run/lock_check_err2.out b/tests/testdata/run/lock_check_err2.out
index 065c7434b..065c7434b 100644
--- a/cli/tests/testdata/run/lock_check_err2.out
+++ b/tests/testdata/run/lock_check_err2.out
diff --git a/cli/tests/testdata/run/lock_check_ok.json b/tests/testdata/run/lock_check_ok.json
index 94de0f630..94de0f630 100644
--- a/cli/tests/testdata/run/lock_check_ok.json
+++ b/tests/testdata/run/lock_check_ok.json
diff --git a/cli/tests/testdata/run/lock_check_ok2.json b/tests/testdata/run/lock_check_ok2.json
index 14d8b7117..14d8b7117 100644
--- a/cli/tests/testdata/run/lock_check_ok2.json
+++ b/tests/testdata/run/lock_check_ok2.json
diff --git a/cli/tests/testdata/run/lock_dynamic_imports.json b/tests/testdata/run/lock_dynamic_imports.json
index 0269b9409..0269b9409 100644
--- a/cli/tests/testdata/run/lock_dynamic_imports.json
+++ b/tests/testdata/run/lock_dynamic_imports.json
diff --git a/cli/tests/testdata/run/lock_dynamic_imports.out b/tests/testdata/run/lock_dynamic_imports.out
index acc65c8e6..acc65c8e6 100644
--- a/cli/tests/testdata/run/lock_dynamic_imports.out
+++ b/tests/testdata/run/lock_dynamic_imports.out
diff --git a/cli/tests/testdata/run/lock_only_http_and_https/b.ts b/tests/testdata/run/lock_only_http_and_https/b.ts
index 3bf5ac26a..3bf5ac26a 100644
--- a/cli/tests/testdata/run/lock_only_http_and_https/b.ts
+++ b/tests/testdata/run/lock_only_http_and_https/b.ts
diff --git a/cli/tests/testdata/run/lock_only_http_and_https/deno.lock b/tests/testdata/run/lock_only_http_and_https/deno.lock
index 695926fd5..695926fd5 100644
--- a/cli/tests/testdata/run/lock_only_http_and_https/deno.lock
+++ b/tests/testdata/run/lock_only_http_and_https/deno.lock
diff --git a/cli/tests/testdata/run/lock_only_http_and_https/main.out b/tests/testdata/run/lock_only_http_and_https/main.out
index cc47b50f3..cc47b50f3 100644
--- a/cli/tests/testdata/run/lock_only_http_and_https/main.out
+++ b/tests/testdata/run/lock_only_http_and_https/main.out
diff --git a/cli/tests/testdata/run/lock_only_http_and_https/main.ts b/tests/testdata/run/lock_only_http_and_https/main.ts
index 879e825ed..879e825ed 100644
--- a/cli/tests/testdata/run/lock_only_http_and_https/main.ts
+++ b/tests/testdata/run/lock_only_http_and_https/main.ts
diff --git a/cli/tests/testdata/run/lock_v2_check_err.json b/tests/testdata/run/lock_v2_check_err.json
index 6bd6491c6..6bd6491c6 100644
--- a/cli/tests/testdata/run/lock_v2_check_err.json
+++ b/tests/testdata/run/lock_v2_check_err.json
diff --git a/cli/tests/testdata/run/lock_v2_check_err.out b/tests/testdata/run/lock_v2_check_err.out
index 28ad01cf4..28ad01cf4 100644
--- a/cli/tests/testdata/run/lock_v2_check_err.out
+++ b/tests/testdata/run/lock_v2_check_err.out
diff --git a/cli/tests/testdata/run/lock_v2_check_err2.json b/tests/testdata/run/lock_v2_check_err2.json
index 30fbcdf4b..30fbcdf4b 100644
--- a/cli/tests/testdata/run/lock_v2_check_err2.json
+++ b/tests/testdata/run/lock_v2_check_err2.json
diff --git a/cli/tests/testdata/run/lock_v2_check_err2.out b/tests/testdata/run/lock_v2_check_err2.out
index 3d82cba27..3d82cba27 100644
--- a/cli/tests/testdata/run/lock_v2_check_err2.out
+++ b/tests/testdata/run/lock_v2_check_err2.out
diff --git a/cli/tests/testdata/run/lock_v2_check_ok.json b/tests/testdata/run/lock_v2_check_ok.json
index 63bec862a..63bec862a 100644
--- a/cli/tests/testdata/run/lock_v2_check_ok.json
+++ b/tests/testdata/run/lock_v2_check_ok.json
diff --git a/cli/tests/testdata/run/lock_v2_check_ok2.json b/tests/testdata/run/lock_v2_check_ok2.json
index 4356c9421..4356c9421 100644
--- a/cli/tests/testdata/run/lock_v2_check_ok2.json
+++ b/tests/testdata/run/lock_v2_check_ok2.json
diff --git a/cli/tests/testdata/run/lock_v2_dynamic_imports.json b/tests/testdata/run/lock_v2_dynamic_imports.json
index eadbee272..eadbee272 100644
--- a/cli/tests/testdata/run/lock_v2_dynamic_imports.json
+++ b/tests/testdata/run/lock_v2_dynamic_imports.json
diff --git a/cli/tests/testdata/run/lock_v2_dynamic_imports.out b/tests/testdata/run/lock_v2_dynamic_imports.out
index 36c2c9b5c..36c2c9b5c 100644
--- a/cli/tests/testdata/run/lock_v2_dynamic_imports.out
+++ b/tests/testdata/run/lock_v2_dynamic_imports.out
diff --git a/cli/tests/testdata/run/lock_write_fetch/file_exists.ts b/tests/testdata/run/lock_write_fetch/file_exists.ts
index 20de4d4f2..20de4d4f2 100644
--- a/cli/tests/testdata/run/lock_write_fetch/file_exists.ts
+++ b/tests/testdata/run/lock_write_fetch/file_exists.ts
diff --git a/cli/tests/testdata/run/lock_write_fetch/main.out b/tests/testdata/run/lock_write_fetch/main.out
index bfdb952f9..bfdb952f9 100644
--- a/cli/tests/testdata/run/lock_write_fetch/main.out
+++ b/tests/testdata/run/lock_write_fetch/main.out
diff --git a/cli/tests/testdata/run/lock_write_fetch/main.ts b/tests/testdata/run/lock_write_fetch/main.ts
index 57bc54d02..57bc54d02 100644
--- a/cli/tests/testdata/run/lock_write_fetch/main.ts
+++ b/tests/testdata/run/lock_write_fetch/main.ts
diff --git a/cli/tests/testdata/run/long_data_url_formatting.ts b/tests/testdata/run/long_data_url_formatting.ts
index 2ed2d5a03..2ed2d5a03 100644
--- a/cli/tests/testdata/run/long_data_url_formatting.ts
+++ b/tests/testdata/run/long_data_url_formatting.ts
diff --git a/cli/tests/testdata/run/long_data_url_formatting.ts.out b/tests/testdata/run/long_data_url_formatting.ts.out
index ea78c2591..ea78c2591 100644
--- a/cli/tests/testdata/run/long_data_url_formatting.ts.out
+++ b/tests/testdata/run/long_data_url_formatting.ts.out
diff --git a/cli/tests/testdata/run/main_module/main.out b/tests/testdata/run/main_module/main.out
index 29f592c2a..29f592c2a 100644
--- a/cli/tests/testdata/run/main_module/main.out
+++ b/tests/testdata/run/main_module/main.out
diff --git a/cli/tests/testdata/run/main_module/main.ts b/tests/testdata/run/main_module/main.ts
index d2f2c66ee..d2f2c66ee 100644
--- a/cli/tests/testdata/run/main_module/main.ts
+++ b/tests/testdata/run/main_module/main.ts
diff --git a/cli/tests/testdata/run/main_module/other.ts b/tests/testdata/run/main_module/other.ts
index b3e524b0a..b3e524b0a 100644
--- a/cli/tests/testdata/run/main_module/other.ts
+++ b/tests/testdata/run/main_module/other.ts
diff --git a/cli/tests/testdata/run/mts_dmts_mjs.out b/tests/testdata/run/mts_dmts_mjs.out
index 789819226..789819226 100644
--- a/cli/tests/testdata/run/mts_dmts_mjs.out
+++ b/tests/testdata/run/mts_dmts_mjs.out
diff --git a/cli/tests/testdata/run/nested_error/main.ts b/tests/testdata/run/nested_error/main.ts
index 69828e1ca..69828e1ca 100644
--- a/cli/tests/testdata/run/nested_error/main.ts
+++ b/tests/testdata/run/nested_error/main.ts
diff --git a/cli/tests/testdata/run/nested_error/main.ts.out b/tests/testdata/run/nested_error/main.ts.out
index 05780bc6a..05780bc6a 100644
--- a/cli/tests/testdata/run/nested_error/main.ts.out
+++ b/tests/testdata/run/nested_error/main.ts.out
diff --git a/cli/tests/testdata/run/no_check_imports_not_used_as_values/hello.ts b/tests/testdata/run/no_check_imports_not_used_as_values/hello.ts
index 1a9d8f114..1a9d8f114 100644
--- a/cli/tests/testdata/run/no_check_imports_not_used_as_values/hello.ts
+++ b/tests/testdata/run/no_check_imports_not_used_as_values/hello.ts
diff --git a/cli/tests/testdata/run/no_check_imports_not_used_as_values/main.out b/tests/testdata/run/no_check_imports_not_used_as_values/main.out
index f744c4183..f744c4183 100644
--- a/cli/tests/testdata/run/no_check_imports_not_used_as_values/main.out
+++ b/tests/testdata/run/no_check_imports_not_used_as_values/main.out
diff --git a/cli/tests/testdata/run/no_check_imports_not_used_as_values/main.ts b/tests/testdata/run/no_check_imports_not_used_as_values/main.ts
index 80e17aa35..80e17aa35 100644
--- a/cli/tests/testdata/run/no_check_imports_not_used_as_values/main.ts
+++ b/tests/testdata/run/no_check_imports_not_used_as_values/main.ts
diff --git a/cli/tests/testdata/run/no_check_imports_not_used_as_values/preserve_imports.tsconfig.json b/tests/testdata/run/no_check_imports_not_used_as_values/preserve_imports.tsconfig.json
index 9b19291aa..9b19291aa 100644
--- a/cli/tests/testdata/run/no_check_imports_not_used_as_values/preserve_imports.tsconfig.json
+++ b/tests/testdata/run/no_check_imports_not_used_as_values/preserve_imports.tsconfig.json
diff --git a/cli/tests/testdata/run/no_check_remote.ts b/tests/testdata/run/no_check_remote.ts
index 2ae8c2692..2ae8c2692 100644
--- a/cli/tests/testdata/run/no_check_remote.ts
+++ b/tests/testdata/run/no_check_remote.ts
diff --git a/cli/tests/testdata/run/no_check_remote.ts.disabled.out b/tests/testdata/run/no_check_remote.ts.disabled.out
index 344264634..344264634 100644
--- a/cli/tests/testdata/run/no_check_remote.ts.disabled.out
+++ b/tests/testdata/run/no_check_remote.ts.disabled.out
diff --git a/cli/tests/testdata/run/no_check_remote.ts.enabled.out b/tests/testdata/run/no_check_remote.ts.enabled.out
index 48082f72f..48082f72f 100644
--- a/cli/tests/testdata/run/no_check_remote.ts.enabled.out
+++ b/tests/testdata/run/no_check_remote.ts.enabled.out
diff --git a/cli/tests/testdata/run/no_lock_flag/deno.json b/tests/testdata/run/no_lock_flag/deno.json
index 90faa728a..90faa728a 100644
--- a/cli/tests/testdata/run/no_lock_flag/deno.json
+++ b/tests/testdata/run/no_lock_flag/deno.json
diff --git a/cli/tests/testdata/run/no_lock_flag/deno.lock b/tests/testdata/run/no_lock_flag/deno.lock
index 059f66789..059f66789 100644
--- a/cli/tests/testdata/run/no_lock_flag/deno.lock
+++ b/tests/testdata/run/no_lock_flag/deno.lock
diff --git a/cli/tests/testdata/run/no_lock_flag/main.out b/tests/testdata/run/no_lock_flag/main.out
index 0d8f0a237..0d8f0a237 100644
--- a/cli/tests/testdata/run/no_lock_flag/main.out
+++ b/tests/testdata/run/no_lock_flag/main.out
diff --git a/cli/tests/testdata/run/no_lock_flag/main.ts b/tests/testdata/run/no_lock_flag/main.ts
index baa52775d..baa52775d 100644
--- a/cli/tests/testdata/run/no_lock_flag/main.ts
+++ b/tests/testdata/run/no_lock_flag/main.ts
diff --git a/cli/tests/testdata/run/no_mem_cache.js b/tests/testdata/run/no_mem_cache.js
index a486732b6..a486732b6 100644
--- a/cli/tests/testdata/run/no_mem_cache.js
+++ b/tests/testdata/run/no_mem_cache.js
diff --git a/cli/tests/testdata/run/no_mem_cache.js.out b/tests/testdata/run/no_mem_cache.js.out
index a32119c8a..a32119c8a 100644
--- a/cli/tests/testdata/run/no_mem_cache.js.out
+++ b/tests/testdata/run/no_mem_cache.js.out
diff --git a/cli/tests/testdata/run/no_prompt.ts b/tests/testdata/run/no_prompt.ts
index 17d54b92c..17d54b92c 100644
--- a/cli/tests/testdata/run/no_prompt.ts
+++ b/tests/testdata/run/no_prompt.ts
diff --git a/cli/tests/testdata/run/no_validate_asm.js b/tests/testdata/run/no_validate_asm.js
index ef999e080..ef999e080 100644
--- a/cli/tests/testdata/run/no_validate_asm.js
+++ b/tests/testdata/run/no_validate_asm.js
diff --git a/cli/tests/testdata/run/node_builtin_modules/mod.js b/tests/testdata/run/node_builtin_modules/mod.js
index a01ac4422..a01ac4422 100644
--- a/cli/tests/testdata/run/node_builtin_modules/mod.js
+++ b/tests/testdata/run/node_builtin_modules/mod.js
diff --git a/cli/tests/testdata/run/node_builtin_modules/mod.js.out b/tests/testdata/run/node_builtin_modules/mod.js.out
index 844e3d927..844e3d927 100644
--- a/cli/tests/testdata/run/node_builtin_modules/mod.js.out
+++ b/tests/testdata/run/node_builtin_modules/mod.js.out
diff --git a/cli/tests/testdata/run/node_builtin_modules/mod.ts b/tests/testdata/run/node_builtin_modules/mod.ts
index a01ac4422..a01ac4422 100644
--- a/cli/tests/testdata/run/node_builtin_modules/mod.ts
+++ b/tests/testdata/run/node_builtin_modules/mod.ts
diff --git a/cli/tests/testdata/run/node_builtin_modules/mod.ts.out b/tests/testdata/run/node_builtin_modules/mod.ts.out
index 844e3d927..844e3d927 100644
--- a/cli/tests/testdata/run/node_builtin_modules/mod.ts.out
+++ b/tests/testdata/run/node_builtin_modules/mod.ts.out
diff --git a/cli/tests/testdata/run/node_env_var_allowlist.ts b/tests/testdata/run/node_env_var_allowlist.ts
index 95da38c24..95da38c24 100644
--- a/cli/tests/testdata/run/node_env_var_allowlist.ts
+++ b/tests/testdata/run/node_env_var_allowlist.ts
diff --git a/cli/tests/testdata/run/node_env_var_allowlist.ts.out b/tests/testdata/run/node_env_var_allowlist.ts.out
index ea66a2965..ea66a2965 100644
--- a/cli/tests/testdata/run/node_env_var_allowlist.ts.out
+++ b/tests/testdata/run/node_env_var_allowlist.ts.out
diff --git a/cli/tests/testdata/run/node_prefix_missing/config.json b/tests/testdata/run/node_prefix_missing/config.json
index 67480c3d4..67480c3d4 100644
--- a/cli/tests/testdata/run/node_prefix_missing/config.json
+++ b/tests/testdata/run/node_prefix_missing/config.json
diff --git a/cli/tests/testdata/run/node_prefix_missing/import_map.json b/tests/testdata/run/node_prefix_missing/import_map.json
index 3add7d009..3add7d009 100644
--- a/cli/tests/testdata/run/node_prefix_missing/import_map.json
+++ b/tests/testdata/run/node_prefix_missing/import_map.json
diff --git a/cli/tests/testdata/run/node_prefix_missing/main.ts b/tests/testdata/run/node_prefix_missing/main.ts
index c5c1885a2..c5c1885a2 100644
--- a/cli/tests/testdata/run/node_prefix_missing/main.ts
+++ b/tests/testdata/run/node_prefix_missing/main.ts
diff --git a/cli/tests/testdata/run/node_prefix_missing/main.ts.out b/tests/testdata/run/node_prefix_missing/main.ts.out
index fd19ed55f..fd19ed55f 100644
--- a/cli/tests/testdata/run/node_prefix_missing/main.ts.out
+++ b/tests/testdata/run/node_prefix_missing/main.ts.out
diff --git a/tests/testdata/run/node_prefix_missing/main.ts.out_feature_enabled b/tests/testdata/run/node_prefix_missing/main.ts.out_feature_enabled
new file mode 100644
index 000000000..513b411ce
--- /dev/null
+++ b/tests/testdata/run/node_prefix_missing/main.ts.out_feature_enabled
@@ -0,0 +1,2 @@
+[WILDCARD]Warning: Resolving "fs" as "node:fs" at file:///[WILDCARD]/tests/testdata/run/node_prefix_missing/main.ts:1:16. If you want to use a built-in Node module, add a "node:" prefix.
+[Function: writeFile]
diff --git a/tests/testdata/run/onload/imported.ts b/tests/testdata/run/onload/imported.ts
new file mode 100644
index 000000000..d2a93c8d2
--- /dev/null
+++ b/tests/testdata/run/onload/imported.ts
@@ -0,0 +1,13 @@
+// deno-lint-ignore-file no-window-prefix
+import { assert } from "../../../../test_util/std/assert/mod.ts";
+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)`);
+};
+
+window.addEventListener("load", handler);
+window.addEventListener("beforeunload", handler);
+window.addEventListener("unload", handler);
+console.log("log from imported script");
diff --git a/cli/tests/testdata/run/onload/main.out b/tests/testdata/run/onload/main.out
index b25d33fa8..b25d33fa8 100644
--- a/cli/tests/testdata/run/onload/main.out
+++ b/tests/testdata/run/onload/main.out
diff --git a/tests/testdata/run/onload/main.ts b/tests/testdata/run/onload/main.ts
new file mode 100644
index 000000000..990a21131
--- /dev/null
+++ b/tests/testdata/run/onload/main.ts
@@ -0,0 +1,34 @@
+// deno-lint-ignore-file no-window-prefix no-prototype-builtins
+import { assert } from "../../../../test_util/std/assert/mod.ts";
+import "./imported.ts";
+
+assert(window.hasOwnProperty("onload"));
+assert(window.onload === null);
+
+const eventHandler = (e: Event) => {
+ assert(e.type === "beforeunload" ? e.cancelable : !e.cancelable);
+ console.log(`got ${e.type} event in event handler (main)`);
+};
+
+window.addEventListener("load", eventHandler);
+
+window.addEventListener("beforeunload", eventHandler);
+
+window.addEventListener("unload", eventHandler);
+
+window.onload = (e: Event) => {
+ assert(!e.cancelable);
+ console.log(`got ${e.type} event in onload function`);
+};
+
+window.onbeforeunload = (e: BeforeUnloadEvent) => {
+ assert(e.cancelable);
+ console.log(`got ${e.type} event in onbeforeunload function`);
+};
+
+window.onunload = (e: Event) => {
+ assert(!e.cancelable);
+ console.log(`got ${e.type} event in onunload function`);
+};
+
+console.log("log from main");
diff --git a/tests/testdata/run/onload/nest_imported.ts b/tests/testdata/run/onload/nest_imported.ts
new file mode 100644
index 000000000..2151f4185
--- /dev/null
+++ b/tests/testdata/run/onload/nest_imported.ts
@@ -0,0 +1,12 @@
+// deno-lint-ignore-file no-window-prefix
+import { assert } from "../../../../test_util/std/assert/mod.ts";
+
+const handler = (e: Event) => {
+ assert(e.type === "beforeunload" ? e.cancelable : !e.cancelable);
+ console.log(`got ${e.type} event in event handler (nest_imported)`);
+};
+
+window.addEventListener("load", handler);
+window.addEventListener("beforeunload", handler);
+window.addEventListener("unload", handler);
+console.log("log from nest_imported script");
diff --git a/cli/tests/testdata/run/op_exit_op_set_exit_code_in_worker.ts b/tests/testdata/run/op_exit_op_set_exit_code_in_worker.ts
index b6a776439..b6a776439 100644
--- a/cli/tests/testdata/run/op_exit_op_set_exit_code_in_worker.ts
+++ b/tests/testdata/run/op_exit_op_set_exit_code_in_worker.ts
diff --git a/cli/tests/testdata/run/op_exit_op_set_exit_code_worker.js b/tests/testdata/run/op_exit_op_set_exit_code_worker.js
index 9b284c37d..9b284c37d 100644
--- a/cli/tests/testdata/run/op_exit_op_set_exit_code_worker.js
+++ b/tests/testdata/run/op_exit_op_set_exit_code_worker.js
diff --git a/cli/tests/testdata/run/permission_args.out b/tests/testdata/run/permission_args.out
index 6a1e1787c..6a1e1787c 100644
--- a/cli/tests/testdata/run/permission_args.out
+++ b/tests/testdata/run/permission_args.out
diff --git a/cli/tests/testdata/run/permission_request_long.ts b/tests/testdata/run/permission_request_long.ts
index 05937e95a..05937e95a 100644
--- a/cli/tests/testdata/run/permission_request_long.ts
+++ b/tests/testdata/run/permission_request_long.ts
diff --git a/cli/tests/testdata/run/permission_test.ts b/tests/testdata/run/permission_test.ts
index a2312e3ac..a2312e3ac 100644
--- a/cli/tests/testdata/run/permission_test.ts
+++ b/tests/testdata/run/permission_test.ts
diff --git a/cli/tests/testdata/run/permissions_cache.ts b/tests/testdata/run/permissions_cache.ts
index c77ee0f36..c77ee0f36 100644
--- a/cli/tests/testdata/run/permissions_cache.ts
+++ b/tests/testdata/run/permissions_cache.ts
diff --git a/cli/tests/testdata/run/permissions_prompt_allow_all.ts b/tests/testdata/run/permissions_prompt_allow_all.ts
index 8aa7d040e..8aa7d040e 100644
--- a/cli/tests/testdata/run/permissions_prompt_allow_all.ts
+++ b/tests/testdata/run/permissions_prompt_allow_all.ts
diff --git a/cli/tests/testdata/run/permissions_prompt_allow_all_2.ts b/tests/testdata/run/permissions_prompt_allow_all_2.ts
index f42b35753..f42b35753 100644
--- a/cli/tests/testdata/run/permissions_prompt_allow_all_2.ts
+++ b/tests/testdata/run/permissions_prompt_allow_all_2.ts
diff --git a/cli/tests/testdata/run/private_field_presence.ts b/tests/testdata/run/private_field_presence.ts
index 7ce2840d8..7ce2840d8 100644
--- a/cli/tests/testdata/run/private_field_presence.ts
+++ b/tests/testdata/run/private_field_presence.ts
diff --git a/cli/tests/testdata/run/private_field_presence.ts.out b/tests/testdata/run/private_field_presence.ts.out
index 1d474d525..1d474d525 100644
--- a/cli/tests/testdata/run/private_field_presence.ts.out
+++ b/tests/testdata/run/private_field_presence.ts.out
diff --git a/cli/tests/testdata/run/proto_exploit.js b/tests/testdata/run/proto_exploit.js
index 8bd22cfe5..8bd22cfe5 100644
--- a/cli/tests/testdata/run/proto_exploit.js
+++ b/tests/testdata/run/proto_exploit.js
diff --git a/cli/tests/testdata/run/proto_exploit.js.out b/tests/testdata/run/proto_exploit.js.out
index fde881dc5..fde881dc5 100644
--- a/cli/tests/testdata/run/proto_exploit.js.out
+++ b/tests/testdata/run/proto_exploit.js.out
diff --git a/cli/tests/testdata/run/queue_microtask_error.ts b/tests/testdata/run/queue_microtask_error.ts
index b2e9642c5..b2e9642c5 100644
--- a/cli/tests/testdata/run/queue_microtask_error.ts
+++ b/tests/testdata/run/queue_microtask_error.ts
diff --git a/cli/tests/testdata/run/queue_microtask_error.ts.out b/tests/testdata/run/queue_microtask_error.ts.out
index a8ce13170..a8ce13170 100644
--- a/cli/tests/testdata/run/queue_microtask_error.ts.out
+++ b/tests/testdata/run/queue_microtask_error.ts.out
diff --git a/cli/tests/testdata/run/queue_microtask_error_handled.ts b/tests/testdata/run/queue_microtask_error_handled.ts
index 47ea2d32e..47ea2d32e 100644
--- a/cli/tests/testdata/run/queue_microtask_error_handled.ts
+++ b/tests/testdata/run/queue_microtask_error_handled.ts
diff --git a/cli/tests/testdata/run/queue_microtask_error_handled.ts.out b/tests/testdata/run/queue_microtask_error_handled.ts.out
index bdc8eafa1..bdc8eafa1 100644
--- a/cli/tests/testdata/run/queue_microtask_error_handled.ts.out
+++ b/tests/testdata/run/queue_microtask_error_handled.ts.out
diff --git a/cli/tests/testdata/run/reference_types.ts b/tests/testdata/run/reference_types.ts
index 105e23b37..105e23b37 100644
--- a/cli/tests/testdata/run/reference_types.ts
+++ b/tests/testdata/run/reference_types.ts
diff --git a/cli/tests/testdata/run/reference_types.ts.out b/tests/testdata/run/reference_types.ts.out
index 417b7b537..417b7b537 100644
--- a/cli/tests/testdata/run/reference_types.ts.out
+++ b/tests/testdata/run/reference_types.ts.out
diff --git a/cli/tests/testdata/run/reference_types_error.js b/tests/testdata/run/reference_types_error.js
index 68b6c2136..68b6c2136 100644
--- a/cli/tests/testdata/run/reference_types_error.js
+++ b/tests/testdata/run/reference_types_error.js
diff --git a/cli/tests/testdata/run/reference_types_error.js.out b/tests/testdata/run/reference_types_error.js.out
index 86055f3ac..86055f3ac 100644
--- a/cli/tests/testdata/run/reference_types_error.js.out
+++ b/tests/testdata/run/reference_types_error.js.out
diff --git a/cli/tests/testdata/run/reference_types_remote.ts b/tests/testdata/run/reference_types_remote.ts
index e7fa81b2c..e7fa81b2c 100644
--- a/cli/tests/testdata/run/reference_types_remote.ts
+++ b/tests/testdata/run/reference_types_remote.ts
diff --git a/cli/tests/testdata/run/reference_types_remote.ts.out b/tests/testdata/run/reference_types_remote.ts.out
index 417b7b537..417b7b537 100644
--- a/cli/tests/testdata/run/reference_types_remote.ts.out
+++ b/tests/testdata/run/reference_types_remote.ts.out
diff --git a/cli/tests/testdata/run/rejection_handled.out b/tests/testdata/run/rejection_handled.out
index 5c06fcd2b..5c06fcd2b 100644
--- a/cli/tests/testdata/run/rejection_handled.out
+++ b/tests/testdata/run/rejection_handled.out
diff --git a/cli/tests/testdata/run/rejection_handled.ts b/tests/testdata/run/rejection_handled.ts
index f058ff966..f058ff966 100644
--- a/cli/tests/testdata/run/rejection_handled.ts
+++ b/tests/testdata/run/rejection_handled.ts
diff --git a/cli/tests/testdata/run/remote_type_error/main.ts b/tests/testdata/run/remote_type_error/main.ts
index 00f8a52df..00f8a52df 100644
--- a/cli/tests/testdata/run/remote_type_error/main.ts
+++ b/tests/testdata/run/remote_type_error/main.ts
diff --git a/cli/tests/testdata/run/remote_type_error/remote.ts b/tests/testdata/run/remote_type_error/remote.ts
index 6e9bf4adb..6e9bf4adb 100644
--- a/cli/tests/testdata/run/remote_type_error/remote.ts
+++ b/tests/testdata/run/remote_type_error/remote.ts
diff --git a/cli/tests/testdata/run/replace_self.js b/tests/testdata/run/replace_self.js
index cfd473cd3..cfd473cd3 100644
--- a/cli/tests/testdata/run/replace_self.js
+++ b/tests/testdata/run/replace_self.js
diff --git a/cli/tests/testdata/run/replace_self.js.out b/tests/testdata/run/replace_self.js.out
index aaffb5a62..aaffb5a62 100644
--- a/cli/tests/testdata/run/replace_self.js.out
+++ b/tests/testdata/run/replace_self.js.out
diff --git a/cli/tests/testdata/run/report_error.ts b/tests/testdata/run/report_error.ts
index a6d4af1fd..a6d4af1fd 100644
--- a/cli/tests/testdata/run/report_error.ts
+++ b/tests/testdata/run/report_error.ts
diff --git a/cli/tests/testdata/run/report_error.ts.out b/tests/testdata/run/report_error.ts.out
index 185db62a5..185db62a5 100644
--- a/cli/tests/testdata/run/report_error.ts.out
+++ b/tests/testdata/run/report_error.ts.out
diff --git a/cli/tests/testdata/run/report_error_end_of_program.ts b/tests/testdata/run/report_error_end_of_program.ts
index cd7ce7f9c..cd7ce7f9c 100644
--- a/cli/tests/testdata/run/report_error_end_of_program.ts
+++ b/tests/testdata/run/report_error_end_of_program.ts
diff --git a/cli/tests/testdata/run/report_error_end_of_program.ts.out b/tests/testdata/run/report_error_end_of_program.ts.out
index ecca63389..ecca63389 100644
--- a/cli/tests/testdata/run/report_error_end_of_program.ts.out
+++ b/tests/testdata/run/report_error_end_of_program.ts.out
diff --git a/cli/tests/testdata/run/report_error_handled.ts b/tests/testdata/run/report_error_handled.ts
index d18996c13..d18996c13 100644
--- a/cli/tests/testdata/run/report_error_handled.ts
+++ b/tests/testdata/run/report_error_handled.ts
diff --git a/cli/tests/testdata/run/report_error_handled.ts.out b/tests/testdata/run/report_error_handled.ts.out
index 89fa30314..89fa30314 100644
--- a/cli/tests/testdata/run/report_error_handled.ts.out
+++ b/tests/testdata/run/report_error_handled.ts.out
diff --git a/cli/tests/testdata/run/resolve_dns.ts b/tests/testdata/run/resolve_dns.ts
index a2d0fd046..a2d0fd046 100644
--- a/cli/tests/testdata/run/resolve_dns.ts
+++ b/tests/testdata/run/resolve_dns.ts
diff --git a/cli/tests/testdata/run/resolve_dns.ts.out b/tests/testdata/run/resolve_dns.ts.out
index 025028395..025028395 100644
--- a/cli/tests/testdata/run/resolve_dns.ts.out
+++ b/tests/testdata/run/resolve_dns.ts.out
diff --git a/cli/tests/testdata/run/resolve_dns.zone.in b/tests/testdata/run/resolve_dns.zone.in
index 94d5b9fc3..94d5b9fc3 100644
--- a/cli/tests/testdata/run/resolve_dns.zone.in
+++ b/tests/testdata/run/resolve_dns.zone.in
diff --git a/cli/tests/testdata/run/runtime_decorators.ts b/tests/testdata/run/runtime_decorators.ts
index 40a26bbd4..40a26bbd4 100644
--- a/cli/tests/testdata/run/runtime_decorators.ts
+++ b/tests/testdata/run/runtime_decorators.ts
diff --git a/cli/tests/testdata/run/runtime_decorators.ts.out b/tests/testdata/run/runtime_decorators.ts.out
index 0fc1d4590..0fc1d4590 100644
--- a/cli/tests/testdata/run/runtime_decorators.ts.out
+++ b/tests/testdata/run/runtime_decorators.ts.out
diff --git a/cli/tests/testdata/run/seed_random.js b/tests/testdata/run/seed_random.js
index 7f6e336df..7f6e336df 100644
--- a/cli/tests/testdata/run/seed_random.js
+++ b/tests/testdata/run/seed_random.js
diff --git a/cli/tests/testdata/run/seed_random.js.out b/tests/testdata/run/seed_random.js.out
index 4d1ebd081..4d1ebd081 100644
--- a/cli/tests/testdata/run/seed_random.js.out
+++ b/tests/testdata/run/seed_random.js.out
diff --git a/cli/tests/testdata/run/set_exit_code_0.ts b/tests/testdata/run/set_exit_code_0.ts
index 8a0103c8f..8a0103c8f 100644
--- a/cli/tests/testdata/run/set_exit_code_0.ts
+++ b/tests/testdata/run/set_exit_code_0.ts
diff --git a/cli/tests/testdata/run/set_exit_code_1.ts b/tests/testdata/run/set_exit_code_1.ts
index 45027ccf7..45027ccf7 100644
--- a/cli/tests/testdata/run/set_exit_code_1.ts
+++ b/tests/testdata/run/set_exit_code_1.ts
diff --git a/cli/tests/testdata/run/set_exit_code_2.ts b/tests/testdata/run/set_exit_code_2.ts
index 48469c17d..48469c17d 100644
--- a/cli/tests/testdata/run/set_exit_code_2.ts
+++ b/tests/testdata/run/set_exit_code_2.ts
diff --git a/cli/tests/testdata/run/set_timeout_error.ts b/tests/testdata/run/set_timeout_error.ts
index 2864574e7..2864574e7 100644
--- a/cli/tests/testdata/run/set_timeout_error.ts
+++ b/tests/testdata/run/set_timeout_error.ts
diff --git a/cli/tests/testdata/run/set_timeout_error.ts.out b/tests/testdata/run/set_timeout_error.ts.out
index 9db053f6c..9db053f6c 100644
--- a/cli/tests/testdata/run/set_timeout_error.ts.out
+++ b/tests/testdata/run/set_timeout_error.ts.out
diff --git a/cli/tests/testdata/run/set_timeout_error_handled.ts b/tests/testdata/run/set_timeout_error_handled.ts
index aee2d97d2..aee2d97d2 100644
--- a/cli/tests/testdata/run/set_timeout_error_handled.ts
+++ b/tests/testdata/run/set_timeout_error_handled.ts
diff --git a/cli/tests/testdata/run/set_timeout_error_handled.ts.out b/tests/testdata/run/set_timeout_error_handled.ts.out
index 054dd9b6b..054dd9b6b 100644
--- a/cli/tests/testdata/run/set_timeout_error_handled.ts.out
+++ b/tests/testdata/run/set_timeout_error_handled.ts.out
diff --git a/cli/tests/testdata/run/shebang.ts b/tests/testdata/run/shebang.ts
index 00feb2da0..00feb2da0 100644
--- a/cli/tests/testdata/run/shebang.ts
+++ b/tests/testdata/run/shebang.ts
diff --git a/cli/tests/testdata/run/shebang.ts.out b/tests/testdata/run/shebang.ts.out
index d81cc0710..d81cc0710 100644
--- a/cli/tests/testdata/run/shebang.ts.out
+++ b/tests/testdata/run/shebang.ts.out
diff --git a/cli/tests/testdata/run/shebang2.ts b/tests/testdata/run/shebang2.ts
index da0d7bf0c..da0d7bf0c 100644
--- a/cli/tests/testdata/run/shebang2.ts
+++ b/tests/testdata/run/shebang2.ts
diff --git a/cli/tests/testdata/run/single_compile_with_reload.ts b/tests/testdata/run/single_compile_with_reload.ts
index 9478ad523..9478ad523 100644
--- a/cli/tests/testdata/run/single_compile_with_reload.ts
+++ b/tests/testdata/run/single_compile_with_reload.ts
diff --git a/cli/tests/testdata/run/single_compile_with_reload.ts.out b/tests/testdata/run/single_compile_with_reload.ts.out
index a3986e3af..a3986e3af 100644
--- a/cli/tests/testdata/run/single_compile_with_reload.ts.out
+++ b/tests/testdata/run/single_compile_with_reload.ts.out
diff --git a/cli/tests/testdata/run/single_compile_with_reload_dyn.ts b/tests/testdata/run/single_compile_with_reload_dyn.ts
index 6c96fac64..6c96fac64 100644
--- a/cli/tests/testdata/run/single_compile_with_reload_dyn.ts
+++ b/tests/testdata/run/single_compile_with_reload_dyn.ts
diff --git a/cli/tests/testdata/run/single_compile_with_reload_worker.ts b/tests/testdata/run/single_compile_with_reload_worker.ts
index 103cafe20..103cafe20 100644
--- a/cli/tests/testdata/run/single_compile_with_reload_worker.ts
+++ b/tests/testdata/run/single_compile_with_reload_worker.ts
diff --git a/cli/tests/testdata/run/spawn_stdout_inherit.ts b/tests/testdata/run/spawn_stdout_inherit.ts
index 04f635cea..04f635cea 100644
--- a/cli/tests/testdata/run/spawn_stdout_inherit.ts
+++ b/tests/testdata/run/spawn_stdout_inherit.ts
diff --git a/cli/tests/testdata/run/spawn_stdout_inherit.ts.out b/tests/testdata/run/spawn_stdout_inherit.ts.out
index 474891cf2..474891cf2 100644
--- a/cli/tests/testdata/run/spawn_stdout_inherit.ts.out
+++ b/tests/testdata/run/spawn_stdout_inherit.ts.out
diff --git a/cli/tests/testdata/run/stdin_read_all.out b/tests/testdata/run/stdin_read_all.out
index 2f0dfb71a..2f0dfb71a 100644
--- a/cli/tests/testdata/run/stdin_read_all.out
+++ b/tests/testdata/run/stdin_read_all.out
diff --git a/cli/tests/testdata/run/stdin_read_all.ts b/tests/testdata/run/stdin_read_all.ts
index d683a2bf6..d683a2bf6 100644
--- a/cli/tests/testdata/run/stdin_read_all.ts
+++ b/tests/testdata/run/stdin_read_all.ts
diff --git a/cli/tests/testdata/run/stdio_streams_are_locked_in_permission_prompt/worker.js b/tests/testdata/run/stdio_streams_are_locked_in_permission_prompt/worker.js
index 287027c83..287027c83 100644
--- a/cli/tests/testdata/run/stdio_streams_are_locked_in_permission_prompt/worker.js
+++ b/tests/testdata/run/stdio_streams_are_locked_in_permission_prompt/worker.js
diff --git a/cli/tests/testdata/run/stdout_write_all.out b/tests/testdata/run/stdout_write_all.out
index d0e667fd4..d0e667fd4 100644
--- a/cli/tests/testdata/run/stdout_write_all.out
+++ b/tests/testdata/run/stdout_write_all.out
diff --git a/cli/tests/testdata/run/stdout_write_all.ts b/tests/testdata/run/stdout_write_all.ts
index cfb2981e4..cfb2981e4 100644
--- a/cli/tests/testdata/run/stdout_write_all.ts
+++ b/tests/testdata/run/stdout_write_all.ts
diff --git a/cli/tests/testdata/run/stdout_write_sync_async.out b/tests/testdata/run/stdout_write_sync_async.out
index 91ebda1ca..91ebda1ca 100644
--- a/cli/tests/testdata/run/stdout_write_sync_async.out
+++ b/tests/testdata/run/stdout_write_sync_async.out
diff --git a/cli/tests/testdata/run/stdout_write_sync_async.ts b/tests/testdata/run/stdout_write_sync_async.ts
index 648999d8a..648999d8a 100644
--- a/cli/tests/testdata/run/stdout_write_sync_async.ts
+++ b/tests/testdata/run/stdout_write_sync_async.ts
diff --git a/cli/tests/testdata/run/swc_syntax_error.ts b/tests/testdata/run/swc_syntax_error.ts
index 991ca9214..991ca9214 100644
--- a/cli/tests/testdata/run/swc_syntax_error.ts
+++ b/tests/testdata/run/swc_syntax_error.ts
diff --git a/cli/tests/testdata/run/swc_syntax_error.ts.out b/tests/testdata/run/swc_syntax_error.ts.out
index 81b0c1949..81b0c1949 100644
--- a/cli/tests/testdata/run/swc_syntax_error.ts.out
+++ b/tests/testdata/run/swc_syntax_error.ts.out
diff --git a/cli/tests/testdata/run/test_and_bench_in_run.js b/tests/testdata/run/test_and_bench_in_run.js
index 108ae937a..108ae937a 100644
--- a/cli/tests/testdata/run/test_and_bench_in_run.js
+++ b/tests/testdata/run/test_and_bench_in_run.js
diff --git a/tests/testdata/run/textproto.ts b/tests/testdata/run/textproto.ts
new file mode 100644
index 000000000..cf9a4dce9
--- /dev/null
+++ b/tests/testdata/run/textproto.ts
@@ -0,0 +1,173 @@
+// 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 "../../../test_util/std/io/buf_reader.ts";
+import { concat } from "../../../test_util/std/bytes/concat.ts";
+
+// 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/cli/tests/testdata/run/tls.out b/tests/testdata/run/tls.out
index c8e8a135c..c8e8a135c 100644
--- a/cli/tests/testdata/run/tls.out
+++ b/tests/testdata/run/tls.out
diff --git a/tests/testdata/run/tls_connecttls.js b/tests/testdata/run/tls_connecttls.js
new file mode 100644
index 000000000..f085d7a8f
--- /dev/null
+++ b/tests/testdata/run/tls_connecttls.js
@@ -0,0 +1,66 @@
+import { assert, assertEquals } from "../../../test_util/std/assert/mod.ts";
+import { BufReader, BufWriter } from "../../../test_util/std/io/mod.ts";
+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("./tls/localhost.crt"),
+ key: Deno.readTextFileSync("./tls/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,
+});
+assert(conn.rid > 0);
+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/testdata/run/tls_starttls.js b/tests/testdata/run/tls_starttls.js
new file mode 100644
index 000000000..5f5428ecd
--- /dev/null
+++ b/tests/testdata/run/tls_starttls.js
@@ -0,0 +1,65 @@
+import { assert, assertEquals } from "../../../test_util/std/assert/mod.ts";
+import { BufReader } from "../../../test_util/std/io/buf_reader.ts";
+import { BufWriter } from "../../../test_util/std/io/buf_writer.ts";
+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("./tls/localhost.crt"),
+ key: Deno.readTextFileSync("./tls/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 });
+assert(conn.rid > 0);
+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/cli/tests/testdata/run/top_level_await/circular.js b/tests/testdata/run/top_level_await/circular.js
index ff2964b6a..ff2964b6a 100644
--- a/cli/tests/testdata/run/top_level_await/circular.js
+++ b/tests/testdata/run/top_level_await/circular.js
diff --git a/cli/tests/testdata/run/top_level_await/circular.out b/tests/testdata/run/top_level_await/circular.out
index c88978961..c88978961 100644
--- a/cli/tests/testdata/run/top_level_await/circular.out
+++ b/tests/testdata/run/top_level_await/circular.out
diff --git a/cli/tests/testdata/run/top_level_await/loop.js b/tests/testdata/run/top_level_await/loop.js
index 415db5ec7..415db5ec7 100644
--- a/cli/tests/testdata/run/top_level_await/loop.js
+++ b/tests/testdata/run/top_level_await/loop.js
diff --git a/cli/tests/testdata/run/top_level_await/loop.out b/tests/testdata/run/top_level_await/loop.out
index 1bdffbf66..1bdffbf66 100644
--- a/cli/tests/testdata/run/top_level_await/loop.out
+++ b/tests/testdata/run/top_level_await/loop.out
diff --git a/cli/tests/testdata/run/top_level_await/nested.out b/tests/testdata/run/top_level_await/nested.out
index 8a1218a10..8a1218a10 100644
--- a/cli/tests/testdata/run/top_level_await/nested.out
+++ b/tests/testdata/run/top_level_await/nested.out
diff --git a/cli/tests/testdata/run/top_level_await/nested/a.js b/tests/testdata/run/top_level_await/nested/a.js
index 74837d4ba..74837d4ba 100644
--- a/cli/tests/testdata/run/top_level_await/nested/a.js
+++ b/tests/testdata/run/top_level_await/nested/a.js
diff --git a/cli/tests/testdata/run/top_level_await/nested/b.js b/tests/testdata/run/top_level_await/nested/b.js
index 3bd241b50..3bd241b50 100644
--- a/cli/tests/testdata/run/top_level_await/nested/b.js
+++ b/tests/testdata/run/top_level_await/nested/b.js
diff --git a/cli/tests/testdata/run/top_level_await/nested/main.js b/tests/testdata/run/top_level_await/nested/main.js
index ed46a4717..ed46a4717 100644
--- a/cli/tests/testdata/run/top_level_await/nested/main.js
+++ b/tests/testdata/run/top_level_await/nested/main.js
diff --git a/cli/tests/testdata/run/top_level_await/order.js b/tests/testdata/run/top_level_await/order.js
index 30659cdfb..30659cdfb 100644
--- a/cli/tests/testdata/run/top_level_await/order.js
+++ b/tests/testdata/run/top_level_await/order.js
diff --git a/cli/tests/testdata/run/top_level_await/order.out b/tests/testdata/run/top_level_await/order.out
index 4cc27858c..4cc27858c 100644
--- a/cli/tests/testdata/run/top_level_await/order.out
+++ b/tests/testdata/run/top_level_await/order.out
diff --git a/cli/tests/testdata/run/top_level_await/tla/a.js b/tests/testdata/run/top_level_await/tla/a.js
index c3ef3f7db..c3ef3f7db 100644
--- a/cli/tests/testdata/run/top_level_await/tla/a.js
+++ b/tests/testdata/run/top_level_await/tla/a.js
diff --git a/cli/tests/testdata/run/top_level_await/tla/b.js b/tests/testdata/run/top_level_await/tla/b.js
index 3271c92d8..3271c92d8 100644
--- a/cli/tests/testdata/run/top_level_await/tla/b.js
+++ b/tests/testdata/run/top_level_await/tla/b.js
diff --git a/cli/tests/testdata/run/top_level_await/tla/c.js b/tests/testdata/run/top_level_await/tla/c.js
index 806eb0a8b..806eb0a8b 100644
--- a/cli/tests/testdata/run/top_level_await/tla/c.js
+++ b/tests/testdata/run/top_level_await/tla/c.js
diff --git a/cli/tests/testdata/run/top_level_await/tla/d.js b/tests/testdata/run/top_level_await/tla/d.js
index 283ebf817..283ebf817 100644
--- a/cli/tests/testdata/run/top_level_await/tla/d.js
+++ b/tests/testdata/run/top_level_await/tla/d.js
diff --git a/cli/tests/testdata/run/top_level_await/tla/order.js b/tests/testdata/run/top_level_await/tla/order.js
index f213a562c..f213a562c 100644
--- a/cli/tests/testdata/run/top_level_await/tla/order.js
+++ b/tests/testdata/run/top_level_await/tla/order.js
diff --git a/cli/tests/testdata/run/top_level_await/tla/parent.js b/tests/testdata/run/top_level_await/tla/parent.js
index 1ecc15463..1ecc15463 100644
--- a/cli/tests/testdata/run/top_level_await/tla/parent.js
+++ b/tests/testdata/run/top_level_await/tla/parent.js
diff --git a/cli/tests/testdata/run/top_level_await/tla2/a.js b/tests/testdata/run/top_level_await/tla2/a.js
index d07bcb94d..d07bcb94d 100644
--- a/cli/tests/testdata/run/top_level_await/tla2/a.js
+++ b/tests/testdata/run/top_level_await/tla2/a.js
diff --git a/cli/tests/testdata/run/top_level_await/tla2/b.js b/tests/testdata/run/top_level_await/tla2/b.js
index 68e357c1e..68e357c1e 100644
--- a/cli/tests/testdata/run/top_level_await/tla2/b.js
+++ b/tests/testdata/run/top_level_await/tla2/b.js
diff --git a/cli/tests/testdata/run/top_level_await/tla3/b.js b/tests/testdata/run/top_level_await/tla3/b.js
index d0349545e..d0349545e 100644
--- a/cli/tests/testdata/run/top_level_await/tla3/b.js
+++ b/tests/testdata/run/top_level_await/tla3/b.js
diff --git a/cli/tests/testdata/run/top_level_await/tla3/timeout_loop.js b/tests/testdata/run/top_level_await/tla3/timeout_loop.js
index 860e6cd2a..860e6cd2a 100644
--- a/cli/tests/testdata/run/top_level_await/tla3/timeout_loop.js
+++ b/tests/testdata/run/top_level_await/tla3/timeout_loop.js
diff --git a/cli/tests/testdata/run/top_level_await/top_level_await.js b/tests/testdata/run/top_level_await/top_level_await.js
index ea319ea12..ea319ea12 100644
--- a/cli/tests/testdata/run/top_level_await/top_level_await.js
+++ b/tests/testdata/run/top_level_await/top_level_await.js
diff --git a/cli/tests/testdata/run/top_level_await/top_level_await.out b/tests/testdata/run/top_level_await/top_level_await.out
index 4b65d15fe..4b65d15fe 100644
--- a/cli/tests/testdata/run/top_level_await/top_level_await.out
+++ b/tests/testdata/run/top_level_await/top_level_await.out
diff --git a/cli/tests/testdata/run/top_level_await/top_level_await.ts b/tests/testdata/run/top_level_await/top_level_await.ts
index 8d47ceb21..8d47ceb21 100644
--- a/cli/tests/testdata/run/top_level_await/top_level_await.ts
+++ b/tests/testdata/run/top_level_await/top_level_await.ts
diff --git a/cli/tests/testdata/run/top_level_await/top_level_for_await.js b/tests/testdata/run/top_level_await/top_level_for_await.js
index a330f6c71..a330f6c71 100644
--- a/cli/tests/testdata/run/top_level_await/top_level_for_await.js
+++ b/tests/testdata/run/top_level_await/top_level_for_await.js
diff --git a/cli/tests/testdata/run/top_level_await/top_level_for_await.out b/tests/testdata/run/top_level_await/top_level_for_await.out
index 4539bbf2d..4539bbf2d 100644
--- a/cli/tests/testdata/run/top_level_await/top_level_for_await.out
+++ b/tests/testdata/run/top_level_await/top_level_for_await.out
diff --git a/cli/tests/testdata/run/top_level_await/top_level_for_await.ts b/tests/testdata/run/top_level_await/top_level_for_await.ts
index 9179322d7..9179322d7 100644
--- a/cli/tests/testdata/run/top_level_await/top_level_for_await.ts
+++ b/tests/testdata/run/top_level_await/top_level_for_await.ts
diff --git a/cli/tests/testdata/run/top_level_await/unresolved.js b/tests/testdata/run/top_level_await/unresolved.js
index 231a8cd63..231a8cd63 100644
--- a/cli/tests/testdata/run/top_level_await/unresolved.js
+++ b/tests/testdata/run/top_level_await/unresolved.js
diff --git a/cli/tests/testdata/run/top_level_await/unresolved.out b/tests/testdata/run/top_level_await/unresolved.out
index 1f4ea5d38..1f4ea5d38 100644
--- a/cli/tests/testdata/run/top_level_await/unresolved.out
+++ b/tests/testdata/run/top_level_await/unresolved.out
diff --git a/cli/tests/testdata/run/ts_import_from_js/deps.js b/tests/testdata/run/ts_import_from_js/deps.js
index 746b5cf6b..746b5cf6b 100644
--- a/cli/tests/testdata/run/ts_import_from_js/deps.js
+++ b/tests/testdata/run/ts_import_from_js/deps.js
diff --git a/cli/tests/testdata/run/ts_import_from_js/main.js b/tests/testdata/run/ts_import_from_js/main.js
index 32d6c29a1..32d6c29a1 100644
--- a/cli/tests/testdata/run/ts_import_from_js/main.js
+++ b/tests/testdata/run/ts_import_from_js/main.js
diff --git a/cli/tests/testdata/run/ts_import_from_js/main.out b/tests/testdata/run/ts_import_from_js/main.out
index e1d7a869f..e1d7a869f 100644
--- a/cli/tests/testdata/run/ts_import_from_js/main.out
+++ b/tests/testdata/run/ts_import_from_js/main.out
diff --git a/cli/tests/testdata/run/ts_type_imports.ts b/tests/testdata/run/ts_type_imports.ts
index 73c779156..73c779156 100644
--- a/cli/tests/testdata/run/ts_type_imports.ts
+++ b/tests/testdata/run/ts_type_imports.ts
diff --git a/cli/tests/testdata/run/ts_type_imports.ts.out b/tests/testdata/run/ts_type_imports.ts.out
index 3972d6a97..3972d6a97 100644
--- a/cli/tests/testdata/run/ts_type_imports.ts.out
+++ b/tests/testdata/run/ts_type_imports.ts.out
diff --git a/cli/tests/testdata/run/ts_type_imports_foo.ts b/tests/testdata/run/ts_type_imports_foo.ts
index db20773f6..db20773f6 100644
--- a/cli/tests/testdata/run/ts_type_imports_foo.ts
+++ b/tests/testdata/run/ts_type_imports_foo.ts
diff --git a/cli/tests/testdata/run/ts_type_only_import.d.ts b/tests/testdata/run/ts_type_only_import.d.ts
index d48e4b48a..d48e4b48a 100644
--- a/cli/tests/testdata/run/ts_type_only_import.d.ts
+++ b/tests/testdata/run/ts_type_only_import.d.ts
diff --git a/cli/tests/testdata/run/ts_type_only_import.ts b/tests/testdata/run/ts_type_only_import.ts
index 53e114373..53e114373 100644
--- a/cli/tests/testdata/run/ts_type_only_import.ts
+++ b/tests/testdata/run/ts_type_only_import.ts
diff --git a/cli/tests/testdata/run/ts_type_only_import.ts.out b/tests/testdata/run/ts_type_only_import.ts.out
index 42852cd26..42852cd26 100644
--- a/cli/tests/testdata/run/ts_type_only_import.ts.out
+++ b/tests/testdata/run/ts_type_only_import.ts.out
diff --git a/cli/tests/testdata/run/tsx_imports/Component.tsx b/tests/testdata/run/tsx_imports/Component.tsx
index c466a28ca..c466a28ca 100644
--- a/cli/tests/testdata/run/tsx_imports/Component.tsx
+++ b/tests/testdata/run/tsx_imports/Component.tsx
diff --git a/cli/tests/testdata/run/tsx_imports/tsx_imports.ts b/tests/testdata/run/tsx_imports/tsx_imports.ts
index 44ba10b7a..44ba10b7a 100644
--- a/cli/tests/testdata/run/tsx_imports/tsx_imports.ts
+++ b/tests/testdata/run/tsx_imports/tsx_imports.ts
diff --git a/cli/tests/testdata/run/tsx_imports/tsx_imports.ts.out b/tests/testdata/run/tsx_imports/tsx_imports.ts.out
index 1f8b10d32..1f8b10d32 100644
--- a/cli/tests/testdata/run/tsx_imports/tsx_imports.ts.out
+++ b/tests/testdata/run/tsx_imports/tsx_imports.ts.out
diff --git a/cli/tests/testdata/run/type_definitions.ts b/tests/testdata/run/type_definitions.ts
index 594842721..594842721 100644
--- a/cli/tests/testdata/run/type_definitions.ts
+++ b/tests/testdata/run/type_definitions.ts
diff --git a/cli/tests/testdata/run/type_definitions.ts.out b/tests/testdata/run/type_definitions.ts.out
index b4fa88c50..b4fa88c50 100644
--- a/cli/tests/testdata/run/type_definitions.ts.out
+++ b/tests/testdata/run/type_definitions.ts.out
diff --git a/cli/tests/testdata/run/type_definitions_for_export.ts b/tests/testdata/run/type_definitions_for_export.ts
index 1f17b4962..1f17b4962 100644
--- a/cli/tests/testdata/run/type_definitions_for_export.ts
+++ b/tests/testdata/run/type_definitions_for_export.ts
diff --git a/cli/tests/testdata/run/type_definitions_for_export.ts.out b/tests/testdata/run/type_definitions_for_export.ts.out
index 8f1240bc7..8f1240bc7 100644
--- a/cli/tests/testdata/run/type_definitions_for_export.ts.out
+++ b/tests/testdata/run/type_definitions_for_export.ts.out
diff --git a/cli/tests/testdata/run/type_directives_01.ts b/tests/testdata/run/type_directives_01.ts
index 71305824c..71305824c 100644
--- a/cli/tests/testdata/run/type_directives_01.ts
+++ b/tests/testdata/run/type_directives_01.ts
diff --git a/cli/tests/testdata/run/type_directives_01.ts.out b/tests/testdata/run/type_directives_01.ts.out
index 77ed3ae26..77ed3ae26 100644
--- a/cli/tests/testdata/run/type_directives_01.ts.out
+++ b/tests/testdata/run/type_directives_01.ts.out
diff --git a/cli/tests/testdata/run/type_directives_02.ts b/tests/testdata/run/type_directives_02.ts
index 0c59346e2..0c59346e2 100644
--- a/cli/tests/testdata/run/type_directives_02.ts
+++ b/tests/testdata/run/type_directives_02.ts
diff --git a/cli/tests/testdata/run/type_directives_02.ts.out b/tests/testdata/run/type_directives_02.ts.out
index b064483b4..b064483b4 100644
--- a/cli/tests/testdata/run/type_directives_02.ts.out
+++ b/tests/testdata/run/type_directives_02.ts.out
diff --git a/cli/tests/testdata/run/type_directives_js_main.js b/tests/testdata/run/type_directives_js_main.js
index 0c59346e2..0c59346e2 100644
--- a/cli/tests/testdata/run/type_directives_js_main.js
+++ b/tests/testdata/run/type_directives_js_main.js
diff --git a/cli/tests/testdata/run/type_directives_redirect.ts b/tests/testdata/run/type_directives_redirect.ts
index 8b98831fd..8b98831fd 100644
--- a/cli/tests/testdata/run/type_directives_redirect.ts
+++ b/tests/testdata/run/type_directives_redirect.ts
diff --git a/cli/tests/testdata/run/type_directives_redirect.ts.out b/tests/testdata/run/type_directives_redirect.ts.out
index 471d9c0b4..471d9c0b4 100644
--- a/cli/tests/testdata/run/type_directives_redirect.ts.out
+++ b/tests/testdata/run/type_directives_redirect.ts.out
diff --git a/cli/tests/testdata/run/type_headers_deno_types.ts b/tests/testdata/run/type_headers_deno_types.ts
index 9670f68cd..9670f68cd 100644
--- a/cli/tests/testdata/run/type_headers_deno_types.ts
+++ b/tests/testdata/run/type_headers_deno_types.ts
diff --git a/cli/tests/testdata/run/type_headers_deno_types.ts.out b/tests/testdata/run/type_headers_deno_types.ts.out
index 798f98311..798f98311 100644
--- a/cli/tests/testdata/run/type_headers_deno_types.ts.out
+++ b/tests/testdata/run/type_headers_deno_types.ts.out
diff --git a/cli/tests/testdata/run/unbuffered_stderr.ts b/tests/testdata/run/unbuffered_stderr.ts
index 0f1d2a999..0f1d2a999 100644
--- a/cli/tests/testdata/run/unbuffered_stderr.ts
+++ b/tests/testdata/run/unbuffered_stderr.ts
diff --git a/cli/tests/testdata/run/unbuffered_stderr.ts.out b/tests/testdata/run/unbuffered_stderr.ts.out
index c1b0730e0..c1b0730e0 100644
--- a/cli/tests/testdata/run/unbuffered_stderr.ts.out
+++ b/tests/testdata/run/unbuffered_stderr.ts.out
diff --git a/cli/tests/testdata/run/unbuffered_stdout.ts b/tests/testdata/run/unbuffered_stdout.ts
index 9f1e07a97..9f1e07a97 100644
--- a/cli/tests/testdata/run/unbuffered_stdout.ts
+++ b/tests/testdata/run/unbuffered_stdout.ts
diff --git a/cli/tests/testdata/run/unbuffered_stdout.ts.out b/tests/testdata/run/unbuffered_stdout.ts.out
index 2e65efe2a..2e65efe2a 100644
--- a/cli/tests/testdata/run/unbuffered_stdout.ts.out
+++ b/tests/testdata/run/unbuffered_stdout.ts.out
diff --git a/cli/tests/testdata/run/unhandled_rejection.ts b/tests/testdata/run/unhandled_rejection.ts
index 388583434..388583434 100644
--- a/cli/tests/testdata/run/unhandled_rejection.ts
+++ b/tests/testdata/run/unhandled_rejection.ts
diff --git a/cli/tests/testdata/run/unhandled_rejection.ts.out b/tests/testdata/run/unhandled_rejection.ts.out
index 6ab1667dc..6ab1667dc 100644
--- a/cli/tests/testdata/run/unhandled_rejection.ts.out
+++ b/tests/testdata/run/unhandled_rejection.ts.out
diff --git a/cli/tests/testdata/run/unhandled_rejection_dynamic_import/import.ts b/tests/testdata/run/unhandled_rejection_dynamic_import/import.ts
index b490f2c20..b490f2c20 100644
--- a/cli/tests/testdata/run/unhandled_rejection_dynamic_import/import.ts
+++ b/tests/testdata/run/unhandled_rejection_dynamic_import/import.ts
diff --git a/cli/tests/testdata/run/unhandled_rejection_dynamic_import/main.ts b/tests/testdata/run/unhandled_rejection_dynamic_import/main.ts
index 244d84467..244d84467 100644
--- a/cli/tests/testdata/run/unhandled_rejection_dynamic_import/main.ts
+++ b/tests/testdata/run/unhandled_rejection_dynamic_import/main.ts
diff --git a/cli/tests/testdata/run/unhandled_rejection_dynamic_import/main.ts.out b/tests/testdata/run/unhandled_rejection_dynamic_import/main.ts.out
index f44c6d2ff..f44c6d2ff 100644
--- a/cli/tests/testdata/run/unhandled_rejection_dynamic_import/main.ts.out
+++ b/tests/testdata/run/unhandled_rejection_dynamic_import/main.ts.out
diff --git a/cli/tests/testdata/run/unhandled_rejection_dynamic_import2/import.ts b/tests/testdata/run/unhandled_rejection_dynamic_import2/import.ts
index f84297afd..f84297afd 100644
--- a/cli/tests/testdata/run/unhandled_rejection_dynamic_import2/import.ts
+++ b/tests/testdata/run/unhandled_rejection_dynamic_import2/import.ts
diff --git a/cli/tests/testdata/run/unhandled_rejection_dynamic_import2/main.ts b/tests/testdata/run/unhandled_rejection_dynamic_import2/main.ts
index 3da2e1d19..3da2e1d19 100644
--- a/cli/tests/testdata/run/unhandled_rejection_dynamic_import2/main.ts
+++ b/tests/testdata/run/unhandled_rejection_dynamic_import2/main.ts
diff --git a/cli/tests/testdata/run/unhandled_rejection_dynamic_import2/main.ts.out b/tests/testdata/run/unhandled_rejection_dynamic_import2/main.ts.out
index 0a913a4b5..0a913a4b5 100644
--- a/cli/tests/testdata/run/unhandled_rejection_dynamic_import2/main.ts.out
+++ b/tests/testdata/run/unhandled_rejection_dynamic_import2/main.ts.out
diff --git a/cli/tests/testdata/run/unhandled_rejection_sync_error.ts b/tests/testdata/run/unhandled_rejection_sync_error.ts
index 0dabb1cb7..0dabb1cb7 100644
--- a/cli/tests/testdata/run/unhandled_rejection_sync_error.ts
+++ b/tests/testdata/run/unhandled_rejection_sync_error.ts
diff --git a/cli/tests/testdata/run/unhandled_rejection_sync_error.ts.out b/tests/testdata/run/unhandled_rejection_sync_error.ts.out
index e178373f0..e178373f0 100644
--- a/cli/tests/testdata/run/unhandled_rejection_sync_error.ts.out
+++ b/tests/testdata/run/unhandled_rejection_sync_error.ts.out
diff --git a/cli/tests/testdata/run/unsafe_proto/main.js b/tests/testdata/run/unsafe_proto/main.js
index eb95c55a0..eb95c55a0 100644
--- a/cli/tests/testdata/run/unsafe_proto/main.js
+++ b/tests/testdata/run/unsafe_proto/main.js
diff --git a/cli/tests/testdata/run/unsafe_proto/main.out b/tests/testdata/run/unsafe_proto/main.out
index 4b095fd0f..4b095fd0f 100644
--- a/cli/tests/testdata/run/unsafe_proto/main.out
+++ b/tests/testdata/run/unsafe_proto/main.out
diff --git a/cli/tests/testdata/run/unsafe_proto/main_with_unsafe_proto_flag.out b/tests/testdata/run/unsafe_proto/main_with_unsafe_proto_flag.out
index bb101b641..bb101b641 100644
--- a/cli/tests/testdata/run/unsafe_proto/main_with_unsafe_proto_flag.out
+++ b/tests/testdata/run/unsafe_proto/main_with_unsafe_proto_flag.out
diff --git a/cli/tests/testdata/run/unsafe_proto/worker.js b/tests/testdata/run/unsafe_proto/worker.js
index b22bc8713..b22bc8713 100644
--- a/cli/tests/testdata/run/unsafe_proto/worker.js
+++ b/tests/testdata/run/unsafe_proto/worker.js
diff --git a/cli/tests/testdata/run/unstable.js b/tests/testdata/run/unstable.js
index 8c01b214e..8c01b214e 100644
--- a/cli/tests/testdata/run/unstable.js
+++ b/tests/testdata/run/unstable.js
diff --git a/cli/tests/testdata/run/unstable.ts b/tests/testdata/run/unstable.ts
index 8c01b214e..8c01b214e 100644
--- a/cli/tests/testdata/run/unstable.ts
+++ b/tests/testdata/run/unstable.ts
diff --git a/cli/tests/testdata/run/unstable_broadcast_channel.disabled.out b/tests/testdata/run/unstable_broadcast_channel.disabled.out
index 775866352..775866352 100644
--- a/cli/tests/testdata/run/unstable_broadcast_channel.disabled.out
+++ b/tests/testdata/run/unstable_broadcast_channel.disabled.out
diff --git a/cli/tests/testdata/run/unstable_broadcast_channel.enabled.out b/tests/testdata/run/unstable_broadcast_channel.enabled.out
index b3701ce44..b3701ce44 100644
--- a/cli/tests/testdata/run/unstable_broadcast_channel.enabled.out
+++ b/tests/testdata/run/unstable_broadcast_channel.enabled.out
diff --git a/cli/tests/testdata/run/unstable_broadcast_channel.js b/tests/testdata/run/unstable_broadcast_channel.js
index b8576aa22..b8576aa22 100644
--- a/cli/tests/testdata/run/unstable_broadcast_channel.js
+++ b/tests/testdata/run/unstable_broadcast_channel.js
diff --git a/cli/tests/testdata/run/unstable_cron.disabled.out b/tests/testdata/run/unstable_cron.disabled.out
index 775866352..775866352 100644
--- a/cli/tests/testdata/run/unstable_cron.disabled.out
+++ b/tests/testdata/run/unstable_cron.disabled.out
diff --git a/cli/tests/testdata/run/unstable_cron.enabled.out b/tests/testdata/run/unstable_cron.enabled.out
index d18304f1f..d18304f1f 100644
--- a/cli/tests/testdata/run/unstable_cron.enabled.out
+++ b/tests/testdata/run/unstable_cron.enabled.out
diff --git a/cli/tests/testdata/run/unstable_cron.js b/tests/testdata/run/unstable_cron.js
index 3114f6e55..3114f6e55 100644
--- a/cli/tests/testdata/run/unstable_cron.js
+++ b/tests/testdata/run/unstable_cron.js
diff --git a/cli/tests/testdata/run/unstable_disabled_js.out b/tests/testdata/run/unstable_disabled_js.out
index 417b7b537..417b7b537 100644
--- a/cli/tests/testdata/run/unstable_disabled_js.out
+++ b/tests/testdata/run/unstable_disabled_js.out
diff --git a/cli/tests/testdata/run/unstable_enabled.out b/tests/testdata/run/unstable_enabled.out
index 5f88c778c..5f88c778c 100644
--- a/cli/tests/testdata/run/unstable_enabled.out
+++ b/tests/testdata/run/unstable_enabled.out
diff --git a/cli/tests/testdata/run/unstable_enabled_js.out b/tests/testdata/run/unstable_enabled_js.out
index 5f88c778c..5f88c778c 100644
--- a/cli/tests/testdata/run/unstable_enabled_js.out
+++ b/tests/testdata/run/unstable_enabled_js.out
diff --git a/cli/tests/testdata/run/unstable_ffi.disabled.out b/tests/testdata/run/unstable_ffi.disabled.out
index 0d8ac4410..0d8ac4410 100644
--- a/cli/tests/testdata/run/unstable_ffi.disabled.out
+++ b/tests/testdata/run/unstable_ffi.disabled.out
diff --git a/cli/tests/testdata/run/unstable_ffi.enabled.out b/tests/testdata/run/unstable_ffi.enabled.out
index 672b2a2a2..672b2a2a2 100644
--- a/cli/tests/testdata/run/unstable_ffi.enabled.out
+++ b/tests/testdata/run/unstable_ffi.enabled.out
diff --git a/cli/tests/testdata/run/unstable_ffi.js b/tests/testdata/run/unstable_ffi.js
index 4809c5ffe..4809c5ffe 100644
--- a/cli/tests/testdata/run/unstable_ffi.js
+++ b/tests/testdata/run/unstable_ffi.js
diff --git a/cli/tests/testdata/run/unstable_fs.disabled.out b/tests/testdata/run/unstable_fs.disabled.out
index 0d8ac4410..0d8ac4410 100644
--- a/cli/tests/testdata/run/unstable_fs.disabled.out
+++ b/tests/testdata/run/unstable_fs.disabled.out
diff --git a/cli/tests/testdata/run/unstable_fs.enabled.out b/tests/testdata/run/unstable_fs.enabled.out
index 6938fa9c2..6938fa9c2 100644
--- a/cli/tests/testdata/run/unstable_fs.enabled.out
+++ b/tests/testdata/run/unstable_fs.enabled.out
diff --git a/cli/tests/testdata/run/unstable_fs.js b/tests/testdata/run/unstable_fs.js
index 83f14f2fd..83f14f2fd 100644
--- a/cli/tests/testdata/run/unstable_fs.js
+++ b/tests/testdata/run/unstable_fs.js
diff --git a/cli/tests/testdata/run/unstable_http.disabled.out b/tests/testdata/run/unstable_http.disabled.out
index 6eb83832e..6eb83832e 100644
--- a/cli/tests/testdata/run/unstable_http.disabled.out
+++ b/tests/testdata/run/unstable_http.disabled.out
diff --git a/cli/tests/testdata/run/unstable_http.enabled.out b/tests/testdata/run/unstable_http.enabled.out
index 4f3c65625..4f3c65625 100644
--- a/cli/tests/testdata/run/unstable_http.enabled.out
+++ b/tests/testdata/run/unstable_http.enabled.out
diff --git a/cli/tests/testdata/run/unstable_http.js b/tests/testdata/run/unstable_http.js
index 1a3ddb2d3..1a3ddb2d3 100644
--- a/cli/tests/testdata/run/unstable_http.js
+++ b/tests/testdata/run/unstable_http.js
diff --git a/cli/tests/testdata/run/unstable_kv.disabled.out b/tests/testdata/run/unstable_kv.disabled.out
index 0d8ac4410..0d8ac4410 100644
--- a/cli/tests/testdata/run/unstable_kv.disabled.out
+++ b/tests/testdata/run/unstable_kv.disabled.out
diff --git a/cli/tests/testdata/run/unstable_kv.enabled.out b/tests/testdata/run/unstable_kv.enabled.out
index a1356cefc..a1356cefc 100644
--- a/cli/tests/testdata/run/unstable_kv.enabled.out
+++ b/tests/testdata/run/unstable_kv.enabled.out
diff --git a/cli/tests/testdata/run/unstable_kv.js b/tests/testdata/run/unstable_kv.js
index 17c0e05aa..17c0e05aa 100644
--- a/cli/tests/testdata/run/unstable_kv.js
+++ b/tests/testdata/run/unstable_kv.js
diff --git a/cli/tests/testdata/run/unstable_net.disabled.out b/tests/testdata/run/unstable_net.disabled.out
index 3562f72fd..3562f72fd 100644
--- a/cli/tests/testdata/run/unstable_net.disabled.out
+++ b/tests/testdata/run/unstable_net.disabled.out
diff --git a/cli/tests/testdata/run/unstable_net.enabled.out b/tests/testdata/run/unstable_net.enabled.out
index 8b86637f3..8b86637f3 100644
--- a/cli/tests/testdata/run/unstable_net.enabled.out
+++ b/tests/testdata/run/unstable_net.enabled.out
diff --git a/cli/tests/testdata/run/unstable_net.js b/tests/testdata/run/unstable_net.js
index 4492b202b..4492b202b 100644
--- a/cli/tests/testdata/run/unstable_net.js
+++ b/tests/testdata/run/unstable_net.js
diff --git a/cli/tests/testdata/run/unstable_temporal_api/main.out b/tests/testdata/run/unstable_temporal_api/main.out
index 46d25c3ea..46d25c3ea 100644
--- a/cli/tests/testdata/run/unstable_temporal_api/main.out
+++ b/tests/testdata/run/unstable_temporal_api/main.out
diff --git a/cli/tests/testdata/run/unstable_temporal_api/main.ts b/tests/testdata/run/unstable_temporal_api/main.ts
index 1641b90bf..1641b90bf 100644
--- a/cli/tests/testdata/run/unstable_temporal_api/main.ts
+++ b/tests/testdata/run/unstable_temporal_api/main.ts
diff --git a/cli/tests/testdata/run/unstable_temporal_api/missing_flag.js b/tests/testdata/run/unstable_temporal_api/missing_flag.js
index 92aed7931..92aed7931 100644
--- a/cli/tests/testdata/run/unstable_temporal_api/missing_flag.js
+++ b/tests/testdata/run/unstable_temporal_api/missing_flag.js
diff --git a/cli/tests/testdata/run/unstable_temporal_api/missing_flag.out b/tests/testdata/run/unstable_temporal_api/missing_flag.out
index 8f8e23e70..8f8e23e70 100644
--- a/cli/tests/testdata/run/unstable_temporal_api/missing_flag.out
+++ b/tests/testdata/run/unstable_temporal_api/missing_flag.out
diff --git a/cli/tests/testdata/run/unstable_webgpu.disabled.out b/tests/testdata/run/unstable_webgpu.disabled.out
index 775866352..775866352 100644
--- a/cli/tests/testdata/run/unstable_webgpu.disabled.out
+++ b/tests/testdata/run/unstable_webgpu.disabled.out
diff --git a/cli/tests/testdata/run/unstable_webgpu.enabled.out b/tests/testdata/run/unstable_webgpu.enabled.out
index e2cc915ba..e2cc915ba 100644
--- a/cli/tests/testdata/run/unstable_webgpu.enabled.out
+++ b/tests/testdata/run/unstable_webgpu.enabled.out
diff --git a/cli/tests/testdata/run/unstable_webgpu.js b/tests/testdata/run/unstable_webgpu.js
index a796b1c4d..a796b1c4d 100644
--- a/cli/tests/testdata/run/unstable_webgpu.js
+++ b/tests/testdata/run/unstable_webgpu.js
diff --git a/cli/tests/testdata/run/unstable_worker.ts b/tests/testdata/run/unstable_worker.ts
index d111d2c7e..d111d2c7e 100644
--- a/cli/tests/testdata/run/unstable_worker.ts
+++ b/tests/testdata/run/unstable_worker.ts
diff --git a/cli/tests/testdata/run/unstable_worker.ts.out b/tests/testdata/run/unstable_worker.ts.out
index 182dc58a4..182dc58a4 100644
--- a/cli/tests/testdata/run/unstable_worker.ts.out
+++ b/tests/testdata/run/unstable_worker.ts.out
diff --git a/cli/tests/testdata/run/unstable_worker_options.disabled.out b/tests/testdata/run/unstable_worker_options.disabled.out
index ba50ca539..ba50ca539 100644
--- a/cli/tests/testdata/run/unstable_worker_options.disabled.out
+++ b/tests/testdata/run/unstable_worker_options.disabled.out
diff --git a/cli/tests/testdata/run/unstable_worker_options.enabled.out b/tests/testdata/run/unstable_worker_options.enabled.out
index 57a52b019..57a52b019 100644
--- a/cli/tests/testdata/run/unstable_worker_options.enabled.out
+++ b/tests/testdata/run/unstable_worker_options.enabled.out
diff --git a/cli/tests/testdata/run/unstable_worker_options.js b/tests/testdata/run/unstable_worker_options.js
index 213eb3ee6..213eb3ee6 100644
--- a/cli/tests/testdata/run/unstable_worker_options.js
+++ b/tests/testdata/run/unstable_worker_options.js
diff --git a/cli/tests/testdata/run/unsupported_dynamic_import_scheme.out b/tests/testdata/run/unsupported_dynamic_import_scheme.out
index c708fced4..c708fced4 100644
--- a/cli/tests/testdata/run/unsupported_dynamic_import_scheme.out
+++ b/tests/testdata/run/unsupported_dynamic_import_scheme.out
diff --git a/cli/tests/testdata/run/v8_flags.js b/tests/testdata/run/v8_flags.js
index f7999c4af..f7999c4af 100644
--- a/cli/tests/testdata/run/v8_flags.js
+++ b/tests/testdata/run/v8_flags.js
diff --git a/cli/tests/testdata/run/v8_flags.js.out b/tests/testdata/run/v8_flags.js.out
index e2dbde096..e2dbde096 100644
--- a/cli/tests/testdata/run/v8_flags.js.out
+++ b/tests/testdata/run/v8_flags.js.out
diff --git a/cli/tests/testdata/run/v8_flags_unrecognized.out b/tests/testdata/run/v8_flags_unrecognized.out
index 56e70f830..56e70f830 100644
--- a/cli/tests/testdata/run/v8_flags_unrecognized.out
+++ b/tests/testdata/run/v8_flags_unrecognized.out
diff --git a/cli/tests/testdata/run/v8_help.out b/tests/testdata/run/v8_help.out
index 006d73557..006d73557 100644
--- a/cli/tests/testdata/run/v8_help.out
+++ b/tests/testdata/run/v8_help.out
diff --git a/cli/tests/testdata/run/warn_on_deprecated_api/main.js b/tests/testdata/run/warn_on_deprecated_api/main.js
index a464be60a..a464be60a 100644
--- a/cli/tests/testdata/run/warn_on_deprecated_api/main.js
+++ b/tests/testdata/run/warn_on_deprecated_api/main.js
diff --git a/cli/tests/testdata/run/warn_on_deprecated_api/main.out b/tests/testdata/run/warn_on_deprecated_api/main.out
index ff44c885f..ff44c885f 100644
--- a/cli/tests/testdata/run/warn_on_deprecated_api/main.out
+++ b/tests/testdata/run/warn_on_deprecated_api/main.out
diff --git a/cli/tests/testdata/run/warn_on_deprecated_api/main.verbose.out b/tests/testdata/run/warn_on_deprecated_api/main.verbose.out
index 184051de1..184051de1 100644
--- a/cli/tests/testdata/run/warn_on_deprecated_api/main.verbose.out
+++ b/tests/testdata/run/warn_on_deprecated_api/main.verbose.out
diff --git a/cli/tests/testdata/run/warn_on_deprecated_api/main_disabled_env.out b/tests/testdata/run/warn_on_deprecated_api/main_disabled_env.out
index ef85a6f99..ef85a6f99 100644
--- a/cli/tests/testdata/run/warn_on_deprecated_api/main_disabled_env.out
+++ b/tests/testdata/run/warn_on_deprecated_api/main_disabled_env.out
diff --git a/cli/tests/testdata/run/warn_on_deprecated_api/main_disabled_flag.out b/tests/testdata/run/warn_on_deprecated_api/main_disabled_flag.out
index ce3755d16..ce3755d16 100644
--- a/cli/tests/testdata/run/warn_on_deprecated_api/main_disabled_flag.out
+++ b/tests/testdata/run/warn_on_deprecated_api/main_disabled_flag.out
diff --git a/cli/tests/testdata/run/warn_on_deprecated_api/mod.ts b/tests/testdata/run/warn_on_deprecated_api/mod.ts
index f74632b2c..f74632b2c 100644
--- a/cli/tests/testdata/run/warn_on_deprecated_api/mod.ts
+++ b/tests/testdata/run/warn_on_deprecated_api/mod.ts
diff --git a/cli/tests/testdata/run/wasm.ts b/tests/testdata/run/wasm.ts
index 96b5fdffc..96b5fdffc 100644
--- a/cli/tests/testdata/run/wasm.ts
+++ b/tests/testdata/run/wasm.ts
diff --git a/cli/tests/testdata/run/wasm.ts.out b/tests/testdata/run/wasm.ts.out
index d81cc0710..d81cc0710 100644
--- a/cli/tests/testdata/run/wasm.ts.out
+++ b/tests/testdata/run/wasm.ts.out
diff --git a/cli/tests/testdata/run/wasm_async.js b/tests/testdata/run/wasm_async.js
index 837460ae9..837460ae9 100644
--- a/cli/tests/testdata/run/wasm_async.js
+++ b/tests/testdata/run/wasm_async.js
diff --git a/cli/tests/testdata/run/wasm_async.out b/tests/testdata/run/wasm_async.out
index 5cdf17de7..5cdf17de7 100644
--- a/cli/tests/testdata/run/wasm_async.out
+++ b/tests/testdata/run/wasm_async.out
diff --git a/cli/tests/testdata/run/wasm_shared.out b/tests/testdata/run/wasm_shared.out
index e69de29bb..e69de29bb 100644
--- a/cli/tests/testdata/run/wasm_shared.out
+++ b/tests/testdata/run/wasm_shared.out
diff --git a/cli/tests/testdata/run/wasm_shared.ts b/tests/testdata/run/wasm_shared.ts
index b713385d5..b713385d5 100644
--- a/cli/tests/testdata/run/wasm_shared.ts
+++ b/tests/testdata/run/wasm_shared.ts
diff --git a/cli/tests/testdata/run/wasm_streaming_panic_test.js b/tests/testdata/run/wasm_streaming_panic_test.js
index ec017592f..ec017592f 100644
--- a/cli/tests/testdata/run/wasm_streaming_panic_test.js
+++ b/tests/testdata/run/wasm_streaming_panic_test.js
diff --git a/cli/tests/testdata/run/wasm_streaming_panic_test.js.out b/tests/testdata/run/wasm_streaming_panic_test.js.out
index 8a3c68e37..8a3c68e37 100644
--- a/cli/tests/testdata/run/wasm_streaming_panic_test.js.out
+++ b/tests/testdata/run/wasm_streaming_panic_test.js.out
diff --git a/cli/tests/testdata/run/wasm_unreachable.js b/tests/testdata/run/wasm_unreachable.js
index d6a4f59db..d6a4f59db 100644
--- a/cli/tests/testdata/run/wasm_unreachable.js
+++ b/tests/testdata/run/wasm_unreachable.js
diff --git a/cli/tests/testdata/run/wasm_unreachable.out b/tests/testdata/run/wasm_unreachable.out
index c213097ab..c213097ab 100644
--- a/cli/tests/testdata/run/wasm_unreachable.out
+++ b/tests/testdata/run/wasm_unreachable.out
diff --git a/cli/tests/testdata/run/wasm_url.js b/tests/testdata/run/wasm_url.js
index 71686ef7e..71686ef7e 100644
--- a/cli/tests/testdata/run/wasm_url.js
+++ b/tests/testdata/run/wasm_url.js
diff --git a/cli/tests/testdata/run/wasm_url.out b/tests/testdata/run/wasm_url.out
index ae3bf491a..ae3bf491a 100644
--- a/cli/tests/testdata/run/wasm_url.out
+++ b/tests/testdata/run/wasm_url.out
diff --git a/cli/tests/testdata/run/weakref.ts b/tests/testdata/run/weakref.ts
index 47c3985fe..47c3985fe 100644
--- a/cli/tests/testdata/run/weakref.ts
+++ b/tests/testdata/run/weakref.ts
diff --git a/cli/tests/testdata/run/weakref.ts.out b/tests/testdata/run/weakref.ts.out
index 32bafcf2d..32bafcf2d 100644
--- a/cli/tests/testdata/run/weakref.ts.out
+++ b/tests/testdata/run/weakref.ts.out
diff --git a/tests/testdata/run/websocket_server_idletimeout.ts b/tests/testdata/run/websocket_server_idletimeout.ts
new file mode 100644
index 000000000..f116c4556
--- /dev/null
+++ b/tests/testdata/run/websocket_server_idletimeout.ts
@@ -0,0 +1,25 @@
+import { assertEquals } from "../../../test_util/std/assert/mod.ts";
+
+const errorDeferred = Promise.withResolvers<void>();
+const closeDeferred = Promise.withResolvers<void>();
+
+const listener = Deno.listen({ port: 4509 });
+console.log("READY");
+const httpConn = Deno.serveHttp(await listener.accept());
+const { request, respondWith } = (await httpConn.nextRequest())!;
+const { response, socket } = Deno.upgradeWebSocket(request, {
+ idleTimeout: 1,
+});
+socket.onerror = (e) => {
+ assertEquals((e as ErrorEvent).message, "No response from ping frame.");
+ errorDeferred.resolve();
+};
+socket.onclose = (e) => {
+ assertEquals(e.reason, "No response from ping frame.");
+ closeDeferred.resolve();
+};
+await respondWith(response);
+
+await errorDeferred.promise;
+await closeDeferred.promise;
+listener.close();
diff --git a/cli/tests/testdata/run/websocket_server_multi_field_connection_header_test.ts b/tests/testdata/run/websocket_server_multi_field_connection_header_test.ts
index d94709767..d94709767 100644
--- a/cli/tests/testdata/run/websocket_server_multi_field_connection_header_test.ts
+++ b/tests/testdata/run/websocket_server_multi_field_connection_header_test.ts
diff --git a/cli/tests/testdata/run/websocketstream_ping_test.ts b/tests/testdata/run/websocketstream_ping_test.ts
index a4b684468..a4b684468 100644
--- a/cli/tests/testdata/run/websocketstream_ping_test.ts
+++ b/tests/testdata/run/websocketstream_ping_test.ts
diff --git a/cli/tests/testdata/run/webstorage/config_a.jsonc b/tests/testdata/run/webstorage/config_a.jsonc
index 875cb6001..875cb6001 100644
--- a/cli/tests/testdata/run/webstorage/config_a.jsonc
+++ b/tests/testdata/run/webstorage/config_a.jsonc
diff --git a/cli/tests/testdata/run/webstorage/config_b.jsonc b/tests/testdata/run/webstorage/config_b.jsonc
index 875cb6001..875cb6001 100644
--- a/cli/tests/testdata/run/webstorage/config_b.jsonc
+++ b/tests/testdata/run/webstorage/config_b.jsonc
diff --git a/cli/tests/testdata/run/webstorage/fixture.ts b/tests/testdata/run/webstorage/fixture.ts
index cf4bd9f1f..cf4bd9f1f 100644
--- a/cli/tests/testdata/run/webstorage/fixture.ts
+++ b/tests/testdata/run/webstorage/fixture.ts
diff --git a/cli/tests/testdata/run/webstorage/logger.ts b/tests/testdata/run/webstorage/logger.ts
index 3898c4445..3898c4445 100644
--- a/cli/tests/testdata/run/webstorage/logger.ts
+++ b/tests/testdata/run/webstorage/logger.ts
diff --git a/cli/tests/testdata/run/webstorage/serialization.ts b/tests/testdata/run/webstorage/serialization.ts
index f3791d355..f3791d355 100644
--- a/cli/tests/testdata/run/webstorage/serialization.ts
+++ b/tests/testdata/run/webstorage/serialization.ts
diff --git a/cli/tests/testdata/run/webstorage/serialization.ts.out b/tests/testdata/run/webstorage/serialization.ts.out
index 4d80032f0..4d80032f0 100644
--- a/cli/tests/testdata/run/webstorage/serialization.ts.out
+++ b/tests/testdata/run/webstorage/serialization.ts.out
diff --git a/cli/tests/testdata/run/webstorage/setter.ts b/tests/testdata/run/webstorage/setter.ts
index ec6d474f5..ec6d474f5 100644
--- a/cli/tests/testdata/run/webstorage/setter.ts
+++ b/tests/testdata/run/webstorage/setter.ts
diff --git a/cli/tests/testdata/run/with_config/auto_discovery_log.out b/tests/testdata/run/with_config/auto_discovery_log.out
index 1a25eb9a7..1a25eb9a7 100644
--- a/cli/tests/testdata/run/with_config/auto_discovery_log.out
+++ b/tests/testdata/run/with_config/auto_discovery_log.out
diff --git a/cli/tests/testdata/run/with_config/deno.jsonc b/tests/testdata/run/with_config/deno.jsonc
index 9017fac30..9017fac30 100644
--- a/cli/tests/testdata/run/with_config/deno.jsonc
+++ b/tests/testdata/run/with_config/deno.jsonc
diff --git a/cli/tests/testdata/run/with_config/frontend_work.ts b/tests/testdata/run/with_config/frontend_work.ts
index 783af44e4..783af44e4 100644
--- a/cli/tests/testdata/run/with_config/frontend_work.ts
+++ b/tests/testdata/run/with_config/frontend_work.ts
diff --git a/cli/tests/testdata/run/with_config/no_auto_discovery.out b/tests/testdata/run/with_config/no_auto_discovery.out
index 59339ebe5..59339ebe5 100644
--- a/cli/tests/testdata/run/with_config/no_auto_discovery.out
+++ b/tests/testdata/run/with_config/no_auto_discovery.out
diff --git a/cli/tests/testdata/run/with_config/server_side_work.ts b/tests/testdata/run/with_config/server_side_work.ts
index 12db2ab05..12db2ab05 100644
--- a/cli/tests/testdata/run/with_config/server_side_work.ts
+++ b/tests/testdata/run/with_config/server_side_work.ts
diff --git a/cli/tests/testdata/run/with_package_json/no_deno_json/main.out b/tests/testdata/run/with_package_json/no_deno_json/main.out
index 402b30ed4..402b30ed4 100644
--- a/cli/tests/testdata/run/with_package_json/no_deno_json/main.out
+++ b/tests/testdata/run/with_package_json/no_deno_json/main.out
diff --git a/cli/tests/testdata/run/with_package_json/no_deno_json/main.ts b/tests/testdata/run/with_package_json/no_deno_json/main.ts
index 1e6e50040..1e6e50040 100644
--- a/cli/tests/testdata/run/with_package_json/no_deno_json/main.ts
+++ b/tests/testdata/run/with_package_json/no_deno_json/main.ts
diff --git a/cli/tests/testdata/run/with_package_json/no_deno_json/no_package_json_imports.out b/tests/testdata/run/with_package_json/no_deno_json/no_package_json_imports.out
index 7ed6ff82d..7ed6ff82d 100644
--- a/cli/tests/testdata/run/with_package_json/no_deno_json/no_package_json_imports.out
+++ b/tests/testdata/run/with_package_json/no_deno_json/no_package_json_imports.out
diff --git a/cli/tests/testdata/run/with_package_json/no_deno_json/no_package_json_imports.ts b/tests/testdata/run/with_package_json/no_deno_json/no_package_json_imports.ts
index 0f3785f91..0f3785f91 100644
--- a/cli/tests/testdata/run/with_package_json/no_deno_json/no_package_json_imports.ts
+++ b/tests/testdata/run/with_package_json/no_deno_json/no_package_json_imports.ts
diff --git a/cli/tests/testdata/run/with_package_json/no_deno_json/noconfig.out b/tests/testdata/run/with_package_json/no_deno_json/noconfig.out
index b9f9a6dea..b9f9a6dea 100644
--- a/cli/tests/testdata/run/with_package_json/no_deno_json/noconfig.out
+++ b/tests/testdata/run/with_package_json/no_deno_json/noconfig.out
diff --git a/cli/tests/testdata/run/with_package_json/no_deno_json/noconfig.ts b/tests/testdata/run/with_package_json/no_deno_json/noconfig.ts
index 73b348fbc..73b348fbc 100644
--- a/cli/tests/testdata/run/with_package_json/no_deno_json/noconfig.ts
+++ b/tests/testdata/run/with_package_json/no_deno_json/noconfig.ts
diff --git a/cli/tests/testdata/run/with_package_json/no_deno_json/package.json b/tests/testdata/run/with_package_json/no_deno_json/package.json
index a85b890a8..a85b890a8 100644
--- a/cli/tests/testdata/run/with_package_json/no_deno_json/package.json
+++ b/tests/testdata/run/with_package_json/no_deno_json/package.json
diff --git a/cli/tests/testdata/run/with_package_json/no_deno_json/sub_dir/main.js b/tests/testdata/run/with_package_json/no_deno_json/sub_dir/main.js
index 492a8fa40..492a8fa40 100644
--- a/cli/tests/testdata/run/with_package_json/no_deno_json/sub_dir/main.js
+++ b/tests/testdata/run/with_package_json/no_deno_json/sub_dir/main.js
diff --git a/cli/tests/testdata/run/with_package_json/no_deno_json/sub_dir/main.out b/tests/testdata/run/with_package_json/no_deno_json/sub_dir/main.out
index 0ec791960..0ec791960 100644
--- a/cli/tests/testdata/run/with_package_json/no_deno_json/sub_dir/main.out
+++ b/tests/testdata/run/with_package_json/no_deno_json/sub_dir/main.out
diff --git a/cli/tests/testdata/run/with_package_json/npm_binary/main.out b/tests/testdata/run/with_package_json/npm_binary/main.out
index 13d196a5e..13d196a5e 100644
--- a/cli/tests/testdata/run/with_package_json/npm_binary/main.out
+++ b/tests/testdata/run/with_package_json/npm_binary/main.out
diff --git a/cli/tests/testdata/run/with_package_json/npm_binary/package.json b/tests/testdata/run/with_package_json/npm_binary/package.json
index 9ee3f39a8..9ee3f39a8 100644
--- a/cli/tests/testdata/run/with_package_json/npm_binary/package.json
+++ b/tests/testdata/run/with_package_json/npm_binary/package.json
diff --git a/cli/tests/testdata/run/with_package_json/with_stop/main.out b/tests/testdata/run/with_package_json/with_stop/main.out
index b199faf8d..b199faf8d 100644
--- a/cli/tests/testdata/run/with_package_json/with_stop/main.out
+++ b/tests/testdata/run/with_package_json/with_stop/main.out
diff --git a/cli/tests/testdata/run/with_package_json/with_stop/package.json b/tests/testdata/run/with_package_json/with_stop/package.json
index 9ee3f39a8..9ee3f39a8 100644
--- a/cli/tests/testdata/run/with_package_json/with_stop/package.json
+++ b/tests/testdata/run/with_package_json/with_stop/package.json
diff --git a/cli/tests/testdata/run/with_package_json/with_stop/some/nested/deno.json b/tests/testdata/run/with_package_json/with_stop/some/nested/deno.json
index 36e1765d1..36e1765d1 100644
--- a/cli/tests/testdata/run/with_package_json/with_stop/some/nested/deno.json
+++ b/tests/testdata/run/with_package_json/with_stop/some/nested/deno.json
diff --git a/cli/tests/testdata/run/with_package_json/with_stop/some/nested/dir/main.ts b/tests/testdata/run/with_package_json/with_stop/some/nested/dir/main.ts
index 6016470a1..6016470a1 100644
--- a/cli/tests/testdata/run/with_package_json/with_stop/some/nested/dir/main.ts
+++ b/tests/testdata/run/with_package_json/with_stop/some/nested/dir/main.ts
diff --git a/cli/tests/testdata/run/worker_close_in_wasm_reactions.js b/tests/testdata/run/worker_close_in_wasm_reactions.js
index 95f34e944..95f34e944 100644
--- a/cli/tests/testdata/run/worker_close_in_wasm_reactions.js
+++ b/tests/testdata/run/worker_close_in_wasm_reactions.js
diff --git a/cli/tests/testdata/run/worker_close_in_wasm_reactions.js.out b/tests/testdata/run/worker_close_in_wasm_reactions.js.out
index 325180de4..325180de4 100644
--- a/cli/tests/testdata/run/worker_close_in_wasm_reactions.js.out
+++ b/tests/testdata/run/worker_close_in_wasm_reactions.js.out
diff --git a/cli/tests/testdata/run/worker_close_nested.js b/tests/testdata/run/worker_close_nested.js
index 37b6ed9c9..37b6ed9c9 100644
--- a/cli/tests/testdata/run/worker_close_nested.js
+++ b/tests/testdata/run/worker_close_nested.js
diff --git a/cli/tests/testdata/run/worker_close_nested.js.out b/tests/testdata/run/worker_close_nested.js.out
index 496bc6251..496bc6251 100644
--- a/cli/tests/testdata/run/worker_close_nested.js.out
+++ b/tests/testdata/run/worker_close_nested.js.out
diff --git a/cli/tests/testdata/run/worker_close_race.js b/tests/testdata/run/worker_close_race.js
index 1da832425..1da832425 100644
--- a/cli/tests/testdata/run/worker_close_race.js
+++ b/tests/testdata/run/worker_close_race.js
diff --git a/cli/tests/testdata/run/worker_close_race.js.out b/tests/testdata/run/worker_close_race.js.out
index e69de29bb..e69de29bb 100644
--- a/cli/tests/testdata/run/worker_close_race.js.out
+++ b/tests/testdata/run/worker_close_race.js.out
diff --git a/cli/tests/testdata/run/worker_drop_handle_race.js b/tests/testdata/run/worker_drop_handle_race.js
index 731a36964..731a36964 100644
--- a/cli/tests/testdata/run/worker_drop_handle_race.js
+++ b/tests/testdata/run/worker_drop_handle_race.js
diff --git a/cli/tests/testdata/run/worker_drop_handle_race.js.out b/tests/testdata/run/worker_drop_handle_race.js.out
index 451c3af3d..451c3af3d 100644
--- a/cli/tests/testdata/run/worker_drop_handle_race.js.out
+++ b/tests/testdata/run/worker_drop_handle_race.js.out
diff --git a/cli/tests/testdata/run/worker_drop_handle_race_terminate.js b/tests/testdata/run/worker_drop_handle_race_terminate.js
index 7c4e0b109..7c4e0b109 100644
--- a/cli/tests/testdata/run/worker_drop_handle_race_terminate.js
+++ b/tests/testdata/run/worker_drop_handle_race_terminate.js
diff --git a/cli/tests/testdata/run/worker_drop_handle_race_terminate.js.out b/tests/testdata/run/worker_drop_handle_race_terminate.js.out
index 5ec1e7ff8..5ec1e7ff8 100644
--- a/cli/tests/testdata/run/worker_drop_handle_race_terminate.js.out
+++ b/tests/testdata/run/worker_drop_handle_race_terminate.js.out
diff --git a/cli/tests/testdata/run/worker_event_handler_test.js b/tests/testdata/run/worker_event_handler_test.js
index a91b0ec0b..a91b0ec0b 100644
--- a/cli/tests/testdata/run/worker_event_handler_test.js
+++ b/tests/testdata/run/worker_event_handler_test.js
diff --git a/cli/tests/testdata/run/worker_event_handler_test.js.out b/tests/testdata/run/worker_event_handler_test.js.out
index b3eed7f6c..b3eed7f6c 100644
--- a/cli/tests/testdata/run/worker_event_handler_test.js.out
+++ b/tests/testdata/run/worker_event_handler_test.js.out
diff --git a/cli/tests/testdata/run/worker_message_before_close.js b/tests/testdata/run/worker_message_before_close.js
index 569388b9b..569388b9b 100644
--- a/cli/tests/testdata/run/worker_message_before_close.js
+++ b/tests/testdata/run/worker_message_before_close.js
diff --git a/cli/tests/testdata/run/worker_message_before_close.js.out b/tests/testdata/run/worker_message_before_close.js.out
index f91b7b4cb..f91b7b4cb 100644
--- a/cli/tests/testdata/run/worker_message_before_close.js.out
+++ b/tests/testdata/run/worker_message_before_close.js.out
diff --git a/cli/tests/testdata/run/workspaces/basic/bar/deno.json b/tests/testdata/run/workspaces/basic/bar/deno.json
index ef3bfc37a..ef3bfc37a 100644
--- a/cli/tests/testdata/run/workspaces/basic/bar/deno.json
+++ b/tests/testdata/run/workspaces/basic/bar/deno.json
diff --git a/cli/tests/testdata/run/workspaces/basic/bar/fizz/buzz.ts b/tests/testdata/run/workspaces/basic/bar/fizz/buzz.ts
index f88d62fcc..f88d62fcc 100644
--- a/cli/tests/testdata/run/workspaces/basic/bar/fizz/buzz.ts
+++ b/tests/testdata/run/workspaces/basic/bar/fizz/buzz.ts
diff --git a/cli/tests/testdata/run/workspaces/basic/bar/mod.ts b/tests/testdata/run/workspaces/basic/bar/mod.ts
index 6f898e389..6f898e389 100644
--- a/cli/tests/testdata/run/workspaces/basic/bar/mod.ts
+++ b/tests/testdata/run/workspaces/basic/bar/mod.ts
diff --git a/cli/tests/testdata/run/workspaces/basic/bar/some_mod/hello.ts b/tests/testdata/run/workspaces/basic/bar/some_mod/hello.ts
index 1013de8d2..1013de8d2 100644
--- a/cli/tests/testdata/run/workspaces/basic/bar/some_mod/hello.ts
+++ b/tests/testdata/run/workspaces/basic/bar/some_mod/hello.ts
diff --git a/cli/tests/testdata/run/workspaces/basic/deno.json b/tests/testdata/run/workspaces/basic/deno.json
index b971c4f3d..b971c4f3d 100644
--- a/cli/tests/testdata/run/workspaces/basic/deno.json
+++ b/tests/testdata/run/workspaces/basic/deno.json
diff --git a/cli/tests/testdata/run/workspaces/basic/foo/bar/hello.ts b/tests/testdata/run/workspaces/basic/foo/bar/hello.ts
index c8a7e57c4..c8a7e57c4 100644
--- a/cli/tests/testdata/run/workspaces/basic/foo/bar/hello.ts
+++ b/tests/testdata/run/workspaces/basic/foo/bar/hello.ts
diff --git a/cli/tests/testdata/run/workspaces/basic/foo/deno.json b/tests/testdata/run/workspaces/basic/foo/deno.json
index 46d84f06f..46d84f06f 100644
--- a/cli/tests/testdata/run/workspaces/basic/foo/deno.json
+++ b/tests/testdata/run/workspaces/basic/foo/deno.json
diff --git a/cli/tests/testdata/run/workspaces/basic/foo/fizz/buzz.ts b/tests/testdata/run/workspaces/basic/foo/fizz/buzz.ts
index 4e03777d1..4e03777d1 100644
--- a/cli/tests/testdata/run/workspaces/basic/foo/fizz/buzz.ts
+++ b/tests/testdata/run/workspaces/basic/foo/fizz/buzz.ts
diff --git a/cli/tests/testdata/run/workspaces/basic/foo/mod.ts b/tests/testdata/run/workspaces/basic/foo/mod.ts
index d7b16dcc0..d7b16dcc0 100644
--- a/cli/tests/testdata/run/workspaces/basic/foo/mod.ts
+++ b/tests/testdata/run/workspaces/basic/foo/mod.ts
diff --git a/cli/tests/testdata/run/workspaces/basic/main.out b/tests/testdata/run/workspaces/basic/main.out
index 77e0de4d1..77e0de4d1 100644
--- a/cli/tests/testdata/run/workspaces/basic/main.out
+++ b/tests/testdata/run/workspaces/basic/main.out
diff --git a/cli/tests/testdata/run/workspaces/basic/main.ts b/tests/testdata/run/workspaces/basic/main.ts
index 380c97619..380c97619 100644
--- a/cli/tests/testdata/run/workspaces/basic/main.ts
+++ b/tests/testdata/run/workspaces/basic/main.ts
diff --git a/cli/tests/testdata/run/workspaces/member_outside_root_dir/deno.json b/tests/testdata/run/workspaces/member_outside_root_dir/deno.json
index 25feefad8..25feefad8 100644
--- a/cli/tests/testdata/run/workspaces/member_outside_root_dir/deno.json
+++ b/tests/testdata/run/workspaces/member_outside_root_dir/deno.json
diff --git a/cli/tests/testdata/run/workspaces/member_outside_root_dir/foo/bar/hello.ts b/tests/testdata/run/workspaces/member_outside_root_dir/foo/bar/hello.ts
index c8a7e57c4..c8a7e57c4 100644
--- a/cli/tests/testdata/run/workspaces/member_outside_root_dir/foo/bar/hello.ts
+++ b/tests/testdata/run/workspaces/member_outside_root_dir/foo/bar/hello.ts
diff --git a/cli/tests/testdata/run/workspaces/member_outside_root_dir/foo/deno.json b/tests/testdata/run/workspaces/member_outside_root_dir/foo/deno.json
index 46d84f06f..46d84f06f 100644
--- a/cli/tests/testdata/run/workspaces/member_outside_root_dir/foo/deno.json
+++ b/tests/testdata/run/workspaces/member_outside_root_dir/foo/deno.json
diff --git a/cli/tests/testdata/run/workspaces/member_outside_root_dir/foo/fizz/buzz.ts b/tests/testdata/run/workspaces/member_outside_root_dir/foo/fizz/buzz.ts
index 4e03777d1..4e03777d1 100644
--- a/cli/tests/testdata/run/workspaces/member_outside_root_dir/foo/fizz/buzz.ts
+++ b/tests/testdata/run/workspaces/member_outside_root_dir/foo/fizz/buzz.ts
diff --git a/cli/tests/testdata/run/workspaces/member_outside_root_dir/foo/mod.ts b/tests/testdata/run/workspaces/member_outside_root_dir/foo/mod.ts
index d7b16dcc0..d7b16dcc0 100644
--- a/cli/tests/testdata/run/workspaces/member_outside_root_dir/foo/mod.ts
+++ b/tests/testdata/run/workspaces/member_outside_root_dir/foo/mod.ts
diff --git a/cli/tests/testdata/run/workspaces/member_outside_root_dir/main.out b/tests/testdata/run/workspaces/member_outside_root_dir/main.out
index 205d95aea..205d95aea 100644
--- a/cli/tests/testdata/run/workspaces/member_outside_root_dir/main.out
+++ b/tests/testdata/run/workspaces/member_outside_root_dir/main.out
diff --git a/cli/tests/testdata/run/workspaces/member_outside_root_dir/main.ts b/tests/testdata/run/workspaces/member_outside_root_dir/main.ts
index 182fd8517..182fd8517 100644
--- a/cli/tests/testdata/run/workspaces/member_outside_root_dir/main.ts
+++ b/tests/testdata/run/workspaces/member_outside_root_dir/main.ts
diff --git a/cli/tests/testdata/run/workspaces/nested_member/bar/deno.json b/tests/testdata/run/workspaces/nested_member/bar/deno.json
index ef3bfc37a..ef3bfc37a 100644
--- a/cli/tests/testdata/run/workspaces/nested_member/bar/deno.json
+++ b/tests/testdata/run/workspaces/nested_member/bar/deno.json
diff --git a/cli/tests/testdata/run/workspaces/nested_member/bar/fizz/buzz.ts b/tests/testdata/run/workspaces/nested_member/bar/fizz/buzz.ts
index f88d62fcc..f88d62fcc 100644
--- a/cli/tests/testdata/run/workspaces/nested_member/bar/fizz/buzz.ts
+++ b/tests/testdata/run/workspaces/nested_member/bar/fizz/buzz.ts
diff --git a/cli/tests/testdata/run/workspaces/nested_member/bar/mod.ts b/tests/testdata/run/workspaces/nested_member/bar/mod.ts
index 6f898e389..6f898e389 100644
--- a/cli/tests/testdata/run/workspaces/nested_member/bar/mod.ts
+++ b/tests/testdata/run/workspaces/nested_member/bar/mod.ts
diff --git a/cli/tests/testdata/run/workspaces/nested_member/bar/some_mod/hello.ts b/tests/testdata/run/workspaces/nested_member/bar/some_mod/hello.ts
index 1013de8d2..1013de8d2 100644
--- a/cli/tests/testdata/run/workspaces/nested_member/bar/some_mod/hello.ts
+++ b/tests/testdata/run/workspaces/nested_member/bar/some_mod/hello.ts
diff --git a/cli/tests/testdata/run/workspaces/nested_member/deno.json b/tests/testdata/run/workspaces/nested_member/deno.json
index 6d9c09d4d..6d9c09d4d 100644
--- a/cli/tests/testdata/run/workspaces/nested_member/deno.json
+++ b/tests/testdata/run/workspaces/nested_member/deno.json
diff --git a/cli/tests/testdata/run/workspaces/nested_member/foo/bar/deno.json b/tests/testdata/run/workspaces/nested_member/foo/bar/deno.json
index d40328b36..d40328b36 100644
--- a/cli/tests/testdata/run/workspaces/nested_member/foo/bar/deno.json
+++ b/tests/testdata/run/workspaces/nested_member/foo/bar/deno.json
diff --git a/cli/tests/testdata/run/workspaces/nested_member/foo/bar/hello.ts b/tests/testdata/run/workspaces/nested_member/foo/bar/hello.ts
index 9c1023153..9c1023153 100644
--- a/cli/tests/testdata/run/workspaces/nested_member/foo/bar/hello.ts
+++ b/tests/testdata/run/workspaces/nested_member/foo/bar/hello.ts
diff --git a/cli/tests/testdata/run/workspaces/nested_member/foo/deno.json b/tests/testdata/run/workspaces/nested_member/foo/deno.json
index 68e053b02..68e053b02 100644
--- a/cli/tests/testdata/run/workspaces/nested_member/foo/deno.json
+++ b/tests/testdata/run/workspaces/nested_member/foo/deno.json
diff --git a/cli/tests/testdata/run/workspaces/nested_member/foo/fizz/buzz.ts b/tests/testdata/run/workspaces/nested_member/foo/fizz/buzz.ts
index 4e03777d1..4e03777d1 100644
--- a/cli/tests/testdata/run/workspaces/nested_member/foo/fizz/buzz.ts
+++ b/tests/testdata/run/workspaces/nested_member/foo/fizz/buzz.ts
diff --git a/cli/tests/testdata/run/workspaces/nested_member/foo/mod.ts b/tests/testdata/run/workspaces/nested_member/foo/mod.ts
index b9d4d3c04..b9d4d3c04 100644
--- a/cli/tests/testdata/run/workspaces/nested_member/foo/mod.ts
+++ b/tests/testdata/run/workspaces/nested_member/foo/mod.ts
diff --git a/cli/tests/testdata/run/workspaces/nested_member/main.out b/tests/testdata/run/workspaces/nested_member/main.out
index 98598a306..98598a306 100644
--- a/cli/tests/testdata/run/workspaces/nested_member/main.out
+++ b/tests/testdata/run/workspaces/nested_member/main.out
diff --git a/cli/tests/testdata/run/workspaces/nested_member/main.ts b/tests/testdata/run/workspaces/nested_member/main.ts
index 2bf53f7c2..2bf53f7c2 100644
--- a/cli/tests/testdata/run/workspaces/nested_member/main.ts
+++ b/tests/testdata/run/workspaces/nested_member/main.ts
diff --git a/cli/tests/testdata/runtime/esm_imports_a.js b/tests/testdata/runtime/esm_imports_a.js
index 673cd9aa3..673cd9aa3 100644
--- a/cli/tests/testdata/runtime/esm_imports_a.js
+++ b/tests/testdata/runtime/esm_imports_a.js
diff --git a/cli/tests/testdata/runtime/esm_imports_b.js b/tests/testdata/runtime/esm_imports_b.js
index 840121368..840121368 100644
--- a/cli/tests/testdata/runtime/esm_imports_b.js
+++ b/tests/testdata/runtime/esm_imports_b.js
diff --git a/cli/tests/testdata/spawn_kill_permissions.ts b/tests/testdata/spawn_kill_permissions.ts
index 86626bd5c..86626bd5c 100644
--- a/cli/tests/testdata/spawn_kill_permissions.ts
+++ b/tests/testdata/spawn_kill_permissions.ts
diff --git a/cli/tests/testdata/subdir/CAPITALS/main.js b/tests/testdata/subdir/CAPITALS/main.js
index 768d1391f..768d1391f 100644
--- a/cli/tests/testdata/subdir/CAPITALS/main.js
+++ b/tests/testdata/subdir/CAPITALS/main.js
diff --git a/cli/tests/testdata/subdir/amd_like.js b/tests/testdata/subdir/amd_like.js
index f27e505e4..f27e505e4 100644
--- a/cli/tests/testdata/subdir/amd_like.js
+++ b/tests/testdata/subdir/amd_like.js
diff --git a/cli/tests/testdata/subdir/auto_print_hello.ts b/tests/testdata/subdir/auto_print_hello.ts
index 5efa72e03..5efa72e03 100644
--- a/cli/tests/testdata/subdir/auto_print_hello.ts
+++ b/tests/testdata/subdir/auto_print_hello.ts
diff --git a/cli/tests/testdata/subdir/circular1.ts b/tests/testdata/subdir/circular1.ts
index 06fdb3373..06fdb3373 100644
--- a/cli/tests/testdata/subdir/circular1.ts
+++ b/tests/testdata/subdir/circular1.ts
diff --git a/cli/tests/testdata/subdir/circular2.ts b/tests/testdata/subdir/circular2.ts
index 0864b7adf..0864b7adf 100644
--- a/cli/tests/testdata/subdir/circular2.ts
+++ b/tests/testdata/subdir/circular2.ts
diff --git a/cli/tests/testdata/subdir/comment.ts b/tests/testdata/subdir/comment.ts
index ea7e630c0..ea7e630c0 100644
--- a/cli/tests/testdata/subdir/comment.ts
+++ b/tests/testdata/subdir/comment.ts
diff --git a/cli/tests/testdata/subdir/config.json b/tests/testdata/subdir/config.json
index 01c3b5e79..01c3b5e79 100644
--- a/cli/tests/testdata/subdir/config.json
+++ b/tests/testdata/subdir/config.json
diff --git a/cli/tests/testdata/subdir/emittable.d.ts b/tests/testdata/subdir/emittable.d.ts
index 425b80f24..425b80f24 100644
--- a/cli/tests/testdata/subdir/emittable.d.ts
+++ b/tests/testdata/subdir/emittable.d.ts
diff --git a/cli/tests/testdata/subdir/evil_remote_import.js b/tests/testdata/subdir/evil_remote_import.js
index 4ff7d1b97..4ff7d1b97 100644
--- a/cli/tests/testdata/subdir/evil_remote_import.js
+++ b/tests/testdata/subdir/evil_remote_import.js
diff --git a/cli/tests/testdata/subdir/export_types.ts b/tests/testdata/subdir/export_types.ts
index 18c8ed881..18c8ed881 100644
--- a/cli/tests/testdata/subdir/export_types.ts
+++ b/tests/testdata/subdir/export_types.ts
diff --git a/cli/tests/testdata/subdir/foo_types.d.ts b/tests/testdata/subdir/foo_types.d.ts
index c489584b9..c489584b9 100644
--- a/cli/tests/testdata/subdir/foo_types.d.ts
+++ b/tests/testdata/subdir/foo_types.d.ts
diff --git a/cli/tests/testdata/subdir/form_urlencoded.txt b/tests/testdata/subdir/form_urlencoded.txt
index 70e087c20..70e087c20 100644
--- a/cli/tests/testdata/subdir/form_urlencoded.txt
+++ b/tests/testdata/subdir/form_urlencoded.txt
diff --git a/cli/tests/testdata/subdir/import.mts b/tests/testdata/subdir/import.mts
index eeb200f59..eeb200f59 100644
--- a/cli/tests/testdata/subdir/import.mts
+++ b/tests/testdata/subdir/import.mts
diff --git a/cli/tests/testdata/subdir/indirect_import_error.js b/tests/testdata/subdir/indirect_import_error.js
index 84011d291..84011d291 100644
--- a/cli/tests/testdata/subdir/indirect_import_error.js
+++ b/tests/testdata/subdir/indirect_import_error.js
diff --git a/cli/tests/testdata/subdir/indirect_throws.js b/tests/testdata/subdir/indirect_throws.js
index e1810a66c..e1810a66c 100644
--- a/cli/tests/testdata/subdir/indirect_throws.js
+++ b/tests/testdata/subdir/indirect_throws.js
diff --git a/cli/tests/testdata/subdir/json_1.json b/tests/testdata/subdir/json_1.json
index 754d16b84..754d16b84 100644
--- a/cli/tests/testdata/subdir/json_1.json
+++ b/tests/testdata/subdir/json_1.json
diff --git a/cli/tests/testdata/subdir/json_2.json b/tests/testdata/subdir/json_2.json
index 7deb8b173..7deb8b173 100644
--- a/cli/tests/testdata/subdir/json_2.json
+++ b/tests/testdata/subdir/json_2.json
diff --git a/cli/tests/testdata/subdir/json_3.json b/tests/testdata/subdir/json_3.json
index b20bc0649..b20bc0649 100644
--- a/cli/tests/testdata/subdir/json_3.json
+++ b/tests/testdata/subdir/json_3.json
diff --git a/cli/tests/testdata/subdir/jsx_import_source_no_pragma.tsx b/tests/testdata/subdir/jsx_import_source_no_pragma.tsx
index 2c756054f..2c756054f 100644
--- a/cli/tests/testdata/subdir/jsx_import_source_no_pragma.tsx
+++ b/tests/testdata/subdir/jsx_import_source_no_pragma.tsx
diff --git a/cli/tests/testdata/subdir/main.ts b/tests/testdata/subdir/main.ts
index 29acf42e0..29acf42e0 100644
--- a/cli/tests/testdata/subdir/main.ts
+++ b/tests/testdata/subdir/main.ts
diff --git a/cli/tests/testdata/subdir/mismatch_ext.ts b/tests/testdata/subdir/mismatch_ext.ts
index e67d2a017..e67d2a017 100644
--- a/cli/tests/testdata/subdir/mismatch_ext.ts
+++ b/tests/testdata/subdir/mismatch_ext.ts
diff --git a/cli/tests/testdata/subdir/mod.mjs b/tests/testdata/subdir/mod.mjs
index 9233cce2f..9233cce2f 100644
--- a/cli/tests/testdata/subdir/mod.mjs
+++ b/tests/testdata/subdir/mod.mjs
diff --git a/cli/tests/testdata/subdir/mod1.ts b/tests/testdata/subdir/mod1.ts
index 5e58f432e..5e58f432e 100644
--- a/cli/tests/testdata/subdir/mod1.ts
+++ b/tests/testdata/subdir/mod1.ts
diff --git a/cli/tests/testdata/subdir/mod2.ts b/tests/testdata/subdir/mod2.ts
index ce1adc0e8..ce1adc0e8 100644
--- a/cli/tests/testdata/subdir/mod2.ts
+++ b/tests/testdata/subdir/mod2.ts
diff --git a/cli/tests/testdata/subdir/mod3.js b/tests/testdata/subdir/mod3.js
index ce534f570..ce534f570 100644
--- a/cli/tests/testdata/subdir/mod3.js
+++ b/tests/testdata/subdir/mod3.js
diff --git a/cli/tests/testdata/subdir/mod4.js b/tests/testdata/subdir/mod4.js
index 71332dbc4..71332dbc4 100644
--- a/cli/tests/testdata/subdir/mod4.js
+++ b/tests/testdata/subdir/mod4.js
diff --git a/cli/tests/testdata/subdir/mod5.mjs b/tests/testdata/subdir/mod5.mjs
index f21d8862b..f21d8862b 100644
--- a/cli/tests/testdata/subdir/mod5.mjs
+++ b/tests/testdata/subdir/mod5.mjs
diff --git a/cli/tests/testdata/subdir/mod6.js b/tests/testdata/subdir/mod6.js
index 5e17c9ee0..5e17c9ee0 100644
--- a/cli/tests/testdata/subdir/mod6.js
+++ b/tests/testdata/subdir/mod6.js
diff --git a/cli/tests/testdata/subdir/mod7.js b/tests/testdata/subdir/mod7.js
index 2bd4b5eb7..2bd4b5eb7 100644
--- a/cli/tests/testdata/subdir/mod7.js
+++ b/tests/testdata/subdir/mod7.js
diff --git a/cli/tests/testdata/subdir/mod8.js b/tests/testdata/subdir/mod8.js
index 5bf7a49a8..5bf7a49a8 100644
--- a/cli/tests/testdata/subdir/mod8.js
+++ b/tests/testdata/subdir/mod8.js
diff --git a/cli/tests/testdata/subdir/more_decorators.ts b/tests/testdata/subdir/more_decorators.ts
index 674705d56..674705d56 100644
--- a/cli/tests/testdata/subdir/more_decorators.ts
+++ b/tests/testdata/subdir/more_decorators.ts
diff --git a/cli/tests/testdata/subdir/mt_application_ecmascript.j2.js b/tests/testdata/subdir/mt_application_ecmascript.j2.js
index e67d2a017..e67d2a017 100644
--- a/cli/tests/testdata/subdir/mt_application_ecmascript.j2.js
+++ b/tests/testdata/subdir/mt_application_ecmascript.j2.js
diff --git a/cli/tests/testdata/subdir/mt_application_ecmascript_jsx.j2.jsx b/tests/testdata/subdir/mt_application_ecmascript_jsx.j2.jsx
index c5c27f9f9..c5c27f9f9 100644
--- a/cli/tests/testdata/subdir/mt_application_ecmascript_jsx.j2.jsx
+++ b/tests/testdata/subdir/mt_application_ecmascript_jsx.j2.jsx
diff --git a/cli/tests/testdata/subdir/mt_application_x_javascript.j4.js b/tests/testdata/subdir/mt_application_x_javascript.j4.js
index e67d2a017..e67d2a017 100644
--- a/cli/tests/testdata/subdir/mt_application_x_javascript.j4.js
+++ b/tests/testdata/subdir/mt_application_x_javascript.j4.js
diff --git a/cli/tests/testdata/subdir/mt_application_x_javascript_jsx.j4.jsx b/tests/testdata/subdir/mt_application_x_javascript_jsx.j4.jsx
index c5c27f9f9..c5c27f9f9 100644
--- a/cli/tests/testdata/subdir/mt_application_x_javascript_jsx.j4.jsx
+++ b/tests/testdata/subdir/mt_application_x_javascript_jsx.j4.jsx
diff --git a/cli/tests/testdata/subdir/mt_application_x_typescript.t4.ts b/tests/testdata/subdir/mt_application_x_typescript.t4.ts
index e67d2a017..e67d2a017 100644
--- a/cli/tests/testdata/subdir/mt_application_x_typescript.t4.ts
+++ b/tests/testdata/subdir/mt_application_x_typescript.t4.ts
diff --git a/cli/tests/testdata/subdir/mt_application_x_typescript_tsx.t4.tsx b/tests/testdata/subdir/mt_application_x_typescript_tsx.t4.tsx
index c5c27f9f9..c5c27f9f9 100644
--- a/cli/tests/testdata/subdir/mt_application_x_typescript_tsx.t4.tsx
+++ b/tests/testdata/subdir/mt_application_x_typescript_tsx.t4.tsx
diff --git a/cli/tests/testdata/subdir/mt_javascript.js b/tests/testdata/subdir/mt_javascript.js
index e67d2a017..e67d2a017 100644
--- a/cli/tests/testdata/subdir/mt_javascript.js
+++ b/tests/testdata/subdir/mt_javascript.js
diff --git a/cli/tests/testdata/subdir/mt_javascript_jsx.jsx b/tests/testdata/subdir/mt_javascript_jsx.jsx
index c5c27f9f9..c5c27f9f9 100644
--- a/cli/tests/testdata/subdir/mt_javascript_jsx.jsx
+++ b/tests/testdata/subdir/mt_javascript_jsx.jsx
diff --git a/cli/tests/testdata/subdir/mt_text_ecmascript.j3.js b/tests/testdata/subdir/mt_text_ecmascript.j3.js
index e67d2a017..e67d2a017 100644
--- a/cli/tests/testdata/subdir/mt_text_ecmascript.j3.js
+++ b/tests/testdata/subdir/mt_text_ecmascript.j3.js
diff --git a/cli/tests/testdata/subdir/mt_text_ecmascript_jsx.j3.jsx b/tests/testdata/subdir/mt_text_ecmascript_jsx.j3.jsx
index c5c27f9f9..c5c27f9f9 100644
--- a/cli/tests/testdata/subdir/mt_text_ecmascript_jsx.j3.jsx
+++ b/tests/testdata/subdir/mt_text_ecmascript_jsx.j3.jsx
diff --git a/cli/tests/testdata/subdir/mt_text_javascript.j1.js b/tests/testdata/subdir/mt_text_javascript.j1.js
index e67d2a017..e67d2a017 100644
--- a/cli/tests/testdata/subdir/mt_text_javascript.j1.js
+++ b/tests/testdata/subdir/mt_text_javascript.j1.js
diff --git a/cli/tests/testdata/subdir/mt_text_javascript_jsx.j1.jsx b/tests/testdata/subdir/mt_text_javascript_jsx.j1.jsx
index c5c27f9f9..c5c27f9f9 100644
--- a/cli/tests/testdata/subdir/mt_text_javascript_jsx.j1.jsx
+++ b/tests/testdata/subdir/mt_text_javascript_jsx.j1.jsx
diff --git a/cli/tests/testdata/subdir/mt_text_typescript.t1.ts b/tests/testdata/subdir/mt_text_typescript.t1.ts
index e67d2a017..e67d2a017 100644
--- a/cli/tests/testdata/subdir/mt_text_typescript.t1.ts
+++ b/tests/testdata/subdir/mt_text_typescript.t1.ts
diff --git a/cli/tests/testdata/subdir/mt_text_typescript_tsx.t1.tsx b/tests/testdata/subdir/mt_text_typescript_tsx.t1.tsx
index c5c27f9f9..c5c27f9f9 100644
--- a/cli/tests/testdata/subdir/mt_text_typescript_tsx.t1.tsx
+++ b/tests/testdata/subdir/mt_text_typescript_tsx.t1.tsx
diff --git a/cli/tests/testdata/subdir/mt_video_mp2t.t3.ts b/tests/testdata/subdir/mt_video_mp2t.t3.ts
index e67d2a017..e67d2a017 100644
--- a/cli/tests/testdata/subdir/mt_video_mp2t.t3.ts
+++ b/tests/testdata/subdir/mt_video_mp2t.t3.ts
diff --git a/cli/tests/testdata/subdir/mt_video_mp2t_tsx.t3.tsx b/tests/testdata/subdir/mt_video_mp2t_tsx.t3.tsx
index c5c27f9f9..c5c27f9f9 100644
--- a/cli/tests/testdata/subdir/mt_video_mp2t_tsx.t3.tsx
+++ b/tests/testdata/subdir/mt_video_mp2t_tsx.t3.tsx
diff --git a/cli/tests/testdata/subdir/mt_video_vdn.t2.ts b/tests/testdata/subdir/mt_video_vdn.t2.ts
index e67d2a017..e67d2a017 100644
--- a/cli/tests/testdata/subdir/mt_video_vdn.t2.ts
+++ b/tests/testdata/subdir/mt_video_vdn.t2.ts
diff --git a/cli/tests/testdata/subdir/mt_video_vdn_tsx.t2.tsx b/tests/testdata/subdir/mt_video_vdn_tsx.t2.tsx
index c5c27f9f9..c5c27f9f9 100644
--- a/cli/tests/testdata/subdir/mt_video_vdn_tsx.t2.tsx
+++ b/tests/testdata/subdir/mt_video_vdn_tsx.t2.tsx
diff --git a/cli/tests/testdata/subdir/no_ext b/tests/testdata/subdir/no_ext
index e67d2a017..e67d2a017 100644
--- a/cli/tests/testdata/subdir/no_ext
+++ b/tests/testdata/subdir/no_ext
diff --git a/cli/tests/testdata/subdir/no_js_ext b/tests/testdata/subdir/no_js_ext
index 8322a106f..8322a106f 100644
--- a/cli/tests/testdata/subdir/no_js_ext
+++ b/tests/testdata/subdir/no_js_ext
diff --git a/cli/tests/testdata/subdir/polyfill.ts b/tests/testdata/subdir/polyfill.ts
index 7af67c4c0..7af67c4c0 100644
--- a/cli/tests/testdata/subdir/polyfill.ts
+++ b/tests/testdata/subdir/polyfill.ts
diff --git a/cli/tests/testdata/subdir/print_hello.ts b/tests/testdata/subdir/print_hello.ts
index b9c0ad527..b9c0ad527 100644
--- a/cli/tests/testdata/subdir/print_hello.ts
+++ b/tests/testdata/subdir/print_hello.ts
diff --git a/cli/tests/testdata/subdir/redirects/a.ts b/tests/testdata/subdir/redirects/a.ts
index 071ee4728..071ee4728 100644
--- a/cli/tests/testdata/subdir/redirects/a.ts
+++ b/tests/testdata/subdir/redirects/a.ts
diff --git a/cli/tests/testdata/subdir/redirects/b.ts b/tests/testdata/subdir/redirects/b.ts
index cdb71eaae..cdb71eaae 100644
--- a/cli/tests/testdata/subdir/redirects/b.ts
+++ b/tests/testdata/subdir/redirects/b.ts
diff --git a/cli/tests/testdata/subdir/redirects/redirect1.js b/tests/testdata/subdir/redirects/redirect1.js
index d674be88c..d674be88c 100644
--- a/cli/tests/testdata/subdir/redirects/redirect1.js
+++ b/tests/testdata/subdir/redirects/redirect1.js
diff --git a/cli/tests/testdata/subdir/redirects/redirect1.ts b/tests/testdata/subdir/redirects/redirect1.ts
index d674be88c..d674be88c 100644
--- a/cli/tests/testdata/subdir/redirects/redirect1.ts
+++ b/tests/testdata/subdir/redirects/redirect1.ts
diff --git a/cli/tests/testdata/subdir/redirects/redirect2.js b/tests/testdata/subdir/redirects/redirect2.js
index e4244f638..e4244f638 100644
--- a/cli/tests/testdata/subdir/redirects/redirect2.js
+++ b/tests/testdata/subdir/redirects/redirect2.js
diff --git a/cli/tests/testdata/subdir/redirects/redirect3.js b/tests/testdata/subdir/redirects/redirect3.js
index e24f2af32..e24f2af32 100644
--- a/cli/tests/testdata/subdir/redirects/redirect3.js
+++ b/tests/testdata/subdir/redirects/redirect3.js
diff --git a/cli/tests/testdata/subdir/redirects/redirect4.ts b/tests/testdata/subdir/redirects/redirect4.ts
index 45c65c5eb..45c65c5eb 100644
--- a/cli/tests/testdata/subdir/redirects/redirect4.ts
+++ b/tests/testdata/subdir/redirects/redirect4.ts
diff --git a/cli/tests/testdata/subdir/shebang_file.js b/tests/testdata/subdir/shebang_file.js
index 1c81be31c..1c81be31c 100644
--- a/cli/tests/testdata/subdir/shebang_file.js
+++ b/tests/testdata/subdir/shebang_file.js
diff --git a/cli/tests/testdata/subdir/single_module.ts b/tests/testdata/subdir/single_module.ts
index 940a3ff0e..940a3ff0e 100644
--- a/cli/tests/testdata/subdir/single_module.ts
+++ b/tests/testdata/subdir/single_module.ts
diff --git a/cli/tests/testdata/subdir/subdir2/dynamic_import.ts b/tests/testdata/subdir/subdir2/dynamic_import.ts
index 59beb64c3..59beb64c3 100644
--- a/cli/tests/testdata/subdir/subdir2/dynamic_import.ts
+++ b/tests/testdata/subdir/subdir2/dynamic_import.ts
diff --git a/cli/tests/testdata/subdir/subdir2/mod2.ts b/tests/testdata/subdir/subdir2/mod2.ts
index 9071d0aeb..9071d0aeb 100644
--- a/cli/tests/testdata/subdir/subdir2/mod2.ts
+++ b/tests/testdata/subdir/subdir2/mod2.ts
diff --git a/cli/tests/testdata/subdir/test_worker_basic.js b/tests/testdata/subdir/test_worker_basic.js
index b960128b4..b960128b4 100644
--- a/cli/tests/testdata/subdir/test_worker_basic.js
+++ b/tests/testdata/subdir/test_worker_basic.js
diff --git a/cli/tests/testdata/subdir/throws.js b/tests/testdata/subdir/throws.js
index abdf29156..abdf29156 100644
--- a/cli/tests/testdata/subdir/throws.js
+++ b/tests/testdata/subdir/throws.js
diff --git a/cli/tests/testdata/subdir/tla.ts b/tests/testdata/subdir/tla.ts
index 713dbfca0..713dbfca0 100644
--- a/cli/tests/testdata/subdir/tla.ts
+++ b/tests/testdata/subdir/tla.ts
diff --git a/cli/tests/testdata/subdir/type_and_code.ts b/tests/testdata/subdir/type_and_code.ts
index b14713419..b14713419 100644
--- a/cli/tests/testdata/subdir/type_and_code.ts
+++ b/tests/testdata/subdir/type_and_code.ts
diff --git a/cli/tests/testdata/subdir/type_error.ts b/tests/testdata/subdir/type_error.ts
index cc3c1d29d..cc3c1d29d 100644
--- a/cli/tests/testdata/subdir/type_error.ts
+++ b/tests/testdata/subdir/type_error.ts
diff --git a/cli/tests/testdata/subdir/type_reference.d.ts b/tests/testdata/subdir/type_reference.d.ts
index f9b8de5ed..f9b8de5ed 100644
--- a/cli/tests/testdata/subdir/type_reference.d.ts
+++ b/tests/testdata/subdir/type_reference.d.ts
diff --git a/cli/tests/testdata/subdir/type_reference.js b/tests/testdata/subdir/type_reference.js
index 917d89198..917d89198 100644
--- a/cli/tests/testdata/subdir/type_reference.js
+++ b/tests/testdata/subdir/type_reference.js
diff --git a/cli/tests/testdata/subdir/types.d.mts b/tests/testdata/subdir/types.d.mts
index 28c282146..28c282146 100644
--- a/cli/tests/testdata/subdir/types.d.mts
+++ b/tests/testdata/subdir/types.d.mts
diff --git a/cli/tests/testdata/subdir/unknown_ext.deno b/tests/testdata/subdir/unknown_ext.deno
index e67d2a017..e67d2a017 100644
--- a/cli/tests/testdata/subdir/unknown_ext.deno
+++ b/tests/testdata/subdir/unknown_ext.deno
diff --git a/cli/tests/testdata/symlink_to_subdir b/tests/testdata/symlink_to_subdir
index fe0c45aa4..fe0c45aa4 120000
--- a/cli/tests/testdata/symlink_to_subdir
+++ b/tests/testdata/symlink_to_subdir
diff --git a/cli/tests/testdata/task/both/deno.json b/tests/testdata/task/both/deno.json
index 1038609a4..1038609a4 100644
--- a/cli/tests/testdata/task/both/deno.json
+++ b/tests/testdata/task/both/deno.json
diff --git a/cli/tests/testdata/task/both/deno_selected.out b/tests/testdata/task/both/deno_selected.out
index f5bbab26d..f5bbab26d 100644
--- a/cli/tests/testdata/task/both/deno_selected.out
+++ b/tests/testdata/task/both/deno_selected.out
diff --git a/cli/tests/testdata/task/both/echo.out b/tests/testdata/task/both/echo.out
index e69de29bb..e69de29bb 100644
--- a/cli/tests/testdata/task/both/echo.out
+++ b/tests/testdata/task/both/echo.out
diff --git a/cli/tests/testdata/task/both/no_args.out b/tests/testdata/task/both/no_args.out
index fce690b70..fce690b70 100644
--- a/cli/tests/testdata/task/both/no_args.out
+++ b/tests/testdata/task/both/no_args.out
diff --git a/cli/tests/testdata/task/both/package.json b/tests/testdata/task/both/package.json
index 708ccc6b1..708ccc6b1 100644
--- a/cli/tests/testdata/task/both/package.json
+++ b/tests/testdata/task/both/package.json
diff --git a/cli/tests/testdata/task/both/package_json_selected.out b/tests/testdata/task/both/package_json_selected.out
index 3dd1ecafa..3dd1ecafa 100644
--- a/cli/tests/testdata/task/both/package_json_selected.out
+++ b/tests/testdata/task/both/package_json_selected.out
diff --git a/cli/tests/testdata/task/both/prefers_deno.out b/tests/testdata/task/both/prefers_deno.out
index 391737272..391737272 100644
--- a/cli/tests/testdata/task/both/prefers_deno.out
+++ b/tests/testdata/task/both/prefers_deno.out
diff --git a/cli/tests/testdata/task/deno_json/deno.json b/tests/testdata/task/deno_json/deno.json
index c57426d25..c57426d25 100644
--- a/cli/tests/testdata/task/deno_json/deno.json
+++ b/tests/testdata/task/deno_json/deno.json
diff --git a/cli/tests/testdata/task/deno_json/task_additional_args.out b/tests/testdata/task/deno_json/task_additional_args.out
index 8d04f961a..8d04f961a 100644
--- a/cli/tests/testdata/task/deno_json/task_additional_args.out
+++ b/tests/testdata/task/deno_json/task_additional_args.out
diff --git a/cli/tests/testdata/task/deno_json/task_additional_args_nested_strings.out b/tests/testdata/task/deno_json/task_additional_args_nested_strings.out
index 0e5f35c7f..0e5f35c7f 100644
--- a/cli/tests/testdata/task/deno_json/task_additional_args_nested_strings.out
+++ b/tests/testdata/task/deno_json/task_additional_args_nested_strings.out
diff --git a/cli/tests/testdata/task/deno_json/task_additional_args_no_logic.out b/tests/testdata/task/deno_json/task_additional_args_no_logic.out
index a4886a60d..a4886a60d 100644
--- a/cli/tests/testdata/task/deno_json/task_additional_args_no_logic.out
+++ b/tests/testdata/task/deno_json/task_additional_args_no_logic.out
diff --git a/cli/tests/testdata/task/deno_json/task_additional_args_no_shell_expansion.out b/tests/testdata/task/deno_json/task_additional_args_no_shell_expansion.out
index 826a3aaf1..826a3aaf1 100644
--- a/cli/tests/testdata/task/deno_json/task_additional_args_no_shell_expansion.out
+++ b/tests/testdata/task/deno_json/task_additional_args_no_shell_expansion.out
diff --git a/cli/tests/testdata/task/deno_json/task_boolean_logic.out b/tests/testdata/task/deno_json/task_boolean_logic.out
index 94ebaf900..94ebaf900 100644
--- a/cli/tests/testdata/task/deno_json/task_boolean_logic.out
+++ b/tests/testdata/task/deno_json/task_boolean_logic.out
diff --git a/cli/tests/testdata/task/deno_json/task_cwd.out b/tests/testdata/task/deno_json/task_cwd.out
index bfe3e7b11..bfe3e7b11 100644
--- a/cli/tests/testdata/task/deno_json/task_cwd.out
+++ b/tests/testdata/task/deno_json/task_cwd.out
diff --git a/cli/tests/testdata/task/deno_json/task_deno_exe_no_env.out b/tests/testdata/task/deno_json/task_deno_exe_no_env.out
index 7ed6ff82d..7ed6ff82d 100644
--- a/cli/tests/testdata/task/deno_json/task_deno_exe_no_env.out
+++ b/tests/testdata/task/deno_json/task_deno_exe_no_env.out
diff --git a/cli/tests/testdata/task/deno_json/task_exit_code_5.out b/tests/testdata/task/deno_json/task_exit_code_5.out
index 12d171939..12d171939 100644
--- a/cli/tests/testdata/task/deno_json/task_exit_code_5.out
+++ b/tests/testdata/task/deno_json/task_exit_code_5.out
diff --git a/cli/tests/testdata/task/deno_json/task_init_cwd.out b/tests/testdata/task/deno_json/task_init_cwd.out
index 95ea8a545..95ea8a545 100644
--- a/cli/tests/testdata/task/deno_json/task_init_cwd.out
+++ b/tests/testdata/task/deno_json/task_init_cwd.out
diff --git a/cli/tests/testdata/task/deno_json/task_init_cwd_already_set.out b/tests/testdata/task/deno_json/task_init_cwd_already_set.out
index e427984d4..e427984d4 100644
--- a/cli/tests/testdata/task/deno_json/task_init_cwd_already_set.out
+++ b/tests/testdata/task/deno_json/task_init_cwd_already_set.out
diff --git a/cli/tests/testdata/task/deno_json/task_no_args.out b/tests/testdata/task/deno_json/task_no_args.out
index 18f86fce6..18f86fce6 100644
--- a/cli/tests/testdata/task/deno_json/task_no_args.out
+++ b/tests/testdata/task/deno_json/task_no_args.out
diff --git a/cli/tests/testdata/task/deno_json/task_non_existent.out b/tests/testdata/task/deno_json/task_non_existent.out
index efe3805f6..efe3805f6 100644
--- a/cli/tests/testdata/task/deno_json/task_non_existent.out
+++ b/tests/testdata/task/deno_json/task_non_existent.out
diff --git a/cli/tests/testdata/task/deno_json/task_piped_stdin.out b/tests/testdata/task/deno_json/task_piped_stdin.out
index a0d636f15..a0d636f15 100644
--- a/cli/tests/testdata/task/deno_json/task_piped_stdin.out
+++ b/tests/testdata/task/deno_json/task_piped_stdin.out
diff --git a/cli/tests/testdata/task/deno_json_pre_post/bin.out b/tests/testdata/task/deno_json_pre_post/bin.out
index ad66595f1..ad66595f1 100644
--- a/cli/tests/testdata/task/deno_json_pre_post/bin.out
+++ b/tests/testdata/task/deno_json_pre_post/bin.out
diff --git a/cli/tests/testdata/task/deno_json_pre_post/deno.json b/tests/testdata/task/deno_json_pre_post/deno.json
index 165b92e3a..165b92e3a 100644
--- a/cli/tests/testdata/task/deno_json_pre_post/deno.json
+++ b/tests/testdata/task/deno_json_pre_post/deno.json
diff --git a/cli/tests/testdata/task/deno_json_pre_post/echo.out b/tests/testdata/task/deno_json_pre_post/echo.out
index 573541ac9..573541ac9 100644
--- a/cli/tests/testdata/task/deno_json_pre_post/echo.out
+++ b/tests/testdata/task/deno_json_pre_post/echo.out
diff --git a/cli/tests/testdata/task/npx/non_existent.out b/tests/testdata/task/npx/non_existent.out
index 5df04917e..5df04917e 100644
--- a/cli/tests/testdata/task/npx/non_existent.out
+++ b/tests/testdata/task/npx/non_existent.out
diff --git a/cli/tests/testdata/task/npx/on_own.out b/tests/testdata/task/npx/on_own.out
index 67491f7b0..67491f7b0 100644
--- a/cli/tests/testdata/task/npx/on_own.out
+++ b/tests/testdata/task/npx/on_own.out
diff --git a/cli/tests/testdata/task/npx/package.json b/tests/testdata/task/npx/package.json
index 59602b96f..59602b96f 100644
--- a/cli/tests/testdata/task/npx/package.json
+++ b/tests/testdata/task/npx/package.json
diff --git a/cli/tests/testdata/task/package_json/bin.out b/tests/testdata/task/package_json/bin.out
index bf4693afc..bf4693afc 100644
--- a/cli/tests/testdata/task/package_json/bin.out
+++ b/tests/testdata/task/package_json/bin.out
diff --git a/cli/tests/testdata/task/package_json/echo.out b/tests/testdata/task/package_json/echo.out
index d00491fd7..d00491fd7 100644
--- a/cli/tests/testdata/task/package_json/echo.out
+++ b/tests/testdata/task/package_json/echo.out
diff --git a/cli/tests/testdata/task/package_json/no_args.out b/tests/testdata/task/package_json/no_args.out
index de149ccf9..de149ccf9 100644
--- a/cli/tests/testdata/task/package_json/no_args.out
+++ b/tests/testdata/task/package_json/no_args.out
diff --git a/cli/tests/testdata/task/package_json/package.json b/tests/testdata/task/package_json/package.json
index cedbe2d5b..cedbe2d5b 100644
--- a/cli/tests/testdata/task/package_json/package.json
+++ b/tests/testdata/task/package_json/package.json
diff --git a/cli/tests/testdata/task/package_json_node_modules_dir_false/bin.out b/tests/testdata/task/package_json_node_modules_dir_false/bin.out
index d5d59d551..d5d59d551 100644
--- a/cli/tests/testdata/task/package_json_node_modules_dir_false/bin.out
+++ b/tests/testdata/task/package_json_node_modules_dir_false/bin.out
diff --git a/cli/tests/testdata/task/package_json_node_modules_dir_false/deno.json b/tests/testdata/task/package_json_node_modules_dir_false/deno.json
index 23a325cfc..23a325cfc 100644
--- a/cli/tests/testdata/task/package_json_node_modules_dir_false/deno.json
+++ b/tests/testdata/task/package_json_node_modules_dir_false/deno.json
diff --git a/cli/tests/testdata/task/package_json_node_modules_dir_false/package.json b/tests/testdata/task/package_json_node_modules_dir_false/package.json
index 081e076b9..081e076b9 100644
--- a/cli/tests/testdata/task/package_json_node_modules_dir_false/package.json
+++ b/tests/testdata/task/package_json_node_modules_dir_false/package.json
diff --git a/cli/tests/testdata/task/package_json_post/bin.out b/tests/testdata/task/package_json_post/bin.out
index 96e5ca910..96e5ca910 100644
--- a/cli/tests/testdata/task/package_json_post/bin.out
+++ b/tests/testdata/task/package_json_post/bin.out
diff --git a/cli/tests/testdata/task/package_json_post/echo.out b/tests/testdata/task/package_json_post/echo.out
index 573541ac9..573541ac9 100644
--- a/cli/tests/testdata/task/package_json_post/echo.out
+++ b/tests/testdata/task/package_json_post/echo.out
diff --git a/cli/tests/testdata/task/package_json_post/package.json b/tests/testdata/task/package_json_post/package.json
index 82689f7d4..82689f7d4 100644
--- a/cli/tests/testdata/task/package_json_post/package.json
+++ b/tests/testdata/task/package_json_post/package.json
diff --git a/cli/tests/testdata/task/package_json_post_only/bin.out b/tests/testdata/task/package_json_post_only/bin.out
index 9e7cea091..9e7cea091 100644
--- a/cli/tests/testdata/task/package_json_post_only/bin.out
+++ b/tests/testdata/task/package_json_post_only/bin.out
diff --git a/cli/tests/testdata/task/package_json_post_only/echo.out b/tests/testdata/task/package_json_post_only/echo.out
index 573541ac9..573541ac9 100644
--- a/cli/tests/testdata/task/package_json_post_only/echo.out
+++ b/tests/testdata/task/package_json_post_only/echo.out
diff --git a/cli/tests/testdata/task/package_json_post_only/package.json b/tests/testdata/task/package_json_post_only/package.json
index ce8a6bbd5..ce8a6bbd5 100644
--- a/cli/tests/testdata/task/package_json_post_only/package.json
+++ b/tests/testdata/task/package_json_post_only/package.json
diff --git a/cli/tests/testdata/task/package_json_pre/bin.out b/tests/testdata/task/package_json_pre/bin.out
index f22961832..f22961832 100644
--- a/cli/tests/testdata/task/package_json_pre/bin.out
+++ b/tests/testdata/task/package_json_pre/bin.out
diff --git a/cli/tests/testdata/task/package_json_pre/echo.out b/tests/testdata/task/package_json_pre/echo.out
index 573541ac9..573541ac9 100644
--- a/cli/tests/testdata/task/package_json_pre/echo.out
+++ b/tests/testdata/task/package_json_pre/echo.out
diff --git a/cli/tests/testdata/task/package_json_pre/package.json b/tests/testdata/task/package_json_pre/package.json
index d3eba02a1..d3eba02a1 100644
--- a/cli/tests/testdata/task/package_json_pre/package.json
+++ b/tests/testdata/task/package_json_pre/package.json
diff --git a/cli/tests/testdata/task/package_json_pre_only/bin.out b/tests/testdata/task/package_json_pre_only/bin.out
index e96e8e341..e96e8e341 100644
--- a/cli/tests/testdata/task/package_json_pre_only/bin.out
+++ b/tests/testdata/task/package_json_pre_only/bin.out
diff --git a/cli/tests/testdata/task/package_json_pre_only/echo.out b/tests/testdata/task/package_json_pre_only/echo.out
index d00491fd7..d00491fd7 100644
--- a/cli/tests/testdata/task/package_json_pre_only/echo.out
+++ b/tests/testdata/task/package_json_pre_only/echo.out
diff --git a/cli/tests/testdata/task/package_json_pre_only/package.json b/tests/testdata/task/package_json_pre_only/package.json
index 032a5d4ea..032a5d4ea 100644
--- a/cli/tests/testdata/task/package_json_pre_only/package.json
+++ b/tests/testdata/task/package_json_pre_only/package.json
diff --git a/cli/tests/testdata/task/package_json_pre_post/bin.out b/tests/testdata/task/package_json_pre_post/bin.out
index 8c4abc6be..8c4abc6be 100644
--- a/cli/tests/testdata/task/package_json_pre_post/bin.out
+++ b/tests/testdata/task/package_json_pre_post/bin.out
diff --git a/cli/tests/testdata/task/package_json_pre_post/echo.out b/tests/testdata/task/package_json_pre_post/echo.out
index 573541ac9..573541ac9 100644
--- a/cli/tests/testdata/task/package_json_pre_post/echo.out
+++ b/tests/testdata/task/package_json_pre_post/echo.out
diff --git a/cli/tests/testdata/task/package_json_pre_post/package.json b/tests/testdata/task/package_json_pre_post/package.json
index 24a3ff1ed..24a3ff1ed 100644
--- a/cli/tests/testdata/task/package_json_pre_post/package.json
+++ b/tests/testdata/task/package_json_pre_post/package.json
diff --git a/cli/tests/testdata/test/aggregate_error.out b/tests/testdata/test/aggregate_error.out
index e70bf5963..e70bf5963 100644
--- a/cli/tests/testdata/test/aggregate_error.out
+++ b/tests/testdata/test/aggregate_error.out
diff --git a/cli/tests/testdata/test/aggregate_error.ts b/tests/testdata/test/aggregate_error.ts
index 0661ea249..0661ea249 100644
--- a/cli/tests/testdata/test/aggregate_error.ts
+++ b/tests/testdata/test/aggregate_error.ts
diff --git a/cli/tests/testdata/test/allow_all.out b/tests/testdata/test/allow_all.out
index 8b783b823..8b783b823 100644
--- a/cli/tests/testdata/test/allow_all.out
+++ b/tests/testdata/test/allow_all.out
diff --git a/tests/testdata/test/allow_all.ts b/tests/testdata/test/allow_all.ts
new file mode 100644
index 000000000..e533bc017
--- /dev/null
+++ b/tests/testdata/test/allow_all.ts
@@ -0,0 +1,43 @@
+import { assertEquals } from "../../../test_util/std/assert/mod.ts";
+
+const permissions: Deno.PermissionName[] = [
+ "read",
+ "write",
+ "net",
+ "env",
+ "run",
+ "ffi",
+ "hrtime",
+];
+
+for (const name of permissions) {
+ Deno.test({
+ name: `${name} false`,
+ permissions: {
+ [name]: false,
+ },
+ async fn() {
+ for await (const n of permissions) {
+ const status = await Deno.permissions.query({ name: n });
+ assertEquals(status.state, "prompt");
+ }
+ },
+ });
+
+ Deno.test({
+ name: `${name} true`,
+ permissions: {
+ [name]: true,
+ },
+ async fn() {
+ for await (const n of permissions) {
+ const status = await Deno.permissions.query({ name: n });
+ if (n === name) {
+ assertEquals(status.state, "granted");
+ } else {
+ assertEquals(status.state, "prompt");
+ }
+ }
+ },
+ });
+}
diff --git a/cli/tests/testdata/test/allow_none.out b/tests/testdata/test/allow_none.out
index aaa467344..aaa467344 100644
--- a/cli/tests/testdata/test/allow_none.out
+++ b/tests/testdata/test/allow_none.out
diff --git a/tests/testdata/test/allow_none.ts b/tests/testdata/test/allow_none.ts
new file mode 100644
index 000000000..04c40a093
--- /dev/null
+++ b/tests/testdata/test/allow_none.ts
@@ -0,0 +1,23 @@
+import { unreachable } from "../../../test_util/std/assert/mod.ts";
+
+const permissions: Deno.PermissionName[] = [
+ "read",
+ "write",
+ "net",
+ "env",
+ "run",
+ "ffi",
+ "hrtime",
+];
+
+for (const name of permissions) {
+ Deno.test({
+ name,
+ permissions: {
+ [name]: true,
+ },
+ fn() {
+ unreachable();
+ },
+ });
+}
diff --git a/cli/tests/testdata/test/before_unload_prevent_default.out b/tests/testdata/test/before_unload_prevent_default.out
index 09da32ff9..09da32ff9 100644
--- a/cli/tests/testdata/test/before_unload_prevent_default.out
+++ b/tests/testdata/test/before_unload_prevent_default.out
diff --git a/cli/tests/testdata/test/before_unload_prevent_default.ts b/tests/testdata/test/before_unload_prevent_default.ts
index 421ded520..421ded520 100644
--- a/cli/tests/testdata/test/before_unload_prevent_default.ts
+++ b/tests/testdata/test/before_unload_prevent_default.ts
diff --git a/cli/tests/testdata/test/captured_output.ts b/tests/testdata/test/captured_output.ts
index 3eed249a2..3eed249a2 100644
--- a/cli/tests/testdata/test/captured_output.ts
+++ b/tests/testdata/test/captured_output.ts
diff --git a/cli/tests/testdata/test/captured_output.worker.js b/tests/testdata/test/captured_output.worker.js
index f49f26880..f49f26880 100644
--- a/cli/tests/testdata/test/captured_output.worker.js
+++ b/tests/testdata/test/captured_output.worker.js
diff --git a/cli/tests/testdata/test/check_local_by_default.out b/tests/testdata/test/check_local_by_default.out
index 4564f99b8..4564f99b8 100644
--- a/cli/tests/testdata/test/check_local_by_default.out
+++ b/tests/testdata/test/check_local_by_default.out
diff --git a/cli/tests/testdata/test/check_local_by_default.ts b/tests/testdata/test/check_local_by_default.ts
index 2ae8c2692..2ae8c2692 100644
--- a/cli/tests/testdata/test/check_local_by_default.ts
+++ b/tests/testdata/test/check_local_by_default.ts
diff --git a/cli/tests/testdata/test/check_local_by_default2.out b/tests/testdata/test/check_local_by_default2.out
index b933ac483..b933ac483 100644
--- a/cli/tests/testdata/test/check_local_by_default2.out
+++ b/tests/testdata/test/check_local_by_default2.out
diff --git a/cli/tests/testdata/test/check_local_by_default2.ts b/tests/testdata/test/check_local_by_default2.ts
index 5177ff944..5177ff944 100644
--- a/cli/tests/testdata/test/check_local_by_default2.ts
+++ b/tests/testdata/test/check_local_by_default2.ts
diff --git a/cli/tests/testdata/test/clear_timeout.out b/tests/testdata/test/clear_timeout.out
index 4d3ff8862..4d3ff8862 100644
--- a/cli/tests/testdata/test/clear_timeout.out
+++ b/tests/testdata/test/clear_timeout.out
diff --git a/cli/tests/testdata/test/clear_timeout.ts b/tests/testdata/test/clear_timeout.ts
index 00056e853..00056e853 100644
--- a/cli/tests/testdata/test/clear_timeout.ts
+++ b/tests/testdata/test/clear_timeout.ts
diff --git a/cli/tests/testdata/test/collect.deprecated.out b/tests/testdata/test/collect.deprecated.out
index 7db2f276c..7db2f276c 100644
--- a/cli/tests/testdata/test/collect.deprecated.out
+++ b/tests/testdata/test/collect.deprecated.out
diff --git a/cli/tests/testdata/test/collect.out b/tests/testdata/test/collect.out
index 734adbe6b..734adbe6b 100644
--- a/cli/tests/testdata/test/collect.out
+++ b/tests/testdata/test/collect.out
diff --git a/cli/tests/testdata/test/collect/deno.deprecated.jsonc b/tests/testdata/test/collect/deno.deprecated.jsonc
index b8acda27d..b8acda27d 100644
--- a/cli/tests/testdata/test/collect/deno.deprecated.jsonc
+++ b/tests/testdata/test/collect/deno.deprecated.jsonc
diff --git a/cli/tests/testdata/test/collect/deno.jsonc b/tests/testdata/test/collect/deno.jsonc
index e14ce86da..e14ce86da 100644
--- a/cli/tests/testdata/test/collect/deno.jsonc
+++ b/tests/testdata/test/collect/deno.jsonc
diff --git a/cli/tests/testdata/test/collect/deno.malformed.jsonc b/tests/testdata/test/collect/deno.malformed.jsonc
index f2d8cbc65..f2d8cbc65 100644
--- a/cli/tests/testdata/test/collect/deno.malformed.jsonc
+++ b/tests/testdata/test/collect/deno.malformed.jsonc
diff --git a/cli/tests/testdata/test/collect/deno2.jsonc b/tests/testdata/test/collect/deno2.jsonc
index b7af09d1c..b7af09d1c 100644
--- a/cli/tests/testdata/test/collect/deno2.jsonc
+++ b/tests/testdata/test/collect/deno2.jsonc
diff --git a/cli/tests/testdata/test/collect/ignore/test.ts b/tests/testdata/test/collect/ignore/test.ts
index 16fb63ba7..16fb63ba7 100644
--- a/cli/tests/testdata/test/collect/ignore/test.ts
+++ b/tests/testdata/test/collect/ignore/test.ts
diff --git a/cli/tests/testdata/test/collect/include.ts b/tests/testdata/test/collect/include.ts
index e69de29bb..e69de29bb 100644
--- a/cli/tests/testdata/test/collect/include.ts
+++ b/tests/testdata/test/collect/include.ts
diff --git a/cli/tests/testdata/test/collect/include/2_test.ts b/tests/testdata/test/collect/include/2_test.ts
index e69de29bb..e69de29bb 100644
--- a/cli/tests/testdata/test/collect/include/2_test.ts
+++ b/tests/testdata/test/collect/include/2_test.ts
diff --git a/cli/tests/testdata/test/collect/include/test.ts b/tests/testdata/test/collect/include/test.ts
index e69de29bb..e69de29bb 100644
--- a/cli/tests/testdata/test/collect/include/test.ts
+++ b/tests/testdata/test/collect/include/test.ts
diff --git a/cli/tests/testdata/test/collect/test.ts b/tests/testdata/test/collect/test.ts
index e69de29bb..e69de29bb 100644
--- a/cli/tests/testdata/test/collect/test.ts
+++ b/tests/testdata/test/collect/test.ts
diff --git a/cli/tests/testdata/test/collect2.out b/tests/testdata/test/collect2.out
index 0c00c956a..0c00c956a 100644
--- a/cli/tests/testdata/test/collect2.out
+++ b/tests/testdata/test/collect2.out
diff --git a/cli/tests/testdata/test/collect_with_malformed_config.out b/tests/testdata/test/collect_with_malformed_config.out
index b31b18e6a..b31b18e6a 100644
--- a/cli/tests/testdata/test/collect_with_malformed_config.out
+++ b/tests/testdata/test/collect_with_malformed_config.out
diff --git a/cli/tests/testdata/test/deno.glob.json b/tests/testdata/test/deno.glob.json
index 9deb4d2f2..9deb4d2f2 100644
--- a/cli/tests/testdata/test/deno.glob.json
+++ b/tests/testdata/test/deno.glob.json
diff --git a/cli/tests/testdata/test/deno_custom_jsx.json b/tests/testdata/test/deno_custom_jsx.json
index 7ef04d829..7ef04d829 100644
--- a/cli/tests/testdata/test/deno_custom_jsx.json
+++ b/tests/testdata/test/deno_custom_jsx.json
diff --git a/cli/tests/testdata/test/doc.out b/tests/testdata/test/doc.out
index cd8bbb620..cd8bbb620 100644
--- a/cli/tests/testdata/test/doc.out
+++ b/tests/testdata/test/doc.out
diff --git a/cli/tests/testdata/test/doc.ts b/tests/testdata/test/doc.ts
index 519479fc5..519479fc5 100644
--- a/cli/tests/testdata/test/doc.ts
+++ b/tests/testdata/test/doc.ts
diff --git a/cli/tests/testdata/test/doc_only.out b/tests/testdata/test/doc_only.out
index 2b8b6dc73..2b8b6dc73 100644
--- a/cli/tests/testdata/test/doc_only.out
+++ b/tests/testdata/test/doc_only.out
diff --git a/cli/tests/testdata/test/doc_only/mod.ts b/tests/testdata/test/doc_only/mod.ts
index 467d850a2..467d850a2 100644
--- a/cli/tests/testdata/test/doc_only/mod.ts
+++ b/tests/testdata/test/doc_only/mod.ts
diff --git a/cli/tests/testdata/test/exit_sanitizer.out b/tests/testdata/test/exit_sanitizer.out
index 684001475..684001475 100644
--- a/cli/tests/testdata/test/exit_sanitizer.out
+++ b/tests/testdata/test/exit_sanitizer.out
diff --git a/cli/tests/testdata/test/exit_sanitizer.ts b/tests/testdata/test/exit_sanitizer.ts
index 186406a9d..186406a9d 100644
--- a/cli/tests/testdata/test/exit_sanitizer.ts
+++ b/tests/testdata/test/exit_sanitizer.ts
diff --git a/cli/tests/testdata/test/fail.out b/tests/testdata/test/fail.out
index 3fcf6fd8f..3fcf6fd8f 100644
--- a/cli/tests/testdata/test/fail.out
+++ b/tests/testdata/test/fail.out
diff --git a/cli/tests/testdata/test/fail.ts b/tests/testdata/test/fail.ts
index 9340db556..9340db556 100644
--- a/cli/tests/testdata/test/fail.ts
+++ b/tests/testdata/test/fail.ts
diff --git a/cli/tests/testdata/test/fail_fast.out b/tests/testdata/test/fail_fast.out
index 606d5b345..606d5b345 100644
--- a/cli/tests/testdata/test/fail_fast.out
+++ b/tests/testdata/test/fail_fast.out
diff --git a/cli/tests/testdata/test/fail_fast.ts b/tests/testdata/test/fail_fast.ts
index 637e825ec..637e825ec 100644
--- a/cli/tests/testdata/test/fail_fast.ts
+++ b/tests/testdata/test/fail_fast.ts
diff --git a/cli/tests/testdata/test/fail_fast_other.ts b/tests/testdata/test/fail_fast_other.ts
index 02aa878cf..02aa878cf 100644
--- a/cli/tests/testdata/test/fail_fast_other.ts
+++ b/tests/testdata/test/fail_fast_other.ts
diff --git a/cli/tests/testdata/test/fail_fast_with_val.out b/tests/testdata/test/fail_fast_with_val.out
index a844b05c1..a844b05c1 100644
--- a/cli/tests/testdata/test/fail_fast_with_val.out
+++ b/tests/testdata/test/fail_fast_with_val.out
diff --git a/cli/tests/testdata/test/fail_fast_with_val.ts b/tests/testdata/test/fail_fast_with_val.ts
index 637e825ec..637e825ec 100644
--- a/cli/tests/testdata/test/fail_fast_with_val.ts
+++ b/tests/testdata/test/fail_fast_with_val.ts
diff --git a/cli/tests/testdata/test/file_protocol.out b/tests/testdata/test/file_protocol.out
index 3f9c73f7e..3f9c73f7e 100644
--- a/cli/tests/testdata/test/file_protocol.out
+++ b/tests/testdata/test/file_protocol.out
diff --git a/cli/tests/testdata/test/file_protocol.ts b/tests/testdata/test/file_protocol.ts
index 79128c2b3..79128c2b3 100644
--- a/cli/tests/testdata/test/file_protocol.ts
+++ b/tests/testdata/test/file_protocol.ts
diff --git a/cli/tests/testdata/test/filter.out b/tests/testdata/test/filter.out
index af3e43ab8..af3e43ab8 100644
--- a/cli/tests/testdata/test/filter.out
+++ b/tests/testdata/test/filter.out
diff --git a/cli/tests/testdata/test/filter/a_test.ts b/tests/testdata/test/filter/a_test.ts
index a3f32968a..a3f32968a 100644
--- a/cli/tests/testdata/test/filter/a_test.ts
+++ b/tests/testdata/test/filter/a_test.ts
diff --git a/cli/tests/testdata/test/filter/b_test.ts b/tests/testdata/test/filter/b_test.ts
index a3f32968a..a3f32968a 100644
--- a/cli/tests/testdata/test/filter/b_test.ts
+++ b/tests/testdata/test/filter/b_test.ts
diff --git a/cli/tests/testdata/test/filter/c_test.ts b/tests/testdata/test/filter/c_test.ts
index a3f32968a..a3f32968a 100644
--- a/cli/tests/testdata/test/filter/c_test.ts
+++ b/tests/testdata/test/filter/c_test.ts
diff --git a/cli/tests/testdata/test/filtered_out_only.out b/tests/testdata/test/filtered_out_only.out
index 337893848..337893848 100644
--- a/cli/tests/testdata/test/filtered_out_only.out
+++ b/tests/testdata/test/filtered_out_only.out
diff --git a/cli/tests/testdata/test/filtered_out_only.ts b/tests/testdata/test/filtered_out_only.ts
index bda301a43..bda301a43 100644
--- a/cli/tests/testdata/test/filtered_out_only.ts
+++ b/tests/testdata/test/filtered_out_only.ts
diff --git a/cli/tests/testdata/test/finally_timeout.out b/tests/testdata/test/finally_timeout.out
index 26153da06..26153da06 100644
--- a/cli/tests/testdata/test/finally_timeout.out
+++ b/tests/testdata/test/finally_timeout.out
diff --git a/cli/tests/testdata/test/finally_timeout.ts b/tests/testdata/test/finally_timeout.ts
index dcc0a4d64..dcc0a4d64 100644
--- a/cli/tests/testdata/test/finally_timeout.ts
+++ b/tests/testdata/test/finally_timeout.ts
diff --git a/cli/tests/testdata/test/glob/data/tes.ts b/tests/testdata/test/glob/data/tes.ts
index 26f07fba5..26f07fba5 100644
--- a/cli/tests/testdata/test/glob/data/tes.ts
+++ b/tests/testdata/test/glob/data/tes.ts
diff --git a/cli/tests/testdata/test/glob/data/test1.js b/tests/testdata/test/glob/data/test1.js
index 26f07fba5..26f07fba5 100644
--- a/cli/tests/testdata/test/glob/data/test1.js
+++ b/tests/testdata/test/glob/data/test1.js
diff --git a/cli/tests/testdata/test/glob/data/test1.ts b/tests/testdata/test/glob/data/test1.ts
index 26f07fba5..26f07fba5 100644
--- a/cli/tests/testdata/test/glob/data/test1.ts
+++ b/tests/testdata/test/glob/data/test1.ts
diff --git a/cli/tests/testdata/test/glob/data/test12.ts b/tests/testdata/test/glob/data/test12.ts
index 26f07fba5..26f07fba5 100644
--- a/cli/tests/testdata/test/glob/data/test12.ts
+++ b/tests/testdata/test/glob/data/test12.ts
diff --git a/cli/tests/testdata/test/glob/nested/fizz/bar.ts b/tests/testdata/test/glob/nested/fizz/bar.ts
index 26f07fba5..26f07fba5 100644
--- a/cli/tests/testdata/test/glob/nested/fizz/bar.ts
+++ b/tests/testdata/test/glob/nested/fizz/bar.ts
diff --git a/cli/tests/testdata/test/glob/nested/fizz/bazz.ts b/tests/testdata/test/glob/nested/fizz/bazz.ts
index 26f07fba5..26f07fba5 100644
--- a/cli/tests/testdata/test/glob/nested/fizz/bazz.ts
+++ b/tests/testdata/test/glob/nested/fizz/bazz.ts
diff --git a/cli/tests/testdata/test/glob/nested/fizz/fizz.ts b/tests/testdata/test/glob/nested/fizz/fizz.ts
index 6940729e9..6940729e9 100644
--- a/cli/tests/testdata/test/glob/nested/fizz/fizz.ts
+++ b/tests/testdata/test/glob/nested/fizz/fizz.ts
diff --git a/cli/tests/testdata/test/glob/nested/fizz/foo.ts b/tests/testdata/test/glob/nested/fizz/foo.ts
index 26f07fba5..26f07fba5 100644
--- a/cli/tests/testdata/test/glob/nested/fizz/foo.ts
+++ b/tests/testdata/test/glob/nested/fizz/foo.ts
diff --git a/cli/tests/testdata/test/glob/nested/foo/bar.ts b/tests/testdata/test/glob/nested/foo/bar.ts
index 26f07fba5..26f07fba5 100644
--- a/cli/tests/testdata/test/glob/nested/foo/bar.ts
+++ b/tests/testdata/test/glob/nested/foo/bar.ts
diff --git a/cli/tests/testdata/test/glob/nested/foo/bazz.ts b/tests/testdata/test/glob/nested/foo/bazz.ts
index 26f07fba5..26f07fba5 100644
--- a/cli/tests/testdata/test/glob/nested/foo/bazz.ts
+++ b/tests/testdata/test/glob/nested/foo/bazz.ts
diff --git a/cli/tests/testdata/test/glob/nested/foo/fizz.ts b/tests/testdata/test/glob/nested/foo/fizz.ts
index 26f07fba5..26f07fba5 100644
--- a/cli/tests/testdata/test/glob/nested/foo/fizz.ts
+++ b/tests/testdata/test/glob/nested/foo/fizz.ts
diff --git a/cli/tests/testdata/test/glob/nested/foo/foo.ts b/tests/testdata/test/glob/nested/foo/foo.ts
index 26f07fba5..26f07fba5 100644
--- a/cli/tests/testdata/test/glob/nested/foo/foo.ts
+++ b/tests/testdata/test/glob/nested/foo/foo.ts
diff --git a/cli/tests/testdata/test/glob/pages/[id].ts b/tests/testdata/test/glob/pages/[id].ts
index 26f07fba5..26f07fba5 100644
--- a/cli/tests/testdata/test/glob/pages/[id].ts
+++ b/tests/testdata/test/glob/pages/[id].ts
diff --git a/cli/tests/testdata/test/hello_world.out b/tests/testdata/test/hello_world.out
index aee8a64d4..aee8a64d4 100644
--- a/cli/tests/testdata/test/hello_world.out
+++ b/tests/testdata/test/hello_world.out
diff --git a/cli/tests/testdata/test/hello_world.ts b/tests/testdata/test/hello_world.ts
index 4a1c3463f..4a1c3463f 100644
--- a/cli/tests/testdata/test/hello_world.ts
+++ b/tests/testdata/test/hello_world.ts
diff --git a/cli/tests/testdata/test/hide_empty_suites.out b/tests/testdata/test/hide_empty_suites.out
index d270cb05a..d270cb05a 100644
--- a/cli/tests/testdata/test/hide_empty_suites.out
+++ b/tests/testdata/test/hide_empty_suites.out
diff --git a/cli/tests/testdata/test/ignore.out b/tests/testdata/test/ignore.out
index e67406c63..e67406c63 100644
--- a/cli/tests/testdata/test/ignore.out
+++ b/tests/testdata/test/ignore.out
diff --git a/cli/tests/testdata/test/ignore.ts b/tests/testdata/test/ignore.ts
index 2339835db..2339835db 100644
--- a/cli/tests/testdata/test/ignore.ts
+++ b/tests/testdata/test/ignore.ts
diff --git a/cli/tests/testdata/test/ignore_permissions.out b/tests/testdata/test/ignore_permissions.out
index cc2574da9..cc2574da9 100644
--- a/cli/tests/testdata/test/ignore_permissions.out
+++ b/tests/testdata/test/ignore_permissions.out
diff --git a/cli/tests/testdata/test/ignore_permissions.ts b/tests/testdata/test/ignore_permissions.ts
index ff3084441..ff3084441 100644
--- a/cli/tests/testdata/test/ignore_permissions.ts
+++ b/tests/testdata/test/ignore_permissions.ts
diff --git a/cli/tests/testdata/test/interval.out b/tests/testdata/test/interval.out
index 1d0bc15ac..1d0bc15ac 100644
--- a/cli/tests/testdata/test/interval.out
+++ b/tests/testdata/test/interval.out
diff --git a/cli/tests/testdata/test/interval.ts b/tests/testdata/test/interval.ts
index 7eb588c59..7eb588c59 100644
--- a/cli/tests/testdata/test/interval.ts
+++ b/tests/testdata/test/interval.ts
diff --git a/cli/tests/testdata/test/load_unload.out b/tests/testdata/test/load_unload.out
index aef7531af..aef7531af 100644
--- a/cli/tests/testdata/test/load_unload.out
+++ b/tests/testdata/test/load_unload.out
diff --git a/cli/tests/testdata/test/load_unload.ts b/tests/testdata/test/load_unload.ts
index 2bd04a676..2bd04a676 100644
--- a/cli/tests/testdata/test/load_unload.ts
+++ b/tests/testdata/test/load_unload.ts
diff --git a/cli/tests/testdata/test/markdown.md b/tests/testdata/test/markdown.md
index d18dbd108..d18dbd108 100644
--- a/cli/tests/testdata/test/markdown.md
+++ b/tests/testdata/test/markdown.md
diff --git a/cli/tests/testdata/test/markdown.out b/tests/testdata/test/markdown.out
index 38c9f0349..38c9f0349 100644
--- a/cli/tests/testdata/test/markdown.out
+++ b/tests/testdata/test/markdown.out
diff --git a/cli/tests/testdata/test/markdown_full_block_names.md b/tests/testdata/test/markdown_full_block_names.md
index 4f9e1ea51..4f9e1ea51 100644
--- a/cli/tests/testdata/test/markdown_full_block_names.md
+++ b/tests/testdata/test/markdown_full_block_names.md
diff --git a/cli/tests/testdata/test/markdown_full_block_names.out b/tests/testdata/test/markdown_full_block_names.out
index 13051112e..13051112e 100644
--- a/cli/tests/testdata/test/markdown_full_block_names.out
+++ b/tests/testdata/test/markdown_full_block_names.out
diff --git a/cli/tests/testdata/test/markdown_windows.md b/tests/testdata/test/markdown_windows.md
index d18dbd108..d18dbd108 100644
--- a/cli/tests/testdata/test/markdown_windows.md
+++ b/tests/testdata/test/markdown_windows.md
diff --git a/cli/tests/testdata/test/markdown_windows.out b/tests/testdata/test/markdown_windows.out
index 4810e50cd..4810e50cd 100644
--- a/cli/tests/testdata/test/markdown_windows.out
+++ b/tests/testdata/test/markdown_windows.out
diff --git a/cli/tests/testdata/test/markdown_with_comment.md b/tests/testdata/test/markdown_with_comment.md
index 886e88103..886e88103 100644
--- a/cli/tests/testdata/test/markdown_with_comment.md
+++ b/tests/testdata/test/markdown_with_comment.md
diff --git a/cli/tests/testdata/test/markdown_with_comment.out b/tests/testdata/test/markdown_with_comment.out
index b202919d8..b202919d8 100644
--- a/cli/tests/testdata/test/markdown_with_comment.out
+++ b/tests/testdata/test/markdown_with_comment.out
diff --git a/cli/tests/testdata/test/meta.out b/tests/testdata/test/meta.out
index c46315ece..c46315ece 100644
--- a/cli/tests/testdata/test/meta.out
+++ b/tests/testdata/test/meta.out
diff --git a/cli/tests/testdata/test/meta.ts b/tests/testdata/test/meta.ts
index f2433a96d..f2433a96d 100644
--- a/cli/tests/testdata/test/meta.ts
+++ b/tests/testdata/test/meta.ts
diff --git a/cli/tests/testdata/test/no_check.out b/tests/testdata/test/no_check.out
index 66ad07e26..66ad07e26 100644
--- a/cli/tests/testdata/test/no_check.out
+++ b/tests/testdata/test/no_check.out
diff --git a/cli/tests/testdata/test/no_check.ts b/tests/testdata/test/no_check.ts
index 79d75f989..79d75f989 100644
--- a/cli/tests/testdata/test/no_check.ts
+++ b/tests/testdata/test/no_check.ts
diff --git a/cli/tests/testdata/test/no_color.ts b/tests/testdata/test/no_color.ts
index 38c531ee9..38c531ee9 100644
--- a/cli/tests/testdata/test/no_color.ts
+++ b/tests/testdata/test/no_color.ts
diff --git a/cli/tests/testdata/test/no_prompt_by_default.out b/tests/testdata/test/no_prompt_by_default.out
index a35e3f7ae..a35e3f7ae 100644
--- a/cli/tests/testdata/test/no_prompt_by_default.out
+++ b/tests/testdata/test/no_prompt_by_default.out
diff --git a/cli/tests/testdata/test/no_prompt_by_default.ts b/tests/testdata/test/no_prompt_by_default.ts
index 83837825d..83837825d 100644
--- a/cli/tests/testdata/test/no_prompt_by_default.ts
+++ b/tests/testdata/test/no_prompt_by_default.ts
diff --git a/cli/tests/testdata/test/no_prompt_with_denied_perms.out b/tests/testdata/test/no_prompt_with_denied_perms.out
index 4293ff1bb..4293ff1bb 100644
--- a/cli/tests/testdata/test/no_prompt_with_denied_perms.out
+++ b/tests/testdata/test/no_prompt_with_denied_perms.out
diff --git a/cli/tests/testdata/test/no_prompt_with_denied_perms.ts b/tests/testdata/test/no_prompt_with_denied_perms.ts
index 7fe5577cb..7fe5577cb 100644
--- a/cli/tests/testdata/test/no_prompt_with_denied_perms.ts
+++ b/tests/testdata/test/no_prompt_with_denied_perms.ts
diff --git a/cli/tests/testdata/test/no_run.out b/tests/testdata/test/no_run.out
index 5edf03fe0..5edf03fe0 100644
--- a/cli/tests/testdata/test/no_run.out
+++ b/tests/testdata/test/no_run.out
diff --git a/cli/tests/testdata/test/no_run.ts b/tests/testdata/test/no_run.ts
index b75915753..b75915753 100644
--- a/cli/tests/testdata/test/no_run.ts
+++ b/tests/testdata/test/no_run.ts
diff --git a/cli/tests/testdata/test/non_error_thrown.out b/tests/testdata/test/non_error_thrown.out
index 6755f2905..6755f2905 100644
--- a/cli/tests/testdata/test/non_error_thrown.out
+++ b/tests/testdata/test/non_error_thrown.out
diff --git a/cli/tests/testdata/test/non_error_thrown.ts b/tests/testdata/test/non_error_thrown.ts
index 85dc8d179..85dc8d179 100644
--- a/cli/tests/testdata/test/non_error_thrown.ts
+++ b/tests/testdata/test/non_error_thrown.ts
diff --git a/cli/tests/testdata/test/only.out b/tests/testdata/test/only.out
index 2e66ed22b..2e66ed22b 100644
--- a/cli/tests/testdata/test/only.out
+++ b/tests/testdata/test/only.out
diff --git a/cli/tests/testdata/test/only.ts b/tests/testdata/test/only.ts
index 26b4cd425..26b4cd425 100644
--- a/cli/tests/testdata/test/only.ts
+++ b/tests/testdata/test/only.ts
diff --git a/tests/testdata/test/ops_sanitizer_closed_inside_started_before.out b/tests/testdata/test/ops_sanitizer_closed_inside_started_before.out
new file mode 100644
index 000000000..0a8cc2245
--- /dev/null
+++ b/tests/testdata/test/ops_sanitizer_closed_inside_started_before.out
@@ -0,0 +1,19 @@
+Check [WILDCARD]test/ops_sanitizer_closed_inside_started_before.ts
+running 1 test from ./test/ops_sanitizer_closed_inside_started_before.ts
+test 1 ... FAILED [WILDCARD]
+
+ ERRORS
+
+test 1 => ./test/ops_sanitizer_closed_inside_started_before.ts:[WILDCARD]
+error: Leaking async ops:
+ - 1 async operation to sleep for a duration was started before this test, but was completed during the test. Async operations should not complete in a test if they were not started in that test. This is often caused by not cancelling a `setTimeout` or `setInterval` call. The operation was started here:
+ at [WILDCARD]
+ at [WILDCARD]/tests/testdata/test/ops_sanitizer_closed_inside_started_before.ts:[WILDCARD]
+
+ FAILURES
+
+test 1 => ./test/ops_sanitizer_closed_inside_started_before.ts:[WILDCARD]
+
+FAILED | 0 passed | 1 failed [WILDCARD]
+
+error: Test failed
diff --git a/cli/tests/testdata/test/ops_sanitizer_closed_inside_started_before.ts b/tests/testdata/test/ops_sanitizer_closed_inside_started_before.ts
index 97d3d72c8..97d3d72c8 100644
--- a/cli/tests/testdata/test/ops_sanitizer_closed_inside_started_before.ts
+++ b/tests/testdata/test/ops_sanitizer_closed_inside_started_before.ts
diff --git a/cli/tests/testdata/test/ops_sanitizer_missing_details.out b/tests/testdata/test/ops_sanitizer_missing_details.out
index 36191912a..36191912a 100644
--- a/cli/tests/testdata/test/ops_sanitizer_missing_details.out
+++ b/tests/testdata/test/ops_sanitizer_missing_details.out
diff --git a/tests/testdata/test/ops_sanitizer_missing_details.ts b/tests/testdata/test/ops_sanitizer_missing_details.ts
new file mode 100644
index 000000000..a40240bfc
--- /dev/null
+++ b/tests/testdata/test/ops_sanitizer_missing_details.ts
@@ -0,0 +1,10 @@
+// https://github.com/denoland/deno/issues/13729
+// https://github.com/denoland/deno/issues/13938
+import { writeAll } from "../../../test_util/std/streams/write_all.ts";
+
+Deno.test("test 1", { permissions: { write: true, read: true } }, async () => {
+ const tmpFile = await Deno.makeTempFile();
+ const file = await Deno.open(tmpFile, { write: true });
+ const buf = new Uint8Array(new Array(1_000_000).fill(1));
+ writeAll(file, buf);
+});
diff --git a/cli/tests/testdata/test/ops_sanitizer_multiple_timeout_tests.out b/tests/testdata/test/ops_sanitizer_multiple_timeout_tests.out
index d7ccc6a00..d7ccc6a00 100644
--- a/cli/tests/testdata/test/ops_sanitizer_multiple_timeout_tests.out
+++ b/tests/testdata/test/ops_sanitizer_multiple_timeout_tests.out
diff --git a/cli/tests/testdata/test/ops_sanitizer_multiple_timeout_tests.ts b/tests/testdata/test/ops_sanitizer_multiple_timeout_tests.ts
index 1f52d481f..1f52d481f 100644
--- a/cli/tests/testdata/test/ops_sanitizer_multiple_timeout_tests.ts
+++ b/tests/testdata/test/ops_sanitizer_multiple_timeout_tests.ts
diff --git a/cli/tests/testdata/test/ops_sanitizer_multiple_timeout_tests_no_trace.out b/tests/testdata/test/ops_sanitizer_multiple_timeout_tests_no_trace.out
index 1655c162f..1655c162f 100644
--- a/cli/tests/testdata/test/ops_sanitizer_multiple_timeout_tests_no_trace.out
+++ b/tests/testdata/test/ops_sanitizer_multiple_timeout_tests_no_trace.out
diff --git a/cli/tests/testdata/test/ops_sanitizer_nexttick.out b/tests/testdata/test/ops_sanitizer_nexttick.out
index 44a8d13d5..44a8d13d5 100644
--- a/cli/tests/testdata/test/ops_sanitizer_nexttick.out
+++ b/tests/testdata/test/ops_sanitizer_nexttick.out
diff --git a/cli/tests/testdata/test/ops_sanitizer_nexttick.ts b/tests/testdata/test/ops_sanitizer_nexttick.ts
index 9ad3a7b28..9ad3a7b28 100644
--- a/cli/tests/testdata/test/ops_sanitizer_nexttick.ts
+++ b/tests/testdata/test/ops_sanitizer_nexttick.ts
diff --git a/tests/testdata/test/ops_sanitizer_step_leak.out b/tests/testdata/test/ops_sanitizer_step_leak.out
new file mode 100644
index 000000000..55c89582a
--- /dev/null
+++ b/tests/testdata/test/ops_sanitizer_step_leak.out
@@ -0,0 +1,10 @@
+Check [WILDCARD]/tests/testdata/test/ops_sanitizer_step_leak.ts
+running 1 test from ./tests/testdata/test/ops_sanitizer_step_leak.ts
+timeout ...
+ step ... ok [WILDCARD]
+------- output -------
+done
+----- output end -----
+timeout ... ok [WILDCARD]
+
+ok | 1 passed (1 step) | 0 failed [WILDCARD] \ No newline at end of file
diff --git a/cli/tests/testdata/test/ops_sanitizer_step_leak.ts b/tests/testdata/test/ops_sanitizer_step_leak.ts
index 3fb9b397e..3fb9b397e 100644
--- a/cli/tests/testdata/test/ops_sanitizer_step_leak.ts
+++ b/tests/testdata/test/ops_sanitizer_step_leak.ts
diff --git a/cli/tests/testdata/test/ops_sanitizer_timeout_failure.out b/tests/testdata/test/ops_sanitizer_timeout_failure.out
index a4fbf0008..a4fbf0008 100644
--- a/cli/tests/testdata/test/ops_sanitizer_timeout_failure.out
+++ b/tests/testdata/test/ops_sanitizer_timeout_failure.out
diff --git a/cli/tests/testdata/test/ops_sanitizer_timeout_failure.ts b/tests/testdata/test/ops_sanitizer_timeout_failure.ts
index d40a5a258..d40a5a258 100644
--- a/cli/tests/testdata/test/ops_sanitizer_timeout_failure.ts
+++ b/tests/testdata/test/ops_sanitizer_timeout_failure.ts
diff --git a/cli/tests/testdata/test/ops_sanitizer_unstable.out b/tests/testdata/test/ops_sanitizer_unstable.out
index a4f47a749..a4f47a749 100644
--- a/cli/tests/testdata/test/ops_sanitizer_unstable.out
+++ b/tests/testdata/test/ops_sanitizer_unstable.out
diff --git a/cli/tests/testdata/test/ops_sanitizer_unstable.ts b/tests/testdata/test/ops_sanitizer_unstable.ts
index d1b554adf..d1b554adf 100644
--- a/cli/tests/testdata/test/ops_sanitizer_unstable.ts
+++ b/tests/testdata/test/ops_sanitizer_unstable.ts
diff --git a/cli/tests/testdata/test/overloads.out b/tests/testdata/test/overloads.out
index 87a3f07cb..87a3f07cb 100644
--- a/cli/tests/testdata/test/overloads.out
+++ b/tests/testdata/test/overloads.out
diff --git a/cli/tests/testdata/test/overloads.ts b/tests/testdata/test/overloads.ts
index eb7b3dccc..eb7b3dccc 100644
--- a/cli/tests/testdata/test/overloads.ts
+++ b/tests/testdata/test/overloads.ts
diff --git a/cli/tests/testdata/test/parallel_output.out b/tests/testdata/test/parallel_output.out
index d3528a6e0..d3528a6e0 100644
--- a/cli/tests/testdata/test/parallel_output.out
+++ b/tests/testdata/test/parallel_output.out
diff --git a/cli/tests/testdata/test/parallel_output.ts b/tests/testdata/test/parallel_output.ts
index 5de733aad..5de733aad 100644
--- a/cli/tests/testdata/test/parallel_output.ts
+++ b/tests/testdata/test/parallel_output.ts
diff --git a/cli/tests/testdata/test/pass.junit.out b/tests/testdata/test/pass.junit.out
index b652dbf85..b652dbf85 100644
--- a/cli/tests/testdata/test/pass.junit.out
+++ b/tests/testdata/test/pass.junit.out
diff --git a/cli/tests/testdata/test/pass.out b/tests/testdata/test/pass.out
index 08b9f5a52..08b9f5a52 100644
--- a/cli/tests/testdata/test/pass.out
+++ b/tests/testdata/test/pass.out
diff --git a/cli/tests/testdata/test/pass.ts b/tests/testdata/test/pass.ts
index c4c0f45dc..c4c0f45dc 100644
--- a/cli/tests/testdata/test/pass.ts
+++ b/tests/testdata/test/pass.ts
diff --git a/cli/tests/testdata/test/quiet.out b/tests/testdata/test/quiet.out
index 83dbe6ba9..83dbe6ba9 100644
--- a/cli/tests/testdata/test/quiet.out
+++ b/tests/testdata/test/quiet.out
diff --git a/cli/tests/testdata/test/quiet.ts b/tests/testdata/test/quiet.ts
index f40805bfb..f40805bfb 100644
--- a/cli/tests/testdata/test/quiet.ts
+++ b/tests/testdata/test/quiet.ts
diff --git a/cli/tests/testdata/test/recursive_permissions_pledge.js b/tests/testdata/test/recursive_permissions_pledge.js
index 9bf320c37..9bf320c37 100644
--- a/cli/tests/testdata/test/recursive_permissions_pledge.js
+++ b/tests/testdata/test/recursive_permissions_pledge.js
diff --git a/cli/tests/testdata/test/relative_pattern_dot_slash/deno.json b/tests/testdata/test/relative_pattern_dot_slash/deno.json
index 7c2c4a5d3..7c2c4a5d3 100644
--- a/cli/tests/testdata/test/relative_pattern_dot_slash/deno.json
+++ b/tests/testdata/test/relative_pattern_dot_slash/deno.json
diff --git a/cli/tests/testdata/test/relative_pattern_dot_slash/output.out b/tests/testdata/test/relative_pattern_dot_slash/output.out
index be2961cff..be2961cff 100644
--- a/cli/tests/testdata/test/relative_pattern_dot_slash/output.out
+++ b/tests/testdata/test/relative_pattern_dot_slash/output.out
diff --git a/cli/tests/testdata/test/relative_pattern_dot_slash/test/add.mjs b/tests/testdata/test/relative_pattern_dot_slash/test/add.mjs
index 7d658310b..7d658310b 100644
--- a/cli/tests/testdata/test/relative_pattern_dot_slash/test/add.mjs
+++ b/tests/testdata/test/relative_pattern_dot_slash/test/add.mjs
diff --git a/cli/tests/testdata/test/relative_pattern_dot_slash/test/add.test.mjs b/tests/testdata/test/relative_pattern_dot_slash/test/add.test.mjs
index 7b21d2fbc..7b21d2fbc 100644
--- a/cli/tests/testdata/test/relative_pattern_dot_slash/test/add.test.mjs
+++ b/tests/testdata/test/relative_pattern_dot_slash/test/add.test.mjs
diff --git a/cli/tests/testdata/test/replace_timers.js b/tests/testdata/test/replace_timers.js
index 692f1d671..692f1d671 100644
--- a/cli/tests/testdata/test/replace_timers.js
+++ b/tests/testdata/test/replace_timers.js
diff --git a/cli/tests/testdata/test/replace_timers.js.out b/tests/testdata/test/replace_timers.js.out
index 81beb5ebe..81beb5ebe 100644
--- a/cli/tests/testdata/test/replace_timers.js.out
+++ b/tests/testdata/test/replace_timers.js.out
diff --git a/cli/tests/testdata/test/report_error.out b/tests/testdata/test/report_error.out
index 698550f97..698550f97 100644
--- a/cli/tests/testdata/test/report_error.out
+++ b/tests/testdata/test/report_error.out
diff --git a/cli/tests/testdata/test/report_error.ts b/tests/testdata/test/report_error.ts
index 56b6db26c..56b6db26c 100644
--- a/cli/tests/testdata/test/report_error.ts
+++ b/tests/testdata/test/report_error.ts
diff --git a/cli/tests/testdata/test/resource_sanitizer.out b/tests/testdata/test/resource_sanitizer.out
index 655dd2a17..655dd2a17 100644
--- a/cli/tests/testdata/test/resource_sanitizer.out
+++ b/tests/testdata/test/resource_sanitizer.out
diff --git a/cli/tests/testdata/test/resource_sanitizer.ts b/tests/testdata/test/resource_sanitizer.ts
index 93c9222c5..93c9222c5 100644
--- a/cli/tests/testdata/test/resource_sanitizer.ts
+++ b/tests/testdata/test/resource_sanitizer.ts
diff --git a/cli/tests/testdata/test/short-pass-jobs-flag-warning.out b/tests/testdata/test/short-pass-jobs-flag-warning.out
index 0d9e1fd9b..0d9e1fd9b 100644
--- a/cli/tests/testdata/test/short-pass-jobs-flag-warning.out
+++ b/tests/testdata/test/short-pass-jobs-flag-warning.out
diff --git a/cli/tests/testdata/test/short-pass.out b/tests/testdata/test/short-pass.out
index 3f239de41..3f239de41 100644
--- a/cli/tests/testdata/test/short-pass.out
+++ b/tests/testdata/test/short-pass.out
diff --git a/cli/tests/testdata/test/short-pass.ts b/tests/testdata/test/short-pass.ts
index 03818ae8d..03818ae8d 100644
--- a/cli/tests/testdata/test/short-pass.ts
+++ b/tests/testdata/test/short-pass.ts
diff --git a/cli/tests/testdata/test/shuffle.out b/tests/testdata/test/shuffle.out
index 9037ff518..9037ff518 100644
--- a/cli/tests/testdata/test/shuffle.out
+++ b/tests/testdata/test/shuffle.out
diff --git a/cli/tests/testdata/test/shuffle/bar_test.ts b/tests/testdata/test/shuffle/bar_test.ts
index ca118dc0d..ca118dc0d 100644
--- a/cli/tests/testdata/test/shuffle/bar_test.ts
+++ b/tests/testdata/test/shuffle/bar_test.ts
diff --git a/cli/tests/testdata/test/shuffle/baz_test.ts b/tests/testdata/test/shuffle/baz_test.ts
index ca118dc0d..ca118dc0d 100644
--- a/cli/tests/testdata/test/shuffle/baz_test.ts
+++ b/tests/testdata/test/shuffle/baz_test.ts
diff --git a/cli/tests/testdata/test/shuffle/foo_test.ts b/tests/testdata/test/shuffle/foo_test.ts
index ca118dc0d..ca118dc0d 100644
--- a/cli/tests/testdata/test/shuffle/foo_test.ts
+++ b/tests/testdata/test/shuffle/foo_test.ts
diff --git a/cli/tests/testdata/test/sigint_with_hanging_test.out b/tests/testdata/test/sigint_with_hanging_test.out
index c590c2192..c590c2192 100644
--- a/cli/tests/testdata/test/sigint_with_hanging_test.out
+++ b/tests/testdata/test/sigint_with_hanging_test.out
diff --git a/cli/tests/testdata/test/sigint_with_hanging_test.ts b/tests/testdata/test/sigint_with_hanging_test.ts
index 07b126e98..07b126e98 100644
--- a/cli/tests/testdata/test/sigint_with_hanging_test.ts
+++ b/tests/testdata/test/sigint_with_hanging_test.ts
diff --git a/cli/tests/testdata/test/steps/failing_steps.dot.out b/tests/testdata/test/steps/failing_steps.dot.out
index f8ba8d8e6..f8ba8d8e6 100644
--- a/cli/tests/testdata/test/steps/failing_steps.dot.out
+++ b/tests/testdata/test/steps/failing_steps.dot.out
diff --git a/cli/tests/testdata/test/steps/failing_steps.out b/tests/testdata/test/steps/failing_steps.out
index 4b717f5cc..4b717f5cc 100644
--- a/cli/tests/testdata/test/steps/failing_steps.out
+++ b/tests/testdata/test/steps/failing_steps.out
diff --git a/cli/tests/testdata/test/steps/failing_steps.tap.out b/tests/testdata/test/steps/failing_steps.tap.out
index 11b289f08..11b289f08 100644
--- a/cli/tests/testdata/test/steps/failing_steps.tap.out
+++ b/tests/testdata/test/steps/failing_steps.tap.out
diff --git a/cli/tests/testdata/test/steps/failing_steps.ts b/tests/testdata/test/steps/failing_steps.ts
index efa18d54e..efa18d54e 100644
--- a/cli/tests/testdata/test/steps/failing_steps.ts
+++ b/tests/testdata/test/steps/failing_steps.ts
diff --git a/cli/tests/testdata/test/steps/ignored_steps.dot.out b/tests/testdata/test/steps/ignored_steps.dot.out
index 442a06c62..442a06c62 100644
--- a/cli/tests/testdata/test/steps/ignored_steps.dot.out
+++ b/tests/testdata/test/steps/ignored_steps.dot.out
diff --git a/cli/tests/testdata/test/steps/ignored_steps.out b/tests/testdata/test/steps/ignored_steps.out
index 2786e1e1a..2786e1e1a 100644
--- a/cli/tests/testdata/test/steps/ignored_steps.out
+++ b/tests/testdata/test/steps/ignored_steps.out
diff --git a/cli/tests/testdata/test/steps/ignored_steps.tap.out b/tests/testdata/test/steps/ignored_steps.tap.out
index b2b2f5070..b2b2f5070 100644
--- a/cli/tests/testdata/test/steps/ignored_steps.tap.out
+++ b/tests/testdata/test/steps/ignored_steps.tap.out
diff --git a/cli/tests/testdata/test/steps/ignored_steps.ts b/tests/testdata/test/steps/ignored_steps.ts
index 102b481fb..102b481fb 100644
--- a/cli/tests/testdata/test/steps/ignored_steps.ts
+++ b/tests/testdata/test/steps/ignored_steps.ts
diff --git a/cli/tests/testdata/test/steps/invalid_usage.out b/tests/testdata/test/steps/invalid_usage.out
index 4b82befae..4b82befae 100644
--- a/cli/tests/testdata/test/steps/invalid_usage.out
+++ b/tests/testdata/test/steps/invalid_usage.out
diff --git a/cli/tests/testdata/test/steps/invalid_usage.ts b/tests/testdata/test/steps/invalid_usage.ts
index 1acfc874c..1acfc874c 100644
--- a/cli/tests/testdata/test/steps/invalid_usage.ts
+++ b/tests/testdata/test/steps/invalid_usage.ts
diff --git a/cli/tests/testdata/test/steps/output_within.out b/tests/testdata/test/steps/output_within.out
index d58722daa..d58722daa 100644
--- a/cli/tests/testdata/test/steps/output_within.out
+++ b/tests/testdata/test/steps/output_within.out
diff --git a/cli/tests/testdata/test/steps/output_within.ts b/tests/testdata/test/steps/output_within.ts
index d3438a8ad..d3438a8ad 100644
--- a/cli/tests/testdata/test/steps/output_within.ts
+++ b/tests/testdata/test/steps/output_within.ts
diff --git a/cli/tests/testdata/test/steps/passing_steps.dot.out b/tests/testdata/test/steps/passing_steps.dot.out
index 243cacd69..243cacd69 100644
--- a/cli/tests/testdata/test/steps/passing_steps.dot.out
+++ b/tests/testdata/test/steps/passing_steps.dot.out
diff --git a/cli/tests/testdata/test/steps/passing_steps.out b/tests/testdata/test/steps/passing_steps.out
index 0757a4ed3..0757a4ed3 100644
--- a/cli/tests/testdata/test/steps/passing_steps.out
+++ b/tests/testdata/test/steps/passing_steps.out
diff --git a/cli/tests/testdata/test/steps/passing_steps.tap.out b/tests/testdata/test/steps/passing_steps.tap.out
index 20a9fa312..20a9fa312 100644
--- a/cli/tests/testdata/test/steps/passing_steps.tap.out
+++ b/tests/testdata/test/steps/passing_steps.tap.out
diff --git a/cli/tests/testdata/test/steps/passing_steps.ts b/tests/testdata/test/steps/passing_steps.ts
index fd145954b..fd145954b 100644
--- a/cli/tests/testdata/test/steps/passing_steps.ts
+++ b/tests/testdata/test/steps/passing_steps.ts
diff --git a/cli/tests/testdata/test/text.md b/tests/testdata/test/text.md
index be89d24bf..be89d24bf 100644
--- a/cli/tests/testdata/test/text.md
+++ b/tests/testdata/test/text.md
diff --git a/cli/tests/testdata/test/text.out b/tests/testdata/test/text.out
index f1b7f7d01..f1b7f7d01 100644
--- a/cli/tests/testdata/test/text.out
+++ b/tests/testdata/test/text.out
diff --git a/cli/tests/testdata/test/trace_ops_caught_error/main.out b/tests/testdata/test/trace_ops_caught_error/main.out
index 192ed3a6d..192ed3a6d 100644
--- a/cli/tests/testdata/test/trace_ops_caught_error/main.out
+++ b/tests/testdata/test/trace_ops_caught_error/main.out
diff --git a/cli/tests/testdata/test/trace_ops_caught_error/main.ts b/tests/testdata/test/trace_ops_caught_error/main.ts
index 8194a8b2a..8194a8b2a 100644
--- a/cli/tests/testdata/test/trace_ops_caught_error/main.ts
+++ b/tests/testdata/test/trace_ops_caught_error/main.ts
diff --git a/cli/tests/testdata/test/uncaught_errors.out b/tests/testdata/test/uncaught_errors.out
index a52f95d57..a52f95d57 100644
--- a/cli/tests/testdata/test/uncaught_errors.out
+++ b/tests/testdata/test/uncaught_errors.out
diff --git a/cli/tests/testdata/test/uncaught_errors_1.ts b/tests/testdata/test/uncaught_errors_1.ts
index 166b23ac3..166b23ac3 100644
--- a/cli/tests/testdata/test/uncaught_errors_1.ts
+++ b/tests/testdata/test/uncaught_errors_1.ts
diff --git a/cli/tests/testdata/test/uncaught_errors_2.ts b/tests/testdata/test/uncaught_errors_2.ts
index 8cafbe291..8cafbe291 100644
--- a/cli/tests/testdata/test/uncaught_errors_2.ts
+++ b/tests/testdata/test/uncaught_errors_2.ts
diff --git a/cli/tests/testdata/test/uncaught_errors_3.ts b/tests/testdata/test/uncaught_errors_3.ts
index cb2a55036..cb2a55036 100644
--- a/cli/tests/testdata/test/uncaught_errors_3.ts
+++ b/tests/testdata/test/uncaught_errors_3.ts
diff --git a/cli/tests/testdata/test/unhandled_rejection.out b/tests/testdata/test/unhandled_rejection.out
index bc8387929..bc8387929 100644
--- a/cli/tests/testdata/test/unhandled_rejection.out
+++ b/tests/testdata/test/unhandled_rejection.out
diff --git a/cli/tests/testdata/test/unhandled_rejection.ts b/tests/testdata/test/unhandled_rejection.ts
index 32f3111ea..32f3111ea 100644
--- a/cli/tests/testdata/test/unhandled_rejection.ts
+++ b/tests/testdata/test/unhandled_rejection.ts
diff --git a/cli/tests/testdata/test/unresolved_promise.out b/tests/testdata/test/unresolved_promise.out
index 88535e171..88535e171 100644
--- a/cli/tests/testdata/test/unresolved_promise.out
+++ b/tests/testdata/test/unresolved_promise.out
diff --git a/cli/tests/testdata/test/unresolved_promise.ts b/tests/testdata/test/unresolved_promise.ts
index 25fe70762..25fe70762 100644
--- a/cli/tests/testdata/test/unresolved_promise.ts
+++ b/tests/testdata/test/unresolved_promise.ts
diff --git a/cli/tests/testdata/tls/README.md b/tests/testdata/tls/README.md
index 19bbaec35..19bbaec35 100644
--- a/cli/tests/testdata/tls/README.md
+++ b/tests/testdata/tls/README.md
diff --git a/cli/tests/testdata/tls/RootCA.crt b/tests/testdata/tls/RootCA.crt
index c2f84ceeb..c2f84ceeb 100644
--- a/cli/tests/testdata/tls/RootCA.crt
+++ b/tests/testdata/tls/RootCA.crt
diff --git a/cli/tests/testdata/tls/RootCA.key b/tests/testdata/tls/RootCA.key
index 98ce53b0b..98ce53b0b 100644
--- a/cli/tests/testdata/tls/RootCA.key
+++ b/tests/testdata/tls/RootCA.key
diff --git a/cli/tests/testdata/tls/RootCA.pem b/tests/testdata/tls/RootCA.pem
index c2f84ceeb..c2f84ceeb 100644
--- a/cli/tests/testdata/tls/RootCA.pem
+++ b/tests/testdata/tls/RootCA.pem
diff --git a/cli/tests/testdata/tls/domains.txt b/tests/testdata/tls/domains.txt
index 0bba95d33..0bba95d33 100644
--- a/cli/tests/testdata/tls/domains.txt
+++ b/tests/testdata/tls/domains.txt
diff --git a/cli/tests/testdata/tls/invalid.crt b/tests/testdata/tls/invalid.crt
index 688e32ede..688e32ede 100644
--- a/cli/tests/testdata/tls/invalid.crt
+++ b/tests/testdata/tls/invalid.crt
diff --git a/cli/tests/testdata/tls/invalid.key b/tests/testdata/tls/invalid.key
index b57bc2f68..b57bc2f68 100644
--- a/cli/tests/testdata/tls/invalid.key
+++ b/tests/testdata/tls/invalid.key
diff --git a/cli/tests/testdata/tls/localhost.crt b/tests/testdata/tls/localhost.crt
index a71ae9050..a71ae9050 100644
--- a/cli/tests/testdata/tls/localhost.crt
+++ b/tests/testdata/tls/localhost.crt
diff --git a/cli/tests/testdata/tls/localhost.key b/tests/testdata/tls/localhost.key
index 42774c977..42774c977 100644
--- a/cli/tests/testdata/tls/localhost.key
+++ b/tests/testdata/tls/localhost.key
diff --git a/cli/tests/testdata/tsc/a.js b/tests/testdata/tsc/a.js
index 5a7b3ff93..5a7b3ff93 100644
--- a/cli/tests/testdata/tsc/a.js
+++ b/tests/testdata/tsc/a.js
diff --git a/cli/tests/testdata/tsc/d.ts b/tests/testdata/tsc/d.ts
index 3c74b8c83..3c74b8c83 100644
--- a/cli/tests/testdata/tsc/d.ts
+++ b/tests/testdata/tsc/d.ts
diff --git a/cli/tests/testdata/tsc/node_modules/b.js b/tests/testdata/tsc/node_modules/b.js
index 191660935..191660935 100644
--- a/cli/tests/testdata/tsc/node_modules/b.js
+++ b/tests/testdata/tsc/node_modules/b.js
diff --git a/cli/tests/testdata/tsc/node_modules/c.js b/tests/testdata/tsc/node_modules/c.js
index cff71c44a..cff71c44a 100644
--- a/cli/tests/testdata/tsc/node_modules/c.js
+++ b/tests/testdata/tsc/node_modules/c.js
diff --git a/cli/tests/testdata/tsc/test.js b/tests/testdata/tsc/test.js
index b7f46b351..b7f46b351 100644
--- a/cli/tests/testdata/tsc/test.js
+++ b/tests/testdata/tsc/test.js
diff --git a/cli/tests/testdata/tsc2/file_exportc.ts b/tests/testdata/tsc2/file_exportc.ts
index efcc5bb46..efcc5bb46 100644
--- a/cli/tests/testdata/tsc2/file_exportc.ts
+++ b/tests/testdata/tsc2/file_exportc.ts
diff --git a/cli/tests/testdata/tsc2/file_libref.ts b/tests/testdata/tsc2/file_libref.ts
index 6f37da139..6f37da139 100644
--- a/cli/tests/testdata/tsc2/file_libref.ts
+++ b/tests/testdata/tsc2/file_libref.ts
diff --git a/cli/tests/testdata/tsc2/file_main.ts b/tests/testdata/tsc2/file_main.ts
index a45477fde..a45477fde 100644
--- a/cli/tests/testdata/tsc2/file_main.ts
+++ b/tests/testdata/tsc2/file_main.ts
diff --git a/cli/tests/testdata/tsc2/file_reexports.ts b/tests/testdata/tsc2/file_reexports.ts
index b26297423..b26297423 100644
--- a/cli/tests/testdata/tsc2/file_reexports.ts
+++ b/tests/testdata/tsc2/file_reexports.ts
diff --git a/cli/tests/testdata/tsc2/https_deno.land-x-a.ts b/tests/testdata/tsc2/https_deno.land-x-a.ts
index 72b3a67bc..72b3a67bc 100644
--- a/cli/tests/testdata/tsc2/https_deno.land-x-a.ts
+++ b/tests/testdata/tsc2/https_deno.land-x-a.ts
diff --git a/cli/tests/testdata/tsc2/https_deno.land-x-b.ts b/tests/testdata/tsc2/https_deno.land-x-b.ts
index 59d168993..59d168993 100644
--- a/cli/tests/testdata/tsc2/https_deno.land-x-b.ts
+++ b/tests/testdata/tsc2/https_deno.land-x-b.ts
diff --git a/cli/tests/testdata/tsc2/https_deno.land-x-c.d.ts b/tests/testdata/tsc2/https_deno.land-x-c.d.ts
index bf3a09240..bf3a09240 100644
--- a/cli/tests/testdata/tsc2/https_deno.land-x-c.d.ts
+++ b/tests/testdata/tsc2/https_deno.land-x-c.d.ts
diff --git a/cli/tests/testdata/tsc2/https_deno.land-x-c.js b/tests/testdata/tsc2/https_deno.land-x-c.js
index 7f2cfac77..7f2cfac77 100644
--- a/cli/tests/testdata/tsc2/https_deno.land-x-c.js
+++ b/tests/testdata/tsc2/https_deno.land-x-c.js
diff --git a/cli/tests/testdata/tsc2/https_deno.land-x-mod.ts b/tests/testdata/tsc2/https_deno.land-x-mod.ts
index a45477fde..a45477fde 100644
--- a/cli/tests/testdata/tsc2/https_deno.land-x-mod.ts
+++ b/tests/testdata/tsc2/https_deno.land-x-mod.ts
diff --git a/cli/tests/testdata/type_definitions/bar.d.ts b/tests/testdata/type_definitions/bar.d.ts
index d43335dbb..d43335dbb 100644
--- a/cli/tests/testdata/type_definitions/bar.d.ts
+++ b/tests/testdata/type_definitions/bar.d.ts
diff --git a/cli/tests/testdata/type_definitions/bar.js b/tests/testdata/type_definitions/bar.js
index e9c2e5193..e9c2e5193 100644
--- a/cli/tests/testdata/type_definitions/bar.js
+++ b/tests/testdata/type_definitions/bar.js
diff --git a/cli/tests/testdata/type_definitions/fizz.d.ts b/tests/testdata/type_definitions/fizz.d.ts
index 34eb41b96..34eb41b96 100644
--- a/cli/tests/testdata/type_definitions/fizz.d.ts
+++ b/tests/testdata/type_definitions/fizz.d.ts
diff --git a/cli/tests/testdata/type_definitions/fizz.js b/tests/testdata/type_definitions/fizz.js
index 852162c94..852162c94 100644
--- a/cli/tests/testdata/type_definitions/fizz.js
+++ b/tests/testdata/type_definitions/fizz.js
diff --git a/cli/tests/testdata/type_definitions/foo.d.ts b/tests/testdata/type_definitions/foo.d.ts
index ce39201e1..ce39201e1 100644
--- a/cli/tests/testdata/type_definitions/foo.d.ts
+++ b/tests/testdata/type_definitions/foo.d.ts
diff --git a/cli/tests/testdata/type_definitions/foo.js b/tests/testdata/type_definitions/foo.js
index 61d366eb2..61d366eb2 100644
--- a/cli/tests/testdata/type_definitions/foo.js
+++ b/tests/testdata/type_definitions/foo.js
diff --git a/cli/tests/testdata/type_definitions/qat.ts b/tests/testdata/type_definitions/qat.ts
index 6196c9d38..6196c9d38 100644
--- a/cli/tests/testdata/type_definitions/qat.ts
+++ b/tests/testdata/type_definitions/qat.ts
diff --git a/cli/tests/testdata/types/types.out b/tests/testdata/types/types.out
index 089a9381f..089a9381f 100644
--- a/cli/tests/testdata/types/types.out
+++ b/tests/testdata/types/types.out
diff --git a/cli/tests/testdata/vendor/dynamic.ts b/tests/testdata/vendor/dynamic.ts
index e2cbb0e59..e2cbb0e59 100644
--- a/cli/tests/testdata/vendor/dynamic.ts
+++ b/tests/testdata/vendor/dynamic.ts
diff --git a/cli/tests/testdata/vendor/dynamic_non_analyzable.ts b/tests/testdata/vendor/dynamic_non_analyzable.ts
index 1847939f6..1847939f6 100644
--- a/cli/tests/testdata/vendor/dynamic_non_analyzable.ts
+++ b/tests/testdata/vendor/dynamic_non_analyzable.ts
diff --git a/cli/tests/testdata/vendor/dynamic_non_existent.ts b/tests/testdata/vendor/dynamic_non_existent.ts
index a48e2accb..a48e2accb 100644
--- a/cli/tests/testdata/vendor/dynamic_non_existent.ts
+++ b/tests/testdata/vendor/dynamic_non_existent.ts
diff --git a/cli/tests/testdata/vendor/dynamic_non_existent.ts.out b/tests/testdata/vendor/dynamic_non_existent.ts.out
index a1b2ade81..a1b2ade81 100644
--- a/cli/tests/testdata/vendor/dynamic_non_existent.ts.out
+++ b/tests/testdata/vendor/dynamic_non_existent.ts.out
diff --git a/cli/tests/testdata/vendor/logger.ts b/tests/testdata/vendor/logger.ts
index 97f603a48..97f603a48 100644
--- a/cli/tests/testdata/vendor/logger.ts
+++ b/tests/testdata/vendor/logger.ts
diff --git a/cli/tests/testdata/vendor/mod.ts b/tests/testdata/vendor/mod.ts
index 8824d1b2a..8824d1b2a 100644
--- a/cli/tests/testdata/vendor/mod.ts
+++ b/tests/testdata/vendor/mod.ts
diff --git a/cli/tests/testdata/vendor/npm_and_node_specifier.ts b/tests/testdata/vendor/npm_and_node_specifier.ts
index 61962e836..61962e836 100644
--- a/cli/tests/testdata/vendor/npm_and_node_specifier.ts
+++ b/tests/testdata/vendor/npm_and_node_specifier.ts
diff --git a/cli/tests/testdata/vendor/query_reexport.ts b/tests/testdata/vendor/query_reexport.ts
index 5dfafb532..5dfafb532 100644
--- a/cli/tests/testdata/vendor/query_reexport.ts
+++ b/tests/testdata/vendor/query_reexport.ts
diff --git a/cli/tests/testdata/webcrypto/id_rsaEncryption.pem b/tests/testdata/webcrypto/id_rsaEncryption.pem
index 2719e5b11..2719e5b11 100644
--- a/cli/tests/testdata/webcrypto/id_rsaEncryption.pem
+++ b/tests/testdata/webcrypto/id_rsaEncryption.pem
diff --git a/cli/tests/testdata/webcrypto/id_rsassaPss.pem b/tests/testdata/webcrypto/id_rsassaPss.pem
index 938b8f7d8..938b8f7d8 100644
--- a/cli/tests/testdata/webcrypto/id_rsassaPss.pem
+++ b/tests/testdata/webcrypto/id_rsassaPss.pem
diff --git a/cli/tests/testdata/webcrypto/id_rsassaPss_default.pem b/tests/testdata/webcrypto/id_rsassaPss_default.pem
index b2b8dee5c..b2b8dee5c 100644
--- a/cli/tests/testdata/webcrypto/id_rsassaPss_default.pem
+++ b/tests/testdata/webcrypto/id_rsassaPss_default.pem
diff --git a/cli/tests/testdata/webcrypto/id_rsassaPss_saltLen_30.pem b/tests/testdata/webcrypto/id_rsassaPss_saltLen_30.pem
index 3d34cb013..3d34cb013 100644
--- a/cli/tests/testdata/webcrypto/id_rsassaPss_saltLen_30.pem
+++ b/tests/testdata/webcrypto/id_rsassaPss_saltLen_30.pem
diff --git a/cli/tests/testdata/webgpu/computepass_shader.wgsl b/tests/testdata/webgpu/computepass_shader.wgsl
index 41af4363a..41af4363a 100644
--- a/cli/tests/testdata/webgpu/computepass_shader.wgsl
+++ b/tests/testdata/webgpu/computepass_shader.wgsl
diff --git a/cli/tests/testdata/webgpu/hellotriangle.out b/tests/testdata/webgpu/hellotriangle.out
index 52972ec9e..52972ec9e 100644
--- a/cli/tests/testdata/webgpu/hellotriangle.out
+++ b/tests/testdata/webgpu/hellotriangle.out
Binary files differ
diff --git a/cli/tests/testdata/webgpu/hellotriangle_shader.wgsl b/tests/testdata/webgpu/hellotriangle_shader.wgsl
index f84ccfe94..f84ccfe94 100644
--- a/cli/tests/testdata/webgpu/hellotriangle_shader.wgsl
+++ b/tests/testdata/webgpu/hellotriangle_shader.wgsl
diff --git a/cli/tests/testdata/welcome.ts b/tests/testdata/welcome.ts
index f983ca89b..f983ca89b 100644
--- a/cli/tests/testdata/welcome.ts
+++ b/tests/testdata/welcome.ts
diff --git a/cli/tests/testdata/workers/async_error.ts b/tests/testdata/workers/async_error.ts
index 154b957b1..154b957b1 100644
--- a/cli/tests/testdata/workers/async_error.ts
+++ b/tests/testdata/workers/async_error.ts
diff --git a/cli/tests/testdata/workers/bench_large_message.ts b/tests/testdata/workers/bench_large_message.ts
index 4bab9fb5c..4bab9fb5c 100644
--- a/cli/tests/testdata/workers/bench_large_message.ts
+++ b/tests/testdata/workers/bench_large_message.ts
diff --git a/cli/tests/testdata/workers/bench_round_robin.ts b/tests/testdata/workers/bench_round_robin.ts
index 0380d7979..0380d7979 100644
--- a/cli/tests/testdata/workers/bench_round_robin.ts
+++ b/tests/testdata/workers/bench_round_robin.ts
diff --git a/cli/tests/testdata/workers/bench_startup.ts b/tests/testdata/workers/bench_startup.ts
index a4233d34c..a4233d34c 100644
--- a/cli/tests/testdata/workers/bench_startup.ts
+++ b/tests/testdata/workers/bench_startup.ts
diff --git a/cli/tests/testdata/workers/bench_worker.ts b/tests/testdata/workers/bench_worker.ts
index 1edd2750f..1edd2750f 100644
--- a/cli/tests/testdata/workers/bench_worker.ts
+++ b/tests/testdata/workers/bench_worker.ts
diff --git a/cli/tests/testdata/workers/broadcast_channel.ts b/tests/testdata/workers/broadcast_channel.ts
index 5076e9eb7..5076e9eb7 100644
--- a/cli/tests/testdata/workers/broadcast_channel.ts
+++ b/tests/testdata/workers/broadcast_channel.ts
diff --git a/cli/tests/testdata/workers/busy_worker.js b/tests/testdata/workers/busy_worker.js
index 7deba0321..7deba0321 100644
--- a/cli/tests/testdata/workers/busy_worker.js
+++ b/tests/testdata/workers/busy_worker.js
diff --git a/cli/tests/testdata/workers/close_in_wasm_reactions.js b/tests/testdata/workers/close_in_wasm_reactions.js
index abe573108..abe573108 100644
--- a/cli/tests/testdata/workers/close_in_wasm_reactions.js
+++ b/tests/testdata/workers/close_in_wasm_reactions.js
diff --git a/cli/tests/testdata/workers/close_nested_child.js b/tests/testdata/workers/close_nested_child.js
index 97980c689..97980c689 100644
--- a/cli/tests/testdata/workers/close_nested_child.js
+++ b/tests/testdata/workers/close_nested_child.js
diff --git a/cli/tests/testdata/workers/close_nested_parent.js b/tests/testdata/workers/close_nested_parent.js
index d1fe47553..d1fe47553 100644
--- a/cli/tests/testdata/workers/close_nested_parent.js
+++ b/tests/testdata/workers/close_nested_parent.js
diff --git a/cli/tests/testdata/workers/close_race_worker.js b/tests/testdata/workers/close_race_worker.js
index 6964be34a..6964be34a 100644
--- a/cli/tests/testdata/workers/close_race_worker.js
+++ b/tests/testdata/workers/close_race_worker.js
diff --git a/cli/tests/testdata/workers/custom_inspect/main.out b/tests/testdata/workers/custom_inspect/main.out
index 40d9b88ad..40d9b88ad 100644
--- a/cli/tests/testdata/workers/custom_inspect/main.out
+++ b/tests/testdata/workers/custom_inspect/main.out
diff --git a/cli/tests/testdata/workers/custom_inspect/main.ts b/tests/testdata/workers/custom_inspect/main.ts
index 93d4eec2d..93d4eec2d 100644
--- a/cli/tests/testdata/workers/custom_inspect/main.ts
+++ b/tests/testdata/workers/custom_inspect/main.ts
diff --git a/cli/tests/testdata/workers/custom_inspect/worker.ts b/tests/testdata/workers/custom_inspect/worker.ts
index 5be82724e..5be82724e 100644
--- a/cli/tests/testdata/workers/custom_inspect/worker.ts
+++ b/tests/testdata/workers/custom_inspect/worker.ts
diff --git a/tests/testdata/workers/deno_worker.ts b/tests/testdata/workers/deno_worker.ts
new file mode 100644
index 000000000..cbebde94a
--- /dev/null
+++ b/tests/testdata/workers/deno_worker.ts
@@ -0,0 +1,16 @@
+import { assert } from "../../../test_util/std/assert/mod.ts";
+
+onmessage = function (e) {
+ if (typeof self.Deno === "undefined") {
+ throw new Error("Deno namespace not available in worker");
+ }
+
+ assert(!Object.isFrozen(self.Deno));
+
+ const desc = Object.getOwnPropertyDescriptor(self, "Deno");
+ assert(desc);
+ assert(desc.configurable);
+ assert(!desc.writable);
+
+ postMessage(e.data);
+};
diff --git a/cli/tests/testdata/workers/drop_handle_race.js b/tests/testdata/workers/drop_handle_race.js
index 30676a600..30676a600 100644
--- a/cli/tests/testdata/workers/drop_handle_race.js
+++ b/tests/testdata/workers/drop_handle_race.js
diff --git a/cli/tests/testdata/workers/dynamic_remote.ts b/tests/testdata/workers/dynamic_remote.ts
index 54e4a4714..54e4a4714 100644
--- a/cli/tests/testdata/workers/dynamic_remote.ts
+++ b/tests/testdata/workers/dynamic_remote.ts
diff --git a/cli/tests/testdata/workers/env_read_check_worker.js b/tests/testdata/workers/env_read_check_worker.js
index 72ad31df2..72ad31df2 100644
--- a/cli/tests/testdata/workers/env_read_check_worker.js
+++ b/tests/testdata/workers/env_read_check_worker.js
diff --git a/cli/tests/testdata/workers/error.ts b/tests/testdata/workers/error.ts
index 495971090..495971090 100644
--- a/cli/tests/testdata/workers/error.ts
+++ b/tests/testdata/workers/error.ts
diff --git a/cli/tests/testdata/workers/error_event.ts b/tests/testdata/workers/error_event.ts
index 70e7728ab..70e7728ab 100644
--- a/cli/tests/testdata/workers/error_event.ts
+++ b/tests/testdata/workers/error_event.ts
diff --git a/cli/tests/testdata/workers/error_event.ts.out b/tests/testdata/workers/error_event.ts.out
index 833cca8be..833cca8be 100644
--- a/cli/tests/testdata/workers/error_event.ts.out
+++ b/tests/testdata/workers/error_event.ts.out
diff --git a/cli/tests/testdata/workers/error_worker_permissions_local.ts b/tests/testdata/workers/error_worker_permissions_local.ts
index 1a4b4c0a9..1a4b4c0a9 100644
--- a/cli/tests/testdata/workers/error_worker_permissions_local.ts
+++ b/tests/testdata/workers/error_worker_permissions_local.ts
diff --git a/cli/tests/testdata/workers/error_worker_permissions_local.ts.out b/tests/testdata/workers/error_worker_permissions_local.ts.out
index cacc8ae38..cacc8ae38 100644
--- a/cli/tests/testdata/workers/error_worker_permissions_local.ts.out
+++ b/tests/testdata/workers/error_worker_permissions_local.ts.out
diff --git a/cli/tests/testdata/workers/error_worker_permissions_remote.ts b/tests/testdata/workers/error_worker_permissions_remote.ts
index 878c7080a..878c7080a 100644
--- a/cli/tests/testdata/workers/error_worker_permissions_remote.ts
+++ b/tests/testdata/workers/error_worker_permissions_remote.ts
diff --git a/cli/tests/testdata/workers/error_worker_permissions_remote.ts.out b/tests/testdata/workers/error_worker_permissions_remote.ts.out
index afecff0a8..afecff0a8 100644
--- a/cli/tests/testdata/workers/error_worker_permissions_remote.ts.out
+++ b/tests/testdata/workers/error_worker_permissions_remote.ts.out
diff --git a/cli/tests/testdata/workers/event_worker.js b/tests/testdata/workers/event_worker.js
index 849b6026c..849b6026c 100644
--- a/cli/tests/testdata/workers/event_worker.js
+++ b/tests/testdata/workers/event_worker.js
diff --git a/cli/tests/testdata/workers/event_worker_scope.js b/tests/testdata/workers/event_worker_scope.js
index 0381801a8..0381801a8 100644
--- a/cli/tests/testdata/workers/event_worker_scope.js
+++ b/tests/testdata/workers/event_worker_scope.js
diff --git a/cli/tests/testdata/workers/fetching_worker.js b/tests/testdata/workers/fetching_worker.js
index 77ff471d7..77ff471d7 100644
--- a/cli/tests/testdata/workers/fetching_worker.js
+++ b/tests/testdata/workers/fetching_worker.js
diff --git a/cli/tests/testdata/workers/http_worker.js b/tests/testdata/workers/http_worker.js
index 3cd1625ab..3cd1625ab 100644
--- a/cli/tests/testdata/workers/http_worker.js
+++ b/tests/testdata/workers/http_worker.js
diff --git a/cli/tests/testdata/workers/image_data_worker.ts b/tests/testdata/workers/image_data_worker.ts
index bf920d2f3..bf920d2f3 100644
--- a/cli/tests/testdata/workers/image_data_worker.ts
+++ b/tests/testdata/workers/image_data_worker.ts
diff --git a/cli/tests/testdata/workers/immediately_close_worker.js b/tests/testdata/workers/immediately_close_worker.js
index 8fd27343a..8fd27343a 100644
--- a/cli/tests/testdata/workers/immediately_close_worker.js
+++ b/tests/testdata/workers/immediately_close_worker.js
diff --git a/cli/tests/testdata/workers/message_before_close.js b/tests/testdata/workers/message_before_close.js
index 9364b6d82..9364b6d82 100644
--- a/cli/tests/testdata/workers/message_before_close.js
+++ b/tests/testdata/workers/message_before_close.js
diff --git a/cli/tests/testdata/workers/message_handler_error.ts b/tests/testdata/workers/message_handler_error.ts
index 3416faad1..3416faad1 100644
--- a/cli/tests/testdata/workers/message_handler_error.ts
+++ b/tests/testdata/workers/message_handler_error.ts
diff --git a/cli/tests/testdata/workers/message_port.ts b/tests/testdata/workers/message_port.ts
index d78304a39..d78304a39 100644
--- a/cli/tests/testdata/workers/message_port.ts
+++ b/tests/testdata/workers/message_port.ts
diff --git a/cli/tests/testdata/workers/nested_worker.js b/tests/testdata/workers/nested_worker.js
index 2273cdbfa..2273cdbfa 100644
--- a/cli/tests/testdata/workers/nested_worker.js
+++ b/tests/testdata/workers/nested_worker.js
diff --git a/cli/tests/testdata/workers/no_permissions_worker.js b/tests/testdata/workers/no_permissions_worker.js
index f49f690ab..f49f690ab 100644
--- a/cli/tests/testdata/workers/no_permissions_worker.js
+++ b/tests/testdata/workers/no_permissions_worker.js
diff --git a/cli/tests/testdata/workers/non_deno_worker.js b/tests/testdata/workers/non_deno_worker.js
index 773721560..773721560 100644
--- a/cli/tests/testdata/workers/non_deno_worker.js
+++ b/tests/testdata/workers/non_deno_worker.js
diff --git a/cli/tests/testdata/workers/nonexistent_worker.out b/tests/testdata/workers/nonexistent_worker.out
index a624c0b51..a624c0b51 100644
--- a/cli/tests/testdata/workers/nonexistent_worker.out
+++ b/tests/testdata/workers/nonexistent_worker.out
diff --git a/cli/tests/testdata/workers/nonexistent_worker.ts b/tests/testdata/workers/nonexistent_worker.ts
index b30d08636..b30d08636 100644
--- a/cli/tests/testdata/workers/nonexistent_worker.ts
+++ b/tests/testdata/workers/nonexistent_worker.ts
diff --git a/cli/tests/testdata/workers/parent_read_check_worker.js b/tests/testdata/workers/parent_read_check_worker.js
index 3221fc597..3221fc597 100644
--- a/cli/tests/testdata/workers/parent_read_check_worker.js
+++ b/tests/testdata/workers/parent_read_check_worker.js
diff --git a/cli/tests/testdata/workers/permission_echo.js b/tests/testdata/workers/permission_echo.js
index f492a25f2..f492a25f2 100644
--- a/cli/tests/testdata/workers/permission_echo.js
+++ b/tests/testdata/workers/permission_echo.js
diff --git a/cli/tests/testdata/workers/permissions_blob_local.ts b/tests/testdata/workers/permissions_blob_local.ts
index 52f630bd8..52f630bd8 100644
--- a/cli/tests/testdata/workers/permissions_blob_local.ts
+++ b/tests/testdata/workers/permissions_blob_local.ts
diff --git a/cli/tests/testdata/workers/permissions_blob_local.ts.out b/tests/testdata/workers/permissions_blob_local.ts.out
index 0cd581f7b..0cd581f7b 100644
--- a/cli/tests/testdata/workers/permissions_blob_local.ts.out
+++ b/tests/testdata/workers/permissions_blob_local.ts.out
diff --git a/cli/tests/testdata/workers/permissions_blob_remote.ts b/tests/testdata/workers/permissions_blob_remote.ts
index 4808bc57b..4808bc57b 100644
--- a/cli/tests/testdata/workers/permissions_blob_remote.ts
+++ b/tests/testdata/workers/permissions_blob_remote.ts
diff --git a/cli/tests/testdata/workers/permissions_blob_remote.ts.out b/tests/testdata/workers/permissions_blob_remote.ts.out
index 618f552dc..618f552dc 100644
--- a/cli/tests/testdata/workers/permissions_blob_remote.ts.out
+++ b/tests/testdata/workers/permissions_blob_remote.ts.out
diff --git a/cli/tests/testdata/workers/permissions_data_local.ts b/tests/testdata/workers/permissions_data_local.ts
index cda80bed6..cda80bed6 100644
--- a/cli/tests/testdata/workers/permissions_data_local.ts
+++ b/tests/testdata/workers/permissions_data_local.ts
diff --git a/cli/tests/testdata/workers/permissions_data_local.ts.out b/tests/testdata/workers/permissions_data_local.ts.out
index 4e0f72779..4e0f72779 100644
--- a/cli/tests/testdata/workers/permissions_data_local.ts.out
+++ b/tests/testdata/workers/permissions_data_local.ts.out
diff --git a/cli/tests/testdata/workers/permissions_data_remote.ts b/tests/testdata/workers/permissions_data_remote.ts
index b37bd661d..b37bd661d 100644
--- a/cli/tests/testdata/workers/permissions_data_remote.ts
+++ b/tests/testdata/workers/permissions_data_remote.ts
diff --git a/cli/tests/testdata/workers/permissions_data_remote.ts.out b/tests/testdata/workers/permissions_data_remote.ts.out
index 3f7c8cb63..3f7c8cb63 100644
--- a/cli/tests/testdata/workers/permissions_data_remote.ts.out
+++ b/tests/testdata/workers/permissions_data_remote.ts.out
diff --git a/cli/tests/testdata/workers/permissions_dynamic_remote.ts b/tests/testdata/workers/permissions_dynamic_remote.ts
index 54a361bc0..54a361bc0 100644
--- a/cli/tests/testdata/workers/permissions_dynamic_remote.ts
+++ b/tests/testdata/workers/permissions_dynamic_remote.ts
diff --git a/cli/tests/testdata/workers/permissions_dynamic_remote.ts.out b/tests/testdata/workers/permissions_dynamic_remote.ts.out
index 91f3cc6d5..91f3cc6d5 100644
--- a/cli/tests/testdata/workers/permissions_dynamic_remote.ts.out
+++ b/tests/testdata/workers/permissions_dynamic_remote.ts.out
diff --git a/cli/tests/testdata/workers/permissions_remote_remote.ts b/tests/testdata/workers/permissions_remote_remote.ts
index 4df2a8a5d..4df2a8a5d 100644
--- a/cli/tests/testdata/workers/permissions_remote_remote.ts
+++ b/tests/testdata/workers/permissions_remote_remote.ts
diff --git a/cli/tests/testdata/workers/permissions_remote_remote.ts.out b/tests/testdata/workers/permissions_remote_remote.ts.out
index bb065740a..bb065740a 100644
--- a/cli/tests/testdata/workers/permissions_remote_remote.ts.out
+++ b/tests/testdata/workers/permissions_remote_remote.ts.out
diff --git a/cli/tests/testdata/workers/post_undefined.ts b/tests/testdata/workers/post_undefined.ts
index 1b9b8d6ca..1b9b8d6ca 100644
--- a/cli/tests/testdata/workers/post_undefined.ts
+++ b/tests/testdata/workers/post_undefined.ts
diff --git a/cli/tests/testdata/workers/racy_worker.js b/tests/testdata/workers/racy_worker.js
index 0f66c6278..0f66c6278 100644
--- a/cli/tests/testdata/workers/racy_worker.js
+++ b/tests/testdata/workers/racy_worker.js
diff --git a/cli/tests/testdata/workers/read_check_granular_worker.js b/tests/testdata/workers/read_check_granular_worker.js
index d40fac876..d40fac876 100644
--- a/cli/tests/testdata/workers/read_check_granular_worker.js
+++ b/tests/testdata/workers/read_check_granular_worker.js
diff --git a/cli/tests/testdata/workers/read_check_worker.js b/tests/testdata/workers/read_check_worker.js
index 2ad01bf5b..2ad01bf5b 100644
--- a/cli/tests/testdata/workers/read_check_worker.js
+++ b/tests/testdata/workers/read_check_worker.js
diff --git a/cli/tests/testdata/workers/shared_array_buffer.ts b/tests/testdata/workers/shared_array_buffer.ts
index 4af95863a..4af95863a 100644
--- a/cli/tests/testdata/workers/shared_array_buffer.ts
+++ b/tests/testdata/workers/shared_array_buffer.ts
diff --git a/cli/tests/testdata/workers/sibling_worker.js b/tests/testdata/workers/sibling_worker.js
index 99707e5d6..99707e5d6 100644
--- a/cli/tests/testdata/workers/sibling_worker.js
+++ b/tests/testdata/workers/sibling_worker.js
diff --git a/cli/tests/testdata/workers/static_remote.ts b/tests/testdata/workers/static_remote.ts
index 2d6e820fd..2d6e820fd 100644
--- a/cli/tests/testdata/workers/static_remote.ts
+++ b/tests/testdata/workers/static_remote.ts
diff --git a/cli/tests/testdata/workers/terminate_tla_crash.js b/tests/testdata/workers/terminate_tla_crash.js
index f793b8c8e..f793b8c8e 100644
--- a/cli/tests/testdata/workers/terminate_tla_crash.js
+++ b/tests/testdata/workers/terminate_tla_crash.js
diff --git a/cli/tests/testdata/workers/terminate_tla_crash.js.out b/tests/testdata/workers/terminate_tla_crash.js.out
index e69de29bb..e69de29bb 100644
--- a/cli/tests/testdata/workers/terminate_tla_crash.js.out
+++ b/tests/testdata/workers/terminate_tla_crash.js.out
diff --git a/cli/tests/testdata/workers/test_worker.js b/tests/testdata/workers/test_worker.js
index 2b2d1eeec..2b2d1eeec 100644
--- a/cli/tests/testdata/workers/test_worker.js
+++ b/tests/testdata/workers/test_worker.js
diff --git a/cli/tests/testdata/workers/test_worker.ts b/tests/testdata/workers/test_worker.ts
index 996476058..996476058 100644
--- a/cli/tests/testdata/workers/test_worker.ts
+++ b/tests/testdata/workers/test_worker.ts
diff --git a/cli/tests/testdata/workers/throwing_worker.js b/tests/testdata/workers/throwing_worker.js
index 56ee4ff88..56ee4ff88 100644
--- a/cli/tests/testdata/workers/throwing_worker.js
+++ b/tests/testdata/workers/throwing_worker.js
diff --git a/cli/tests/testdata/workers/worker_async_error.ts b/tests/testdata/workers/worker_async_error.ts
index 7941a5bbe..7941a5bbe 100644
--- a/cli/tests/testdata/workers/worker_async_error.ts
+++ b/tests/testdata/workers/worker_async_error.ts
diff --git a/cli/tests/testdata/workers/worker_async_error.ts.out b/tests/testdata/workers/worker_async_error.ts.out
index 8d017859c..8d017859c 100644
--- a/cli/tests/testdata/workers/worker_async_error.ts.out
+++ b/tests/testdata/workers/worker_async_error.ts.out
diff --git a/cli/tests/testdata/workers/worker_crypto.js b/tests/testdata/workers/worker_crypto.js
index 4398ad068..4398ad068 100644
--- a/cli/tests/testdata/workers/worker_crypto.js
+++ b/tests/testdata/workers/worker_crypto.js
diff --git a/cli/tests/testdata/workers/worker_doest_stall_event_loop.ts b/tests/testdata/workers/worker_doest_stall_event_loop.ts
index bfddee2ec..bfddee2ec 100644
--- a/cli/tests/testdata/workers/worker_doest_stall_event_loop.ts
+++ b/tests/testdata/workers/worker_doest_stall_event_loop.ts
diff --git a/cli/tests/testdata/workers/worker_doest_stall_event_loop.ts.out b/tests/testdata/workers/worker_doest_stall_event_loop.ts.out
index 5ed65b02f..5ed65b02f 100644
--- a/cli/tests/testdata/workers/worker_doest_stall_event_loop.ts.out
+++ b/tests/testdata/workers/worker_doest_stall_event_loop.ts.out
diff --git a/cli/tests/testdata/workers/worker_error.ts b/tests/testdata/workers/worker_error.ts
index 403223d0a..403223d0a 100644
--- a/cli/tests/testdata/workers/worker_error.ts
+++ b/tests/testdata/workers/worker_error.ts
diff --git a/cli/tests/testdata/workers/worker_error.ts.out b/tests/testdata/workers/worker_error.ts.out
index 1dd017770..1dd017770 100644
--- a/cli/tests/testdata/workers/worker_error.ts.out
+++ b/tests/testdata/workers/worker_error.ts.out
diff --git a/cli/tests/testdata/workers/worker_event_handlers.js b/tests/testdata/workers/worker_event_handlers.js
index 5e457cd2e..5e457cd2e 100644
--- a/cli/tests/testdata/workers/worker_event_handlers.js
+++ b/tests/testdata/workers/worker_event_handlers.js
diff --git a/cli/tests/testdata/workers/worker_globals.ts b/tests/testdata/workers/worker_globals.ts
index 90e369e41..90e369e41 100644
--- a/cli/tests/testdata/workers/worker_globals.ts
+++ b/tests/testdata/workers/worker_globals.ts
diff --git a/cli/tests/testdata/workers/worker_large_message.js b/tests/testdata/workers/worker_large_message.js
index a1ddae4f9..a1ddae4f9 100644
--- a/cli/tests/testdata/workers/worker_large_message.js
+++ b/tests/testdata/workers/worker_large_message.js
diff --git a/cli/tests/testdata/workers/worker_location.ts b/tests/testdata/workers/worker_location.ts
index c3c1bb26f..c3c1bb26f 100644
--- a/cli/tests/testdata/workers/worker_location.ts
+++ b/tests/testdata/workers/worker_location.ts
diff --git a/cli/tests/testdata/workers/worker_message_handler_error.ts b/tests/testdata/workers/worker_message_handler_error.ts
index 355d86770..355d86770 100644
--- a/cli/tests/testdata/workers/worker_message_handler_error.ts
+++ b/tests/testdata/workers/worker_message_handler_error.ts
diff --git a/cli/tests/testdata/workers/worker_message_handler_error.ts.out b/tests/testdata/workers/worker_message_handler_error.ts.out
index 0f97e9703..0f97e9703 100644
--- a/cli/tests/testdata/workers/worker_message_handler_error.ts.out
+++ b/tests/testdata/workers/worker_message_handler_error.ts.out
diff --git a/cli/tests/testdata/workers/worker_navigator.ts b/tests/testdata/workers/worker_navigator.ts
index bd364a8f9..bd364a8f9 100644
--- a/cli/tests/testdata/workers/worker_navigator.ts
+++ b/tests/testdata/workers/worker_navigator.ts
diff --git a/cli/tests/testdata/workers/worker_nested_error.ts b/tests/testdata/workers/worker_nested_error.ts
index 48bdea109..48bdea109 100644
--- a/cli/tests/testdata/workers/worker_nested_error.ts
+++ b/tests/testdata/workers/worker_nested_error.ts
diff --git a/cli/tests/testdata/workers/worker_nested_error.ts.out b/tests/testdata/workers/worker_nested_error.ts.out
index 3622acfb3..3622acfb3 100644
--- a/cli/tests/testdata/workers/worker_nested_error.ts.out
+++ b/tests/testdata/workers/worker_nested_error.ts.out
diff --git a/cli/tests/testdata/workers/worker_structured_cloning.ts b/tests/testdata/workers/worker_structured_cloning.ts
index eb1719a9a..eb1719a9a 100644
--- a/cli/tests/testdata/workers/worker_structured_cloning.ts
+++ b/tests/testdata/workers/worker_structured_cloning.ts
diff --git a/cli/tests/testdata/workers/worker_types.ts b/tests/testdata/workers/worker_types.ts
index b67a3b782..b67a3b782 100644
--- a/cli/tests/testdata/workers/worker_types.ts
+++ b/tests/testdata/workers/worker_types.ts
diff --git a/cli/tests/testdata/workers/worker_unstable.ts b/tests/testdata/workers/worker_unstable.ts
index 219f34e7b..219f34e7b 100644
--- a/cli/tests/testdata/workers/worker_unstable.ts
+++ b/tests/testdata/workers/worker_unstable.ts
diff --git a/cli/tests/testdata/workers/worker_with_top_level_await.ts b/tests/testdata/workers/worker_with_top_level_await.ts
index 1d20bb736..1d20bb736 100644
--- a/cli/tests/testdata/workers/worker_with_top_level_await.ts
+++ b/tests/testdata/workers/worker_with_top_level_await.ts
diff --git a/cli/tests/unit/README.md b/tests/unit/README.md
index af31c08fc..af31c08fc 100644
--- a/cli/tests/unit/README.md
+++ b/tests/unit/README.md
diff --git a/cli/tests/unit/abort_controller_test.ts b/tests/unit/abort_controller_test.ts
index 60ea6aa24..60ea6aa24 100644
--- a/cli/tests/unit/abort_controller_test.ts
+++ b/tests/unit/abort_controller_test.ts
diff --git a/cli/tests/unit/blob_test.ts b/tests/unit/blob_test.ts
index e6623a65c..e6623a65c 100644
--- a/cli/tests/unit/blob_test.ts
+++ b/tests/unit/blob_test.ts
diff --git a/cli/tests/unit/body_test.ts b/tests/unit/body_test.ts
index 18cdb22be..18cdb22be 100644
--- a/cli/tests/unit/body_test.ts
+++ b/tests/unit/body_test.ts
diff --git a/cli/tests/unit/broadcast_channel_test.ts b/tests/unit/broadcast_channel_test.ts
index c5d7f7e7f..c5d7f7e7f 100644
--- a/cli/tests/unit/broadcast_channel_test.ts
+++ b/tests/unit/broadcast_channel_test.ts
diff --git a/cli/tests/unit/buffer_test.ts b/tests/unit/buffer_test.ts
index 9d7e51a95..9d7e51a95 100644
--- a/cli/tests/unit/buffer_test.ts
+++ b/tests/unit/buffer_test.ts
diff --git a/cli/tests/unit/build_test.ts b/tests/unit/build_test.ts
index f697b64d3..f697b64d3 100644
--- a/cli/tests/unit/build_test.ts
+++ b/tests/unit/build_test.ts
diff --git a/cli/tests/unit/cache_api_test.ts b/tests/unit/cache_api_test.ts
index 792929870..792929870 100644
--- a/cli/tests/unit/cache_api_test.ts
+++ b/tests/unit/cache_api_test.ts
diff --git a/cli/tests/unit/chmod_test.ts b/tests/unit/chmod_test.ts
index df3771bbc..df3771bbc 100644
--- a/cli/tests/unit/chmod_test.ts
+++ b/tests/unit/chmod_test.ts
diff --git a/cli/tests/unit/chown_test.ts b/tests/unit/chown_test.ts
index 033d4592d..033d4592d 100644
--- a/cli/tests/unit/chown_test.ts
+++ b/tests/unit/chown_test.ts
diff --git a/cli/tests/unit/command_test.ts b/tests/unit/command_test.ts
index cbb1c4921..cbb1c4921 100644
--- a/cli/tests/unit/command_test.ts
+++ b/tests/unit/command_test.ts
diff --git a/cli/tests/unit/console_test.ts b/tests/unit/console_test.ts
index 2f24b2c4e..2f24b2c4e 100644
--- a/cli/tests/unit/console_test.ts
+++ b/tests/unit/console_test.ts
diff --git a/cli/tests/unit/copy_file_test.ts b/tests/unit/copy_file_test.ts
index ad467f510..ad467f510 100644
--- a/cli/tests/unit/copy_file_test.ts
+++ b/tests/unit/copy_file_test.ts
diff --git a/cli/tests/unit/cron_test.ts b/tests/unit/cron_test.ts
index 02573a898..02573a898 100644
--- a/cli/tests/unit/cron_test.ts
+++ b/tests/unit/cron_test.ts
diff --git a/cli/tests/unit/custom_event_test.ts b/tests/unit/custom_event_test.ts
index b72084eb2..b72084eb2 100644
--- a/cli/tests/unit/custom_event_test.ts
+++ b/tests/unit/custom_event_test.ts
diff --git a/cli/tests/unit/dir_test.ts b/tests/unit/dir_test.ts
index 4aaadfb12..4aaadfb12 100644
--- a/cli/tests/unit/dir_test.ts
+++ b/tests/unit/dir_test.ts
diff --git a/cli/tests/unit/dom_exception_test.ts b/tests/unit/dom_exception_test.ts
index de335e105..de335e105 100644
--- a/cli/tests/unit/dom_exception_test.ts
+++ b/tests/unit/dom_exception_test.ts
diff --git a/cli/tests/unit/error_stack_test.ts b/tests/unit/error_stack_test.ts
index 7188b9f53..7188b9f53 100644
--- a/cli/tests/unit/error_stack_test.ts
+++ b/tests/unit/error_stack_test.ts
diff --git a/cli/tests/unit/error_test.ts b/tests/unit/error_test.ts
index 9ba09ce0d..9ba09ce0d 100644
--- a/cli/tests/unit/error_test.ts
+++ b/tests/unit/error_test.ts
diff --git a/cli/tests/unit/esnext_test.ts b/tests/unit/esnext_test.ts
index 6b2334f42..6b2334f42 100644
--- a/cli/tests/unit/esnext_test.ts
+++ b/tests/unit/esnext_test.ts
diff --git a/cli/tests/unit/event_target_test.ts b/tests/unit/event_target_test.ts
index b084eaf90..b084eaf90 100644
--- a/cli/tests/unit/event_target_test.ts
+++ b/tests/unit/event_target_test.ts
diff --git a/cli/tests/unit/event_test.ts b/tests/unit/event_test.ts
index c82873cf6..c82873cf6 100644
--- a/cli/tests/unit/event_test.ts
+++ b/tests/unit/event_test.ts
diff --git a/tests/unit/fetch_test.ts b/tests/unit/fetch_test.ts
new file mode 100644
index 000000000..80837a456
--- /dev/null
+++ b/tests/unit/fetch_test.ts
@@ -0,0 +1,2071 @@
+// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
+import {
+ assert,
+ assertEquals,
+ assertRejects,
+ assertThrows,
+ delay,
+ fail,
+ unimplemented,
+} from "./test_util.ts";
+import { Buffer } from "@test_util/std/io/buffer.ts";
+
+const listenPort = 4506;
+
+Deno.test(
+ { permissions: { net: true } },
+ async function fetchRequiresOneArgument() {
+ await assertRejects(
+ fetch as unknown as () => Promise<void>,
+ TypeError,
+ );
+ },
+);
+
+Deno.test({ permissions: { net: true } }, async function fetchProtocolError() {
+ await assertRejects(
+ async () => {
+ await fetch("ftp://localhost:21/a/file");
+ },
+ TypeError,
+ "not supported",
+ );
+});
+
+function findClosedPortInRange(
+ minPort: number,
+ maxPort: number,
+): number | never {
+ let port = minPort;
+
+ // If we hit the return statement of this loop
+ // that means that we did not throw an
+ // AddrInUse error when we executed Deno.listen.
+ while (port < maxPort) {
+ try {
+ const listener = Deno.listen({ port });
+ listener.close();
+ return port;
+ } catch (_e) {
+ port++;
+ }
+ }
+
+ unimplemented(
+ `No available ports between ${minPort} and ${maxPort} to test fetch`,
+ );
+}
+
+Deno.test(
+ // TODO(bartlomieju): reenable this test
+ // https://github.com/denoland/deno/issues/18350
+ { ignore: Deno.build.os === "windows", permissions: { net: true } },
+ async function fetchConnectionError() {
+ const port = findClosedPortInRange(4000, 9999);
+ await assertRejects(
+ async () => {
+ await fetch(`http://localhost:${port}`);
+ },
+ TypeError,
+ "error trying to connect",
+ );
+ },
+);
+
+Deno.test(
+ { permissions: { net: true } },
+ async function fetchDnsError() {
+ await assertRejects(
+ async () => {
+ await fetch("http://nil/");
+ },
+ TypeError,
+ "error trying to connect",
+ );
+ },
+);
+
+Deno.test(
+ { permissions: { net: true } },
+ async function fetchInvalidUriError() {
+ await assertRejects(
+ async () => {
+ await fetch("http://<invalid>/");
+ },
+ TypeError,
+ );
+ },
+);
+
+Deno.test(
+ { permissions: { net: true } },
+ async function fetchMalformedUriError() {
+ await assertRejects(
+ async () => {
+ const url = new URL("http://{{google/");
+ await fetch(url);
+ },
+ TypeError,
+ );
+ },
+);
+
+Deno.test({ permissions: { net: true } }, async function fetchJsonSuccess() {
+ const response = await fetch("http://localhost:4545/assets/fixture.json");
+ const json = await response.json();
+ assertEquals(json.name, "deno");
+});
+
+Deno.test({ permissions: { net: false } }, async function fetchPerm() {
+ await assertRejects(async () => {
+ await fetch("http://localhost:4545/assets/fixture.json");
+ }, Deno.errors.PermissionDenied);
+});
+
+Deno.test({ permissions: { net: true } }, async function fetchUrl() {
+ const response = await fetch("http://localhost:4545/assets/fixture.json");
+ assertEquals(response.url, "http://localhost:4545/assets/fixture.json");
+ const _json = await response.json();
+});
+
+Deno.test({ permissions: { net: true } }, async function fetchURL() {
+ const response = await fetch(
+ new URL("http://localhost:4545/assets/fixture.json"),
+ );
+ assertEquals(response.url, "http://localhost:4545/assets/fixture.json");
+ const _json = await response.json();
+});
+
+Deno.test({ permissions: { net: true } }, async function fetchHeaders() {
+ const response = await fetch("http://localhost:4545/assets/fixture.json");
+ const headers = response.headers;
+ assertEquals(headers.get("Content-Type"), "application/json");
+ const _json = await response.json();
+});
+
+Deno.test({ permissions: { net: true } }, async function fetchBlob() {
+ const response = await fetch("http://localhost:4545/assets/fixture.json");
+ const headers = response.headers;
+ const blob = await response.blob();
+ assertEquals(blob.type, headers.get("Content-Type"));
+ assertEquals(blob.size, Number(headers.get("Content-Length")));
+});
+
+Deno.test(
+ { permissions: { net: true } },
+ async function fetchBodyUsedReader() {
+ const response = await fetch(
+ "http://localhost:4545/assets/fixture.json",
+ );
+ assert(response.body !== null);
+
+ const reader = response.body.getReader();
+ // Getting a reader should lock the stream but does not consume the body
+ // so bodyUsed should not be true
+ assertEquals(response.bodyUsed, false);
+ reader.releaseLock();
+ await response.json();
+ assertEquals(response.bodyUsed, true);
+ },
+);
+
+Deno.test(
+ { permissions: { net: true } },
+ async function fetchBodyUsedCancelStream() {
+ const response = await fetch(
+ "http://localhost:4545/assets/fixture.json",
+ );
+ assert(response.body !== null);
+
+ assertEquals(response.bodyUsed, false);
+ const promise = response.body.cancel();
+ assertEquals(response.bodyUsed, true);
+ await promise;
+ },
+);
+
+Deno.test({ permissions: { net: true } }, async function fetchAsyncIterator() {
+ const response = await fetch("http://localhost:4545/assets/fixture.json");
+ const headers = response.headers;
+
+ assert(response.body !== null);
+ let total = 0;
+ for await (const chunk of response.body) {
+ assert(chunk instanceof Uint8Array);
+ total += chunk.length;
+ }
+
+ assertEquals(total, Number(headers.get("Content-Length")));
+});
+
+Deno.test({ permissions: { net: true } }, async function fetchBodyReader() {
+ const response = await fetch("http://localhost:4545/assets/fixture.json");
+ const headers = response.headers;
+ assert(response.body !== null);
+ const reader = response.body.getReader();
+ let total = 0;
+ while (true) {
+ const { done, value } = await reader.read();
+ if (done) break;
+ assert(value);
+ assert(value instanceof Uint8Array);
+ total += value.length;
+ }
+
+ assertEquals(total, Number(headers.get("Content-Length")));
+});
+
+Deno.test(
+ { permissions: { net: true } },
+ async function fetchBodyReaderBigBody() {
+ const data = "a".repeat(10 << 10); // 10mb
+ const response = await fetch("http://localhost:4545/echo_server", {
+ method: "POST",
+ body: data,
+ });
+ assert(response.body !== null);
+ const reader = await response.body.getReader();
+ let total = 0;
+ while (true) {
+ const { done, value } = await reader.read();
+ if (done) break;
+ assert(value);
+ total += value.length;
+ }
+
+ assertEquals(total, data.length);
+ },
+);
+
+Deno.test({ permissions: { net: true } }, async function responseClone() {
+ const response = await fetch("http://localhost:4545/assets/fixture.json");
+ const response1 = response.clone();
+ assert(response !== response1);
+ assertEquals(response.status, response1.status);
+ assertEquals(response.statusText, response1.statusText);
+ const u8a = new Uint8Array(await response.arrayBuffer());
+ const u8a1 = new Uint8Array(await response1.arrayBuffer());
+ for (let i = 0; i < u8a.byteLength; i++) {
+ assertEquals(u8a[i], u8a1[i]);
+ }
+});
+
+Deno.test(
+ { permissions: { net: true } },
+ async function fetchMultipartFormDataSuccess() {
+ const response = await fetch(
+ "http://localhost:4545/multipart_form_data.txt",
+ );
+ const formData = await response.formData();
+ assert(formData.has("field_1"));
+ assertEquals(formData.get("field_1")!.toString(), "value_1 \r\n");
+ assert(formData.has("field_2"));
+ const file = formData.get("field_2") as File;
+ assertEquals(file.name, "file.js");
+
+ assertEquals(await file.text(), `console.log("Hi")`);
+ },
+);
+
+Deno.test(
+ { permissions: { net: true } },
+ async function fetchMultipartFormBadContentType() {
+ const response = await fetch(
+ "http://localhost:4545/multipart_form_bad_content_type",
+ );
+ assert(response.body !== null);
+
+ await assertRejects(
+ async () => {
+ await response.formData();
+ },
+ TypeError,
+ "Body can not be decoded as form data",
+ );
+ },
+);
+
+Deno.test(
+ { permissions: { net: true } },
+ async function fetchURLEncodedFormDataSuccess() {
+ const response = await fetch(
+ "http://localhost:4545/subdir/form_urlencoded.txt",
+ );
+ const formData = await response.formData();
+ assert(formData.has("field_1"));
+ assertEquals(formData.get("field_1")!.toString(), "Hi");
+ assert(formData.has("field_2"));
+ assertEquals(formData.get("field_2")!.toString(), "<Deno>");
+ },
+);
+
+Deno.test(
+ { permissions: { net: true } },
+ async function fetchInitFormDataBinaryFileBody() {
+ // Some random bytes
+ // deno-fmt-ignore
+ const binaryFile = new Uint8Array([108,2,0,0,145,22,162,61,157,227,166,77,138,75,180,56,119,188,177,183]);
+ const response = await fetch("http://localhost:4545/echo_multipart_file", {
+ method: "POST",
+ body: binaryFile,
+ });
+ const resultForm = await response.formData();
+ const resultFile = resultForm.get("file") as File;
+
+ assertEquals(resultFile.type, "application/octet-stream");
+ assertEquals(resultFile.name, "file.bin");
+ assertEquals(new Uint8Array(await resultFile.arrayBuffer()), binaryFile);
+ },
+);
+
+Deno.test(
+ { permissions: { net: true } },
+ async function fetchInitFormDataMultipleFilesBody() {
+ const files = [
+ {
+ // deno-fmt-ignore
+ content: new Uint8Array([137,80,78,71,13,10,26,10, 137, 1, 25]),
+ type: "image/png",
+ name: "image",
+ fileName: "some-image.png",
+ },
+ {
+ // deno-fmt-ignore
+ content: new Uint8Array([108,2,0,0,145,22,162,61,157,227,166,77,138,75,180,56,119,188,177,183]),
+ name: "file",
+ fileName: "file.bin",
+ expectedType: "application/octet-stream",
+ },
+ {
+ content: new TextEncoder().encode("deno land"),
+ type: "text/plain",
+ name: "text",
+ fileName: "deno.txt",
+ },
+ ];
+ const form = new FormData();
+ form.append("field", "value");
+ for (const file of files) {
+ form.append(
+ file.name,
+ new Blob([file.content], { type: file.type }),
+ file.fileName,
+ );
+ }
+ const response = await fetch("http://localhost:4545/echo_server", {
+ method: "POST",
+ body: form,
+ });
+ const resultForm = await response.formData();
+ assertEquals(form.get("field"), resultForm.get("field"));
+ for (const file of files) {
+ const inputFile = form.get(file.name) as File;
+ const resultFile = resultForm.get(file.name) as File;
+ assertEquals(inputFile.size, resultFile.size);
+ assertEquals(inputFile.name, resultFile.name);
+ assertEquals(file.expectedType || file.type, resultFile.type);
+ assertEquals(
+ new Uint8Array(await resultFile.arrayBuffer()),
+ file.content,
+ );
+ }
+ },
+);
+
+Deno.test(
+ {
+ permissions: { net: true },
+ },
+ async function fetchWithRedirection() {
+ const response = await fetch("http://localhost:4546/assets/hello.txt");
+ assertEquals(response.status, 200);
+ assertEquals(response.statusText, "OK");
+ assertEquals(response.url, "http://localhost:4545/assets/hello.txt");
+ const body = await response.text();
+ assert(body.includes("Hello world!"));
+ },
+);
+
+Deno.test(
+ {
+ permissions: { net: true },
+ },
+ async function fetchWithRelativeRedirection() {
+ const response = await fetch(
+ "http://localhost:4545/run/001_hello.js",
+ );
+ assertEquals(response.status, 200);
+ assertEquals(response.statusText, "OK");
+ const body = await response.text();
+ assert(body.includes("Hello"));
+ },
+);
+
+Deno.test(
+ {
+ permissions: { net: true },
+ },
+ async function fetchWithRelativeRedirectionUrl() {
+ const cases = [
+ ["end", "http://localhost:4550/a/b/end"],
+ ["/end", "http://localhost:4550/end"],
+ ];
+ for (const [loc, redUrl] of cases) {
+ const response = await fetch("http://localhost:4550/a/b/c", {
+ headers: new Headers([["x-location", loc]]),
+ });
+ assertEquals(response.url, redUrl);
+ assertEquals(response.redirected, true);
+ assertEquals(response.status, 404);
+ assertEquals(await response.text(), "");
+ }
+ },
+);
+
+Deno.test(
+ {
+ permissions: { net: true },
+ },
+ async function fetchWithInfRedirection() {
+ await assertRejects(
+ () => fetch("http://localhost:4549"),
+ TypeError,
+ "redirect",
+ );
+ },
+);
+
+Deno.test(
+ { permissions: { net: true } },
+ async function fetchInitStringBody() {
+ const data = "Hello World";
+ const response = await fetch("http://localhost:4545/echo_server", {
+ method: "POST",
+ body: data,
+ });
+ const text = await response.text();
+ assertEquals(text, data);
+ assert(response.headers.get("content-type")!.startsWith("text/plain"));
+ },
+);
+
+Deno.test(
+ { permissions: { net: true } },
+ async function fetchRequestInitStringBody() {
+ const data = "Hello World";
+ const req = new Request("http://localhost:4545/echo_server", {
+ method: "POST",
+ body: data,
+ });
+ const response = await fetch(req);
+ const text = await response.text();
+ assertEquals(text, data);
+ },
+);
+
+Deno.test(
+ { permissions: { net: true } },
+ async function fetchSeparateInit() {
+ // related to: https://github.com/denoland/deno/issues/10396
+ const req = new Request("http://localhost:4545/run/001_hello.js");
+ const init = {
+ method: "GET",
+ };
+ req.headers.set("foo", "bar");
+ const res = await fetch(req, init);
+ assertEquals(res.status, 200);
+ await res.text();
+ },
+);
+
+Deno.test(
+ { permissions: { net: true } },
+ async function fetchInitTypedArrayBody() {
+ const data = "Hello World";
+ const response = await fetch("http://localhost:4545/echo_server", {
+ method: "POST",
+ body: new TextEncoder().encode(data),
+ });
+ const text = await response.text();
+ assertEquals(text, data);
+ },
+);
+
+Deno.test(
+ { permissions: { net: true } },
+ async function fetchInitArrayBufferBody() {
+ const data = "Hello World";
+ const response = await fetch("http://localhost:4545/echo_server", {
+ method: "POST",
+ body: new TextEncoder().encode(data).buffer,
+ });
+ const text = await response.text();
+ assertEquals(text, data);
+ },
+);
+
+Deno.test(
+ { permissions: { net: true } },
+ async function fetchInitURLSearchParamsBody() {
+ const data = "param1=value1&param2=value2";
+ const params = new URLSearchParams(data);
+ const response = await fetch("http://localhost:4545/echo_server", {
+ method: "POST",
+ body: params,
+ });
+ const text = await response.text();
+ assertEquals(text, data);
+ assert(
+ response.headers
+ .get("content-type")!
+ .startsWith("application/x-www-form-urlencoded"),
+ );
+ },
+);
+
+Deno.test({ permissions: { net: true } }, async function fetchInitBlobBody() {
+ const data = "const a = 1 🦕";
+ const blob = new Blob([data], {
+ type: "text/javascript",
+ });
+ const response = await fetch("http://localhost:4545/echo_server", {
+ method: "POST",
+ body: blob,
+ });
+ const text = await response.text();
+ assertEquals(text, data);
+ assert(response.headers.get("content-type")!.startsWith("text/javascript"));
+});
+
+Deno.test(
+ { permissions: { net: true } },
+ async function fetchInitFormDataBody() {
+ const form = new FormData();
+ form.append("field", "value");
+ const response = await fetch("http://localhost:4545/echo_server", {
+ method: "POST",
+ body: form,
+ });
+ const resultForm = await response.formData();
+ assertEquals(form.get("field"), resultForm.get("field"));
+ },
+);
+
+Deno.test(
+ { permissions: { net: true } },
+ async function fetchInitFormDataBlobFilenameBody() {
+ const form = new FormData();
+ form.append("field", "value");
+ form.append(
+ "file",
+ new Blob([new TextEncoder().encode("deno")]),
+ "file name",
+ );
+ const response = await fetch("http://localhost:4545/echo_server", {
+ method: "POST",
+ body: form,
+ });
+ const resultForm = await response.formData();
+ assertEquals(form.get("field"), resultForm.get("field"));
+ const file = resultForm.get("file");
+ assert(file instanceof File);
+ assertEquals(file.name, "file name");
+ },
+);
+
+Deno.test(
+ { permissions: { net: true } },
+ async function fetchInitFormDataFileFilenameBody() {
+ const form = new FormData();
+ form.append("field", "value");
+ form.append(
+ "file",
+ new File([new Blob([new TextEncoder().encode("deno")])], "file name"),
+ );
+ const response = await fetch("http://localhost:4545/echo_server", {
+ method: "POST",
+ body: form,
+ });
+ const resultForm = await response.formData();
+ assertEquals(form.get("field"), resultForm.get("field"));
+ const file = resultForm.get("file");
+ assert(file instanceof File);
+ assertEquals(file.name, "file name");
+ },
+);
+
+Deno.test(
+ { permissions: { net: true } },
+ async function fetchInitFormDataTextFileBody() {
+ const fileContent = "deno land";
+ const form = new FormData();
+ form.append("field", "value");
+ form.append(
+ "file",
+ new Blob([new TextEncoder().encode(fileContent)], {
+ type: "text/plain",
+ }),
+ "deno.txt",
+ );
+ const response = await fetch("http://localhost:4545/echo_server", {
+ method: "POST",
+ body: form,
+ });
+ const resultForm = await response.formData();
+ assertEquals(form.get("field"), resultForm.get("field"));
+
+ const file = form.get("file") as File;
+ const resultFile = resultForm.get("file") as File;
+
+ assertEquals(file.size, resultFile.size);
+ assertEquals(file.name, resultFile.name);
+ assertEquals(file.type, resultFile.type);
+ assertEquals(await file.text(), await resultFile.text());
+ },
+);
+
+Deno.test({ permissions: { net: true } }, async function fetchUserAgent() {
+ const data = "Hello World";
+ const response = await fetch("http://localhost:4545/echo_server", {
+ method: "POST",
+ body: new TextEncoder().encode(data),
+ });
+ assertEquals(response.headers.get("user-agent"), `Deno/${Deno.version.deno}`);
+ await response.text();
+});
+
+function bufferServer(addr: string): Promise<Buffer> {
+ const [hostname, port] = addr.split(":");
+ const listener = Deno.listen({
+ hostname,
+ port: Number(port),
+ }) as Deno.Listener;
+ return listener.accept().then(async (conn: Deno.Conn) => {
+ const buf = new Buffer();
+ const p1 = buf.readFrom(conn);
+ const p2 = conn.write(
+ new TextEncoder().encode(
+ "HTTP/1.0 404 Not Found\r\nContent-Length: 2\r\n\r\nNF",
+ ),
+ );
+ // Wait for both an EOF on the read side of the socket and for the write to
+ // complete before closing it. Due to keep-alive, the EOF won't be sent
+ // until the Connection close (HTTP/1.0) response, so readFrom() can't
+ // proceed write. Conversely, if readFrom() is async, waiting for the
+ // write() to complete is not a guarantee that we've read the incoming
+ // request.
+ await Promise.all([p1, p2]);
+ conn.close();
+ listener.close();
+ return buf;
+ });
+}
+
+Deno.test(
+ {
+ permissions: { net: true },
+ },
+ async function fetchRequest() {
+ const addr = `127.0.0.1:${listenPort}`;
+ const bufPromise = bufferServer(addr);
+ const response = await fetch(`http://${addr}/blah`, {
+ method: "POST",
+ headers: [
+ ["Hello", "World"],
+ ["Foo", "Bar"],
+ ],
+ });
+ await response.arrayBuffer();
+ assertEquals(response.status, 404);
+ assertEquals(response.headers.get("Content-Length"), "2");
+
+ const actual = new TextDecoder().decode((await bufPromise).bytes());
+ const expected = [
+ "POST /blah HTTP/1.1\r\n",
+ "content-length: 0\r\n",
+ "hello: World\r\n",
+ "foo: Bar\r\n",
+ "accept: */*\r\n",
+ "accept-language: *\r\n",
+ `user-agent: Deno/${Deno.version.deno}\r\n`,
+ "accept-encoding: gzip, br\r\n",
+ `host: ${addr}\r\n\r\n`,
+ ].join("");
+ assertEquals(actual, expected);
+ },
+);
+
+Deno.test(
+ {
+ permissions: { net: true },
+ },
+ async function fetchRequestAcceptHeaders() {
+ const addr = `127.0.0.1:${listenPort}`;
+ const bufPromise = bufferServer(addr);
+ const response = await fetch(`http://${addr}/blah`, {
+ method: "POST",
+ headers: [
+ ["Accept", "text/html"],
+ ["Accept-Language", "en-US"],
+ ],
+ });
+ await response.arrayBuffer();
+ assertEquals(response.status, 404);
+ assertEquals(response.headers.get("Content-Length"), "2");
+
+ const actual = new TextDecoder().decode((await bufPromise).bytes());
+ const expected = [
+ "POST /blah HTTP/1.1\r\n",
+ "content-length: 0\r\n",
+ "accept: text/html\r\n",
+ "accept-language: en-US\r\n",
+ `user-agent: Deno/${Deno.version.deno}\r\n`,
+ "accept-encoding: gzip, br\r\n",
+ `host: ${addr}\r\n\r\n`,
+ ].join("");
+ assertEquals(actual, expected);
+ },
+);
+
+Deno.test(
+ {
+ permissions: { net: true },
+ },
+ async function fetchPostBodyString() {
+ const addr = `127.0.0.1:${listenPort}`;
+ const bufPromise = bufferServer(addr);
+ const body = "hello world";
+ const response = await fetch(`http://${addr}/blah`, {
+ method: "POST",
+ headers: [
+ ["Hello", "World"],
+ ["Foo", "Bar"],
+ ],
+ body,
+ });
+ await response.arrayBuffer();
+ assertEquals(response.status, 404);
+ assertEquals(response.headers.get("Content-Length"), "2");
+
+ const actual = new TextDecoder().decode((await bufPromise).bytes());
+ const expected = [
+ "POST /blah HTTP/1.1\r\n",
+ "hello: World\r\n",
+ "foo: Bar\r\n",
+ "content-type: text/plain;charset=UTF-8\r\n",
+ "accept: */*\r\n",
+ "accept-language: *\r\n",
+ `user-agent: Deno/${Deno.version.deno}\r\n`,
+ "accept-encoding: gzip, br\r\n",
+ `host: ${addr}\r\n`,
+ `content-length: ${body.length}\r\n\r\n`,
+ body,
+ ].join("");
+ assertEquals(actual, expected);
+ },
+);
+
+Deno.test(
+ {
+ permissions: { net: true },
+ },
+ async function fetchPostBodyTypedArray() {
+ const addr = `127.0.0.1:${listenPort}`;
+ const bufPromise = bufferServer(addr);
+ const bodyStr = "hello world";
+ const body = new TextEncoder().encode(bodyStr);
+ const response = await fetch(`http://${addr}/blah`, {
+ method: "POST",
+ headers: [
+ ["Hello", "World"],
+ ["Foo", "Bar"],
+ ],
+ body,
+ });
+ await response.arrayBuffer();
+ assertEquals(response.status, 404);
+ assertEquals(response.headers.get("Content-Length"), "2");
+
+ const actual = new TextDecoder().decode((await bufPromise).bytes());
+ const expected = [
+ "POST /blah HTTP/1.1\r\n",
+ "hello: World\r\n",
+ "foo: Bar\r\n",
+ "accept: */*\r\n",
+ "accept-language: *\r\n",
+ `user-agent: Deno/${Deno.version.deno}\r\n`,
+ "accept-encoding: gzip, br\r\n",
+ `host: ${addr}\r\n`,
+ `content-length: ${body.byteLength}\r\n\r\n`,
+ bodyStr,
+ ].join("");
+ assertEquals(actual, expected);
+ },
+);
+
+Deno.test(
+ {
+ permissions: { net: true },
+ },
+ async function fetchUserSetContentLength() {
+ const addr = `127.0.0.1:${listenPort}`;
+ const bufPromise = bufferServer(addr);
+ const response = await fetch(`http://${addr}/blah`, {
+ method: "POST",
+ headers: [
+ ["Content-Length", "10"],
+ ],
+ });
+ await response.arrayBuffer();
+ assertEquals(response.status, 404);
+ assertEquals(response.headers.get("Content-Length"), "2");
+
+ const actual = new TextDecoder().decode((await bufPromise).bytes());
+ const expected = [
+ "POST /blah HTTP/1.1\r\n",
+ "content-length: 0\r\n",
+ "accept: */*\r\n",
+ "accept-language: *\r\n",
+ `user-agent: Deno/${Deno.version.deno}\r\n`,
+ "accept-encoding: gzip, br\r\n",
+ `host: ${addr}\r\n\r\n`,
+ ].join("");
+ assertEquals(actual, expected);
+ },
+);
+
+Deno.test(
+ {
+ permissions: { net: true },
+ },
+ async function fetchUserSetTransferEncoding() {
+ const addr = `127.0.0.1:${listenPort}`;
+ const bufPromise = bufferServer(addr);
+ const response = await fetch(`http://${addr}/blah`, {
+ method: "POST",
+ headers: [
+ ["Transfer-Encoding", "chunked"],
+ ],
+ });
+ await response.arrayBuffer();
+ assertEquals(response.status, 404);
+ assertEquals(response.headers.get("Content-Length"), "2");
+
+ const actual = new TextDecoder().decode((await bufPromise).bytes());
+ const expected = [
+ "POST /blah HTTP/1.1\r\n",
+ "content-length: 0\r\n",
+ `host: ${addr}\r\n`,
+ "accept: */*\r\n",
+ "accept-language: *\r\n",
+ `user-agent: Deno/${Deno.version.deno}\r\n`,
+ "accept-encoding: gzip, br\r\n\r\n",
+ ].join("");
+ assertEquals(actual, expected);
+ },
+);
+
+Deno.test(
+ {
+ permissions: { net: true },
+ },
+ async function fetchWithNonAsciiRedirection() {
+ const response = await fetch("http://localhost:4545/non_ascii_redirect", {
+ redirect: "manual",
+ });
+ assertEquals(response.status, 301);
+ assertEquals(response.headers.get("location"), "/redirect®");
+ await response.text();
+ },
+);
+
+Deno.test(
+ {
+ permissions: { net: true },
+ },
+ async function fetchWithManualRedirection() {
+ const response = await fetch("http://localhost:4546/", {
+ redirect: "manual",
+ }); // will redirect to http://localhost:4545/
+ assertEquals(response.status, 301);
+ assertEquals(response.url, "http://localhost:4546/");
+ assertEquals(response.type, "basic");
+ assertEquals(response.headers.get("Location"), "http://localhost:4545/");
+ await response.body!.cancel();
+ },
+);
+
+Deno.test(
+ {
+ permissions: { net: true },
+ },
+ async function fetchWithErrorRedirection() {
+ await assertRejects(
+ () =>
+ fetch("http://localhost:4546/", {
+ redirect: "error",
+ }),
+ TypeError,
+ "redirect",
+ );
+ },
+);
+
+Deno.test(function responseRedirect() {
+ const redir = Response.redirect("http://example.com/newLocation", 301);
+ assertEquals(redir.status, 301);
+ assertEquals(redir.statusText, "");
+ assertEquals(redir.url, "");
+ assertEquals(
+ redir.headers.get("Location"),
+ "http://example.com/newLocation",
+ );
+ assertEquals(redir.type, "default");
+});
+
+Deno.test(function responseRedirectTakeURLObjectAsParameter() {
+ const redir = Response.redirect(new URL("https://example.com/"));
+ assertEquals(
+ redir.headers.get("Location"),
+ "https://example.com/",
+ );
+});
+
+Deno.test(async function responseWithoutBody() {
+ const response = new Response();
+ assertEquals(await response.arrayBuffer(), new ArrayBuffer(0));
+ const blob = await response.blob();
+ assertEquals(blob.size, 0);
+ assertEquals(await blob.arrayBuffer(), new ArrayBuffer(0));
+ assertEquals(await response.text(), "");
+ await assertRejects(async () => {
+ await response.json();
+ });
+});
+
+Deno.test({ permissions: { net: true } }, async function fetchBodyReadTwice() {
+ const response = await fetch("http://localhost:4545/assets/fixture.json");
+
+ // Read body
+ const _json = await response.json();
+ assert(_json);
+
+ // All calls after the body was consumed, should fail
+ const methods = ["json", "text", "formData", "arrayBuffer"] as const;
+ for (const method of methods) {
+ try {
+ await response[method]();
+ fail(
+ "Reading body multiple times should failed, the stream should've been locked.",
+ );
+ } catch {
+ // pass
+ }
+ }
+});
+
+Deno.test(
+ { permissions: { net: true } },
+ async function fetchBodyReaderAfterRead() {
+ const response = await fetch(
+ "http://localhost:4545/assets/fixture.json",
+ );
+ assert(response.body !== null);
+ const reader = await response.body.getReader();
+ while (true) {
+ const { done, value } = await reader.read();
+ if (done) break;
+ assert(value);
+ }
+
+ try {
+ response.body.getReader();
+ fail("The stream should've been locked.");
+ } catch {
+ // pass
+ }
+ },
+);
+
+Deno.test(
+ { permissions: { net: true } },
+ async function fetchBodyReaderWithCancelAndNewReader() {
+ const data = "a".repeat(1 << 10);
+ const response = await fetch("http://localhost:4545/echo_server", {
+ method: "POST",
+ body: data,
+ });
+ assert(response.body !== null);
+ const firstReader = await response.body.getReader();
+
+ // Acquire reader without reading & release
+ await firstReader.releaseLock();
+
+ const reader = await response.body.getReader();
+
+ let total = 0;
+ while (true) {
+ const { done, value } = await reader.read();
+ if (done) break;
+ assert(value);
+ total += value.length;
+ }
+
+ assertEquals(total, data.length);
+ },
+);
+
+Deno.test(
+ { permissions: { net: true } },
+ async function fetchBodyReaderWithReadCancelAndNewReader() {
+ const data = "a".repeat(1 << 10);
+
+ const response = await fetch("http://localhost:4545/echo_server", {
+ method: "POST",
+ body: data,
+ });
+ assert(response.body !== null);
+ const firstReader = await response.body.getReader();
+
+ // Do one single read with first reader
+ const { value: firstValue } = await firstReader.read();
+ assert(firstValue);
+ await firstReader.releaseLock();
+
+ // Continue read with second reader
+ const reader = await response.body.getReader();
+ let total = firstValue.length || 0;
+ while (true) {
+ const { done, value } = await reader.read();
+ if (done) break;
+ assert(value);
+ total += value.length;
+ }
+ assertEquals(total, data.length);
+ },
+);
+
+Deno.test(
+ { permissions: { net: true } },
+ async function fetchResourceCloseAfterStreamCancel() {
+ const res = await fetch("http://localhost:4545/assets/fixture.json");
+ assert(res.body !== null);
+
+ // After ReadableStream.cancel is called, resource handle must be closed
+ // The test should not fail with: Test case is leaking resources
+ await res.body.cancel();
+ },
+);
+
+Deno.test(
+ { permissions: { net: true } },
+ async function fetchNullBodyStatus() {
+ const nullBodyStatus = [101, 204, 205, 304];
+
+ for (const status of nullBodyStatus) {
+ const headers = new Headers([["x-status", String(status)]]);
+ const res = await fetch("http://localhost:4545/echo_server", {
+ body: "deno",
+ method: "POST",
+ headers,
+ });
+ assertEquals(res.body, null);
+ assertEquals(res.status, status);
+ }
+ },
+);
+
+Deno.test(
+ { permissions: { net: true } },
+ async function fetchResponseContentLength() {
+ const body = new Uint8Array(2 ** 16);
+ const headers = new Headers([["content-type", "application/octet-stream"]]);
+ const res = await fetch("http://localhost:4545/echo_server", {
+ body: body,
+ method: "POST",
+ headers,
+ });
+ assertEquals(Number(res.headers.get("content-length")), body.byteLength);
+
+ const blob = await res.blob();
+ // Make sure Body content-type is correctly set
+ assertEquals(blob.type, "application/octet-stream");
+ assertEquals(blob.size, body.byteLength);
+ },
+);
+
+Deno.test(function fetchResponseConstructorNullBody() {
+ const nullBodyStatus = [204, 205, 304];
+
+ for (const status of nullBodyStatus) {
+ try {
+ new Response("deno", { status });
+ fail("Response with null body status cannot have body");
+ } catch (e) {
+ assert(e instanceof TypeError);
+ assertEquals(
+ e.message,
+ "Response with null body status cannot have body",
+ );
+ }
+ }
+});
+
+Deno.test(function fetchResponseConstructorInvalidStatus() {
+ const invalidStatus = [100, 600, 199, null, "", NaN];
+
+ for (const status of invalidStatus) {
+ try {
+ // deno-lint-ignore ban-ts-comment
+ // @ts-ignore
+ new Response("deno", { status });
+ fail(`Invalid status: ${status}`);
+ } catch (e) {
+ assert(e instanceof RangeError);
+ assert(
+ e.message.endsWith(
+ "is not equal to 101 and outside the range [200, 599].",
+ ),
+ );
+ }
+ }
+});
+
+Deno.test(function fetchResponseEmptyConstructor() {
+ const response = new Response();
+ assertEquals(response.status, 200);
+ assertEquals(response.body, null);
+ assertEquals(response.type, "default");
+ assertEquals(response.url, "");
+ assertEquals(response.redirected, false);
+ assertEquals(response.ok, true);
+ assertEquals(response.bodyUsed, false);
+ assertEquals([...response.headers], []);
+});
+
+Deno.test(
+ { permissions: { net: true, read: true } },
+ async function fetchCustomHttpClientParamCertificateSuccess(): Promise<
+ void
+ > {
+ const caCert = Deno.readTextFileSync("tests/testdata/tls/RootCA.pem");
+ const client = Deno.createHttpClient({ caCerts: [caCert] });
+ const response = await fetch("https://localhost:5545/assets/fixture.json", {
+ client,
+ });
+ const json = await response.json();
+ assertEquals(json.name, "deno");
+ client.close();
+ },
+);
+
+Deno.test(
+ { permissions: { net: true, read: true } },
+ function createHttpClientAcceptPoolIdleTimeout() {
+ const client = Deno.createHttpClient({
+ poolIdleTimeout: 1000,
+ });
+ client.close();
+ },
+);
+
+Deno.test(
+ { permissions: { net: true } },
+ async function fetchCustomClientUserAgent(): Promise<
+ void
+ > {
+ const data = "Hello World";
+ const client = Deno.createHttpClient({});
+ const response = await fetch("http://localhost:4545/echo_server", {
+ client,
+ method: "POST",
+ body: new TextEncoder().encode(data),
+ });
+ assertEquals(
+ response.headers.get("user-agent"),
+ `Deno/${Deno.version.deno}`,
+ );
+ await response.text();
+ client.close();
+ },
+);
+
+Deno.test(
+ {
+ permissions: { net: true },
+ },
+ async function fetchPostBodyReadableStream() {
+ const addr = `127.0.0.1:${listenPort}`;
+ const bufPromise = bufferServer(addr);
+ const stream = new TransformStream();
+ const writer = stream.writable.getWriter();
+ // transformer writes don't resolve until they are read, so awaiting these
+ // will cause the transformer to hang, as the suspend the transformer, it
+ // is also illogical to await for the reads, as that is the whole point of
+ // streams is to have a "queue" which gets drained...
+ writer.write(new TextEncoder().encode("hello "));
+ writer.write(new TextEncoder().encode("world"));
+ writer.close();
+ const response = await fetch(`http://${addr}/blah`, {
+ method: "POST",
+ headers: [
+ ["Hello", "World"],
+ ["Foo", "Bar"],
+ ],
+ body: stream.readable,
+ });
+ await response.arrayBuffer();
+ assertEquals(response.status, 404);
+ assertEquals(response.headers.get("Content-Length"), "2");
+
+ const actual = new TextDecoder().decode((await bufPromise).bytes());
+ const expected = [
+ "POST /blah HTTP/1.1\r\n",
+ "hello: World\r\n",
+ "foo: Bar\r\n",
+ "accept: */*\r\n",
+ "accept-language: *\r\n",
+ `user-agent: Deno/${Deno.version.deno}\r\n`,
+ "accept-encoding: gzip, br\r\n",
+ `host: ${addr}\r\n`,
+ `transfer-encoding: chunked\r\n\r\n`,
+ "B\r\n",
+ "hello world\r\n",
+ "0\r\n\r\n",
+ ].join("");
+ assertEquals(actual, expected);
+ },
+);
+
+Deno.test({}, function fetchWritableRespProps() {
+ const original = new Response("https://deno.land", {
+ status: 404,
+ headers: { "x-deno": "foo" },
+ });
+ const new_ = new Response("https://deno.land", original);
+ assertEquals(original.status, new_.status);
+ assertEquals(new_.headers.get("x-deno"), "foo");
+});
+
+Deno.test(
+ { permissions: { net: true } },
+ async function fetchFilterOutCustomHostHeader(): Promise<
+ void
+ > {
+ const addr = `127.0.0.1:${listenPort}`;
+ const [hostname, port] = addr.split(":");
+ const listener = Deno.listen({
+ hostname,
+ port: Number(port),
+ }) as Deno.Listener;
+
+ let httpConn: Deno.HttpConn;
+ listener.accept().then(async (conn: Deno.Conn) => {
+ httpConn = Deno.serveHttp(conn);
+
+ await httpConn.nextRequest()
+ .then(async (requestEvent: Deno.RequestEvent | null) => {
+ const hostHeader = requestEvent?.request.headers.get("Host");
+ const headersToReturn = hostHeader
+ ? { "Host": hostHeader }
+ : undefined;
+
+ await requestEvent?.respondWith(
+ new Response("", {
+ status: 200,
+ headers: headersToReturn,
+ }),
+ );
+ });
+ });
+
+ const response = await fetch(`http://${addr}/`, {
+ headers: { "Host": "example.com" },
+ });
+ await response.text();
+ listener.close();
+ httpConn!.close();
+
+ assertEquals(response.headers.get("Host"), addr);
+ },
+);
+
+Deno.test(
+ { permissions: { net: true } },
+ async function fetchNoServerReadableStreamBody() {
+ const completed = Promise.withResolvers<void>();
+ const failed = Promise.withResolvers<void>();
+ const body = new ReadableStream({
+ start(controller) {
+ controller.enqueue(new Uint8Array([1]));
+ setTimeout(async () => {
+ // This is technically a race. If the fetch has failed by this point, the enqueue will
+ // throw. If not, it will succeed. Windows appears to take a while to time out the fetch,
+ // so we will just wait for that here before we attempt to enqueue so it's consistent
+ // across platforms.
+ await failed.promise;
+ assertThrows(() => controller.enqueue(new Uint8Array([2])));
+ completed.resolve();
+ }, 1000);
+ },
+ });
+ const nonExistentHostname = "http://localhost:47582";
+ await assertRejects(async () => {
+ await fetch(nonExistentHostname, { body, method: "POST" });
+ }, TypeError);
+ failed.resolve();
+ await completed.promise;
+ },
+);
+
+Deno.test(
+ { permissions: { net: true } },
+ async function fetchHeadRespBody() {
+ const res = await fetch("http://localhost:4545/echo_server", {
+ method: "HEAD",
+ });
+ assertEquals(res.body, null);
+ },
+);
+
+Deno.test(
+ { permissions: { read: true, net: true } },
+ async function fetchClientCertWrongPrivateKey(): Promise<void> {
+ await assertRejects(async () => {
+ const client = Deno.createHttpClient({
+ certChain: "bad data",
+ privateKey: await Deno.readTextFile(
+ "tests/testdata/tls/localhost.key",
+ ),
+ });
+ await fetch("https://localhost:5552/assets/fixture.json", {
+ client,
+ });
+ }, Deno.errors.InvalidData);
+ },
+);
+
+Deno.test(
+ { permissions: { read: true, net: true } },
+ async function fetchClientCertBadPrivateKey(): Promise<void> {
+ await assertRejects(async () => {
+ const client = Deno.createHttpClient({
+ certChain: await Deno.readTextFile(
+ "tests/testdata/tls/localhost.crt",
+ ),
+ privateKey: "bad data",
+ });
+ await fetch("https://localhost:5552/assets/fixture.json", {
+ client,
+ });
+ }, Deno.errors.InvalidData);
+ },
+);
+
+Deno.test(
+ { permissions: { read: true, net: true } },
+ async function fetchClientCertNotPrivateKey(): Promise<void> {
+ await assertRejects(async () => {
+ const client = Deno.createHttpClient({
+ certChain: await Deno.readTextFile(
+ "tests/testdata/tls/localhost.crt",
+ ),
+ privateKey: "",
+ });
+ await fetch("https://localhost:5552/assets/fixture.json", {
+ client,
+ });
+ }, Deno.errors.InvalidData);
+ },
+);
+
+Deno.test(
+ { permissions: { read: true, net: true } },
+ async function fetchCustomClientPrivateKey(): Promise<
+ void
+ > {
+ const data = "Hello World";
+ const caCert = await Deno.readTextFile("tests/testdata/tls/RootCA.crt");
+ const client = Deno.createHttpClient({
+ certChain: await Deno.readTextFile(
+ "tests/testdata/tls/localhost.crt",
+ ),
+ privateKey: await Deno.readTextFile(
+ "tests/testdata/tls/localhost.key",
+ ),
+ caCerts: [caCert],
+ });
+ const response = await fetch("https://localhost:5552/echo_server", {
+ client,
+ method: "POST",
+ body: new TextEncoder().encode(data),
+ });
+ assertEquals(
+ response.headers.get("user-agent"),
+ `Deno/${Deno.version.deno}`,
+ );
+ await response.text();
+ client.close();
+ },
+);
+
+Deno.test(
+ { permissions: { net: true } },
+ async function fetchAbortWhileUploadStreaming(): Promise<void> {
+ const abortController = new AbortController();
+ try {
+ await fetch(
+ "http://localhost:5552/echo_server",
+ {
+ method: "POST",
+ body: new ReadableStream({
+ pull(controller) {
+ abortController.abort();
+ controller.enqueue(new Uint8Array([1, 2, 3, 4]));
+ },
+ }),
+ signal: abortController.signal,
+ },
+ );
+ fail("Fetch didn't reject.");
+ } catch (error) {
+ assert(error instanceof DOMException);
+ assertEquals(error.name, "AbortError");
+ assertEquals(error.message, "The signal has been aborted");
+ }
+ },
+);
+
+Deno.test(
+ { permissions: { net: true } },
+ async function fetchAbortWhileUploadStreamingWithReason(): Promise<void> {
+ const abortController = new AbortController();
+ const abortReason = new Error();
+ try {
+ await fetch(
+ "http://localhost:5552/echo_server",
+ {
+ method: "POST",
+ body: new ReadableStream({
+ pull(controller) {
+ abortController.abort(abortReason);
+ controller.enqueue(new Uint8Array([1, 2, 3, 4]));
+ },
+ }),
+ signal: abortController.signal,
+ },
+ );
+ fail("Fetch didn't reject.");
+ } catch (error) {
+ assertEquals(error, abortReason);
+ }
+ },
+);
+
+Deno.test(
+ { permissions: { net: true } },
+ async function fetchAbortWhileUploadStreamingWithPrimitiveReason(): Promise<
+ void
+ > {
+ const abortController = new AbortController();
+ try {
+ await fetch(
+ "http://localhost:5552/echo_server",
+ {
+ method: "POST",
+ body: new ReadableStream({
+ pull(controller) {
+ abortController.abort("Abort reason");
+ controller.enqueue(new Uint8Array([1, 2, 3, 4]));
+ },
+ }),
+ signal: abortController.signal,
+ },
+ );
+ fail("Fetch didn't reject.");
+ } catch (error) {
+ assertEquals(error, "Abort reason");
+ }
+ },
+);
+
+Deno.test(
+ { permissions: { net: true } },
+ async function fetchHeaderValueShouldNotPanic() {
+ for (let i = 0; i < 0x21; i++) {
+ if (i === 0x09 || i === 0x0A || i === 0x0D || i === 0x20) {
+ continue; // these header value will be normalized, will not cause an error.
+ }
+ // ensure there will be an error instead of panic.
+ await assertRejects(() =>
+ fetch("http://localhost:4545/echo_server", {
+ method: "HEAD",
+ headers: { "val": String.fromCharCode(i) },
+ }), TypeError);
+ }
+ await assertRejects(() =>
+ fetch("http://localhost:4545/echo_server", {
+ method: "HEAD",
+ headers: { "val": String.fromCharCode(127) },
+ }), TypeError);
+ },
+);
+
+Deno.test(
+ { permissions: { net: true } },
+ async function fetchHeaderNameShouldNotPanic() {
+ const validTokens =
+ "!#$%&'*+-.0123456789ABCDEFGHIJKLMNOPQRSTUWVXYZ^_`abcdefghijklmnopqrstuvwxyz|~"
+ .split("");
+ for (let i = 0; i <= 255; i++) {
+ const token = String.fromCharCode(i);
+ if (validTokens.includes(token)) {
+ continue;
+ }
+ // ensure there will be an error instead of panic.
+ await assertRejects(() =>
+ fetch("http://localhost:4545/echo_server", {
+ method: "HEAD",
+ headers: { [token]: "value" },
+ }), TypeError);
+ }
+ await assertRejects(() =>
+ fetch("http://localhost:4545/echo_server", {
+ method: "HEAD",
+ headers: { "": "value" },
+ }), TypeError);
+ },
+);
+
+Deno.test(
+ { permissions: { net: true, read: true } },
+ async function fetchSupportsHttpsOverIpAddress() {
+ const caCert = await Deno.readTextFile("tests/testdata/tls/RootCA.pem");
+ const client = Deno.createHttpClient({ caCerts: [caCert] });
+ const res = await fetch("https://localhost:5546/http_version", { client });
+ assert(res.ok);
+ assertEquals(await res.text(), "HTTP/1.1");
+ client.close();
+ },
+);
+
+Deno.test(
+ { permissions: { net: true, read: true } },
+ async function fetchSupportsHttp1Only() {
+ const caCert = await Deno.readTextFile("tests/testdata/tls/RootCA.pem");
+ const client = Deno.createHttpClient({ caCerts: [caCert] });
+ const res = await fetch("https://localhost:5546/http_version", { client });
+ assert(res.ok);
+ assertEquals(await res.text(), "HTTP/1.1");
+ client.close();
+ },
+);
+
+Deno.test(
+ { permissions: { net: true, read: true } },
+ async function fetchSupportsHttp2() {
+ const caCert = await Deno.readTextFile("tests/testdata/tls/RootCA.pem");
+ const client = Deno.createHttpClient({ caCerts: [caCert] });
+ const res = await fetch("https://localhost:5547/http_version", { client });
+ assert(res.ok);
+ assertEquals(await res.text(), "HTTP/2.0");
+ client.close();
+ },
+);
+
+Deno.test(
+ { permissions: { net: true, read: true } },
+ async function fetchForceHttp1OnHttp2Server() {
+ const client = Deno.createHttpClient({ http2: false, http1: true });
+ await assertRejects(
+ () => fetch("http://localhost:5549/http_version", { client }),
+ TypeError,
+ );
+ client.close();
+ },
+);
+
+Deno.test(
+ { permissions: { net: true, read: true } },
+ async function fetchForceHttp2OnHttp1Server() {
+ const client = Deno.createHttpClient({ http2: true, http1: false });
+ await assertRejects(
+ () => fetch("http://localhost:5548/http_version", { client }),
+ TypeError,
+ );
+ client.close();
+ },
+);
+
+Deno.test(
+ { permissions: { net: true, read: true } },
+ async function fetchPrefersHttp2() {
+ const caCert = await Deno.readTextFile("tests/testdata/tls/RootCA.pem");
+ const client = Deno.createHttpClient({ caCerts: [caCert] });
+ const res = await fetch("https://localhost:5545/http_version", { client });
+ assert(res.ok);
+ assertEquals(await res.text(), "HTTP/2.0");
+ client.close();
+ },
+);
+
+Deno.test(
+ { permissions: { net: true, read: true } },
+ async function createHttpClientAllowHost() {
+ const client = Deno.createHttpClient({
+ allowHost: true,
+ });
+ const res = await fetch("http://localhost:4545/echo_server", {
+ headers: {
+ "host": "example.com",
+ },
+ client,
+ });
+ assert(res.ok);
+ assertEquals(res.headers.get("host"), "example.com");
+ await res.body?.cancel();
+ client.close();
+ },
+);
+
+Deno.test(
+ { permissions: { net: true } },
+ async function createHttpClientExplicitResourceManagement() {
+ using client = Deno.createHttpClient({});
+ const response = await fetch("http://localhost:4545/assets/fixture.json", {
+ client,
+ });
+ const json = await response.json();
+ assertEquals(json.name, "deno");
+ },
+);
+
+Deno.test(
+ { permissions: { net: true } },
+ async function createHttpClientExplicitResourceManagementDoubleClose() {
+ using client = Deno.createHttpClient({});
+ const response = await fetch("http://localhost:4545/assets/fixture.json", {
+ client,
+ });
+ const json = await response.json();
+ assertEquals(json.name, "deno");
+ // Close the client even though we declared it with `using` to confirm that
+ // the cleanup done as per `Symbol.dispose` will not throw any errors.
+ client.close();
+ },
+);
+
+Deno.test({ permissions: { read: false } }, async function fetchFilePerm() {
+ await assertRejects(async () => {
+ await fetch(import.meta.resolve("../testdata/subdir/json_1.json"));
+ }, Deno.errors.PermissionDenied);
+});
+
+Deno.test(
+ { permissions: { read: false } },
+ async function fetchFilePermDoesNotExist() {
+ await assertRejects(async () => {
+ await fetch(import.meta.resolve("./bad.json"));
+ }, Deno.errors.PermissionDenied);
+ },
+);
+
+Deno.test(
+ { permissions: { read: true } },
+ async function fetchFileBadMethod() {
+ await assertRejects(
+ async () => {
+ await fetch(
+ import.meta.resolve("../testdata/subdir/json_1.json"),
+ {
+ method: "POST",
+ },
+ );
+ },
+ TypeError,
+ "Fetching files only supports the GET method. Received POST.",
+ );
+ },
+);
+
+Deno.test(
+ { permissions: { read: true } },
+ async function fetchFileDoesNotExist() {
+ await assertRejects(
+ async () => {
+ await fetch(import.meta.resolve("./bad.json"));
+ },
+ TypeError,
+ );
+ },
+);
+
+Deno.test(
+ { permissions: { read: true } },
+ async function fetchFile() {
+ const res = await fetch(
+ import.meta.resolve("../testdata/subdir/json_1.json"),
+ );
+ assert(res.ok);
+ const fixture = await Deno.readTextFile(
+ "tests/testdata/subdir/json_1.json",
+ );
+ assertEquals(await res.text(), fixture);
+ },
+);
+
+Deno.test(
+ { permissions: { net: true } },
+ async function fetchContentLengthPost() {
+ const response = await fetch("http://localhost:4545/content_length", {
+ method: "POST",
+ });
+ const length = await response.text();
+ assertEquals(length, 'Some("0")');
+ },
+);
+
+Deno.test(
+ { permissions: { net: true } },
+ async function fetchContentLengthPut() {
+ const response = await fetch("http://localhost:4545/content_length", {
+ method: "PUT",
+ });
+ const length = await response.text();
+ assertEquals(length, 'Some("0")');
+ },
+);
+
+Deno.test(
+ { permissions: { net: true } },
+ async function fetchContentLengthPatch() {
+ const response = await fetch("http://localhost:4545/content_length", {
+ method: "PATCH",
+ });
+ const length = await response.text();
+ assertEquals(length, "None");
+ },
+);
+
+Deno.test(
+ { permissions: { net: true } },
+ async function fetchContentLengthPostWithStringBody() {
+ const response = await fetch("http://localhost:4545/content_length", {
+ method: "POST",
+ body: "Hey!",
+ });
+ const length = await response.text();
+ assertEquals(length, 'Some("4")');
+ },
+);
+
+Deno.test(
+ { permissions: { net: true } },
+ async function fetchContentLengthPostWithBufferBody() {
+ const response = await fetch("http://localhost:4545/content_length", {
+ method: "POST",
+ body: new TextEncoder().encode("Hey!"),
+ });
+ const length = await response.text();
+ assertEquals(length, 'Some("4")');
+ },
+);
+
+Deno.test(async function staticResponseJson() {
+ const data = { hello: "world" };
+ const resp = Response.json(data);
+ assertEquals(resp.status, 200);
+ assertEquals(resp.headers.get("content-type"), "application/json");
+ const res = await resp.json();
+ assertEquals(res, data);
+});
+
+function invalidServer(addr: string, body: Uint8Array): Deno.Listener {
+ const [hostname, port] = addr.split(":");
+ const listener = Deno.listen({
+ hostname,
+ port: Number(port),
+ }) as Deno.Listener;
+
+ (async () => {
+ for await (const conn of listener) {
+ const p1 = conn.read(new Uint8Array(2 ** 14));
+ const p2 = conn.write(body);
+
+ await Promise.all([p1, p2]);
+ conn.close();
+ }
+ })();
+
+ return listener;
+}
+
+Deno.test(
+ { permissions: { net: true } },
+ async function fetchWithInvalidContentLengthAndTransferEncoding(): Promise<
+ void
+ > {
+ const addr = `127.0.0.1:${listenPort}`;
+ const data = "a".repeat(10 << 10);
+
+ const body = new TextEncoder().encode(
+ `HTTP/1.1 200 OK\r\nContent-Length: ${
+ Math.round(data.length * 2)
+ }\r\nTransfer-Encoding: chunked\r\n\r\n${
+ data.length.toString(16)
+ }\r\n${data}\r\n0\r\n\r\n`,
+ );
+
+ // if transfer-encoding is sent, content-length is ignored
+ // even if it has an invalid value (content-length > totalLength)
+ const listener = invalidServer(addr, body);
+ const response = await fetch(`http://${addr}/`);
+
+ const res = await response.arrayBuffer();
+ const buf = new TextEncoder().encode(data);
+ assertEquals(res.byteLength, buf.byteLength);
+ assertEquals(new Uint8Array(res), buf);
+
+ listener.close();
+ },
+);
+
+Deno.test(
+ // TODO(bartlomieju): reenable this test
+ // https://github.com/denoland/deno/issues/18350
+ { ignore: Deno.build.os === "windows", permissions: { net: true } },
+ async function fetchWithInvalidContentLength(): Promise<
+ void
+ > {
+ const addr = `127.0.0.1:${listenPort}`;
+ const data = "a".repeat(10 << 10);
+
+ const body = new TextEncoder().encode(
+ `HTTP/1.1 200 OK\r\nContent-Length: ${
+ Math.round(data.length / 2)
+ }\r\nContent-Length: ${data.length}\r\n\r\n${data}`,
+ );
+
+ // It should fail if multiple content-length headers with different values are sent
+ const listener = invalidServer(addr, body);
+ await assertRejects(
+ async () => {
+ await fetch(`http://${addr}/`);
+ },
+ TypeError,
+ "invalid content-length parsed",
+ );
+
+ listener.close();
+ },
+);
+
+Deno.test(
+ { permissions: { net: true } },
+ async function fetchWithInvalidContentLength2(): Promise<
+ void
+ > {
+ const addr = `127.0.0.1:${listenPort}`;
+ const data = "a".repeat(10 << 10);
+
+ const contentLength = data.length / 2;
+ const body = new TextEncoder().encode(
+ `HTTP/1.1 200 OK\r\nContent-Length: ${contentLength}\r\n\r\n${data}`,
+ );
+
+ const listener = invalidServer(addr, body);
+ const response = await fetch(`http://${addr}/`);
+
+ // If content-length < totalLength, a maximum of content-length bytes
+ // should be returned.
+ const res = await response.arrayBuffer();
+ const buf = new TextEncoder().encode(data);
+ assertEquals(res.byteLength, contentLength);
+ assertEquals(new Uint8Array(res), buf.subarray(contentLength));
+
+ listener.close();
+ },
+);
+
+Deno.test(
+ { permissions: { net: true } },
+ async function fetchWithInvalidContentLength3(): Promise<
+ void
+ > {
+ const addr = `127.0.0.1:${listenPort}`;
+ const data = "a".repeat(10 << 10);
+
+ const contentLength = data.length * 2;
+ const body = new TextEncoder().encode(
+ `HTTP/1.1 200 OK\r\nContent-Length: ${contentLength}\r\n\r\n${data}`,
+ );
+
+ const listener = invalidServer(addr, body);
+ const response = await fetch(`http://${addr}/`);
+ // If content-length > totalLength, a maximum of content-length bytes
+ // should be returned.
+ await assertRejects(
+ async () => {
+ await response.arrayBuffer();
+ },
+ Error,
+ "end of file before message length reached",
+ );
+
+ listener.close();
+ },
+);
+
+Deno.test(
+ { permissions: { net: true } },
+ async function fetchBlobUrl(): Promise<void> {
+ const blob = new Blob(["ok"], { type: "text/plain" });
+ const url = URL.createObjectURL(blob);
+ assert(url.startsWith("blob:"), `URL was ${url}`);
+ const res = await fetch(url);
+ assertEquals(res.url, url);
+ assertEquals(res.status, 200);
+ assertEquals(res.headers.get("content-length"), "2");
+ assertEquals(res.headers.get("content-type"), "text/plain");
+ assertEquals(await res.text(), "ok");
+ },
+);
+
+Deno.test(
+ { permissions: { net: true } },
+ async function fetchResponseStreamIsLockedWhileReading() {
+ const response = await fetch("http://localhost:4545/echo_server", {
+ body: new Uint8Array(5000),
+ method: "POST",
+ });
+
+ assertEquals(response.body!.locked, false);
+ const promise = response.arrayBuffer();
+ assertEquals(response.body!.locked, true);
+
+ await promise;
+ },
+);
+
+Deno.test(
+ { permissions: { net: true } },
+ async function fetchConstructorClones() {
+ const req = new Request("https://example.com", {
+ method: "POST",
+ body: "foo",
+ });
+ assertEquals(await req.text(), "foo");
+ await assertRejects(() => req.text());
+
+ const req2 = new Request(req, { method: "PUT", body: "bar" }); // should not have any impact on req
+ await assertRejects(() => req.text());
+ assertEquals(await req2.text(), "bar");
+
+ assertEquals(req.method, "POST");
+ assertEquals(req2.method, "PUT");
+
+ assertEquals(req.headers.get("x-foo"), null);
+ assertEquals(req2.headers.get("x-foo"), null);
+ req2.headers.set("x-foo", "bar"); // should not have any impact on req
+ assertEquals(req.headers.get("x-foo"), null);
+ assertEquals(req2.headers.get("x-foo"), "bar");
+ },
+);
+
+Deno.test(
+ // TODO(bartlomieju): reenable this test
+ // https://github.com/denoland/deno/issues/18350
+ { ignore: Deno.build.os === "windows", permissions: { net: true } },
+ async function fetchRequestBodyErrorCatchable() {
+ const listener = Deno.listen({ hostname: "127.0.0.1", port: listenPort });
+ const server = (async () => {
+ const conn = await listener.accept();
+ listener.close();
+ const buf = new Uint8Array(256);
+ const n = await conn.read(buf);
+ const data = new TextDecoder().decode(buf.subarray(0, n!)); // this is the request headers + first body chunk
+ assert(data.startsWith("POST / HTTP/1.1\r\n"));
+ assert(data.endsWith("1\r\na\r\n"));
+ const n2 = await conn.read(buf);
+ assertEquals(n2, 6); // this is the second body chunk
+ const n3 = await conn.read(buf);
+ assertEquals(n3, null); // the connection now abruptly closes because the client has errored
+ conn.close();
+ })();
+
+ const stream = new ReadableStream({
+ async start(controller) {
+ controller.enqueue(new TextEncoder().encode("a"));
+ await delay(1000);
+ controller.enqueue(new TextEncoder().encode("b"));
+ await delay(1000);
+ controller.error(new Error("foo"));
+ },
+ });
+
+ const err = await assertRejects(() =>
+ fetch(`http://localhost:${listenPort}/`, {
+ body: stream,
+ method: "POST",
+ })
+ );
+
+ assert(err instanceof TypeError, `err was not a TypeError ${err}`);
+ assert(err.cause, `err.cause was null ${err}`);
+ assert(
+ err.cause instanceof Error,
+ `err.cause was not an Error ${err.cause}`,
+ );
+ assertEquals(err.cause.message, "foo");
+
+ await server;
+ },
+);
+
+Deno.test(
+ { permissions: { net: true } },
+ async function fetchRequestBodyEmptyStream() {
+ const body = new ReadableStream({
+ start(controller) {
+ controller.enqueue(new Uint8Array([]));
+ controller.close();
+ },
+ });
+
+ await assertRejects(
+ async () => {
+ const controller = new AbortController();
+ const promise = fetch("http://localhost:4545/echo_server", {
+ body,
+ method: "POST",
+ signal: controller.signal,
+ });
+ try {
+ controller.abort();
+ } catch (e) {
+ console.log(e);
+ fail("abort should not throw");
+ }
+ await promise;
+ },
+ DOMException,
+ "The signal has been aborted",
+ );
+ },
+);
+
+Deno.test("Request with subarray TypedArray body", async () => {
+ const body = new Uint8Array([1, 2, 3, 4, 5]).subarray(1);
+ const req = new Request("https://example.com", { method: "POST", body });
+ const actual = new Uint8Array(await req.arrayBuffer());
+ const expected = new Uint8Array([2, 3, 4, 5]);
+ assertEquals(actual, expected);
+});
+
+Deno.test("Response with subarray TypedArray body", async () => {
+ const body = new Uint8Array([1, 2, 3, 4, 5]).subarray(1);
+ const req = new Response(body);
+ const actual = new Uint8Array(await req.arrayBuffer());
+ const expected = new Uint8Array([2, 3, 4, 5]);
+ assertEquals(actual, expected);
+});
diff --git a/cli/tests/unit/ffi_test.ts b/tests/unit/ffi_test.ts
index 2b56a8db1..2b56a8db1 100644
--- a/cli/tests/unit/ffi_test.ts
+++ b/tests/unit/ffi_test.ts
diff --git a/cli/tests/unit/file_test.ts b/tests/unit/file_test.ts
index 1af3a3f84..1af3a3f84 100644
--- a/cli/tests/unit/file_test.ts
+++ b/tests/unit/file_test.ts
diff --git a/cli/tests/unit/filereader_test.ts b/tests/unit/filereader_test.ts
index 158cf5383..158cf5383 100644
--- a/cli/tests/unit/filereader_test.ts
+++ b/tests/unit/filereader_test.ts
diff --git a/tests/unit/files_test.ts b/tests/unit/files_test.ts
new file mode 100644
index 000000000..c29092963
--- /dev/null
+++ b/tests/unit/files_test.ts
@@ -0,0 +1,1095 @@
+// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
+
+// deno-lint-ignore-file no-deprecated-deno-api
+
+import {
+ assert,
+ assertEquals,
+ assertRejects,
+ assertThrows,
+} from "./test_util.ts";
+import { copy } from "@test_util/std/streams/copy.ts";
+
+Deno.test(function filesStdioFileDescriptors() {
+ assertEquals(Deno.stdin.rid, 0);
+ assertEquals(Deno.stdout.rid, 1);
+ assertEquals(Deno.stderr.rid, 2);
+});
+
+Deno.test({ permissions: { read: true } }, async function filesCopyToStdout() {
+ const filename = "tests/testdata/assets/fixture.json";
+ using file = await Deno.open(filename);
+ assert(file instanceof Deno.File);
+ assert(file instanceof Deno.FsFile);
+ assert(file.rid > 2);
+ const bytesWritten = await copy(file, Deno.stdout);
+ const fileSize = Deno.statSync(filename).size;
+ assertEquals(bytesWritten, fileSize);
+});
+
+Deno.test({ permissions: { read: true } }, async function filesIter() {
+ const filename = "tests/testdata/assets/hello.txt";
+ using file = await Deno.open(filename);
+
+ let totalSize = 0;
+ for await (const buf of Deno.iter(file)) {
+ totalSize += buf.byteLength;
+ }
+
+ assertEquals(totalSize, 12);
+});
+
+Deno.test(
+ { permissions: { read: true } },
+ async function filesIterCustomBufSize() {
+ const filename = "tests/testdata/assets/hello.txt";
+ using file = await Deno.open(filename);
+
+ let totalSize = 0;
+ let iterations = 0;
+ for await (const buf of Deno.iter(file, { bufSize: 6 })) {
+ totalSize += buf.byteLength;
+ iterations += 1;
+ }
+
+ assertEquals(totalSize, 12);
+ assertEquals(iterations, 2);
+ },
+);
+
+Deno.test({ permissions: { read: true } }, function filesIterSync() {
+ const filename = "tests/testdata/assets/hello.txt";
+ using file = Deno.openSync(filename);
+
+ let totalSize = 0;
+ for (const buf of Deno.iterSync(file)) {
+ totalSize += buf.byteLength;
+ }
+
+ assertEquals(totalSize, 12);
+});
+
+Deno.test(
+ { permissions: { read: true } },
+ function filesIterSyncCustomBufSize() {
+ const filename = "tests/testdata/assets/hello.txt";
+ using file = Deno.openSync(filename);
+
+ let totalSize = 0;
+ let iterations = 0;
+ for (const buf of Deno.iterSync(file, { bufSize: 6 })) {
+ totalSize += buf.byteLength;
+ iterations += 1;
+ }
+
+ assertEquals(totalSize, 12);
+ assertEquals(iterations, 2);
+ },
+);
+
+Deno.test(async function readerIter() {
+ // ref: https://github.com/denoland/deno/issues/2330
+ const encoder = new TextEncoder();
+
+ class TestReader implements Deno.Reader {
+ #offset = 0;
+ #buf: Uint8Array;
+
+ constructor(s: string) {
+ this.#buf = new Uint8Array(encoder.encode(s));
+ }
+
+ read(p: Uint8Array): Promise<number | null> {
+ const n = Math.min(p.byteLength, this.#buf.byteLength - this.#offset);
+ p.set(this.#buf.slice(this.#offset, this.#offset + n));
+ this.#offset += n;
+
+ if (n === 0) {
+ return Promise.resolve(null);
+ }
+
+ return Promise.resolve(n);
+ }
+ }
+
+ const reader = new TestReader("hello world!");
+
+ let totalSize = 0;
+ for await (const buf of Deno.iter(reader)) {
+ totalSize += buf.byteLength;
+ }
+
+ assertEquals(totalSize, 12);
+});
+
+Deno.test(async function readerIterSync() {
+ // ref: https://github.com/denoland/deno/issues/2330
+ const encoder = new TextEncoder();
+
+ class TestReader implements Deno.ReaderSync {
+ #offset = 0;
+ #buf: Uint8Array;
+
+ constructor(s: string) {
+ this.#buf = new Uint8Array(encoder.encode(s));
+ }
+
+ readSync(p: Uint8Array): number | null {
+ const n = Math.min(p.byteLength, this.#buf.byteLength - this.#offset);
+ p.set(this.#buf.slice(this.#offset, this.#offset + n));
+ this.#offset += n;
+
+ if (n === 0) {
+ return null;
+ }
+
+ return n;
+ }
+ }
+
+ const reader = new TestReader("hello world!");
+
+ let totalSize = 0;
+ for await (const buf of Deno.iterSync(reader)) {
+ totalSize += buf.byteLength;
+ }
+
+ assertEquals(totalSize, 12);
+});
+
+Deno.test(
+ {
+ permissions: { read: true, write: true },
+ },
+ function openSyncMode() {
+ const path = Deno.makeTempDirSync() + "/test_openSync.txt";
+ using _file = Deno.openSync(path, {
+ write: true,
+ createNew: true,
+ mode: 0o626,
+ });
+ const pathInfo = Deno.statSync(path);
+ if (Deno.build.os !== "windows") {
+ assertEquals(pathInfo.mode! & 0o777, 0o626 & ~Deno.umask());
+ }
+ },
+);
+
+Deno.test(
+ {
+ permissions: { read: true, write: true },
+ },
+ async function openMode() {
+ const path = (await Deno.makeTempDir()) + "/test_open.txt";
+ using _file = await Deno.open(path, {
+ write: true,
+ createNew: true,
+ mode: 0o626,
+ });
+ const pathInfo = Deno.statSync(path);
+ if (Deno.build.os !== "windows") {
+ assertEquals(pathInfo.mode! & 0o777, 0o626 & ~Deno.umask());
+ }
+ },
+);
+
+Deno.test(
+ {
+ permissions: { read: true, write: true },
+ },
+ function openSyncUrl() {
+ const tempDir = Deno.makeTempDirSync();
+ const fileUrl = new URL(
+ `file://${
+ Deno.build.os === "windows" ? "/" : ""
+ }${tempDir}/test_open.txt`,
+ );
+ using _file = Deno.openSync(fileUrl, {
+ write: true,
+ createNew: true,
+ mode: 0o626,
+ });
+ const pathInfo = Deno.statSync(fileUrl);
+ if (Deno.build.os !== "windows") {
+ assertEquals(pathInfo.mode! & 0o777, 0o626 & ~Deno.umask());
+ }
+
+ Deno.removeSync(tempDir, { recursive: true });
+ },
+);
+
+Deno.test(
+ {
+ permissions: { read: true, write: true },
+ },
+ async function openUrl() {
+ const tempDir = await Deno.makeTempDir();
+ const fileUrl = new URL(
+ `file://${
+ Deno.build.os === "windows" ? "/" : ""
+ }${tempDir}/test_open.txt`,
+ );
+ using _file = await Deno.open(fileUrl, {
+ write: true,
+ createNew: true,
+ mode: 0o626,
+ });
+ const pathInfo = Deno.statSync(fileUrl);
+ if (Deno.build.os !== "windows") {
+ assertEquals(pathInfo.mode! & 0o777, 0o626 & ~Deno.umask());
+ }
+
+ Deno.removeSync(tempDir, { recursive: true });
+ },
+);
+
+Deno.test(
+ { permissions: { write: false } },
+ async function writePermFailure() {
+ const filename = "tests/hello.txt";
+ const openOptions: Deno.OpenOptions[] = [{ write: true }, { append: true }];
+ for (const options of openOptions) {
+ await assertRejects(async () => {
+ await Deno.open(filename, options);
+ }, Deno.errors.PermissionDenied);
+ }
+ },
+);
+
+Deno.test(async function openOptions() {
+ const filename = "tests/testdata/assets/fixture.json";
+ await assertRejects(
+ async () => {
+ await Deno.open(filename, { write: false });
+ },
+ Error,
+ "OpenOptions requires at least one option to be true",
+ );
+
+ await assertRejects(
+ async () => {
+ await Deno.open(filename, { truncate: true, write: false });
+ },
+ Error,
+ "'truncate' option requires 'write' option",
+ );
+
+ await assertRejects(
+ async () => {
+ await Deno.open(filename, { create: true, write: false });
+ },
+ Error,
+ "'create' or 'createNew' options require 'write' or 'append' option",
+ );
+
+ await assertRejects(
+ async () => {
+ await Deno.open(filename, { createNew: true, append: false });
+ },
+ Error,
+ "'create' or 'createNew' options require 'write' or 'append' option",
+ );
+});
+
+Deno.test({ permissions: { read: false } }, async function readPermFailure() {
+ await assertRejects(async () => {
+ await Deno.open("package.json", { read: true });
+ }, Deno.errors.PermissionDenied);
+});
+
+Deno.test(
+ { permissions: { write: true } },
+ async function writeNullBufferFailure() {
+ const tempDir = Deno.makeTempDirSync();
+ const filename = tempDir + "hello.txt";
+ const w = {
+ write: true,
+ truncate: true,
+ create: true,
+ };
+ using file = await Deno.open(filename, w);
+
+ // writing null should throw an error
+ await assertRejects(
+ async () => {
+ // deno-lint-ignore no-explicit-any
+ await file.write(null as any);
+ },
+ ); // TODO(bartlomieju): Check error kind when dispatch_minimal pipes errors properly
+ await Deno.remove(tempDir, { recursive: true });
+ },
+);
+
+Deno.test(
+ { permissions: { write: true, read: true } },
+ async function readNullBufferFailure() {
+ const tempDir = Deno.makeTempDirSync();
+ const filename = tempDir + "hello.txt";
+ using file = await Deno.open(filename, {
+ read: true,
+ write: true,
+ truncate: true,
+ create: true,
+ });
+
+ // reading into an empty buffer should return 0 immediately
+ const bytesRead = await file.read(new Uint8Array(0));
+ assert(bytesRead === 0);
+
+ // reading file into null buffer should throw an error
+ await assertRejects(async () => {
+ // deno-lint-ignore no-explicit-any
+ await file.read(null as any);
+ }, TypeError);
+ // TODO(bartlomieju): Check error kind when dispatch_minimal pipes errors properly
+
+ await Deno.remove(tempDir, { recursive: true });
+ },
+);
+
+Deno.test(
+ { permissions: { write: false, read: false } },
+ async function readWritePermFailure() {
+ const filename = "tests/hello.txt";
+ await assertRejects(async () => {
+ await Deno.open(filename, { read: true });
+ }, Deno.errors.PermissionDenied);
+ },
+);
+
+Deno.test(
+ { permissions: { write: true, read: true } },
+ async function openNotFound() {
+ await assertRejects(
+ async () => {
+ await Deno.open("bad_file_name");
+ },
+ Deno.errors.NotFound,
+ `open 'bad_file_name'`,
+ );
+ },
+);
+
+Deno.test(
+ { permissions: { write: true, read: true } },
+ function openSyncNotFound() {
+ assertThrows(
+ () => {
+ Deno.openSync("bad_file_name");
+ },
+ Deno.errors.NotFound,
+ `open 'bad_file_name'`,
+ );
+ },
+);
+
+Deno.test(
+ { permissions: { read: true, write: true } },
+ async function createFile() {
+ const tempDir = await Deno.makeTempDir();
+ const filename = tempDir + "/test.txt";
+ const f = await Deno.create(filename);
+ let fileInfo = Deno.statSync(filename);
+ assert(fileInfo.isFile);
+ assert(fileInfo.size === 0);
+ const enc = new TextEncoder();
+ const data = enc.encode("Hello");
+ await f.write(data);
+ fileInfo = Deno.statSync(filename);
+ assert(fileInfo.size === 5);
+ f.close();
+
+ // TODO(bartlomieju): test different modes
+ await Deno.remove(tempDir, { recursive: true });
+ },
+);
+
+Deno.test(
+ { permissions: { read: true, write: true } },
+ async function createFileWithUrl() {
+ const tempDir = await Deno.makeTempDir();
+ const fileUrl = new URL(
+ `file://${Deno.build.os === "windows" ? "/" : ""}${tempDir}/test.txt`,
+ );
+ const f = await Deno.create(fileUrl);
+ let fileInfo = Deno.statSync(fileUrl);
+ assert(fileInfo.isFile);
+ assert(fileInfo.size === 0);
+ const enc = new TextEncoder();
+ const data = enc.encode("Hello");
+ await f.write(data);
+ fileInfo = Deno.statSync(fileUrl);
+ assert(fileInfo.size === 5);
+ f.close();
+
+ await Deno.remove(tempDir, { recursive: true });
+ },
+);
+
+Deno.test(
+ { permissions: { read: true, write: true } },
+ async function createSyncFile() {
+ const tempDir = await Deno.makeTempDir();
+ const filename = tempDir + "/test.txt";
+ const f = Deno.createSync(filename);
+ let fileInfo = Deno.statSync(filename);
+ assert(fileInfo.isFile);
+ assert(fileInfo.size === 0);
+ const enc = new TextEncoder();
+ const data = enc.encode("Hello");
+ await f.write(data);
+ fileInfo = Deno.statSync(filename);
+ assert(fileInfo.size === 5);
+ f.close();
+
+ // TODO(bartlomieju): test different modes
+ await Deno.remove(tempDir, { recursive: true });
+ },
+);
+
+Deno.test(
+ { permissions: { read: true, write: true } },
+ async function createSyncFileWithUrl() {
+ const tempDir = await Deno.makeTempDir();
+ const fileUrl = new URL(
+ `file://${Deno.build.os === "windows" ? "/" : ""}${tempDir}/test.txt`,
+ );
+ const f = Deno.createSync(fileUrl);
+ let fileInfo = Deno.statSync(fileUrl);
+ assert(fileInfo.isFile);
+ assert(fileInfo.size === 0);
+ const enc = new TextEncoder();
+ const data = enc.encode("Hello");
+ await f.write(data);
+ fileInfo = Deno.statSync(fileUrl);
+ assert(fileInfo.size === 5);
+ f.close();
+
+ await Deno.remove(tempDir, { recursive: true });
+ },
+);
+
+Deno.test(
+ { permissions: { read: true, write: true } },
+ async function openModeWrite() {
+ const tempDir = Deno.makeTempDirSync();
+ const encoder = new TextEncoder();
+ const filename = tempDir + "hello.txt";
+ const data = encoder.encode("Hello world!\n");
+ let file = await Deno.open(filename, {
+ create: true,
+ write: true,
+ truncate: true,
+ });
+ // assert file was created
+ let fileInfo = Deno.statSync(filename);
+ assert(fileInfo.isFile);
+ assertEquals(fileInfo.size, 0);
+ // write some data
+ await file.write(data);
+ fileInfo = Deno.statSync(filename);
+ assertEquals(fileInfo.size, 13);
+ // assert we can't read from file
+ let thrown = false;
+ try {
+ const buf = new Uint8Array(20);
+ await file.read(buf);
+ } catch (_e) {
+ thrown = true;
+ } finally {
+ assert(thrown, "'w' mode shouldn't allow to read file");
+ }
+ file.close();
+ // assert that existing file is truncated on open
+ file = await Deno.open(filename, {
+ write: true,
+ truncate: true,
+ });
+ file.close();
+ const fileSize = Deno.statSync(filename).size;
+ assertEquals(fileSize, 0);
+ await Deno.remove(tempDir, { recursive: true });
+ },
+);
+
+Deno.test(
+ { permissions: { read: true, write: true } },
+ async function openModeWriteRead() {
+ const tempDir = Deno.makeTempDirSync();
+ const encoder = new TextEncoder();
+ const filename = tempDir + "hello.txt";
+ const data = encoder.encode("Hello world!\n");
+
+ using file = await Deno.open(filename, {
+ write: true,
+ truncate: true,
+ create: true,
+ read: true,
+ });
+ const seekPosition = 0;
+ // assert file was created
+ let fileInfo = Deno.statSync(filename);
+ assert(fileInfo.isFile);
+ assertEquals(fileInfo.size, 0);
+ // write some data
+ await file.write(data);
+ fileInfo = Deno.statSync(filename);
+ assertEquals(fileInfo.size, 13);
+
+ const buf = new Uint8Array(20);
+ // seeking from beginning of a file
+ const cursorPosition = await file.seek(seekPosition, Deno.SeekMode.Start);
+ assertEquals(seekPosition, cursorPosition);
+ const result = await file.read(buf);
+ assertEquals(result, 13);
+
+ await Deno.remove(tempDir, { recursive: true });
+ },
+);
+
+Deno.test({ permissions: { read: true } }, async function seekStart() {
+ const filename = "tests/testdata/assets/hello.txt";
+ using file = await Deno.open(filename);
+ const seekPosition = 6;
+ // Deliberately move 1 step forward
+ await file.read(new Uint8Array(1)); // "H"
+ // Skipping "Hello "
+ // seeking from beginning of a file plus seekPosition
+ const cursorPosition = await file.seek(seekPosition, Deno.SeekMode.Start);
+ assertEquals(seekPosition, cursorPosition);
+ const buf = new Uint8Array(6);
+ await file.read(buf);
+ const decoded = new TextDecoder().decode(buf);
+ assertEquals(decoded, "world!");
+});
+
+Deno.test({ permissions: { read: true } }, async function seekStartBigInt() {
+ const filename = "tests/testdata/assets/hello.txt";
+ using file = await Deno.open(filename);
+ const seekPosition = 6n;
+ // Deliberately move 1 step forward
+ await file.read(new Uint8Array(1)); // "H"
+ // Skipping "Hello "
+ // seeking from beginning of a file plus seekPosition
+ const cursorPosition = await file.seek(seekPosition, Deno.SeekMode.Start);
+ assertEquals(seekPosition, BigInt(cursorPosition));
+ const buf = new Uint8Array(6);
+ await file.read(buf);
+ const decoded = new TextDecoder().decode(buf);
+ assertEquals(decoded, "world!");
+});
+
+Deno.test({ permissions: { read: true } }, function seekSyncStart() {
+ const filename = "tests/testdata/assets/hello.txt";
+ using file = Deno.openSync(filename);
+ const seekPosition = 6;
+ // Deliberately move 1 step forward
+ file.readSync(new Uint8Array(1)); // "H"
+ // Skipping "Hello "
+ // seeking from beginning of a file plus seekPosition
+ const cursorPosition = file.seekSync(seekPosition, Deno.SeekMode.Start);
+ assertEquals(seekPosition, cursorPosition);
+ const buf = new Uint8Array(6);
+ file.readSync(buf);
+ const decoded = new TextDecoder().decode(buf);
+ assertEquals(decoded, "world!");
+});
+
+Deno.test({ permissions: { read: true } }, async function seekCurrent() {
+ const filename = "tests/testdata/assets/hello.txt";
+ using file = await Deno.open(filename);
+ // Deliberately move 1 step forward
+ await file.read(new Uint8Array(1)); // "H"
+ // Skipping "ello "
+ const seekPosition = 5;
+ // seekPosition is relative to current cursor position after read
+ const cursorPosition = await file.seek(seekPosition, Deno.SeekMode.Current);
+ assertEquals(seekPosition + 1, cursorPosition);
+ const buf = new Uint8Array(6);
+ await file.read(buf);
+ const decoded = new TextDecoder().decode(buf);
+ assertEquals(decoded, "world!");
+});
+
+Deno.test({ permissions: { read: true } }, function seekSyncCurrent() {
+ const filename = "tests/testdata/assets/hello.txt";
+ using file = Deno.openSync(filename);
+ // Deliberately move 1 step forward
+ file.readSync(new Uint8Array(1)); // "H"
+ // Skipping "ello "
+ const seekPosition = 5;
+ // seekPosition is relative to current cursor position after read
+ const cursorPosition = file.seekSync(seekPosition, Deno.SeekMode.Current);
+ assertEquals(seekPosition + 1, cursorPosition);
+ const buf = new Uint8Array(6);
+ file.readSync(buf);
+ const decoded = new TextDecoder().decode(buf);
+ assertEquals(decoded, "world!");
+});
+
+Deno.test({ permissions: { read: true } }, async function seekEnd() {
+ const filename = "tests/testdata/assets/hello.txt";
+ using file = await Deno.open(filename);
+ const seekPosition = -6;
+ // seek from end of file that has 12 chars, 12 - 6 = 6
+ const cursorPosition = await file.seek(seekPosition, Deno.SeekMode.End);
+ assertEquals(6, cursorPosition);
+ const buf = new Uint8Array(6);
+ await file.read(buf);
+ const decoded = new TextDecoder().decode(buf);
+ assertEquals(decoded, "world!");
+});
+
+Deno.test({ permissions: { read: true } }, function seekSyncEnd() {
+ const filename = "tests/testdata/assets/hello.txt";
+ using file = Deno.openSync(filename);
+ const seekPosition = -6;
+ // seek from end of file that has 12 chars, 12 - 6 = 6
+ const cursorPosition = file.seekSync(seekPosition, Deno.SeekMode.End);
+ assertEquals(6, cursorPosition);
+ const buf = new Uint8Array(6);
+ file.readSync(buf);
+ const decoded = new TextDecoder().decode(buf);
+ assertEquals(decoded, "world!");
+});
+
+Deno.test({ permissions: { read: true } }, async function seekMode() {
+ const filename = "tests/testdata/assets/hello.txt";
+ using file = await Deno.open(filename);
+ await assertRejects(
+ async () => {
+ await file.seek(1, -1 as unknown as Deno.SeekMode);
+ },
+ TypeError,
+ "Invalid seek mode",
+ );
+
+ // We should still be able to read the file
+ // since it is still open.
+ const buf = new Uint8Array(1);
+ await file.read(buf); // "H"
+ assertEquals(new TextDecoder().decode(buf), "H");
+});
+
+Deno.test(
+ { permissions: { read: true, write: true } },
+ function fileTruncateSyncSuccess() {
+ const filename = Deno.makeTempDirSync() + "/test_fileTruncateSync.txt";
+ using file = Deno.openSync(filename, {
+ create: true,
+ read: true,
+ write: true,
+ });
+
+ file.truncateSync(20);
+ assertEquals(Deno.readFileSync(filename).byteLength, 20);
+ file.truncateSync(5);
+ assertEquals(Deno.readFileSync(filename).byteLength, 5);
+ file.truncateSync(-5);
+ assertEquals(Deno.readFileSync(filename).byteLength, 0);
+
+ Deno.removeSync(filename);
+ },
+);
+
+Deno.test(
+ { permissions: { read: true, write: true } },
+ async function fileTruncateSuccess() {
+ const filename = Deno.makeTempDirSync() + "/test_fileTruncate.txt";
+ using file = await Deno.open(filename, {
+ create: true,
+ read: true,
+ write: true,
+ });
+
+ await file.truncate(20);
+ assertEquals((await Deno.readFile(filename)).byteLength, 20);
+ await file.truncate(5);
+ assertEquals((await Deno.readFile(filename)).byteLength, 5);
+ await file.truncate(-5);
+ assertEquals((await Deno.readFile(filename)).byteLength, 0);
+
+ await Deno.remove(filename);
+ },
+);
+
+Deno.test({ permissions: { read: true } }, function fileStatSyncSuccess() {
+ using file = Deno.openSync("README.md");
+ const fileInfo = file.statSync();
+ assert(fileInfo.isFile);
+ assert(!fileInfo.isSymlink);
+ assert(!fileInfo.isDirectory);
+ assert(fileInfo.size);
+ assert(fileInfo.atime);
+ assert(fileInfo.mtime);
+ // The `birthtime` field is not available on Linux before kernel version 4.11.
+ assert(fileInfo.birthtime || Deno.build.os === "linux");
+});
+
+Deno.test(async function fileStatSuccess() {
+ using file = await Deno.open("README.md");
+ const fileInfo = await file.stat();
+ assert(fileInfo.isFile);
+ assert(!fileInfo.isSymlink);
+ assert(!fileInfo.isDirectory);
+ assert(fileInfo.size);
+ assert(fileInfo.atime);
+ assert(fileInfo.mtime);
+ // The `birthtime` field is not available on Linux before kernel version 4.11.
+ assert(fileInfo.birthtime || Deno.build.os === "linux");
+});
+
+Deno.test({ permissions: { read: true } }, async function readableStream() {
+ const filename = "tests/testdata/assets/hello.txt";
+ const file = await Deno.open(filename);
+ assert(file.readable instanceof ReadableStream);
+ const chunks = [];
+ for await (const chunk of file.readable) {
+ chunks.push(chunk);
+ }
+ assertEquals(chunks.length, 1);
+ assertEquals(chunks[0].byteLength, 12);
+});
+
+Deno.test(
+ { permissions: { read: true } },
+ async function readableStreamTextEncoderPipe() {
+ const filename = "tests/testdata/assets/hello.txt";
+ const file = await Deno.open(filename);
+ const readable = file.readable.pipeThrough(new TextDecoderStream());
+ const chunks = [];
+ for await (const chunk of readable) {
+ chunks.push(chunk);
+ }
+ assertEquals(chunks.length, 1);
+ assertEquals(chunks[0].length, 12);
+ },
+);
+
+Deno.test(
+ { permissions: { read: true, write: true } },
+ async function writableStream() {
+ const path = await Deno.makeTempFile();
+ const file = await Deno.open(path, { write: true });
+ assert(file.writable instanceof WritableStream);
+ const readable = new ReadableStream({
+ start(controller) {
+ controller.enqueue(new TextEncoder().encode("hello "));
+ controller.enqueue(new TextEncoder().encode("world!"));
+ controller.close();
+ },
+ });
+ await readable.pipeTo(file.writable);
+ const res = await Deno.readTextFile(path);
+ assertEquals(res, "hello world!");
+ },
+);
+
+Deno.test(
+ { permissions: { read: true, write: true } },
+ async function readTextFileNonUtf8() {
+ const path = await Deno.makeTempFile();
+ using file = await Deno.open(path, { write: true });
+ await file.write(new TextEncoder().encode("hello "));
+ await file.write(new Uint8Array([0xC0]));
+
+ const res = await Deno.readTextFile(path);
+ const resSync = Deno.readTextFileSync(path);
+ assertEquals(res, resSync);
+ assertEquals(res, "hello \uFFFD");
+ },
+);
+
+Deno.test(
+ { permissions: { read: true } },
+ async function fsFileExplicitResourceManagement() {
+ let file2: Deno.FsFile;
+
+ {
+ using file = await Deno.open("tests/testdata/assets/hello.txt");
+ file2 = file;
+
+ const stat = file.statSync();
+ assert(stat.isFile);
+ }
+
+ assertThrows(() => file2.statSync(), Deno.errors.BadResource);
+ },
+);
+
+Deno.test(
+ { permissions: { read: true } },
+ async function fsFileExplicitResourceManagementManualClose() {
+ using file = await Deno.open("tests/testdata/assets/hello.txt");
+ file.close();
+ assertThrows(() => file.statSync(), Deno.errors.BadResource); // definitely closed
+ // calling [Symbol.dispose] after manual close is a no-op
+ },
+);
+
+Deno.test(
+ { permissions: { read: true, write: true } },
+ function fsFileDatasyncSyncSuccess() {
+ const filename = Deno.makeTempDirSync() + "/test_fdatasyncSync.txt";
+ const file = Deno.openSync(filename, {
+ read: true,
+ write: true,
+ create: true,
+ });
+ const data = new Uint8Array(64);
+ file.writeSync(data);
+ file.syncDataSync();
+ assertEquals(Deno.readFileSync(filename), data);
+ file.close();
+ Deno.removeSync(filename);
+ },
+);
+
+Deno.test(
+ { permissions: { read: true, write: true } },
+ async function fsFileDatasyncSuccess() {
+ const filename = (await Deno.makeTempDir()) + "/test_fdatasync.txt";
+ const file = await Deno.open(filename, {
+ read: true,
+ write: true,
+ create: true,
+ });
+ const data = new Uint8Array(64);
+ await file.write(data);
+ await file.syncData();
+ assertEquals(await Deno.readFile(filename), data);
+ file.close();
+ await Deno.remove(filename);
+ },
+);
+
+Deno.test(
+ { permissions: { read: true, write: true } },
+ function fsFileSyncSyncSuccess() {
+ const filename = Deno.makeTempDirSync() + "/test_fsyncSync.txt";
+ const file = Deno.openSync(filename, {
+ read: true,
+ write: true,
+ create: true,
+ });
+ const size = 64;
+ file.truncateSync(size);
+ file.syncSync();
+ assertEquals(file.statSync().size, size);
+ file.close();
+ Deno.removeSync(filename);
+ },
+);
+
+Deno.test(
+ { permissions: { read: true, write: true } },
+ async function fsFileSyncSuccess() {
+ const filename = (await Deno.makeTempDir()) + "/test_fsync.txt";
+ const file = await Deno.open(filename, {
+ read: true,
+ write: true,
+ create: true,
+ });
+ const size = 64;
+ await file.truncate(size);
+ await file.sync();
+ assertEquals((await file.stat()).size, size);
+ file.close();
+ await Deno.remove(filename);
+ },
+);
+
+Deno.test(
+ { permissions: { read: true, run: true, hrtime: true } },
+ async function fsFileLockFileSync() {
+ await runFlockTests({ sync: true });
+ },
+);
+
+Deno.test(
+ { permissions: { read: true, run: true, hrtime: true } },
+ async function fsFileLockFileAsync() {
+ await runFlockTests({ sync: false });
+ },
+);
+
+async function runFlockTests(opts: { sync: boolean }) {
+ assertEquals(
+ await checkFirstBlocksSecond({
+ firstExclusive: true,
+ secondExclusive: false,
+ sync: opts.sync,
+ }),
+ true,
+ "exclusive blocks shared",
+ );
+ assertEquals(
+ await checkFirstBlocksSecond({
+ firstExclusive: false,
+ secondExclusive: true,
+ sync: opts.sync,
+ }),
+ true,
+ "shared blocks exclusive",
+ );
+ assertEquals(
+ await checkFirstBlocksSecond({
+ firstExclusive: true,
+ secondExclusive: true,
+ sync: opts.sync,
+ }),
+ true,
+ "exclusive blocks exclusive",
+ );
+ assertEquals(
+ await checkFirstBlocksSecond({
+ firstExclusive: false,
+ secondExclusive: false,
+ sync: opts.sync,
+ // need to wait for both to enter the lock to prevent the case where the
+ // first process enters and exits the lock before the second even enters
+ waitBothEnteredLock: true,
+ }),
+ false,
+ "shared does not block shared",
+ );
+}
+
+async function checkFirstBlocksSecond(opts: {
+ firstExclusive: boolean;
+ secondExclusive: boolean;
+ sync: boolean;
+ waitBothEnteredLock?: boolean;
+}) {
+ const firstProcess = runFlockTestProcess({
+ exclusive: opts.firstExclusive,
+ sync: opts.sync,
+ });
+ const secondProcess = runFlockTestProcess({
+ exclusive: opts.secondExclusive,
+ sync: opts.sync,
+ });
+ try {
+ const sleep = (time: number) => new Promise((r) => setTimeout(r, time));
+
+ await Promise.all([
+ firstProcess.waitStartup(),
+ secondProcess.waitStartup(),
+ ]);
+
+ await firstProcess.enterLock();
+ await firstProcess.waitEnterLock();
+
+ await secondProcess.enterLock();
+ await sleep(100);
+
+ if (!opts.waitBothEnteredLock) {
+ await firstProcess.exitLock();
+ }
+
+ await secondProcess.waitEnterLock();
+
+ if (opts.waitBothEnteredLock) {
+ await firstProcess.exitLock();
+ }
+
+ await secondProcess.exitLock();
+
+ // collect the final output
+ const firstPsTimes = await firstProcess.getTimes();
+ const secondPsTimes = await secondProcess.getTimes();
+ return firstPsTimes.exitTime < secondPsTimes.enterTime;
+ } finally {
+ await firstProcess.close();
+ await secondProcess.close();
+ }
+}
+
+function runFlockTestProcess(opts: { exclusive: boolean; sync: boolean }) {
+ const path = "tests/testdata/assets/lock_target.txt";
+ const scriptText = `
+ const file = Deno.openSync("${path}");
+
+ // ready signal
+ Deno.stdout.writeSync(new Uint8Array(1));
+ // wait for enter lock signal
+ Deno.stdin.readSync(new Uint8Array(1));
+
+ // entering signal
+ Deno.stdout.writeSync(new Uint8Array(1));
+ // lock and record the entry time
+ ${
+ opts.sync
+ ? `file.lockSync(${opts.exclusive ? "true" : "false"});`
+ : `await file.lock(${opts.exclusive ? "true" : "false"});`
+ }
+ const enterTime = new Date().getTime();
+ // entered signal
+ Deno.stdout.writeSync(new Uint8Array(1));
+
+ // wait for exit lock signal
+ Deno.stdin.readSync(new Uint8Array(1));
+
+ // record the exit time and wait a little bit before releasing
+ // the lock so that the enter time of the next process doesn't
+ // occur at the same time as this exit time
+ const exitTime = new Date().getTime();
+ await new Promise(resolve => setTimeout(resolve, 100));
+
+ // release the lock
+ ${opts.sync ? "file.unlockSync();" : "await file.unlock();"}
+
+ // exited signal
+ Deno.stdout.writeSync(new Uint8Array(1));
+
+ // output the enter and exit time
+ console.log(JSON.stringify({ enterTime, exitTime }));
+`;
+
+ const process = new Deno.Command(Deno.execPath(), {
+ args: ["eval", "--unstable", scriptText],
+ stdin: "piped",
+ stdout: "piped",
+ stderr: "null",
+ }).spawn();
+
+ const waitSignal = async () => {
+ const reader = process.stdout.getReader({ mode: "byob" });
+ await reader.read(new Uint8Array(1));
+ reader.releaseLock();
+ };
+ const signal = async () => {
+ const writer = process.stdin.getWriter();
+ await writer.write(new Uint8Array(1));
+ writer.releaseLock();
+ };
+
+ return {
+ async waitStartup() {
+ await waitSignal();
+ },
+ async enterLock() {
+ await signal();
+ await waitSignal(); // entering signal
+ },
+ async waitEnterLock() {
+ await waitSignal();
+ },
+ async exitLock() {
+ await signal();
+ await waitSignal();
+ },
+ getTimes: async () => {
+ const { stdout } = await process.output();
+ const text = new TextDecoder().decode(stdout);
+ return JSON.parse(text) as {
+ enterTime: number;
+ exitTime: number;
+ };
+ },
+ close: async () => {
+ await process.status;
+ await process.stdin.close();
+ },
+ };
+}
diff --git a/tests/unit/flock_test.ts b/tests/unit/flock_test.ts
new file mode 100644
index 000000000..4b194ce55
--- /dev/null
+++ b/tests/unit/flock_test.ts
@@ -0,0 +1,197 @@
+// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
+import { assertEquals } from "./test_util.ts";
+
+Deno.test(
+ { permissions: { read: true, run: true, hrtime: true } },
+ async function flockFileSync() {
+ await runFlockTests({ sync: true });
+ },
+);
+
+Deno.test(
+ { permissions: { read: true, run: true, hrtime: true } },
+ async function flockFileAsync() {
+ await runFlockTests({ sync: false });
+ },
+);
+
+async function runFlockTests(opts: { sync: boolean }) {
+ assertEquals(
+ await checkFirstBlocksSecond({
+ firstExclusive: true,
+ secondExclusive: false,
+ sync: opts.sync,
+ }),
+ true,
+ "exclusive blocks shared",
+ );
+ assertEquals(
+ await checkFirstBlocksSecond({
+ firstExclusive: false,
+ secondExclusive: true,
+ sync: opts.sync,
+ }),
+ true,
+ "shared blocks exclusive",
+ );
+ assertEquals(
+ await checkFirstBlocksSecond({
+ firstExclusive: true,
+ secondExclusive: true,
+ sync: opts.sync,
+ }),
+ true,
+ "exclusive blocks exclusive",
+ );
+ assertEquals(
+ await checkFirstBlocksSecond({
+ firstExclusive: false,
+ secondExclusive: false,
+ sync: opts.sync,
+ // need to wait for both to enter the lock to prevent the case where the
+ // first process enters and exits the lock before the second even enters
+ waitBothEnteredLock: true,
+ }),
+ false,
+ "shared does not block shared",
+ );
+}
+
+async function checkFirstBlocksSecond(opts: {
+ firstExclusive: boolean;
+ secondExclusive: boolean;
+ sync: boolean;
+ waitBothEnteredLock?: boolean;
+}) {
+ const firstProcess = runFlockTestProcess({
+ exclusive: opts.firstExclusive,
+ sync: opts.sync,
+ });
+ const secondProcess = runFlockTestProcess({
+ exclusive: opts.secondExclusive,
+ sync: opts.sync,
+ });
+ try {
+ const sleep = (time: number) => new Promise((r) => setTimeout(r, time));
+
+ await Promise.all([
+ firstProcess.waitStartup(),
+ secondProcess.waitStartup(),
+ ]);
+
+ await firstProcess.enterLock();
+ await firstProcess.waitEnterLock();
+
+ await secondProcess.enterLock();
+ await sleep(100);
+
+ if (!opts.waitBothEnteredLock) {
+ await firstProcess.exitLock();
+ }
+
+ await secondProcess.waitEnterLock();
+
+ if (opts.waitBothEnteredLock) {
+ await firstProcess.exitLock();
+ }
+
+ await secondProcess.exitLock();
+
+ // collect the final output
+ const firstPsTimes = await firstProcess.getTimes();
+ const secondPsTimes = await secondProcess.getTimes();
+ return firstPsTimes.exitTime < secondPsTimes.enterTime;
+ } finally {
+ await firstProcess.close();
+ await secondProcess.close();
+ }
+}
+
+function runFlockTestProcess(opts: { exclusive: boolean; sync: boolean }) {
+ const path = "tests/testdata/assets/lock_target.txt";
+ const scriptText = `
+ const { rid } = Deno.openSync("${path}");
+
+ // ready signal
+ Deno.stdout.writeSync(new Uint8Array(1));
+ // wait for enter lock signal
+ Deno.stdin.readSync(new Uint8Array(1));
+
+ // entering signal
+ Deno.stdout.writeSync(new Uint8Array(1));
+ // lock and record the entry time
+ ${
+ opts.sync
+ ? `Deno.flockSync(rid, ${opts.exclusive ? "true" : "false"});`
+ : `await Deno.flock(rid, ${opts.exclusive ? "true" : "false"});`
+ }
+ const enterTime = new Date().getTime();
+ // entered signal
+ Deno.stdout.writeSync(new Uint8Array(1));
+
+ // wait for exit lock signal
+ Deno.stdin.readSync(new Uint8Array(1));
+
+ // record the exit time and wait a little bit before releasing
+ // the lock so that the enter time of the next process doesn't
+ // occur at the same time as this exit time
+ const exitTime = new Date().getTime();
+ await new Promise(resolve => setTimeout(resolve, 100));
+
+ // release the lock
+ ${opts.sync ? "Deno.funlockSync(rid);" : "await Deno.funlock(rid);"}
+
+ // exited signal
+ Deno.stdout.writeSync(new Uint8Array(1));
+
+ // output the enter and exit time
+ console.log(JSON.stringify({ enterTime, exitTime }));
+`;
+
+ const process = new Deno.Command(Deno.execPath(), {
+ args: ["eval", "--unstable", scriptText],
+ stdin: "piped",
+ stdout: "piped",
+ stderr: "null",
+ }).spawn();
+
+ const waitSignal = async () => {
+ const reader = process.stdout.getReader({ mode: "byob" });
+ await reader.read(new Uint8Array(1));
+ reader.releaseLock();
+ };
+ const signal = async () => {
+ const writer = process.stdin.getWriter();
+ await writer.write(new Uint8Array(1));
+ writer.releaseLock();
+ };
+
+ return {
+ async waitStartup() {
+ await waitSignal();
+ },
+ async enterLock() {
+ await signal();
+ await waitSignal(); // entering signal
+ },
+ async waitEnterLock() {
+ await waitSignal();
+ },
+ async exitLock() {
+ await signal();
+ await waitSignal();
+ },
+ getTimes: async () => {
+ const { stdout } = await process.output();
+ const text = new TextDecoder().decode(stdout);
+ return JSON.parse(text) as {
+ enterTime: number;
+ exitTime: number;
+ };
+ },
+ close: async () => {
+ await process.status;
+ await process.stdin.close();
+ },
+ };
+}
diff --git a/cli/tests/unit/fs_events_test.ts b/tests/unit/fs_events_test.ts
index 4f7cdc4d5..4f7cdc4d5 100644
--- a/cli/tests/unit/fs_events_test.ts
+++ b/tests/unit/fs_events_test.ts
diff --git a/cli/tests/unit/get_random_values_test.ts b/tests/unit/get_random_values_test.ts
index 75aaf4c1b..75aaf4c1b 100644
--- a/cli/tests/unit/get_random_values_test.ts
+++ b/tests/unit/get_random_values_test.ts
diff --git a/cli/tests/unit/globals_test.ts b/tests/unit/globals_test.ts
index 00be3f451..00be3f451 100644
--- a/cli/tests/unit/globals_test.ts
+++ b/tests/unit/globals_test.ts
diff --git a/cli/tests/unit/headers_test.ts b/tests/unit/headers_test.ts
index ad453b67f..ad453b67f 100644
--- a/cli/tests/unit/headers_test.ts
+++ b/tests/unit/headers_test.ts
diff --git a/tests/unit/http_test.ts b/tests/unit/http_test.ts
new file mode 100644
index 000000000..17023004e
--- /dev/null
+++ b/tests/unit/http_test.ts
@@ -0,0 +1,2801 @@
+// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
+import { Buffer, BufReader, BufWriter } from "@test_util/std/io/mod.ts";
+import { TextProtoReader } from "../testdata/run/textproto.ts";
+import {
+ assert,
+ assertEquals,
+ assertRejects,
+ assertStrictEquals,
+ assertThrows,
+ delay,
+ fail,
+} from "./test_util.ts";
+import { join } from "@test_util/std/path/mod.ts";
+
+const listenPort = 4507;
+const listenPort2 = 4508;
+
+const {
+ buildCaseInsensitiveCommaValueFinder,
+ // @ts-expect-error TypeScript (as of 3.7) does not support indexing namespaces by symbol
+} = Deno[Deno.internal];
+
+async function writeRequestAndReadResponse(conn: Deno.Conn): Promise<string> {
+ const encoder = new TextEncoder();
+ const decoder = new TextDecoder();
+
+ const w = new BufWriter(conn);
+ const r = new BufReader(conn);
+ const body = `GET / HTTP/1.1\r\nHost: 127.0.0.1:${listenPort}\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);
+ const headers = await tpr.readMimeHeader();
+ assert(headers !== null);
+
+ const chunkedReader = chunkedBodyReader(headers, r);
+ const buf = new Uint8Array(5);
+ const dest = new Buffer();
+ let result: number | null;
+ while ((result = await chunkedReader.read(buf)) !== null) {
+ const len = Math.min(buf.byteLength, result);
+ await dest.write(buf.subarray(0, len));
+ }
+ return decoder.decode(dest.bytes());
+}
+
+Deno.test({ permissions: { net: true } }, async function httpServerBasic() {
+ let httpConn: Deno.HttpConn;
+ const promise = (async () => {
+ const listener = Deno.listen({ port: listenPort });
+ const conn = await listener.accept();
+ listener.close();
+ httpConn = Deno.serveHttp(conn);
+ const reqEvent = await httpConn.nextRequest();
+ assert(reqEvent);
+ const { request, respondWith } = reqEvent;
+ assertEquals(new URL(request.url).href, `http://127.0.0.1:${listenPort}/`);
+ assertEquals(await request.text(), "");
+ await respondWith(
+ new Response("Hello World", { headers: { "foo": "bar" } }),
+ );
+ })();
+
+ const resp = await fetch(`http://127.0.0.1:${listenPort}/`, {
+ headers: { "connection": "close" },
+ });
+ const clone = resp.clone();
+ const text = await resp.text();
+ assertEquals(text, "Hello World");
+ assertEquals(resp.headers.get("foo"), "bar");
+ const cloneText = await clone.text();
+ assertEquals(cloneText, "Hello World");
+ await promise;
+
+ httpConn!.close();
+});
+
+// https://github.com/denoland/deno/issues/15107
+Deno.test(
+ { permissions: { net: true } },
+ async function httpLazyHeadersIssue15107() {
+ let headers: Headers;
+ const promise = (async () => {
+ const listener = Deno.listen({ port: 2333 });
+ const conn = await listener.accept();
+ listener.close();
+ const httpConn = Deno.serveHttp(conn);
+ const e = await httpConn.nextRequest();
+ assert(e);
+ const { request } = e;
+ request.text();
+ headers = request.headers;
+ httpConn!.close();
+ })();
+
+ const conn = await Deno.connect({ port: 2333 });
+ // Send GET request with a body + content-length.
+ const encoder = new TextEncoder();
+ const body =
+ `GET / HTTP/1.1\r\nHost: 127.0.0.1:2333\r\nContent-Length: 5\r\n\r\n12345`;
+ const writeResult = await conn.write(encoder.encode(body));
+ assertEquals(body.length, writeResult);
+ await promise;
+ conn.close();
+ assertEquals(headers!.get("content-length"), "5");
+ },
+);
+
+Deno.test(
+ { permissions: { net: true } },
+ async function httpReadHeadersAfterClose() {
+ const promise = (async () => {
+ const listener = Deno.listen({ port: 2334 });
+ const conn = await listener.accept();
+ listener.close();
+ const httpConn = Deno.serveHttp(conn);
+ const e = await httpConn.nextRequest();
+ assert(e);
+ const { request, respondWith } = e;
+
+ await request.text(); // Read body
+ await respondWith(new Response("Hello World")); // Closes request
+
+ assertThrows(() => request.headers, TypeError, "request closed");
+ httpConn!.close();
+ })();
+
+ const conn = await Deno.connect({ port: 2334 });
+ // Send GET request with a body + content-length.
+ const encoder = new TextEncoder();
+ const body =
+ `GET / HTTP/1.1\r\nHost: 127.0.0.1:2333\r\nContent-Length: 5\r\n\r\n12345`;
+ const writeResult = await conn.write(encoder.encode(body));
+ assertEquals(body.length, writeResult);
+ await promise;
+ conn.close();
+ },
+);
+
+Deno.test(
+ { permissions: { net: true } },
+ async function httpServerGetRequestBody() {
+ let httpConn: Deno.HttpConn;
+ const promise = (async () => {
+ const listener = Deno.listen({ port: listenPort });
+ const conn = await listener.accept();
+ listener.close();
+ httpConn = Deno.serveHttp(conn);
+ const e = await httpConn.nextRequest();
+ assert(e);
+ const { request, respondWith } = e;
+ assertEquals(request.body, null);
+ await respondWith(new Response("", { headers: {} }));
+ })();
+
+ const conn = await Deno.connect({ port: listenPort });
+ // Send GET request with a body + content-length.
+ const encoder = new TextEncoder();
+ const body =
+ `GET / HTTP/1.1\r\nHost: 127.0.0.1:${listenPort}\r\nContent-Length: 5\r\n\r\n12345`;
+ const writeResult = await conn.write(encoder.encode(body));
+ assertEquals(body.length, writeResult);
+
+ const resp = new Uint8Array(200);
+ const readResult = await conn.read(resp);
+ assertEquals(readResult, 138);
+
+ conn.close();
+
+ await promise;
+ httpConn!.close();
+ },
+);
+
+Deno.test(
+ { permissions: { net: true } },
+ async function httpServerStreamResponse() {
+ const stream = new TransformStream();
+ const writer = stream.writable.getWriter();
+ writer.write(new TextEncoder().encode("hello "));
+ writer.write(new TextEncoder().encode("world"));
+ writer.close();
+
+ let httpConn: Deno.HttpConn;
+ const listener = Deno.listen({ port: listenPort });
+ const promise = (async () => {
+ const conn = await listener.accept();
+ httpConn = Deno.serveHttp(conn);
+ const evt = await httpConn.nextRequest();
+ assert(evt);
+ const { request, respondWith } = evt;
+ assert(!request.body);
+ await respondWith(new Response(stream.readable));
+ })();
+
+ const resp = await fetch(`http://127.0.0.1:${listenPort}/`);
+ const respBody = await resp.text();
+ assertEquals("hello world", respBody);
+ await promise;
+ httpConn!.close();
+ listener.close();
+ },
+);
+
+Deno.test(
+ { permissions: { net: true } },
+ async function httpServerStreamRequest() {
+ const stream = new TransformStream();
+ const writer = stream.writable.getWriter();
+ writer.write(new TextEncoder().encode("hello "));
+ writer.write(new TextEncoder().encode("world"));
+ writer.close();
+
+ const listener = Deno.listen({ port: listenPort });
+ const promise = (async () => {
+ const conn = await listener.accept();
+ const httpConn = Deno.serveHttp(conn);
+ const evt = await httpConn.nextRequest();
+ assert(evt);
+ const { request, respondWith } = evt;
+ const reqBody = await request.text();
+ assertEquals("hello world", reqBody);
+ await respondWith(new Response(""));
+
+ // TODO(ry) If we don't call httpConn.nextRequest() here we get "error sending
+ // request for url (https://localhost:${listenPort}/): connection closed before
+ // message completed".
+ assertEquals(await httpConn.nextRequest(), null);
+
+ listener.close();
+ })();
+
+ const resp = await fetch(`http://127.0.0.1:${listenPort}/`, {
+ body: stream.readable,
+ method: "POST",
+ headers: { "connection": "close" },
+ });
+
+ await resp.arrayBuffer();
+ await promise;
+ },
+);
+
+Deno.test(
+ { permissions: { net: true } },
+ async function httpServerStreamDuplex() {
+ let httpConn: Deno.HttpConn;
+ const listener = Deno.listen({ port: listenPort });
+ const promise = (async () => {
+ const conn = await listener.accept();
+ httpConn = Deno.serveHttp(conn);
+ const evt = await httpConn.nextRequest();
+ assert(evt);
+ const { request, respondWith } = evt;
+ assert(request.body);
+ await respondWith(new Response(request.body));
+ })();
+
+ const ts = new TransformStream();
+ const writable = ts.writable.getWriter();
+ const resp = await fetch(`http://127.0.0.1:${listenPort}/`, {
+ method: "POST",
+ body: ts.readable,
+ });
+ assert(resp.body);
+ const reader = resp.body.getReader();
+ await writable.write(new Uint8Array([1]));
+ const chunk1 = await reader.read();
+ assert(!chunk1.done);
+ assertEquals(chunk1.value, new Uint8Array([1]));
+ await writable.write(new Uint8Array([2]));
+ const chunk2 = await reader.read();
+ assert(!chunk2.done);
+ assertEquals(chunk2.value, new Uint8Array([2]));
+
+ await writable.close();
+ const chunk3 = await reader.read();
+ assert(chunk3.done);
+ await promise;
+ httpConn!.close();
+ listener.close();
+ },
+);
+
+Deno.test({ permissions: { net: true } }, async function httpServerClose() {
+ const listener = Deno.listen({ port: listenPort });
+ const client = await Deno.connect({ port: listenPort });
+ const httpConn = Deno.serveHttp(await listener.accept());
+ client.close();
+ const evt = await httpConn.nextRequest();
+ assertEquals(evt, null);
+ // Note httpConn is automatically closed when "done" is reached.
+ listener.close();
+});
+
+Deno.test(
+ { permissions: { net: true } },
+ async function httpServerInvalidMethod() {
+ const listener = Deno.listen({ port: listenPort });
+ const client = await Deno.connect({ port: listenPort });
+ const httpConn = Deno.serveHttp(await listener.accept());
+ await client.write(new Uint8Array([1, 2, 3]));
+ await assertRejects(
+ async () => {
+ await httpConn.nextRequest();
+ },
+ Deno.errors.Http,
+ "invalid HTTP method parsed",
+ );
+ // Note httpConn is automatically closed when it errors.
+ client.close();
+ listener.close();
+ },
+);
+
+Deno.test(
+ { permissions: { read: true, net: true } },
+ async function httpServerWithTls() {
+ const hostname = "localhost";
+ const port = listenPort;
+
+ const promise = (async () => {
+ const listener = Deno.listenTls({
+ hostname,
+ port,
+ cert: Deno.readTextFileSync("tests/testdata/tls/localhost.crt"),
+ key: Deno.readTextFileSync("tests/testdata/tls/localhost.key"),
+ });
+ const conn = await listener.accept();
+ const httpConn = Deno.serveHttp(conn);
+ const evt = await httpConn.nextRequest();
+ assert(evt);
+ const { respondWith } = evt;
+ await respondWith(new Response("Hello World"));
+
+ // TODO(ry) If we don't call httpConn.nextRequest() here we get "error sending
+ // request for url (https://localhost:${listenPort}/): connection closed before
+ // message completed".
+ assertEquals(await httpConn.nextRequest(), null);
+
+ listener.close();
+ })();
+
+ const caCert = Deno.readTextFileSync("tests/testdata/tls/RootCA.pem");
+ const client = Deno.createHttpClient({ caCerts: [caCert] });
+ const resp = await fetch(`https://${hostname}:${port}/`, {
+ headers: { "connection": "close" },
+ client,
+ });
+ client.close();
+ const respBody = await resp.text();
+ assertEquals("Hello World", respBody);
+ await promise;
+ },
+);
+
+Deno.test(
+ { permissions: { net: true } },
+ async function httpServerRegressionHang() {
+ let httpConn: Deno.HttpConn;
+ const listener = Deno.listen({ port: listenPort });
+ const promise = (async () => {
+ const conn = await listener.accept();
+ httpConn = Deno.serveHttp(conn);
+ const event = await httpConn.nextRequest();
+ assert(event);
+ const { request, respondWith } = event;
+ const reqBody = await request.text();
+ assertEquals("request", reqBody);
+ await respondWith(new Response("response"));
+ })();
+
+ const resp = await fetch(`http://127.0.0.1:${listenPort}/`, {
+ method: "POST",
+ body: "request",
+ });
+ const respBody = await resp.text();
+ assertEquals("response", respBody);
+ await promise;
+
+ httpConn!.close();
+ listener.close();
+ },
+);
+
+Deno.test(
+ { permissions: { net: true } },
+ async function httpServerCancelBodyOnResponseFailure() {
+ const promise = (async () => {
+ const listener = Deno.listen({ port: listenPort });
+ const conn = await listener.accept();
+ const httpConn = Deno.serveHttp(conn);
+ const event = await httpConn.nextRequest();
+ assert(event);
+ const { respondWith } = event;
+ let cancelReason: string;
+ await assertRejects(
+ async () => {
+ let interval = 0;
+ await respondWith(
+ new Response(
+ new ReadableStream({
+ start(controller) {
+ interval = setInterval(() => {
+ const message = `data: ${Date.now()}\n\n`;
+ controller.enqueue(new TextEncoder().encode(message));
+ }, 200);
+ },
+ cancel(reason) {
+ cancelReason = reason;
+ clearInterval(interval);
+ },
+ }),
+ ),
+ );
+ },
+ Deno.errors.Http,
+ cancelReason!,
+ );
+ assert(cancelReason!);
+ httpConn!.close();
+ listener.close();
+ })();
+
+ const resp = await fetch(`http://127.0.0.1:${listenPort}/`);
+ await resp.body!.cancel();
+ await promise;
+ },
+);
+
+Deno.test(
+ { permissions: { net: true } },
+ async function httpServerNextRequestErrorExposedInResponse() {
+ const promise = (async () => {
+ const listener = Deno.listen({ port: listenPort });
+ const conn = await listener.accept();
+ const httpConn = Deno.serveHttp(conn);
+ const event = await httpConn.nextRequest();
+ assert(event);
+ // Start polling for the next request before awaiting response.
+ const nextRequestPromise = httpConn.nextRequest();
+ const { respondWith } = event;
+ await assertRejects(
+ async () => {
+ let interval = 0;
+ await respondWith(
+ new Response(
+ new ReadableStream({
+ start(controller) {
+ interval = setInterval(() => {
+ const message = `data: ${Date.now()}\n\n`;
+ controller.enqueue(new TextEncoder().encode(message));
+ }, 200);
+ },
+ cancel() {
+ clearInterval(interval);
+ },
+ }),
+ ),
+ );
+ },
+ Deno.errors.Http,
+ "connection closed",
+ );
+ // The error from `op_http_accept` reroutes to `respondWith()`.
+ assertEquals(await nextRequestPromise, null);
+ listener.close();
+ })();
+
+ const resp = await fetch(`http://127.0.0.1:${listenPort}/`);
+ await resp.body!.cancel();
+ await promise;
+ },
+);
+
+Deno.test(
+ { permissions: { net: true } },
+ async function httpServerEmptyBlobResponse() {
+ let httpConn: Deno.HttpConn;
+ const listener = Deno.listen({ port: listenPort });
+ const promise = (async () => {
+ const conn = await listener.accept();
+ httpConn = Deno.serveHttp(conn);
+ const event = await httpConn.nextRequest();
+ assert(event);
+ const { respondWith } = event;
+ await respondWith(new Response(new Blob([])));
+ })();
+
+ const resp = await fetch(`http://127.0.0.1:${listenPort}/`);
+ const respBody = await resp.text();
+ assertEquals("", respBody);
+ await promise;
+ httpConn!.close();
+ listener.close();
+ },
+);
+
+Deno.test(
+ { permissions: { net: true } },
+ async function httpServerNextRequestResolvesOnClose() {
+ const httpConnList: Deno.HttpConn[] = [];
+
+ async function serve(l: Deno.Listener) {
+ for await (const conn of l) {
+ (async () => {
+ const c = Deno.serveHttp(conn);
+ httpConnList.push(c);
+ for await (const { respondWith } of c) {
+ respondWith(new Response("hello"));
+ }
+ })();
+ }
+ }
+
+ const l = Deno.listen({ port: listenPort });
+ serve(l);
+
+ await delay(300);
+ const res = await fetch(`http://localhost:${listenPort}/`);
+ const _text = await res.text();
+
+ // Close connection and listener.
+ httpConnList.forEach((conn) => conn.close());
+ l.close();
+
+ await delay(300);
+ },
+);
+
+Deno.test(
+ { permissions: { net: true } },
+ // Issue: https://github.com/denoland/deno/issues/10870
+ async function httpServerHang() {
+ // Quick and dirty way to make a readable stream from a string. Alternatively,
+ // `readableStreamFromReader(file)` could be used.
+ function stream(s: string): ReadableStream<Uint8Array> {
+ return new Response(s).body!;
+ }
+
+ const httpConns: Deno.HttpConn[] = [];
+ const promise = (async () => {
+ let count = 0;
+ const listener = Deno.listen({ port: listenPort });
+ for await (const conn of listener) {
+ (async () => {
+ const httpConn = Deno.serveHttp(conn);
+ httpConns.push(httpConn);
+ for await (const { respondWith } of httpConn) {
+ respondWith(new Response(stream("hello")));
+
+ count++;
+ if (count >= 2) {
+ listener.close();
+ }
+ }
+ })();
+ }
+ })();
+
+ const clientConn = await Deno.connect({ port: listenPort });
+
+ const r1 = await writeRequestAndReadResponse(clientConn);
+ assertEquals(r1, "hello");
+
+ const r2 = await writeRequestAndReadResponse(clientConn);
+ assertEquals(r2, "hello");
+
+ clientConn.close();
+ await promise;
+ for (const conn of httpConns) {
+ conn.close();
+ }
+ },
+);
+
+Deno.test(
+ { permissions: { net: true } },
+ // Issue: https://github.com/denoland/deno/issues/10930
+ async function httpServerStreamingResponse() {
+ // This test enqueues a single chunk for readable
+ // stream and waits for client to read that chunk and signal
+ // it before enqueueing subsequent chunk. Issue linked above
+ // presented a situation where enqueued chunks were not
+ // written to the HTTP connection until the next chunk was enqueued.
+
+ let counter = 0;
+
+ const deferreds = [
+ Promise.withResolvers<void>(),
+ Promise.withResolvers<void>(),
+ Promise.withResolvers<void>(),
+ ];
+
+ async function writeRequest(conn: Deno.Conn) {
+ const encoder = new TextEncoder();
+ const decoder = new TextDecoder();
+
+ const w = new BufWriter(conn);
+ const r = new BufReader(conn);
+ const body = `GET / HTTP/1.1\r\nHost: 127.0.0.1:${listenPort}\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);
+ const headers = await tpr.readMimeHeader();
+ assert(headers !== null);
+
+ const chunkedReader = chunkedBodyReader(headers, r);
+ const buf = new Uint8Array(5);
+ const dest = new Buffer();
+ let result: number | null;
+ while ((result = await chunkedReader.read(buf)) !== null) {
+ const len = Math.min(buf.byteLength, result);
+ await dest.write(buf.subarray(0, len));
+ // Resolve a deferred - this will make response stream to
+ // enqueue next chunk.
+ deferreds[counter - 1].resolve();
+ }
+ return decoder.decode(dest.bytes());
+ }
+
+ function periodicStream() {
+ return new ReadableStream({
+ start(controller) {
+ controller.enqueue(`${counter}\n`);
+ counter++;
+ },
+
+ async pull(controller) {
+ if (counter >= 3) {
+ return controller.close();
+ }
+
+ await deferreds[counter - 1].promise;
+
+ controller.enqueue(`${counter}\n`);
+ counter++;
+ },
+ }).pipeThrough(new TextEncoderStream());
+ }
+
+ let httpConn: Deno.HttpConn;
+ const listener = Deno.listen({ port: listenPort });
+ const finished = (async () => {
+ const conn = await listener.accept();
+ httpConn = Deno.serveHttp(conn);
+ const requestEvent = await httpConn.nextRequest();
+ const { respondWith } = requestEvent!;
+ await respondWith(new Response(periodicStream()));
+ })();
+
+ // start a client
+ const clientConn = await Deno.connect({ port: listenPort });
+
+ const r1 = await writeRequest(clientConn);
+ assertEquals(r1, "0\n1\n2\n");
+
+ await finished;
+ clientConn.close();
+
+ httpConn!.close();
+ listener.close();
+ },
+);
+
+Deno.test(
+ { permissions: { net: true } },
+ async function httpRequestLatin1Headers() {
+ let httpConn: Deno.HttpConn;
+ const promise = (async () => {
+ const listener = Deno.listen({ port: listenPort });
+ const conn = await listener.accept();
+ listener.close();
+ httpConn = Deno.serveHttp(conn);
+ const reqEvent = await httpConn.nextRequest();
+ assert(reqEvent);
+ const { request, respondWith } = reqEvent;
+ assertEquals(request.headers.get("X-Header-Test"), "á");
+ await respondWith(
+ new Response("", { headers: { "X-Header-Test": "Æ" } }),
+ );
+ })();
+
+ const clientConn = await Deno.connect({ port: listenPort });
+ const requestText =
+ `GET / HTTP/1.1\r\nHost: 127.0.0.1:${listenPort}\r\nX-Header-Test: á\r\n\r\n`;
+ const requestBytes = new Uint8Array(requestText.length);
+ for (let i = 0; i < requestText.length; i++) {
+ requestBytes[i] = requestText.charCodeAt(i);
+ }
+ let written = 0;
+ while (written < requestBytes.byteLength) {
+ written += await clientConn.write(requestBytes.slice(written));
+ }
+
+ let responseText = "";
+ const buf = new Uint8Array(1024);
+ let read;
+
+ while ((read = await clientConn.read(buf)) !== null) {
+ httpConn!.close();
+ for (let i = 0; i < read; i++) {
+ responseText += String.fromCharCode(buf[i]);
+ }
+ }
+
+ clientConn.close();
+
+ assert(/\r\n[Xx]-[Hh]eader-[Tt]est: Æ\r\n/.test(responseText));
+
+ await promise;
+ },
+);
+
+Deno.test(
+ { permissions: { net: true } },
+ async function httpServerRequestWithoutPath() {
+ let httpConn: Deno.HttpConn;
+ const listener = Deno.listen({ port: listenPort });
+ const promise = (async () => {
+ const conn = await listener.accept();
+ listener.close();
+ httpConn = Deno.serveHttp(conn);
+ const reqEvent = await httpConn.nextRequest();
+ assert(reqEvent);
+ const { request, respondWith } = reqEvent;
+ assertEquals(
+ new URL(request.url).href,
+ `http://127.0.0.1:${listenPort}/`,
+ );
+ assertEquals(await request.text(), "");
+ await respondWith(new Response());
+ })();
+
+ const clientConn = await Deno.connect({ port: listenPort });
+
+ async function writeRequest(conn: Deno.Conn) {
+ const encoder = new TextEncoder();
+
+ const w = new BufWriter(conn);
+ const r = new BufReader(conn);
+ const body =
+ `CONNECT 127.0.0.1:${listenPort} HTTP/1.1\r\nHost: 127.0.0.1:${listenPort}\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);
+ const m = statusLine.match(/^(.+?) (.+?) (.+?)$/);
+ assert(m !== null, "must be matched");
+ const [_, _proto, status, _ok] = m;
+ assertEquals(status, "200");
+ const headers = await tpr.readMimeHeader();
+ assert(headers !== null);
+ }
+
+ await writeRequest(clientConn);
+ clientConn.close();
+ await promise;
+ httpConn!.close();
+ },
+);
+
+Deno.test({ permissions: { net: true } }, async function httpServerWebSocket() {
+ const promise = (async () => {
+ const listener = Deno.listen({ port: listenPort });
+ const conn = await listener.accept();
+ listener.close();
+ const httpConn = Deno.serveHttp(conn);
+ const reqEvent = await httpConn.nextRequest();
+ assert(reqEvent);
+ const { request, respondWith } = reqEvent;
+ const {
+ response,
+ socket,
+ } = Deno.upgradeWebSocket(request);
+ socket.onerror = () => fail();
+ socket.onmessage = (m) => {
+ socket.send(m.data);
+ socket.close(1001);
+ };
+ const close = new Promise<void>((resolve) => {
+ socket.onclose = () => resolve();
+ });
+ await respondWith(response);
+ await close;
+ })();
+
+ const def = Promise.withResolvers<void>();
+ const ws = new WebSocket(`ws://localhost:${listenPort}`);
+ ws.onmessage = (m) => assertEquals(m.data, "foo");
+ ws.onerror = () => fail();
+ ws.onclose = () => def.resolve();
+ ws.onopen = () => ws.send("foo");
+ await def.promise;
+ await promise;
+});
+
+Deno.test(function httpUpgradeWebSocket() {
+ const request = new Request("https://deno.land/", {
+ headers: {
+ connection: "Upgrade",
+ upgrade: "websocket",
+ "sec-websocket-key": "dGhlIHNhbXBsZSBub25jZQ==",
+ },
+ });
+ const { response } = Deno.upgradeWebSocket(request);
+ assertEquals(response.status, 101);
+ assertEquals(response.headers.get("connection"), "Upgrade");
+ assertEquals(response.headers.get("upgrade"), "websocket");
+ assertEquals(
+ response.headers.get("sec-websocket-accept"),
+ "s3pPLMBiTxaQ9kYGzzhZRbK+xOo=",
+ );
+});
+
+Deno.test(function httpUpgradeWebSocketMultipleConnectionOptions() {
+ const request = new Request("https://deno.land/", {
+ headers: {
+ connection: "keep-alive, upgrade",
+ upgrade: "websocket",
+ "sec-websocket-key": "dGhlIHNhbXBsZSBub25jZQ==",
+ },
+ });
+ const { response } = Deno.upgradeWebSocket(request);
+ assertEquals(response.status, 101);
+});
+
+Deno.test(function httpUpgradeWebSocketMultipleUpgradeOptions() {
+ const request = new Request("https://deno.land/", {
+ headers: {
+ connection: "upgrade",
+ upgrade: "websocket, foo",
+ "sec-websocket-key": "dGhlIHNhbXBsZSBub25jZQ==",
+ },
+ });
+ const { response } = Deno.upgradeWebSocket(request);
+ assertEquals(response.status, 101);
+});
+
+Deno.test(function httpUpgradeWebSocketCaseInsensitiveUpgradeHeader() {
+ const request = new Request("https://deno.land/", {
+ headers: {
+ connection: "upgrade",
+ upgrade: "Websocket",
+ "sec-websocket-key": "dGhlIHNhbXBsZSBub25jZQ==",
+ },
+ });
+ const { response } = Deno.upgradeWebSocket(request);
+ assertEquals(response.status, 101);
+});
+
+Deno.test(function httpUpgradeWebSocketInvalidUpgradeHeader() {
+ assertThrows(
+ () => {
+ const request = new Request("https://deno.land/", {
+ headers: {
+ connection: "upgrade",
+ upgrade: "invalid",
+ "sec-websocket-key": "dGhlIHNhbXBsZSBub25jZQ==",
+ },
+ });
+ Deno.upgradeWebSocket(request);
+ },
+ TypeError,
+ "Invalid Header: 'upgrade' header must contain 'websocket'",
+ );
+});
+
+Deno.test(function httpUpgradeWebSocketWithoutUpgradeHeader() {
+ assertThrows(
+ () => {
+ const request = new Request("https://deno.land/", {
+ headers: {
+ connection: "upgrade",
+ "sec-websocket-key": "dGhlIHNhbXBsZSBub25jZQ==",
+ },
+ });
+ Deno.upgradeWebSocket(request);
+ },
+ TypeError,
+ "Invalid Header: 'upgrade' header must contain 'websocket'",
+ );
+});
+
+Deno.test(
+ { permissions: { net: true } },
+ async function httpCookieConcatenation() {
+ let httpConn: Deno.HttpConn;
+ const promise = (async () => {
+ const listener = Deno.listen({ port: listenPort });
+ const conn = await listener.accept();
+ listener.close();
+ httpConn = Deno.serveHttp(conn);
+ const reqEvent = await httpConn.nextRequest();
+ assert(reqEvent);
+ const { request, respondWith } = reqEvent;
+ assertEquals(
+ new URL(request.url).href,
+ `http://127.0.0.1:${listenPort}/`,
+ );
+ assertEquals(await request.text(), "");
+ assertEquals(request.headers.get("cookie"), "foo=bar; bar=foo");
+ await respondWith(new Response("ok"));
+ })();
+
+ const resp = await fetch(`http://127.0.0.1:${listenPort}/`, {
+ headers: [
+ ["connection", "close"],
+ ["cookie", "foo=bar"],
+ ["cookie", "bar=foo"],
+ ],
+ });
+ const text = await resp.text();
+ assertEquals(text, "ok");
+ await promise;
+ httpConn!.close();
+ },
+);
+
+// https://github.com/denoland/deno/issues/11651
+Deno.test({ permissions: { net: true } }, async function httpServerPanic() {
+ const listener = Deno.listen({ port: listenPort });
+ const client = await Deno.connect({ port: listenPort });
+ const conn = await listener.accept();
+ const httpConn = Deno.serveHttp(conn);
+
+ // This message is incomplete on purpose, we'll forcefully close client connection
+ // after it's flushed to cause connection to error out on the server side.
+ const encoder = new TextEncoder();
+ await client.write(encoder.encode("GET / HTTP/1.1"));
+
+ httpConn.nextRequest();
+ await client.write(encoder.encode("\r\n\r\n"));
+ httpConn!.close();
+
+ client.close();
+ listener.close();
+});
+
+Deno.test(
+ { permissions: { net: true, write: true, read: true } },
+ async function httpServerCorrectSizeResponse() {
+ const tmpFile = await Deno.makeTempFile();
+ using file = await Deno.open(tmpFile, { write: true, read: true });
+ await file.write(new Uint8Array(70 * 1024).fill(1)); // 70kb sent in 64kb + 6kb chunks
+
+ let httpConn: Deno.HttpConn;
+ const listener = Deno.listen({ port: listenPort });
+ const promise = (async () => {
+ const conn = await listener.accept();
+ httpConn = Deno.serveHttp(conn);
+ const ev = await httpConn.nextRequest();
+ const { respondWith } = ev!;
+ const f = await Deno.open(tmpFile, { read: true });
+ await respondWith(new Response(f.readable, { status: 200 }));
+ })();
+ const resp = await fetch(`http://127.0.0.1:${listenPort}/`);
+ const body = await resp.arrayBuffer();
+ assertEquals(body.byteLength, 70 * 1024);
+ await promise;
+ httpConn!.close();
+ listener.close();
+ },
+);
+
+Deno.test(
+ { permissions: { net: true, write: true, read: true } },
+ async function httpServerClosedStream() {
+ const listener = Deno.listen({ port: listenPort });
+
+ const client = await Deno.connect({ port: listenPort });
+ await client.write(new TextEncoder().encode(
+ `GET / HTTP/1.0\r\n\r\n`,
+ ));
+
+ const conn = await listener.accept();
+ const httpConn = Deno.serveHttp(conn);
+ const ev = await httpConn.nextRequest();
+ const { respondWith } = ev!;
+
+ const tmpFile = await Deno.makeTempFile();
+ const file = await Deno.open(tmpFile, { write: true, read: true });
+ await file.write(new TextEncoder().encode("hello"));
+
+ const reader = await file.readable.getReader();
+ while (true) {
+ const { done, value } = await reader.read();
+ if (done) break;
+ assert(value);
+ }
+
+ let didThrow = false;
+ try {
+ await respondWith(new Response(file.readable));
+ } catch {
+ // pass
+ didThrow = true;
+ }
+
+ assert(didThrow);
+ httpConn!.close();
+ listener.close();
+ client.close();
+ },
+);
+
+// https://github.com/denoland/deno/issues/11595
+Deno.test(
+ { permissions: { net: true } },
+ async function httpServerIncompleteMessage() {
+ const listener = Deno.listen({ port: listenPort });
+
+ const client = await Deno.connect({ port: listenPort });
+ await client.write(new TextEncoder().encode(
+ `GET / HTTP/1.0\r\n\r\n`,
+ ));
+
+ const conn = await listener.accept();
+ const httpConn = Deno.serveHttp(conn);
+ const ev = await httpConn.nextRequest();
+ const { respondWith } = ev!;
+
+ const errors: Error[] = [];
+
+ const readable = new ReadableStream({
+ async pull(controller) {
+ client.close();
+ await delay(1000);
+ controller.enqueue(new TextEncoder().encode(
+ "written to the writable side of a TransformStream",
+ ));
+ controller.close();
+ },
+ cancel(error) {
+ errors.push(error);
+ },
+ });
+
+ const res = new Response(readable);
+
+ await respondWith(res).catch((error: Error) => errors.push(error));
+
+ httpConn!.close();
+ listener.close();
+
+ assert(errors.length >= 1);
+ for (const error of errors) {
+ assertEquals(error.name, "Http");
+ assert(error.message.includes("connection"));
+ }
+ },
+);
+
+// https://github.com/denoland/deno/issues/11743
+Deno.test(
+ { permissions: { net: true } },
+ async function httpServerDoesntLeakResources() {
+ const listener = Deno.listen({ port: listenPort });
+ const [conn, clientConn] = await Promise.all([
+ listener.accept(),
+ Deno.connect({ port: listenPort }),
+ ]);
+ const httpConn = Deno.serveHttp(conn);
+
+ await Promise.all([
+ httpConn.nextRequest(),
+ clientConn.write(new TextEncoder().encode(
+ `GET / HTTP/1.1\r\nHost: 127.0.0.1:${listenPort}\r\n\r\n`,
+ )),
+ ]);
+
+ httpConn!.close();
+ listener.close();
+ clientConn.close();
+ },
+);
+
+// https://github.com/denoland/deno/issues/11926
+// verify that the only new resource is "httpConnection", to make
+// sure "request" resource is closed even if its body was not read
+// by server handler
+Deno.test(
+ { permissions: { net: true } },
+ async function httpServerDoesntLeakResources2() {
+ let listener: Deno.Listener;
+ let httpConn: Deno.HttpConn;
+
+ const promise = (async () => {
+ listener = Deno.listen({ port: listenPort });
+ for await (const conn of listener) {
+ httpConn = Deno.serveHttp(conn);
+ for await (const { request, respondWith } of httpConn) {
+ assertEquals(
+ new URL(request.url).href,
+ `http://127.0.0.1:${listenPort}/`,
+ );
+ // not reading request body on purpose
+ respondWith(new Response("ok"));
+ }
+ }
+ })();
+
+ const response = await fetch(`http://127.0.0.1:${listenPort}`, {
+ method: "POST",
+ body: "hello world",
+ });
+ await response.text();
+
+ listener!.close();
+ httpConn!.close();
+ await promise;
+ },
+);
+
+// https://github.com/denoland/deno/pull/12216
+Deno.test(
+ { permissions: { net: true } },
+ async function droppedConnSenderNoPanic() {
+ async function server() {
+ const listener = Deno.listen({ port: listenPort });
+ const conn = await listener.accept();
+ const http = Deno.serveHttp(conn);
+ const evt = await http.nextRequest();
+ http.close();
+ try {
+ await evt!.respondWith(new Response("boom"));
+ } catch {
+ // Ignore error.
+ }
+ listener.close();
+ }
+
+ async function client() {
+ try {
+ const resp = await fetch(`http://127.0.0.1:${listenPort}/`);
+ await resp.body?.cancel();
+ } catch {
+ // Ignore error
+ }
+ }
+
+ await Promise.all([server(), client()]);
+ },
+);
+
+// https://github.com/denoland/deno/issues/12193
+Deno.test(
+ { permissions: { net: true } },
+ async function httpConnConcurrentNextRequestCalls() {
+ const hostname = "localhost";
+ const port = listenPort;
+
+ let httpConn: Deno.HttpConn;
+ const listener = Deno.listen({ hostname, port });
+ async function server() {
+ const tcpConn = await listener.accept();
+ httpConn = Deno.serveHttp(tcpConn);
+ const promises = new Array(10).fill(null).map(async (_, i) => {
+ const event = await httpConn.nextRequest();
+ assert(event);
+ const { pathname } = new URL(event.request.url);
+ assertStrictEquals(pathname, `/${i}`);
+ const response = new Response(`Response #${i}`);
+ await event.respondWith(response);
+ });
+ await Promise.all(promises);
+ }
+
+ async function client() {
+ for (let i = 0; i < 10; i++) {
+ const response = await fetch(`http://${hostname}:${port}/${i}`);
+ const body = await response.text();
+ assertStrictEquals(body, `Response #${i}`);
+ }
+ }
+
+ await Promise.all([server(), delay(100).then(client)]);
+ httpConn!.close();
+ listener.close();
+ },
+);
+
+// https://github.com/denoland/deno/pull/12704
+// https://github.com/denoland/deno/pull/12732
+Deno.test(
+ { permissions: { net: true } },
+ async function httpConnAutoCloseDelayedOnUpgrade() {
+ const hostname = "localhost";
+ const port = listenPort;
+
+ async function server() {
+ const listener = Deno.listen({ hostname, port });
+ const tcpConn = await listener.accept();
+ const httpConn = Deno.serveHttp(tcpConn);
+
+ const event1 = await httpConn.nextRequest() as Deno.RequestEvent;
+ const event2Promise = httpConn.nextRequest();
+
+ const { socket, response } = Deno.upgradeWebSocket(event1.request);
+ socket.onmessage = (event) => socket.send(event.data);
+ const socketClosed = new Promise<void>((resolve) => {
+ socket.onclose = () => resolve();
+ });
+ event1.respondWith(response);
+
+ const event2 = await event2Promise;
+ assertStrictEquals(event2, null);
+
+ listener.close();
+ await socketClosed;
+ }
+
+ async function client() {
+ const socket = new WebSocket(`ws://${hostname}:${port}/`);
+ socket.onopen = () => socket.send("bla bla");
+ const closed = new Promise<void>((resolve) => {
+ socket.onclose = () => resolve();
+ });
+ const { data } = await new Promise<MessageEvent<string>>((res) =>
+ socket.onmessage = res
+ );
+ assertStrictEquals(data, "bla bla");
+ socket.close();
+ await closed;
+ }
+
+ await Promise.all([server(), client()]);
+ },
+);
+
+// https://github.com/denoland/deno/issues/12741
+// https://github.com/denoland/deno/pull/12746
+// https://github.com/denoland/deno/pull/12798
+Deno.test(
+ { permissions: { net: true, run: true } },
+ async function httpServerDeleteRequestHasBody() {
+ const hostname = "localhost";
+ const port = listenPort;
+
+ let httpConn: Deno.HttpConn;
+ const listener = Deno.listen({ hostname, port });
+ async function server() {
+ const tcpConn = await listener.accept();
+ httpConn = Deno.serveHttp(tcpConn);
+ const event = await httpConn.nextRequest() as Deno.RequestEvent;
+ assert(event.request.body);
+ const response = new Response();
+ await event.respondWith(response);
+ }
+
+ async function client() {
+ const url = `http://${hostname}:${port}/`;
+ const args = ["-X", "DELETE", url];
+ const { success } = await new Deno.Command("curl", {
+ args,
+ stdout: "null",
+ stderr: "null",
+ }).output();
+ assert(success);
+ }
+
+ await Promise.all([server(), client()]);
+ httpConn!.close();
+ listener.close();
+ },
+);
+
+Deno.test(
+ { permissions: { net: true } },
+ async function httpServerRespondNonAsciiUint8Array() {
+ let httpConn: Deno.HttpConn;
+ const listener = Deno.listen({ port: listenPort });
+ const promise = (async () => {
+ const conn = await listener.accept();
+ listener.close();
+ httpConn = Deno.serveHttp(conn);
+ const e = await httpConn.nextRequest();
+ assert(e);
+ const { request, respondWith } = e;
+ assertEquals(request.body, null);
+ await respondWith(
+ new Response(new Uint8Array([128]), {}),
+ );
+ })();
+
+ const resp = await fetch(`http://localhost:${listenPort}/`);
+ assertEquals(resp.status, 200);
+ const body = await resp.arrayBuffer();
+ assertEquals(new Uint8Array(body), new Uint8Array([128]));
+
+ await promise;
+ httpConn!.close();
+ },
+);
+
+function tmpUnixSocketPath(): string {
+ const folder = Deno.makeTempDirSync();
+ return join(folder, "socket");
+}
+
+// https://github.com/denoland/deno/pull/13628
+Deno.test(
+ {
+ ignore: Deno.build.os === "windows",
+ permissions: { read: true, write: true },
+ },
+ async function httpServerOnUnixSocket() {
+ const filePath = tmpUnixSocketPath();
+
+ let httpConn: Deno.HttpConn;
+ const promise = (async () => {
+ const listener = Deno.listen({ path: filePath, transport: "unix" });
+ const conn = await listener.accept();
+ listener.close();
+ httpConn = Deno.serveHttp(conn);
+ const reqEvent = await httpConn.nextRequest();
+ assert(reqEvent);
+ const { request, respondWith } = reqEvent;
+ const url = new URL(request.url);
+ assertEquals(url.protocol, "http+unix:");
+ assertEquals(decodeURIComponent(url.host), filePath);
+ assertEquals(url.pathname, "/path/name");
+ await respondWith(new Response("", { headers: {} }));
+ })();
+
+ // fetch() does not supports unix domain sockets yet https://github.com/denoland/deno/issues/8821
+ const conn = await Deno.connect({ path: filePath, transport: "unix" });
+ const encoder = new TextEncoder();
+ // The Host header must be present and empty if it is not a Internet host name (RFC2616, Section 14.23)
+ const body = `GET /path/name HTTP/1.1\r\nHost:\r\n\r\n`;
+ const writeResult = await conn.write(encoder.encode(body));
+ assertEquals(body.length, writeResult);
+
+ const resp = new Uint8Array(200);
+ const readResult = await conn.read(resp);
+ assertEquals(readResult, 138);
+
+ conn.close();
+
+ await promise;
+ httpConn!.close();
+ },
+);
+
+/* Automatic Body Compression */
+
+const decoder = new TextDecoder();
+
+Deno.test({
+ name: "http server compresses body - check headers",
+ permissions: { net: true, run: true },
+ async fn() {
+ const hostname = "localhost";
+ const port = listenPort;
+ const listener = Deno.listen({ hostname, port });
+
+ const data = { hello: "deno", now: "with", compressed: "body" };
+
+ let httpConn: Deno.HttpConn;
+ async function server() {
+ const tcpConn = await listener.accept();
+ httpConn = Deno.serveHttp(tcpConn);
+ const e = await httpConn.nextRequest();
+ assert(e);
+ const { request, respondWith } = e;
+ assertEquals(request.headers.get("Accept-Encoding"), "gzip, deflate, br");
+ const response = new Response(JSON.stringify(data), {
+ headers: { "content-type": "application/json" },
+ });
+ await respondWith(response);
+ listener.close();
+ }
+
+ async function client() {
+ const url = `http://${hostname}:${port}/`;
+ const args = [
+ "-i",
+ "--request",
+ "GET",
+ "--url",
+ url,
+ "--header",
+ "Accept-Encoding: gzip, deflate, br",
+ ];
+ const { success, stdout } = await new Deno.Command("curl", {
+ args,
+ stderr: "null",
+ stdout: "piped",
+ }).output();
+ assert(success);
+ const output = decoder.decode(stdout);
+ assert(output.includes("vary: Accept-Encoding\r\n"));
+ assert(output.includes("content-encoding: gzip\r\n"));
+ }
+
+ await Promise.all([server(), client()]);
+ httpConn!.close();
+ },
+});
+
+Deno.test({
+ name: "http server compresses body - check body",
+ permissions: { net: true, run: true },
+ async fn() {
+ const hostname = "localhost";
+ const port = listenPort;
+ const listener = Deno.listen({ hostname, port });
+
+ const data = { hello: "deno", now: "with", compressed: "body" };
+
+ let httpConn: Deno.HttpConn;
+ async function server() {
+ const tcpConn = await listener.accept();
+ httpConn = Deno.serveHttp(tcpConn);
+ const e = await httpConn.nextRequest();
+ assert(e);
+ const { request, respondWith } = e;
+ assertEquals(request.headers.get("Accept-Encoding"), "gzip, deflate, br");
+ const response = new Response(JSON.stringify(data), {
+ headers: { "content-type": "application/json" },
+ });
+ await respondWith(response);
+ listener.close();
+ }
+
+ async function client() {
+ const url = `http://${hostname}:${port}/`;
+ const args = [
+ "--request",
+ "GET",
+ "--url",
+ url,
+ "--header",
+ "Accept-Encoding: gzip, deflate, br",
+ ];
+ const proc = new Deno.Command("curl", {
+ args,
+ stderr: "null",
+ stdout: "piped",
+ }).spawn();
+ const status = await proc.status;
+ assert(status.success);
+ const stdout = proc.stdout
+ .pipeThrough(new DecompressionStream("gzip"))
+ .pipeThrough(new TextDecoderStream());
+ let body = "";
+ for await (const chunk of stdout) {
+ body += chunk;
+ }
+ assertEquals(JSON.parse(body), data);
+ }
+
+ await Promise.all([server(), client()]);
+ httpConn!.close();
+ },
+});
+
+Deno.test({
+ name: "http server doesn't compress small body",
+ permissions: { net: true, run: true },
+ async fn() {
+ const hostname = "localhost";
+ const port = listenPort;
+
+ let httpConn: Deno.HttpConn;
+ async function server() {
+ const listener = Deno.listen({ hostname, port });
+ const tcpConn = await listener.accept();
+ httpConn = Deno.serveHttp(tcpConn);
+ const e = await httpConn.nextRequest();
+ assert(e);
+ const { request, respondWith } = e;
+ assertEquals(request.headers.get("Accept-Encoding"), "gzip, deflate, br");
+ const response = new Response(
+ JSON.stringify({ hello: "deno" }),
+ {
+ headers: { "content-type": "application/json" },
+ },
+ );
+ await respondWith(response);
+ listener.close();
+ }
+
+ async function client() {
+ const url = `http://${hostname}:${port}/`;
+ const args = [
+ "-i",
+ "--request",
+ "GET",
+ "--url",
+ url,
+ "--header",
+ "Accept-Encoding: gzip, deflate, br",
+ ];
+ const { success, stdout } = await new Deno.Command("curl", {
+ args,
+ stderr: "null",
+ stdout: "piped",
+ }).output();
+ assert(success);
+ const output = decoder.decode(stdout).toLocaleLowerCase();
+ assert(output.includes("vary: accept-encoding\r\n"));
+ assert(!output.includes("content-encoding: "));
+ }
+
+ await Promise.all([server(), client()]);
+ httpConn!.close();
+ },
+});
+
+Deno.test({
+ name: "http server respects accept-encoding weights",
+ permissions: { net: true, run: true },
+ async fn() {
+ const hostname = "localhost";
+ const port = listenPort;
+
+ let httpConn: Deno.HttpConn;
+ async function server() {
+ const listener = Deno.listen({ hostname, port });
+ const tcpConn = await listener.accept();
+ httpConn = Deno.serveHttp(tcpConn);
+ const e = await httpConn.nextRequest();
+ assert(e);
+ const { request, respondWith } = e;
+ assertEquals(
+ request.headers.get("Accept-Encoding"),
+ "gzip;q=0.8, br;q=1.0, *;q=0.1",
+ );
+ const response = new Response(
+ JSON.stringify({ hello: "deno", now: "with", compressed: "body" }),
+ {
+ headers: { "content-type": "application/json" },
+ },
+ );
+ await respondWith(response);
+ listener.close();
+ }
+
+ async function client() {
+ const url = `http://${hostname}:${port}/`;
+ const args = [
+ "-i",
+ "--request",
+ "GET",
+ "--url",
+ url,
+ "--header",
+ "Accept-Encoding: gzip;q=0.8, br;q=1.0, *;q=0.1",
+ ];
+ const { success, stdout } = await new Deno.Command("curl", {
+ args,
+ stderr: "null",
+ stdout: "piped",
+ }).output();
+ assert(success);
+ const output = decoder.decode(stdout);
+ assert(output.includes("vary: Accept-Encoding\r\n"));
+ assert(output.includes("content-encoding: br\r\n"));
+ }
+
+ await Promise.all([server(), client()]);
+ httpConn!.close();
+ },
+});
+
+Deno.test({
+ name: "http server augments vary header",
+ permissions: { net: true, run: true },
+ async fn() {
+ const hostname = "localhost";
+ const port = listenPort;
+
+ let httpConn: Deno.HttpConn;
+ async function server() {
+ const listener = Deno.listen({ hostname, port });
+ const tcpConn = await listener.accept();
+ httpConn = Deno.serveHttp(tcpConn);
+ const e = await httpConn.nextRequest();
+ assert(e);
+ const { request, respondWith } = e;
+ assertEquals(request.headers.get("Accept-Encoding"), "gzip, deflate, br");
+ const response = new Response(
+ JSON.stringify({ hello: "deno", now: "with", compressed: "body" }),
+ {
+ headers: { "content-type": "application/json", vary: "Accept" },
+ },
+ );
+ await respondWith(response);
+ listener.close();
+ }
+
+ async function client() {
+ const url = `http://${hostname}:${port}/`;
+ const args = [
+ "-i",
+ "--request",
+ "GET",
+ "--url",
+ url,
+ "--header",
+ "Accept-Encoding: gzip, deflate, br",
+ ];
+ const { success, stdout } = await new Deno.Command("curl", {
+ args,
+ stderr: "null",
+ stdout: "piped",
+ }).output();
+ assert(success);
+ const output = decoder.decode(stdout);
+ assert(output.includes("vary: Accept-Encoding, Accept\r\n"));
+ assert(output.includes("content-encoding: gzip\r\n"));
+ }
+
+ await Promise.all([server(), client()]);
+ httpConn!.close();
+ },
+});
+
+Deno.test({
+ name: "http server weakens etag header",
+ permissions: { net: true, run: true },
+ async fn() {
+ const hostname = "localhost";
+ const port = listenPort;
+
+ let httpConn: Deno.HttpConn;
+ async function server() {
+ const listener = Deno.listen({ hostname, port });
+ const tcpConn = await listener.accept();
+ httpConn = Deno.serveHttp(tcpConn);
+ const e = await httpConn.nextRequest();
+ assert(e);
+ const { request, respondWith } = e;
+ assertEquals(request.headers.get("Accept-Encoding"), "gzip, deflate, br");
+ const response = new Response(
+ JSON.stringify({ hello: "deno", now: "with", compressed: "body" }),
+ {
+ headers: {
+ "content-type": "application/json",
+ etag: "33a64df551425fcc55e4d42a148795d9f25f89d4",
+ },
+ },
+ );
+ await respondWith(response);
+ listener.close();
+ }
+
+ async function client() {
+ const url = `http://${hostname}:${port}/`;
+ const args = [
+ "curl",
+ "-i",
+ "--request",
+ "GET",
+ "--url",
+ url,
+ "--header",
+ "Accept-Encoding: gzip, deflate, br",
+ ];
+ const { success, stdout } = await new Deno.Command("curl", {
+ args,
+ stderr: "null",
+ stdout: "piped",
+ }).output();
+ assert(success);
+ const output = decoder.decode(stdout);
+ assert(output.includes("vary: Accept-Encoding\r\n"));
+ assert(
+ output.includes("etag: W/33a64df551425fcc55e4d42a148795d9f25f89d4\r\n"),
+ );
+ assert(output.includes("content-encoding: gzip\r\n"));
+ }
+
+ await Promise.all([server(), client()]);
+ httpConn!.close();
+ },
+});
+
+Deno.test({
+ name: "http server passes through weak etag header",
+ permissions: { net: true, run: true },
+ async fn() {
+ const hostname = "localhost";
+ const port = listenPort;
+
+ let httpConn: Deno.HttpConn;
+ async function server() {
+ const listener = Deno.listen({ hostname, port });
+ const tcpConn = await listener.accept();
+ httpConn = Deno.serveHttp(tcpConn);
+ const e = await httpConn.nextRequest();
+ assert(e);
+ const { request, respondWith } = e;
+ assertEquals(request.headers.get("Accept-Encoding"), "gzip, deflate, br");
+ const response = new Response(
+ JSON.stringify({ hello: "deno", now: "with", compressed: "body" }),
+ {
+ headers: {
+ "content-type": "application/json",
+ etag: "W/33a64df551425fcc55e4d42a148795d9f25f89d4",
+ },
+ },
+ );
+ await respondWith(response);
+ listener.close();
+ }
+
+ async function client() {
+ const url = `http://${hostname}:${port}/`;
+ const args = [
+ "-i",
+ "--request",
+ "GET",
+ "--url",
+ url,
+ "--header",
+ "Accept-Encoding: gzip, deflate, br",
+ ];
+ const { success, stdout } = await new Deno.Command("curl", {
+ args,
+ stderr: "null",
+ stdout: "piped",
+ }).output();
+ assert(success);
+ const output = decoder.decode(stdout);
+ assert(output.includes("vary: Accept-Encoding\r\n"));
+ assert(
+ output.includes("etag: W/33a64df551425fcc55e4d42a148795d9f25f89d4\r\n"),
+ );
+ assert(output.includes("content-encoding: gzip\r\n"));
+ }
+
+ await Promise.all([server(), client()]);
+ httpConn!.close();
+ },
+});
+
+Deno.test({
+ name: "http server doesn't compress body when no-transform is set",
+ permissions: { net: true, run: true },
+ async fn() {
+ const hostname = "localhost";
+ const port = listenPort;
+
+ let httpConn: Deno.HttpConn;
+ async function server() {
+ const listener = Deno.listen({ hostname, port });
+ const tcpConn = await listener.accept();
+ httpConn = Deno.serveHttp(tcpConn);
+ const e = await httpConn.nextRequest();
+ assert(e);
+ const { request, respondWith } = e;
+ assertEquals(request.headers.get("Accept-Encoding"), "gzip, deflate, br");
+ const response = new Response(
+ JSON.stringify({ hello: "deno", now: "with", compressed: "body" }),
+ {
+ headers: {
+ "content-type": "application/json",
+ "cache-control": "no-transform",
+ },
+ },
+ );
+ await respondWith(response);
+ listener.close();
+ }
+
+ async function client() {
+ const url = `http://${hostname}:${port}/`;
+ const args = [
+ "-i",
+ "--request",
+ "GET",
+ "--url",
+ url,
+ "--header",
+ "Accept-Encoding: gzip, deflate, br",
+ ];
+ const { success, stdout } = await new Deno.Command("curl", {
+ args,
+ stderr: "null",
+ stdout: "piped",
+ }).output();
+ assert(success);
+ const output = decoder.decode(stdout);
+ assert(output.includes("vary: Accept-Encoding\r\n"));
+ assert(!output.includes("content-encoding: "));
+ }
+
+ await Promise.all([server(), client()]);
+ httpConn!.close();
+ },
+});
+
+Deno.test({
+ name: "http server doesn't compress body when content-range is set",
+ permissions: { net: true, run: true },
+ async fn() {
+ const hostname = "localhost";
+ const port = listenPort;
+
+ let httpConn: Deno.HttpConn;
+ async function server() {
+ const listener = Deno.listen({ hostname, port });
+ const tcpConn = await listener.accept();
+ httpConn = Deno.serveHttp(tcpConn);
+ const e = await httpConn.nextRequest();
+ assert(e);
+ const { request, respondWith } = e;
+ assertEquals(request.headers.get("Accept-Encoding"), "gzip, deflate, br");
+ const response = new Response(
+ JSON.stringify({ hello: "deno", now: "with", compressed: "body" }),
+ {
+ headers: {
+ "content-type": "application/json",
+ "content-range": "bytes 200-100/67589",
+ },
+ },
+ );
+ await respondWith(response);
+ listener.close();
+ }
+
+ async function client() {
+ const url = `http://${hostname}:${port}/`;
+ const args = [
+ "-i",
+ "--request",
+ "GET",
+ "--url",
+ url,
+ "--header",
+ "Accept-Encoding: gzip, deflate, br",
+ ];
+ const { success, stdout } = await new Deno.Command("curl", {
+ args,
+ stderr: "null",
+ stdout: "piped",
+ }).output();
+ assert(success);
+ const output = decoder.decode(stdout);
+ assert(output.includes("vary: Accept-Encoding\r\n"));
+ assert(!output.includes("content-encoding: "));
+ }
+
+ await Promise.all([server(), client()]);
+ httpConn!.close();
+ },
+});
+
+Deno.test({
+ name: "http server compresses streamed bodies - check headers",
+ permissions: { net: true, run: true },
+ async fn() {
+ const hostname = "localhost";
+ const port = listenPort;
+
+ const encoder = new TextEncoder();
+ const listener = Deno.listen({ hostname, port });
+
+ const data = { hello: "deno", now: "with", compressed: "body" };
+
+ let httpConn: Deno.HttpConn;
+ async function server() {
+ const tcpConn = await listener.accept();
+ httpConn = Deno.serveHttp(tcpConn);
+ const e = await httpConn.nextRequest();
+ assert(e);
+ const { request, respondWith } = e;
+ assertEquals(request.headers.get("Accept-Encoding"), "gzip, deflate, br");
+ const bodyInit = new ReadableStream({
+ start(controller) {
+ controller.enqueue(encoder.encode(JSON.stringify(data)));
+ controller.close();
+ },
+ });
+ const response = new Response(
+ bodyInit,
+ { headers: { "content-type": "application/json" } },
+ );
+ await respondWith(response);
+ listener.close();
+ }
+
+ async function client() {
+ const url = `http://${hostname}:${port}/`;
+ const args = [
+ "curl",
+ "-i",
+ "--request",
+ "GET",
+ "--url",
+ url,
+ "--header",
+ "Accept-Encoding: gzip, deflate, br",
+ ];
+ const { success, stdout } = await new Deno.Command("curl", {
+ args,
+ stderr: "null",
+ stdout: "piped",
+ }).output();
+ assert(success);
+ const output = decoder.decode(stdout);
+ assert(output.includes("vary: Accept-Encoding\r\n"));
+ assert(output.includes("content-encoding: gzip\r\n"));
+ }
+
+ await Promise.all([server(), client()]);
+ httpConn!.close();
+ },
+});
+
+Deno.test({
+ name: "http server compresses streamed bodies - check body",
+ permissions: { net: true, run: true },
+ async fn() {
+ const hostname = "localhost";
+ const port = listenPort;
+
+ const encoder = new TextEncoder();
+ const listener = Deno.listen({ hostname, port });
+
+ const data = { hello: "deno", now: "with", compressed: "body" };
+
+ let httpConn: Deno.HttpConn;
+ async function server() {
+ const tcpConn = await listener.accept();
+ httpConn = Deno.serveHttp(tcpConn);
+ const e = await httpConn.nextRequest();
+ assert(e);
+ const { request, respondWith } = e;
+ assertEquals(request.headers.get("Accept-Encoding"), "gzip, deflate, br");
+ const bodyInit = new ReadableStream({
+ start(controller) {
+ controller.enqueue(encoder.encode(JSON.stringify(data)));
+ controller.close();
+ },
+ });
+ const response = new Response(
+ bodyInit,
+ { headers: { "content-type": "application/json" } },
+ );
+ await respondWith(response);
+ listener.close();
+ }
+
+ async function client() {
+ const url = `http://${hostname}:${port}/`;
+ const args = [
+ "--request",
+ "GET",
+ "--url",
+ url,
+ "--header",
+ "Accept-Encoding: gzip, deflate, br",
+ ];
+ const proc = new Deno.Command("curl", {
+ args,
+ stderr: "null",
+ stdout: "piped",
+ }).spawn();
+ const status = await proc.status;
+ assert(status.success);
+ const stdout = proc.stdout
+ .pipeThrough(new DecompressionStream("gzip"))
+ .pipeThrough(new TextDecoderStream());
+ let body = "";
+ for await (const chunk of stdout) {
+ body += chunk;
+ }
+ assertEquals(JSON.parse(body), data);
+ }
+
+ await Promise.all([server(), client()]);
+ httpConn!.close();
+ },
+});
+
+Deno.test({
+ name: "http server updates content-length header if compression is applied",
+ permissions: { net: true, run: true },
+ async fn() {
+ const hostname = "localhost";
+ const port = listenPort;
+ let contentLength: string;
+
+ let httpConn: Deno.HttpConn;
+ async function server() {
+ const listener = Deno.listen({ hostname, port });
+ const tcpConn = await listener.accept();
+ httpConn = Deno.serveHttp(tcpConn);
+ const e = await httpConn.nextRequest();
+ assert(e);
+ const { request, respondWith } = e;
+ assertEquals(request.headers.get("Accept-Encoding"), "gzip, deflate, br");
+ const body = JSON.stringify({
+ hello: "deno",
+ now: "with",
+ compressed: "body",
+ });
+ contentLength = String(body.length);
+ const response = new Response(
+ body,
+ {
+ headers: {
+ "content-type": "application/json",
+ "content-length": contentLength,
+ },
+ },
+ );
+ await respondWith(response);
+ listener.close();
+ }
+
+ async function client() {
+ const url = `http://${hostname}:${port}/`;
+ const args = [
+ "-i",
+ "--request",
+ "GET",
+ "--url",
+ url,
+ "--header",
+ "Accept-Encoding: gzip, deflate, br",
+ ];
+ const { success, stdout } = await new Deno.Command("curl", {
+ args,
+ stderr: "null",
+ stdout: "piped",
+ }).output();
+ assert(success);
+ const output = decoder.decode(stdout);
+ assert(output.includes("vary: Accept-Encoding\r\n"));
+ assert(output.includes("content-encoding: gzip\r\n"));
+ // Ensure the content-length header is updated (but don't check the exact length).
+ assert(!output.includes(`content-length: ${contentLength}\r\n`));
+ assert(output.includes("content-length: "));
+ }
+
+ await Promise.all([server(), client()]);
+ httpConn!.close();
+ },
+});
+
+Deno.test({
+ name: "http server compresses when accept-encoding is deflate, gzip",
+ permissions: { net: true, run: true },
+ async fn() {
+ const hostname = "localhost";
+ const port = listenPort;
+ let contentLength: string;
+
+ let httpConn: Deno.HttpConn;
+ async function server() {
+ const listener = Deno.listen({ hostname, port });
+ const tcpConn = await listener.accept();
+ httpConn = Deno.serveHttp(tcpConn);
+ const e = await httpConn.nextRequest();
+ assert(e);
+ const { request, respondWith } = e;
+ assertEquals(request.headers.get("Accept-Encoding"), "deflate, gzip");
+ const body = "x".repeat(10000);
+ contentLength = String(body.length);
+ const response = new Response(
+ body,
+ {
+ headers: {
+ "content-length": contentLength,
+ },
+ },
+ );
+ await respondWith(response);
+ listener.close();
+ }
+
+ async function client() {
+ const url = `http://${hostname}:${port}/`;
+ const cmd = [
+ "curl",
+ "-i",
+ "--request",
+ "GET",
+ "--url",
+ url,
+ // "--compressed", // Windows curl does not support --compressed
+ "--header",
+ "Accept-Encoding: deflate, gzip",
+ ];
+ // deno-lint-ignore no-deprecated-deno-api
+ const proc = Deno.run({ cmd, stdout: "piped", stderr: "null" });
+ const status = await proc.status();
+ assert(status.success);
+ const output = decoder.decode(await proc.output());
+ assert(output.includes("vary: Accept-Encoding\r\n"));
+ assert(output.includes("content-encoding: gzip\r\n"));
+ // Ensure the content-length header is updated.
+ assert(!output.includes(`content-length: ${contentLength}\r\n`));
+ assert(output.includes("content-length: "));
+ proc.close();
+ }
+
+ await Promise.all([server(), client()]);
+ httpConn!.close();
+ },
+});
+
+Deno.test({
+ name: "http server custom content-encoding is left untouched",
+ permissions: { net: true, run: true },
+ async fn() {
+ const hostname = "localhost";
+ const port = listenPort;
+ let contentLength: string;
+
+ let httpConn: Deno.HttpConn;
+ async function server() {
+ const listener = Deno.listen({ hostname, port });
+ const tcpConn = await listener.accept();
+ httpConn = Deno.serveHttp(tcpConn);
+ const e = await httpConn.nextRequest();
+ assert(e);
+ const { request, respondWith } = e;
+ assertEquals(request.headers.get("Accept-Encoding"), "deflate, gzip");
+ const body = new Uint8Array([3, 1, 4, 1]);
+ contentLength = String(body.length);
+ const response = new Response(
+ body,
+ {
+ headers: {
+ "content-length": contentLength,
+ "content-encoding": "arbitrary",
+ },
+ },
+ );
+ await respondWith(response);
+ listener.close();
+ }
+
+ async function client() {
+ const url = `http://${hostname}:${port}/`;
+ const cmd = [
+ "curl",
+ "-i",
+ "--request",
+ "GET",
+ "--url",
+ url,
+ // "--compressed", // Windows curl does not support --compressed
+ "--header",
+ "Accept-Encoding: deflate, gzip",
+ ];
+ // deno-lint-ignore no-deprecated-deno-api
+ const proc = Deno.run({ cmd, stdout: "piped", stderr: "null" });
+ const status = await proc.status();
+ assert(status.success);
+ const output = decoder.decode(await proc.output());
+ assert(output.includes("vary: Accept-Encoding\r\n"));
+ assert(output.includes("content-encoding: arbitrary\r\n"));
+ proc.close();
+ }
+
+ await Promise.all([server(), client()]);
+ httpConn!.close();
+ },
+});
+
+Deno.test(
+ { permissions: { net: true } },
+ async function httpServerReadLargeBodyWithContentLength() {
+ const TLS_PACKET_SIZE = 16 * 1024 + 256;
+ // We want the body to be read in multiple packets
+ const body = "aa\n" + "deno.land large body\n".repeat(TLS_PACKET_SIZE) +
+ "zz";
+
+ let httpConn: Deno.HttpConn;
+ const promise = (async () => {
+ const listener = Deno.listen({ port: listenPort });
+ const conn = await listener.accept();
+ listener.close();
+ httpConn = Deno.serveHttp(conn);
+ const reqEvent = await httpConn.nextRequest();
+ assert(reqEvent);
+ const { request, respondWith } = reqEvent;
+ assertEquals(await request.text(), body);
+ await respondWith(new Response(body));
+ })();
+
+ const resp = await fetch(`http://127.0.0.1:${listenPort}/`, {
+ method: "POST",
+ headers: { "connection": "close" },
+ body,
+ });
+ const text = await resp.text();
+ assertEquals(text, body);
+ await promise;
+
+ httpConn!.close();
+ },
+);
+
+Deno.test(
+ { permissions: { net: true } },
+ async function httpServerReadLargeBodyWithTransferChunked() {
+ const TLS_PACKET_SIZE = 16 * 1024 + 256;
+
+ // We want the body to be read in multiple packets
+ const chunks = [
+ "aa\n",
+ "deno.land large body\n".repeat(TLS_PACKET_SIZE),
+ "zz",
+ ];
+
+ const body = chunks.join("");
+
+ const stream = new TransformStream();
+ const writer = stream.writable.getWriter();
+ for (const chunk of chunks) {
+ writer.write(new TextEncoder().encode(chunk));
+ }
+ writer.close();
+
+ let httpConn: Deno.HttpConn;
+ const promise = (async () => {
+ const listener = Deno.listen({ port: listenPort });
+ const conn = await listener.accept();
+ listener.close();
+ httpConn = Deno.serveHttp(conn);
+ const reqEvent = await httpConn.nextRequest();
+ assert(reqEvent);
+ const { request, respondWith } = reqEvent;
+ assertEquals(await request.text(), body);
+ await respondWith(new Response(body));
+ })();
+
+ const resp = await fetch(`http://127.0.0.1:${listenPort}/`, {
+ method: "POST",
+ headers: { "connection": "close" },
+ body: stream.readable,
+ });
+ const text = await resp.text();
+ assertEquals(text, body);
+ await promise;
+
+ httpConn!.close();
+ },
+);
+
+Deno.test(
+ {
+ permissions: { net: true },
+ },
+ async function httpServerWithoutExclusiveAccessToTcp() {
+ const port = listenPort;
+ const listener = Deno.listen({ port });
+
+ const [clientConn, serverConn] = await Promise.all([
+ Deno.connect({ port }),
+ listener.accept(),
+ ]);
+
+ const buf = new Uint8Array(128);
+ const readPromise = serverConn.read(buf);
+ assertThrows(() => Deno.serveHttp(serverConn), Deno.errors.BadResource);
+
+ clientConn.close();
+ listener.close();
+ await readPromise;
+ },
+);
+
+Deno.test(
+ {
+ permissions: { net: true, read: true },
+ },
+ async function httpServerWithoutExclusiveAccessToTls() {
+ const hostname = "localhost";
+ const port = listenPort;
+ const listener = Deno.listenTls({
+ hostname,
+ port,
+ cert: await Deno.readTextFile("tests/testdata/tls/localhost.crt"),
+ key: await Deno.readTextFile("tests/testdata/tls/localhost.key"),
+ });
+
+ const caCerts = [
+ await Deno.readTextFile("tests/testdata/tls/RootCA.pem"),
+ ];
+ const [clientConn, serverConn] = await Promise.all([
+ Deno.connectTls({ hostname, port, caCerts }),
+ listener.accept(),
+ ]);
+ await Promise.all([clientConn.handshake(), serverConn.handshake()]);
+
+ const buf = new Uint8Array(128);
+ const readPromise = serverConn.read(buf);
+ assertThrows(() => Deno.serveHttp(serverConn), Deno.errors.BadResource);
+
+ clientConn.close();
+ listener.close();
+ await readPromise;
+ },
+);
+
+Deno.test(
+ {
+ ignore: Deno.build.os === "windows",
+ permissions: { read: true, write: true },
+ },
+ async function httpServerWithoutExclusiveAccessToUnixSocket() {
+ const filePath = tmpUnixSocketPath();
+ const listener = Deno.listen({ path: filePath, transport: "unix" });
+
+ const [clientConn, serverConn] = await Promise.all([
+ Deno.connect({ path: filePath, transport: "unix" }),
+ listener.accept(),
+ ]);
+
+ const buf = new Uint8Array(128);
+ const readPromise = serverConn.read(buf);
+ assertThrows(() => Deno.serveHttp(serverConn), Deno.errors.BadResource);
+
+ clientConn.close();
+ listener.close();
+ await readPromise;
+ },
+);
+
+Deno.test(
+ { permissions: { net: true } },
+ async function httpServerRequestResponseClone() {
+ const body = "deno".repeat(64 * 1024);
+ let httpConn: Deno.HttpConn;
+ const listener = Deno.listen({ port: listenPort });
+ const promise = (async () => {
+ const conn = await listener.accept();
+ listener.close();
+ httpConn = Deno.serveHttp(conn);
+ const reqEvent = await httpConn.nextRequest();
+ assert(reqEvent);
+ const { request, respondWith } = reqEvent;
+ const clone = request.clone();
+ const reader = clone.body!.getReader();
+
+ // get first chunk from branch2
+ const clonedChunks = [];
+ const { value, done } = await reader.read();
+ assert(!done);
+ clonedChunks.push(value);
+
+ // consume request after first chunk single read
+ // readAll should read correctly the rest of the body.
+ // firstChunk should be in the stream internal buffer
+ const body1 = await request.text();
+
+ while (true) {
+ const { value, done } = await reader.read();
+ if (done) break;
+ clonedChunks.push(value);
+ }
+ let offset = 0;
+ const body2 = new Uint8Array(body.length);
+ for (const chunk of clonedChunks) {
+ body2.set(chunk, offset);
+ offset += chunk.byteLength;
+ }
+
+ assertEquals(body1, body);
+ assertEquals(body1, new TextDecoder().decode(body2));
+ await respondWith(new Response(body));
+ })();
+
+ const response = await fetch(`http://localhost:${listenPort}`, {
+ body,
+ method: "POST",
+ });
+ const clone = response.clone();
+ assertEquals(await response.text(), await clone.text());
+
+ await promise;
+ httpConn!.close();
+ },
+);
+
+Deno.test({
+ name: "http server compresses and flushes each chunk of a streamed resource",
+ permissions: { net: true, run: true },
+ async fn() {
+ const hostname = "localhost";
+ const port = listenPort;
+ const port2 = listenPort2;
+
+ const encoder = new TextEncoder();
+ const listener = Deno.listen({ hostname, port });
+ const listener2 = Deno.listen({ hostname, port: port2 });
+
+ let httpConn: Deno.HttpConn;
+ async function server() {
+ const tcpConn = await listener.accept();
+ httpConn = Deno.serveHttp(tcpConn);
+ const e = await httpConn.nextRequest();
+ assert(e);
+ const { request, respondWith } = e;
+ assertEquals(request.headers.get("Accept-Encoding"), "gzip, deflate, br");
+ const resp = await fetch(`http://${hostname}:${port2}/`);
+ await respondWith(resp);
+ listener.close();
+ }
+
+ const ts = new TransformStream();
+ const writer = ts.writable.getWriter();
+ writer.write(encoder.encode("hello"));
+
+ let httpConn2: Deno.HttpConn;
+ async function server2() {
+ const tcpConn = await listener2.accept();
+ httpConn2 = Deno.serveHttp(tcpConn);
+ const e = await httpConn2.nextRequest();
+ assert(e);
+ await e.respondWith(
+ new Response(ts.readable, {
+ headers: { "Content-Type": "text/plain" },
+ }),
+ );
+ listener2.close();
+ }
+
+ async function client() {
+ const url = `http://${hostname}:${port}/`;
+ const args = [
+ "--request",
+ "GET",
+ "--url",
+ url,
+ "--header",
+ "Accept-Encoding: gzip, deflate, br",
+ "--no-buffer",
+ ];
+ const proc = new Deno.Command("curl", {
+ args,
+ stderr: "null",
+ stdout: "piped",
+ }).spawn();
+ const stdout = proc.stdout
+ .pipeThrough(new DecompressionStream("gzip"))
+ .pipeThrough(new TextDecoderStream());
+ let body = "";
+ for await (const chunk of stdout) {
+ body += chunk;
+ if (body === "hello") {
+ writer.write(encoder.encode(" world"));
+ writer.close();
+ }
+ }
+ assertEquals(body, "hello world");
+ const status = await proc.status;
+ assert(status.success);
+ }
+
+ await Promise.all([server(), server2(), client()]);
+ httpConn!.close();
+ httpConn2!.close();
+ },
+});
+
+Deno.test("case insensitive comma value finder", async (t) => {
+ const cases = /** @type {[string, boolean][]} */ ([
+ ["websocket", true],
+ ["wEbSOcKET", true],
+ [",wEbSOcKET", true],
+ [",wEbSOcKET,", true],
+ [", wEbSOcKET ,", true],
+ ["test, wEbSOcKET ,", true],
+ ["test ,\twEbSOcKET\t\t ,", true],
+ ["test , wEbSOcKET", true],
+ ["test, asdf,web,wEbSOcKET", true],
+ ["test, asdf,web,wEbSOcKETs", false],
+ ["test, asdf,awebsocket,wEbSOcKETs", false],
+ ]);
+
+ const findValue = buildCaseInsensitiveCommaValueFinder("websocket");
+ for (const [input, expected] of cases) {
+ await t.step(input.toString(), () => {
+ const actual = findValue(input);
+ assertEquals(actual, expected);
+ });
+ }
+});
+
+async function httpServerWithErrorBody(
+ listener: Deno.Listener,
+ compression: boolean,
+): Promise<Deno.HttpConn> {
+ const conn = await listener.accept();
+ listener.close();
+ const httpConn = Deno.serveHttp(conn);
+ const e = await httpConn.nextRequest();
+ assert(e);
+ const { respondWith } = e;
+ const originalErr = new Error("boom");
+ const rs = new ReadableStream({
+ async start(controller) {
+ controller.enqueue(new Uint8Array([65]));
+ await delay(1000);
+ controller.error(originalErr);
+ },
+ });
+ const init = compression ? { headers: { "content-type": "text/plain" } } : {};
+ const response = new Response(rs, init);
+ const err = await assertRejects(() => respondWith(response));
+ assert(err === originalErr);
+ return httpConn;
+}
+
+for (const compression of [true, false]) {
+ Deno.test({
+ name: `http server errors stream if response body errors (http/1.1${
+ compression ? " + compression" : ""
+ })`,
+ permissions: { net: true },
+ async fn() {
+ const hostname = "localhost";
+ const port = listenPort;
+
+ const listener = Deno.listen({ hostname, port });
+ const server = httpServerWithErrorBody(listener, compression);
+
+ const conn = await Deno.connect({ hostname, port });
+ const msg = new TextEncoder().encode(
+ `GET / HTTP/1.1\r\nHost: ${hostname}:${port}\r\n\r\n`,
+ );
+ const nwritten = await conn.write(msg);
+ assertEquals(nwritten, msg.byteLength);
+
+ const buf = new Uint8Array(1024);
+ const nread = await conn.read(buf);
+ assert(nread);
+ const data = new TextDecoder().decode(buf.subarray(0, nread));
+ assert(data.endsWith("1\r\nA\r\n"));
+ const nread2 = await conn.read(buf); // connection should be closed now because the stream errored
+ assertEquals(nread2, null);
+ conn.close();
+
+ const httpConn = await server;
+ httpConn.close();
+ },
+ });
+
+ Deno.test({
+ name: `http server errors stream if response body errors (http/1.1 + fetch${
+ compression ? " + compression" : ""
+ })`,
+ permissions: { net: true },
+ async fn() {
+ const hostname = "localhost";
+ const port = listenPort;
+
+ const listener = Deno.listen({ hostname, port });
+ const server = httpServerWithErrorBody(listener, compression);
+
+ const resp = await fetch(`http://${hostname}:${port}/`);
+ assert(resp.body);
+ const reader = resp.body.getReader();
+ const result = await reader.read();
+ assert(!result.done);
+ assertEquals(result.value, new Uint8Array([65]));
+ const err = await assertRejects(() => reader.read());
+ assert(err instanceof TypeError);
+ assert(err.message.includes("unexpected EOF"));
+
+ const httpConn = await server;
+ httpConn.close();
+ },
+ });
+
+ Deno.test({
+ name: `http server errors stream if response body errors (http/2 + fetch${
+ compression ? " + compression" : ""
+ }))`,
+ permissions: { net: true, read: true },
+ async fn() {
+ const hostname = "localhost";
+ const port = listenPort;
+
+ const listener = Deno.listenTls({
+ hostname,
+ port,
+ cert: await Deno.readTextFile("tests/testdata/tls/localhost.crt"),
+ key: await Deno.readTextFile("tests/testdata/tls/localhost.key"),
+ alpnProtocols: ["h2"],
+ });
+ const server = httpServerWithErrorBody(listener, compression);
+
+ const caCert = Deno.readTextFileSync("tests/testdata/tls/RootCA.pem");
+ const client = Deno.createHttpClient({ caCerts: [caCert] });
+ const resp = await fetch(`https://${hostname}:${port}/`, { client });
+ client.close();
+ assert(resp.body);
+ const reader = resp.body.getReader();
+ const result = await reader.read();
+ assert(!result.done);
+ assertEquals(result.value, new Uint8Array([65]));
+ const err = await assertRejects(() => reader.read());
+ assert(err instanceof TypeError);
+ assert(err.message.includes("unexpected internal error encountered"));
+
+ const httpConn = await server;
+ httpConn.close();
+ },
+ });
+}
+
+Deno.test({
+ name: "request signal is aborted when response errors",
+ permissions: { net: true },
+ async fn() {
+ let httpConn: Deno.HttpConn;
+ const promise = (async () => {
+ const listener = Deno.listen({ port: listenPort });
+ const conn = await listener.accept();
+ listener.close();
+ httpConn = Deno.serveHttp(conn);
+ const ev = await httpConn.nextRequest();
+ const { request, respondWith } = ev!;
+
+ await delay(300);
+ await assertRejects(() => respondWith(new Response("Hello World")));
+ assert(request.signal.aborted);
+ })();
+
+ const abortController = new AbortController();
+
+ fetch(`http://127.0.0.1:${listenPort}/`, {
+ signal: abortController.signal,
+ }).catch(() => {
+ // ignore
+ });
+
+ await delay(100);
+ abortController.abort();
+ await promise;
+ httpConn!.close();
+ },
+});
+
+Deno.test(
+ async function httpConnExplicitResourceManagement() {
+ let promise;
+
+ {
+ const listen = Deno.listen({ port: listenPort });
+ promise = fetch(`http://localhost:${listenPort}/`).catch(() => null);
+ const serverConn = await listen.accept();
+ listen.close();
+
+ using _httpConn = Deno.serveHttp(serverConn);
+ }
+
+ const response = await promise;
+ assertEquals(response, null);
+ },
+);
+
+function chunkedBodyReader(h: Headers, r: BufReader): Deno.Reader {
+ // Based on https://tools.ietf.org/html/rfc2616#section-19.4.6
+ const tp = new TextProtoReader(r);
+ let finished = false;
+ const chunks: Array<{
+ offset: number;
+ data: Uint8Array;
+ }> = [];
+ async function read(buf: Uint8Array): Promise<number | null> {
+ if (finished) return null;
+ const [chunk] = chunks;
+ if (chunk) {
+ const chunkRemaining = chunk.data.byteLength - chunk.offset;
+ const readLength = Math.min(chunkRemaining, buf.byteLength);
+ for (let i = 0; i < readLength; i++) {
+ buf[i] = chunk.data[chunk.offset + i];
+ }
+ chunk.offset += readLength;
+ if (chunk.offset === chunk.data.byteLength) {
+ chunks.shift();
+ // Consume \r\n;
+ if ((await tp.readLine()) === null) {
+ throw new Deno.errors.UnexpectedEof();
+ }
+ }
+ return readLength;
+ }
+ const line = await tp.readLine();
+ if (line === null) throw new Deno.errors.UnexpectedEof();
+ // TODO(bartlomieju): handle chunk extension
+ const [chunkSizeString] = line.split(";");
+ const chunkSize = parseInt(chunkSizeString, 16);
+ if (Number.isNaN(chunkSize) || chunkSize < 0) {
+ throw new Deno.errors.InvalidData("Invalid chunk size");
+ }
+ if (chunkSize > 0) {
+ if (chunkSize > buf.byteLength) {
+ let eof = await r.readFull(buf);
+ if (eof === null) {
+ throw new Deno.errors.UnexpectedEof();
+ }
+ const restChunk = new Uint8Array(chunkSize - buf.byteLength);
+ eof = await r.readFull(restChunk);
+ if (eof === null) {
+ throw new Deno.errors.UnexpectedEof();
+ } else {
+ chunks.push({
+ offset: 0,
+ data: restChunk,
+ });
+ }
+ return buf.byteLength;
+ } else {
+ const bufToFill = buf.subarray(0, chunkSize);
+ const eof = await r.readFull(bufToFill);
+ if (eof === null) {
+ throw new Deno.errors.UnexpectedEof();
+ }
+ // Consume \r\n
+ if ((await tp.readLine()) === null) {
+ throw new Deno.errors.UnexpectedEof();
+ }
+ return chunkSize;
+ }
+ } else {
+ assert(chunkSize === 0);
+ // Consume \r\n
+ if ((await r.readLine()) === null) {
+ throw new Deno.errors.UnexpectedEof();
+ }
+ await readTrailers(h, r);
+ finished = true;
+ return null;
+ }
+ }
+ return { read };
+}
+
+async function readTrailers(
+ headers: Headers,
+ r: BufReader,
+) {
+ const trailers = parseTrailer(headers.get("trailer"));
+ if (trailers == null) return;
+ const trailerNames = [...trailers.keys()];
+ const tp = new TextProtoReader(r);
+ const result = await tp.readMimeHeader();
+ if (result == null) {
+ throw new Deno.errors.InvalidData("Missing trailer header.");
+ }
+ const undeclared = [...result.keys()].filter(
+ (k) => !trailerNames.includes(k),
+ );
+ if (undeclared.length > 0) {
+ throw new Deno.errors.InvalidData(
+ `Undeclared trailers: ${Deno.inspect(undeclared)}.`,
+ );
+ }
+ for (const [k, v] of result) {
+ headers.append(k, v);
+ }
+ const missingTrailers = trailerNames.filter((k) => !result.has(k));
+ if (missingTrailers.length > 0) {
+ throw new Deno.errors.InvalidData(
+ `Missing trailers: ${Deno.inspect(missingTrailers)}.`,
+ );
+ }
+ headers.delete("trailer");
+}
+
+function parseTrailer(field: string | null): Headers | undefined {
+ if (field == null) {
+ return undefined;
+ }
+ const trailerNames = field.split(",").map((v) => v.trim().toLowerCase());
+ if (trailerNames.length === 0) {
+ throw new Deno.errors.InvalidData("Empty trailer header.");
+ }
+ const prohibited = trailerNames.filter((k) => isProhibitedForTrailer(k));
+ if (prohibited.length > 0) {
+ throw new Deno.errors.InvalidData(
+ `Prohibited trailer names: ${Deno.inspect(prohibited)}.`,
+ );
+ }
+ return new Headers(trailerNames.map((key) => [key, ""]));
+}
+
+function isProhibitedForTrailer(key: string): boolean {
+ const s = new Set(["transfer-encoding", "content-length", "trailer"]);
+ return s.has(key.toLowerCase());
+}
diff --git a/cli/tests/unit/image_bitmap_test.ts b/tests/unit/image_bitmap_test.ts
index 364f2a167..364f2a167 100644
--- a/cli/tests/unit/image_bitmap_test.ts
+++ b/tests/unit/image_bitmap_test.ts
diff --git a/cli/tests/unit/image_data_test.ts b/tests/unit/image_data_test.ts
index 7156301a0..7156301a0 100644
--- a/cli/tests/unit/image_data_test.ts
+++ b/tests/unit/image_data_test.ts
diff --git a/cli/tests/unit/internals_test.ts b/tests/unit/internals_test.ts
index bb4c21793..bb4c21793 100644
--- a/cli/tests/unit/internals_test.ts
+++ b/tests/unit/internals_test.ts
diff --git a/cli/tests/unit/intl_test.ts b/tests/unit/intl_test.ts
index 6e4de378c..6e4de378c 100644
--- a/cli/tests/unit/intl_test.ts
+++ b/tests/unit/intl_test.ts
diff --git a/cli/tests/unit/io_test.ts b/tests/unit/io_test.ts
index 04c9dab4b..04c9dab4b 100644
--- a/cli/tests/unit/io_test.ts
+++ b/tests/unit/io_test.ts
diff --git a/cli/tests/unit/jupyter_test.ts b/tests/unit/jupyter_test.ts
index 07defe230..07defe230 100644
--- a/cli/tests/unit/jupyter_test.ts
+++ b/tests/unit/jupyter_test.ts
diff --git a/cli/tests/unit/kv_queue_test.ts b/tests/unit/kv_queue_test.ts
index e052dcbf7..e052dcbf7 100644
--- a/cli/tests/unit/kv_queue_test.ts
+++ b/tests/unit/kv_queue_test.ts
diff --git a/cli/tests/unit/kv_queue_test_no_db_close.ts b/tests/unit/kv_queue_test_no_db_close.ts
index 947e1c5e6..947e1c5e6 100644
--- a/cli/tests/unit/kv_queue_test_no_db_close.ts
+++ b/tests/unit/kv_queue_test_no_db_close.ts
diff --git a/cli/tests/unit/kv_queue_undelivered_test.ts b/tests/unit/kv_queue_undelivered_test.ts
index 1fcefe7e2..1fcefe7e2 100644
--- a/cli/tests/unit/kv_queue_undelivered_test.ts
+++ b/tests/unit/kv_queue_undelivered_test.ts
diff --git a/cli/tests/unit/kv_test.ts b/tests/unit/kv_test.ts
index 5780d9900..5780d9900 100644
--- a/cli/tests/unit/kv_test.ts
+++ b/tests/unit/kv_test.ts
diff --git a/cli/tests/unit/link_test.ts b/tests/unit/link_test.ts
index 6048b8add..6048b8add 100644
--- a/cli/tests/unit/link_test.ts
+++ b/tests/unit/link_test.ts
diff --git a/cli/tests/unit/make_temp_test.ts b/tests/unit/make_temp_test.ts
index cbbae8dfe..cbbae8dfe 100644
--- a/cli/tests/unit/make_temp_test.ts
+++ b/tests/unit/make_temp_test.ts
diff --git a/cli/tests/unit/message_channel_test.ts b/tests/unit/message_channel_test.ts
index 88fb1ba11..88fb1ba11 100644
--- a/cli/tests/unit/message_channel_test.ts
+++ b/tests/unit/message_channel_test.ts
diff --git a/cli/tests/unit/mkdir_test.ts b/tests/unit/mkdir_test.ts
index 0948a1a84..0948a1a84 100644
--- a/cli/tests/unit/mkdir_test.ts
+++ b/tests/unit/mkdir_test.ts
diff --git a/cli/tests/unit/navigator_test.ts b/tests/unit/navigator_test.ts
index 5dcc423fa..5dcc423fa 100644
--- a/cli/tests/unit/navigator_test.ts
+++ b/tests/unit/navigator_test.ts
diff --git a/tests/unit/net_test.ts b/tests/unit/net_test.ts
new file mode 100644
index 000000000..eae1ae533
--- /dev/null
+++ b/tests/unit/net_test.ts
@@ -0,0 +1,1274 @@
+// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
+import {
+ assert,
+ assertEquals,
+ assertNotEquals,
+ assertRejects,
+ assertThrows,
+ delay,
+ execCode,
+ execCode2,
+ tmpUnixSocketPath,
+} from "./test_util.ts";
+
+// Since these tests may run in parallel, ensure this port is unique to this file
+const listenPort = 4503;
+const listenPort2 = 4504;
+
+let isCI: boolean;
+try {
+ isCI = Deno.env.get("CI") !== undefined;
+} catch {
+ isCI = true;
+}
+
+Deno.test({ permissions: { net: true } }, function netTcpListenClose() {
+ const listener = Deno.listen({ hostname: "127.0.0.1", port: listenPort });
+ assert(listener.addr.transport === "tcp");
+ assertEquals(listener.addr.hostname, "127.0.0.1");
+ assertEquals(listener.addr.port, listenPort);
+ assertNotEquals(listener.rid, 0);
+ listener.close();
+});
+
+Deno.test(
+ {
+ permissions: { net: true },
+ },
+ function netUdpListenClose() {
+ const socket = Deno.listenDatagram({
+ hostname: "127.0.0.1",
+ port: listenPort,
+ transport: "udp",
+ });
+ assert(socket.addr.transport === "udp");
+ assertEquals(socket.addr.hostname, "127.0.0.1");
+ assertEquals(socket.addr.port, listenPort);
+ socket.close();
+ },
+);
+
+Deno.test(
+ {
+ ignore: Deno.build.os === "windows",
+ permissions: { read: true, write: true },
+ },
+ function netUnixListenClose() {
+ const filePath = tmpUnixSocketPath();
+ const socket = Deno.listen({
+ path: filePath,
+ transport: "unix",
+ });
+ assert(socket.addr.transport === "unix");
+ assertEquals(socket.addr.path, filePath);
+ socket.close();
+ },
+);
+
+Deno.test(
+ {
+ ignore: Deno.build.os === "windows",
+ permissions: { read: true, write: true },
+ },
+ function netUnixPacketListenClose() {
+ const filePath = tmpUnixSocketPath();
+ const socket = Deno.listenDatagram({
+ path: filePath,
+ transport: "unixpacket",
+ });
+ assert(socket.addr.transport === "unixpacket");
+ assertEquals(socket.addr.path, filePath);
+ socket.close();
+ },
+);
+
+Deno.test(
+ {
+ ignore: Deno.build.os === "windows",
+ permissions: { read: true, write: false },
+ },
+ function netUnixListenWritePermission() {
+ assertThrows(() => {
+ const filePath = tmpUnixSocketPath();
+ const socket = Deno.listen({
+ path: filePath,
+ transport: "unix",
+ });
+ assert(socket.addr.transport === "unix");
+ assertEquals(socket.addr.path, filePath);
+ socket.close();
+ }, Deno.errors.PermissionDenied);
+ },
+);
+
+Deno.test(
+ {
+ ignore: Deno.build.os === "windows",
+ permissions: { read: true, write: false },
+ },
+ function netUnixPacketListenWritePermission() {
+ assertThrows(() => {
+ const filePath = tmpUnixSocketPath();
+ const socket = Deno.listenDatagram({
+ path: filePath,
+ transport: "unixpacket",
+ });
+ assert(socket.addr.transport === "unixpacket");
+ assertEquals(socket.addr.path, filePath);
+ socket.close();
+ }, Deno.errors.PermissionDenied);
+ },
+);
+
+Deno.test(
+ {
+ permissions: { net: true },
+ },
+ async function netTcpCloseWhileAccept() {
+ const listener = Deno.listen({ port: listenPort });
+ const p = listener.accept();
+ listener.close();
+ // TODO(piscisaureus): the error type should be `Interrupted` here, which
+ // gets thrown, but then ext/net catches it and rethrows `BadResource`.
+ await assertRejects(
+ () => p,
+ Deno.errors.BadResource,
+ "Listener has been closed",
+ );
+ },
+);
+
+Deno.test(
+ {
+ ignore: Deno.build.os === "windows",
+ permissions: { read: true, write: true },
+ },
+ async function netUnixCloseWhileAccept() {
+ const filePath = tmpUnixSocketPath();
+ const listener = Deno.listen({
+ path: filePath,
+ transport: "unix",
+ });
+ const p = listener.accept();
+ listener.close();
+ await assertRejects(
+ () => p,
+ Deno.errors.BadResource,
+ "Listener has been closed",
+ );
+ },
+);
+
+Deno.test(
+ { permissions: { net: true } },
+ async function netTcpConcurrentAccept() {
+ const listener = Deno.listen({ port: 4510 });
+ let acceptErrCount = 0;
+ const checkErr = (e: Error) => {
+ if (e.message === "Listener has been closed") {
+ assertEquals(acceptErrCount, 1);
+ } else if (e.message === "Another accept task is ongoing") {
+ acceptErrCount++;
+ } else {
+ throw new Error("Unexpected error message");
+ }
+ };
+ const p = listener.accept().catch(checkErr);
+ const p1 = listener.accept().catch(checkErr);
+ await Promise.race([p, p1]);
+ listener.close();
+ await Promise.all([p, p1]);
+ assertEquals(acceptErrCount, 1);
+ },
+);
+
+Deno.test(
+ {
+ ignore: Deno.build.os === "windows",
+ permissions: { read: true, write: true },
+ },
+ async function netUnixConcurrentAccept() {
+ const filePath = tmpUnixSocketPath();
+ const listener = Deno.listen({ transport: "unix", path: filePath });
+ let acceptErrCount = 0;
+ const checkErr = (e: Error) => {
+ if (e.message === "Listener has been closed") {
+ assertEquals(acceptErrCount, 1);
+ } else if (e instanceof Deno.errors.Busy) { // "Listener already in use"
+ acceptErrCount++;
+ } else {
+ throw e;
+ }
+ };
+ const p = listener.accept().catch(checkErr);
+ const p1 = listener.accept().catch(checkErr);
+ await Promise.race([p, p1]);
+ listener.close();
+ await Promise.all([p, p1]);
+ assertEquals(acceptErrCount, 1);
+ },
+);
+
+Deno.test({ permissions: { net: true } }, async function netTcpDialListen() {
+ const listener = Deno.listen({ port: listenPort });
+ listener.accept().then(
+ async (conn) => {
+ assert(conn.remoteAddr != null);
+ assert(conn.localAddr.transport === "tcp");
+ assertEquals(conn.localAddr.hostname, "127.0.0.1");
+ assertEquals(conn.localAddr.port, listenPort);
+ await conn.write(new Uint8Array([1, 2, 3]));
+ conn.close();
+ },
+ );
+
+ const conn = await Deno.connect({ hostname: "127.0.0.1", port: listenPort });
+ assert(conn.remoteAddr.transport === "tcp");
+ assertEquals(conn.remoteAddr.hostname, "127.0.0.1");
+ assertEquals(conn.remoteAddr.port, listenPort);
+ assert(conn.localAddr != null);
+ const buf = new Uint8Array(1024);
+ const readResult = await conn.read(buf);
+ assertEquals(3, readResult);
+ assertEquals(1, buf[0]);
+ assertEquals(2, buf[1]);
+ assertEquals(3, buf[2]);
+ assert(conn.rid > 0);
+
+ assert(readResult !== null);
+
+ const readResult2 = await conn.read(buf);
+ assertEquals(readResult2, null);
+
+ listener.close();
+ conn.close();
+});
+
+Deno.test({ permissions: { net: true } }, async function netTcpSetNoDelay() {
+ const listener = Deno.listen({ port: listenPort });
+ listener.accept().then(
+ async (conn) => {
+ assert(conn.remoteAddr != null);
+ assert(conn.localAddr.transport === "tcp");
+ assertEquals(conn.localAddr.hostname, "127.0.0.1");
+ assertEquals(conn.localAddr.port, listenPort);
+ await conn.write(new Uint8Array([1, 2, 3]));
+ conn.close();
+ },
+ );
+
+ const conn = await Deno.connect({ hostname: "127.0.0.1", port: listenPort });
+ conn.setNoDelay(true);
+ assert(conn.remoteAddr.transport === "tcp");
+ assertEquals(conn.remoteAddr.hostname, "127.0.0.1");
+ assertEquals(conn.remoteAddr.port, listenPort);
+ assert(conn.localAddr != null);
+ const buf = new Uint8Array(1024);
+ const readResult = await conn.read(buf);
+ assertEquals(3, readResult);
+ assertEquals(1, buf[0]);
+ assertEquals(2, buf[1]);
+ assertEquals(3, buf[2]);
+ assert(conn.rid > 0);
+
+ assert(readResult !== null);
+
+ const readResult2 = await conn.read(buf);
+ assertEquals(readResult2, null);
+
+ listener.close();
+ conn.close();
+});
+
+Deno.test({ permissions: { net: true } }, async function netTcpSetKeepAlive() {
+ const listener = Deno.listen({ port: listenPort });
+ listener.accept().then(
+ async (conn) => {
+ assert(conn.remoteAddr != null);
+ assert(conn.localAddr.transport === "tcp");
+ assertEquals(conn.localAddr.hostname, "127.0.0.1");
+ assertEquals(conn.localAddr.port, listenPort);
+ await conn.write(new Uint8Array([1, 2, 3]));
+ conn.close();
+ },
+ );
+
+ const conn = await Deno.connect({ hostname: "127.0.0.1", port: listenPort });
+ conn.setKeepAlive(true);
+ assert(conn.remoteAddr.transport === "tcp");
+ assertEquals(conn.remoteAddr.hostname, "127.0.0.1");
+ assertEquals(conn.remoteAddr.port, listenPort);
+ assert(conn.localAddr != null);
+ const buf = new Uint8Array(1024);
+ const readResult = await conn.read(buf);
+ assertEquals(3, readResult);
+ assertEquals(1, buf[0]);
+ assertEquals(2, buf[1]);
+ assertEquals(3, buf[2]);
+ assert(conn.rid > 0);
+
+ assert(readResult !== null);
+
+ const readResult2 = await conn.read(buf);
+ assertEquals(readResult2, null);
+
+ listener.close();
+ conn.close();
+});
+
+Deno.test(
+ {
+ ignore: Deno.build.os === "windows",
+ permissions: { read: true, write: true },
+ },
+ async function netUnixDialListen() {
+ const filePath = tmpUnixSocketPath();
+ const listener = Deno.listen({ path: filePath, transport: "unix" });
+ listener.accept().then(
+ async (conn) => {
+ assert(conn.remoteAddr != null);
+ assert(conn.localAddr.transport === "unix");
+ assertEquals(conn.localAddr.path, filePath);
+ await conn.write(new Uint8Array([1, 2, 3]));
+ conn.close();
+ },
+ );
+ const conn = await Deno.connect({ path: filePath, transport: "unix" });
+ assert(conn.remoteAddr.transport === "unix");
+ assertEquals(conn.remoteAddr.path, filePath);
+ assert(conn.remoteAddr != null);
+ const buf = new Uint8Array(1024);
+ const readResult = await conn.read(buf);
+ assertEquals(3, readResult);
+ assertEquals(1, buf[0]);
+ assertEquals(2, buf[1]);
+ assertEquals(3, buf[2]);
+ assert(conn.rid > 0);
+
+ assert(readResult !== null);
+
+ const readResult2 = await conn.read(buf);
+ assertEquals(readResult2, null);
+
+ listener.close();
+ conn.close();
+ },
+);
+
+Deno.test(
+ { permissions: { net: true } },
+ async function netUdpSendReceive() {
+ const alice = Deno.listenDatagram({ port: listenPort, transport: "udp" });
+ assert(alice.addr.transport === "udp");
+ assertEquals(alice.addr.port, listenPort);
+ assertEquals(alice.addr.hostname, "127.0.0.1");
+
+ const bob = Deno.listenDatagram({ port: listenPort2, transport: "udp" });
+ assert(bob.addr.transport === "udp");
+ assertEquals(bob.addr.port, listenPort2);
+ assertEquals(bob.addr.hostname, "127.0.0.1");
+
+ const sent = new Uint8Array([1, 2, 3]);
+ const byteLength = await alice.send(sent, bob.addr);
+
+ assertEquals(byteLength, 3);
+
+ const [recvd, remote] = await bob.receive();
+ assert(remote.transport === "udp");
+ assertEquals(remote.port, listenPort);
+ assertEquals(recvd.length, 3);
+ assertEquals(1, recvd[0]);
+ assertEquals(2, recvd[1]);
+ assertEquals(3, recvd[2]);
+ alice.close();
+ bob.close();
+ },
+);
+
+Deno.test(
+ { permissions: { net: true }, ignore: true },
+ async function netUdpSendReceiveBroadcast() {
+ // Must bind sender to an address that can send to the broadcast address on MacOS.
+ // Macos will give us error 49 when sending the broadcast packet if we omit hostname here.
+ const alice = Deno.listenDatagram({
+ port: listenPort,
+ transport: "udp",
+ hostname: "0.0.0.0",
+ });
+
+ const bob = Deno.listenDatagram({
+ port: listenPort,
+ transport: "udp",
+ hostname: "0.0.0.0",
+ });
+ assert(bob.addr.transport === "udp");
+ assertEquals(bob.addr.port, listenPort);
+ assertEquals(bob.addr.hostname, "0.0.0.0");
+
+ const broadcastAddr = { ...bob.addr, hostname: "255.255.255.255" };
+
+ const sent = new Uint8Array([1, 2, 3]);
+ const byteLength = await alice.send(sent, broadcastAddr);
+
+ assertEquals(byteLength, 3);
+ const [recvd, remote] = await bob.receive();
+ assert(remote.transport === "udp");
+ assertEquals(remote.port, listenPort);
+ assertEquals(recvd.length, 3);
+ assertEquals(1, recvd[0]);
+ assertEquals(2, recvd[1]);
+ assertEquals(3, recvd[2]);
+ alice.close();
+ bob.close();
+ },
+);
+
+Deno.test(
+ { permissions: { net: true }, ignore: true },
+ async function netUdpMulticastV4() {
+ const listener = Deno.listenDatagram({
+ hostname: "0.0.0.0",
+ port: 5353,
+ transport: "udp",
+ reuseAddress: true,
+ });
+
+ const membership = await listener.joinMulticastV4(
+ "224.0.0.251",
+ "127.0.0.1",
+ );
+
+ membership.setLoopback(true);
+ membership.setLoopback(false);
+ membership.setTTL(50);
+ membership.leave();
+ listener.close();
+ },
+);
+
+Deno.test(
+ { permissions: { net: true }, ignore: true },
+ async function netUdpMulticastV6() {
+ const listener = Deno.listenDatagram({
+ hostname: "::",
+ port: 5353,
+ transport: "udp",
+ reuseAddress: true,
+ });
+
+ const membership = await listener.joinMulticastV6(
+ "ff02::fb",
+ 1,
+ );
+
+ membership.setLoopback(true);
+ membership.setLoopback(false);
+ membership.leave();
+ listener.close();
+ },
+);
+
+Deno.test(
+ { permissions: { net: true }, ignore: true },
+ async function netUdpSendReceiveMulticastv4() {
+ const alice = Deno.listenDatagram({
+ hostname: "0.0.0.0",
+ port: 5353,
+ transport: "udp",
+ reuseAddress: true,
+ loopback: true,
+ });
+
+ const bob = Deno.listenDatagram({
+ hostname: "0.0.0.0",
+ port: 5353,
+ transport: "udp",
+ reuseAddress: true,
+ });
+
+ const aliceMembership = await alice.joinMulticastV4(
+ "224.0.0.1",
+ "0.0.0.0",
+ );
+
+ const bobMembership = await bob.joinMulticastV4("224.0.0.1", "0.0.0.0");
+
+ const sent = new Uint8Array([1, 2, 3]);
+
+ await alice.send(sent, {
+ hostname: "224.0.0.1",
+ port: 5353,
+ transport: "udp",
+ });
+
+ const [recvd, remote] = await bob.receive();
+
+ assert(remote.transport === "udp");
+ assertEquals(remote.port, 5353);
+ assertEquals(recvd.length, 3);
+ assertEquals(1, recvd[0]);
+ assertEquals(2, recvd[1]);
+ assertEquals(3, recvd[2]);
+
+ aliceMembership.leave();
+ bobMembership.leave();
+
+ alice.close();
+ bob.close();
+ },
+);
+
+Deno.test(
+ { permissions: { net: true }, ignore: true },
+ async function netUdpMulticastLoopbackOption() {
+ // Must bind sender to an address that can send to the broadcast address on MacOS.
+ // Macos will give us error 49 when sending the broadcast packet if we omit hostname here.
+ const listener = Deno.listenDatagram({
+ port: 5353,
+ transport: "udp",
+ hostname: "0.0.0.0",
+ loopback: true,
+ reuseAddress: true,
+ });
+
+ const membership = await listener.joinMulticastV4(
+ "224.0.0.1",
+ "0.0.0.0",
+ );
+
+ // await membership.setLoopback(true);
+
+ const sent = new Uint8Array([1, 2, 3]);
+ const byteLength = await listener.send(sent, {
+ hostname: "224.0.0.1",
+ port: 5353,
+ transport: "udp",
+ });
+
+ assertEquals(byteLength, 3);
+ const [recvd, remote] = await listener.receive();
+ assert(remote.transport === "udp");
+ assertEquals(remote.port, 5353);
+ assertEquals(recvd.length, 3);
+ assertEquals(1, recvd[0]);
+ assertEquals(2, recvd[1]);
+ assertEquals(3, recvd[2]);
+ membership.leave();
+ listener.close();
+ },
+);
+
+Deno.test(
+ { permissions: { net: true } },
+ async function netUdpConcurrentSendReceive() {
+ const socket = Deno.listenDatagram({ port: listenPort, transport: "udp" });
+ assert(socket.addr.transport === "udp");
+ assertEquals(socket.addr.port, listenPort);
+ assertEquals(socket.addr.hostname, "127.0.0.1");
+
+ const recvPromise = socket.receive();
+
+ const sendBuf = new Uint8Array([1, 2, 3]);
+ const sendLen = await socket.send(sendBuf, socket.addr);
+ assertEquals(sendLen, 3);
+
+ const [recvBuf, _recvAddr] = await recvPromise;
+ assertEquals(recvBuf.length, 3);
+ assertEquals(1, recvBuf[0]);
+ assertEquals(2, recvBuf[1]);
+ assertEquals(3, recvBuf[2]);
+
+ socket.close();
+ },
+);
+
+Deno.test(
+ { permissions: { net: true } },
+ async function netUdpBorrowMutError() {
+ const socket = Deno.listenDatagram({
+ port: listenPort,
+ transport: "udp",
+ });
+ // Panic happened on second send: BorrowMutError
+ const a = socket.send(new Uint8Array(), socket.addr);
+ const b = socket.send(new Uint8Array(), socket.addr);
+ await Promise.all([a, b]);
+ socket.close();
+ },
+);
+
+Deno.test(
+ {
+ ignore: Deno.build.os === "windows",
+ permissions: { read: true, write: true },
+ },
+ async function netUnixPacketSendReceive() {
+ const aliceFilePath = tmpUnixSocketPath();
+ const alice = Deno.listenDatagram({
+ path: aliceFilePath,
+ transport: "unixpacket",
+ });
+ assert(alice.addr.transport === "unixpacket");
+ assertEquals(alice.addr.path, aliceFilePath);
+
+ const bobFilePath = tmpUnixSocketPath();
+ const bob = Deno.listenDatagram({
+ path: bobFilePath,
+ transport: "unixpacket",
+ });
+ assert(bob.addr.transport === "unixpacket");
+ assertEquals(bob.addr.path, bobFilePath);
+
+ const sent = new Uint8Array([1, 2, 3]);
+ const byteLength = await alice.send(sent, bob.addr);
+ assertEquals(byteLength, 3);
+
+ const [recvd, remote] = await bob.receive();
+ assert(remote.transport === "unixpacket");
+ assertEquals(remote.path, aliceFilePath);
+ assertEquals(recvd.length, 3);
+ assertEquals(1, recvd[0]);
+ assertEquals(2, recvd[1]);
+ assertEquals(3, recvd[2]);
+ alice.close();
+ bob.close();
+ },
+);
+
+// TODO(lucacasonato): support concurrent reads and writes on unixpacket sockets
+Deno.test(
+ { ignore: true, permissions: { read: true, write: true } },
+ async function netUnixPacketConcurrentSendReceive() {
+ const filePath = tmpUnixSocketPath();
+ const socket = Deno.listenDatagram({
+ path: filePath,
+ transport: "unixpacket",
+ });
+ assert(socket.addr.transport === "unixpacket");
+ assertEquals(socket.addr.path, filePath);
+
+ const recvPromise = socket.receive();
+
+ const sendBuf = new Uint8Array([1, 2, 3]);
+ const sendLen = await socket.send(sendBuf, socket.addr);
+ assertEquals(sendLen, 3);
+
+ const [recvBuf, _recvAddr] = await recvPromise;
+ assertEquals(recvBuf.length, 3);
+ assertEquals(1, recvBuf[0]);
+ assertEquals(2, recvBuf[1]);
+ assertEquals(3, recvBuf[2]);
+
+ socket.close();
+ },
+);
+
+Deno.test(
+ { permissions: { net: true } },
+ async function netTcpListenIteratorBreakClosesResource() {
+ async function iterate(listener: Deno.Listener) {
+ let i = 0;
+
+ for await (const conn of listener) {
+ conn.close();
+ i++;
+
+ if (i > 1) {
+ break;
+ }
+ }
+ }
+
+ const addr = { hostname: "127.0.0.1", port: 8888 };
+ const listener = Deno.listen(addr);
+ const iteratePromise = iterate(listener);
+
+ await delay(100);
+ const conn1 = await Deno.connect(addr);
+ conn1.close();
+ const conn2 = await Deno.connect(addr);
+ conn2.close();
+
+ await iteratePromise;
+ },
+);
+
+Deno.test(
+ { permissions: { net: true } },
+ async function netTcpListenCloseWhileIterating() {
+ const listener = Deno.listen({ port: 8001 });
+ const nextWhileClosing = listener[Symbol.asyncIterator]().next();
+ listener.close();
+ assertEquals(await nextWhileClosing, { value: undefined, done: true });
+
+ const nextAfterClosing = listener[Symbol.asyncIterator]().next();
+ assertEquals(await nextAfterClosing, { value: undefined, done: true });
+ },
+);
+
+Deno.test(
+ { permissions: { net: true } },
+ async function netUdpListenCloseWhileIterating() {
+ const socket = Deno.listenDatagram({ port: 8000, transport: "udp" });
+ const nextWhileClosing = socket[Symbol.asyncIterator]().next();
+ socket.close();
+ assertEquals(await nextWhileClosing, { value: undefined, done: true });
+
+ const nextAfterClosing = socket[Symbol.asyncIterator]().next();
+ assertEquals(await nextAfterClosing, { value: undefined, done: true });
+ },
+);
+
+Deno.test(
+ {
+ ignore: Deno.build.os === "windows",
+ permissions: { read: true, write: true },
+ },
+ async function netUnixListenCloseWhileIterating() {
+ const filePath = tmpUnixSocketPath();
+ const socket = Deno.listen({ path: filePath, transport: "unix" });
+ const nextWhileClosing = socket[Symbol.asyncIterator]().next();
+ socket.close();
+ assertEquals(await nextWhileClosing, { value: undefined, done: true });
+
+ const nextAfterClosing = socket[Symbol.asyncIterator]().next();
+ assertEquals(await nextAfterClosing, { value: undefined, done: true });
+ },
+);
+
+Deno.test(
+ {
+ ignore: Deno.build.os === "windows",
+ permissions: { read: true, write: true },
+ },
+ async function netUnixPacketListenCloseWhileIterating() {
+ const filePath = tmpUnixSocketPath();
+ const socket = Deno.listenDatagram({
+ path: filePath,
+ transport: "unixpacket",
+ });
+ const nextWhileClosing = socket[Symbol.asyncIterator]().next();
+ socket.close();
+ assertEquals(await nextWhileClosing, { value: undefined, done: true });
+
+ const nextAfterClosing = socket[Symbol.asyncIterator]().next();
+ assertEquals(await nextAfterClosing, { value: undefined, done: true });
+ },
+);
+
+Deno.test(
+ { permissions: { net: true } },
+ async function netListenAsyncIterator() {
+ const addr = { hostname: "127.0.0.1", port: listenPort };
+ const listener = Deno.listen(addr);
+ const runAsyncIterator = async () => {
+ for await (const conn of listener) {
+ await conn.write(new Uint8Array([1, 2, 3]));
+ conn.close();
+ }
+ };
+ runAsyncIterator();
+ const conn = await Deno.connect(addr);
+ const buf = new Uint8Array(1024);
+ const readResult = await conn.read(buf);
+ assertEquals(3, readResult);
+ assertEquals(1, buf[0]);
+ assertEquals(2, buf[1]);
+ assertEquals(3, buf[2]);
+ assert(conn.rid > 0);
+
+ assert(readResult !== null);
+
+ const readResult2 = await conn.read(buf);
+ assertEquals(readResult2, null);
+
+ listener.close();
+ conn.close();
+ },
+);
+
+Deno.test(
+ {
+ permissions: { net: true },
+ },
+ async function netCloseWriteSuccess() {
+ const addr = { hostname: "127.0.0.1", port: listenPort };
+ const listener = Deno.listen(addr);
+ const { promise: closePromise, resolve } = Promise.withResolvers<void>();
+ listener.accept().then(async (conn) => {
+ await conn.write(new Uint8Array([1, 2, 3]));
+ await closePromise;
+ conn.close();
+ });
+ const conn = await Deno.connect(addr);
+ conn.closeWrite(); // closing write
+ const buf = new Uint8Array(1024);
+ // Check read not impacted
+ const readResult = await conn.read(buf);
+ assertEquals(3, readResult);
+ assertEquals(1, buf[0]);
+ assertEquals(2, buf[1]);
+ assertEquals(3, buf[2]);
+ // Verify that the write end of the socket is closed.
+ // TODO(piscisaureus): assert that thrown error is of a specific type.
+ await assertRejects(async () => {
+ await conn.write(new Uint8Array([1, 2, 3]));
+ });
+ resolve();
+ listener.close();
+ conn.close();
+ },
+);
+
+Deno.test(
+ {
+ // https://github.com/denoland/deno/issues/11580
+ ignore: Deno.build.os === "darwin" && isCI,
+ permissions: { net: true },
+ },
+ async function netHangsOnClose() {
+ let acceptedConn: Deno.Conn;
+
+ async function iteratorReq(listener: Deno.Listener) {
+ const p = new Uint8Array(10);
+ const conn = await listener.accept();
+ acceptedConn = conn;
+
+ try {
+ while (true) {
+ const nread = await conn.read(p);
+ if (nread === null) {
+ break;
+ }
+ await conn.write(new Uint8Array([1, 2, 3]));
+ }
+ } catch (err) {
+ assert(err);
+ assert(err instanceof Deno.errors.Interrupted);
+ }
+ }
+
+ const addr = { hostname: "127.0.0.1", port: listenPort };
+ const listener = Deno.listen(addr);
+ const listenerPromise = iteratorReq(listener);
+ const connectionPromise = (async () => {
+ const conn = await Deno.connect(addr);
+ await conn.write(new Uint8Array([1, 2, 3, 4]));
+ const buf = new Uint8Array(10);
+ await conn.read(buf);
+ conn!.close();
+ acceptedConn!.close();
+ listener.close();
+ })();
+
+ await Promise.all([
+ listenerPromise,
+ connectionPromise,
+ ]);
+ },
+);
+
+Deno.test(
+ {
+ permissions: { net: true },
+ },
+ function netExplicitUndefinedHostname() {
+ const listener = Deno.listen({ hostname: undefined, port: 8080 });
+ assertEquals((listener.addr as Deno.NetAddr).hostname, "0.0.0.0");
+ listener.close();
+ },
+);
+
+Deno.test(
+ {
+ ignore: Deno.build.os !== "linux",
+ permissions: { read: true, write: true },
+ },
+ function netUnixAbstractPathShouldNotPanic() {
+ const listener = Deno.listen({
+ path: "\0aaa",
+ transport: "unix",
+ });
+ assert("not panic");
+ listener.close();
+ },
+);
+
+Deno.test({ permissions: { net: true } }, async function whatwgStreams() {
+ const server = (async () => {
+ const listener = Deno.listen({ hostname: "127.0.0.1", port: listenPort });
+ const conn = await listener.accept();
+ await conn.readable.pipeTo(conn.writable);
+ listener.close();
+ })();
+
+ const conn = await Deno.connect({ hostname: "127.0.0.1", port: listenPort });
+ const reader = conn.readable.getReader();
+ const writer = conn.writable.getWriter();
+ const encoder = new TextEncoder();
+ const decoder = new TextDecoder();
+ const data = encoder.encode("Hello World");
+
+ await writer.write(data);
+ const { value, done } = await reader.read();
+ assert(!done);
+ assertEquals(decoder.decode(value), "Hello World");
+ await reader.cancel();
+ await server;
+});
+
+Deno.test(
+ { permissions: { read: true } },
+ async function readableStreamTextEncoderPipe() {
+ const filename = "tests/testdata/assets/hello.txt";
+ const file = await Deno.open(filename);
+ const readable = file.readable.pipeThrough(new TextDecoderStream());
+ const chunks = [];
+ for await (const chunk of readable) {
+ chunks.push(chunk);
+ }
+ assertEquals(chunks.length, 1);
+ assertEquals(chunks[0].length, 12);
+ },
+);
+
+Deno.test(
+ { permissions: { read: true, write: true } },
+ async function writableStream() {
+ const path = await Deno.makeTempFile();
+ const file = await Deno.open(path, { write: true });
+ assert(file.writable instanceof WritableStream);
+ const readable = new ReadableStream({
+ start(controller) {
+ controller.enqueue(new TextEncoder().encode("hello "));
+ controller.enqueue(new TextEncoder().encode("world!"));
+ controller.close();
+ },
+ });
+ await readable.pipeTo(file.writable);
+ const res = await Deno.readTextFile(path);
+ assertEquals(res, "hello world!");
+ },
+);
+
+Deno.test(
+ { permissions: { read: true, run: true } },
+ async function netListenUnref() {
+ const [statusCode, _output] = await execCode(`
+ async function main() {
+ const listener = Deno.listen({ port: ${listenPort} });
+ listener.unref();
+ await listener.accept(); // This doesn't block the program from exiting
+ }
+ main();
+ `);
+ assertEquals(statusCode, 0);
+ },
+);
+
+Deno.test(
+ { permissions: { read: true, run: true } },
+ async function netListenUnref2() {
+ const [statusCode, _output] = await execCode(`
+ async function main() {
+ const listener = Deno.listen({ port: ${listenPort} });
+ await listener.accept();
+ listener.unref();
+ await listener.accept(); // The program exits here
+ throw new Error(); // The program doesn't reach here
+ }
+ main();
+ const conn = await Deno.connect({ port: ${listenPort} });
+ conn.close();
+ `);
+ assertEquals(statusCode, 0);
+ },
+);
+
+Deno.test(
+ { permissions: { read: true, run: true, net: true } },
+ async function netListenUnrefAndRef() {
+ const p = execCode2(`
+ async function main() {
+ const listener = Deno.listen({ port: ${listenPort} });
+ listener.unref();
+ listener.ref(); // This restores 'ref' state of listener
+ console.log("started");
+ await listener.accept();
+ console.log("accepted")
+ }
+ main();
+ `);
+ await p.waitStdoutText("started");
+ const conn = await Deno.connect({ port: listenPort });
+ conn.close();
+ const [statusCode, output] = await p.finished();
+ assertEquals(statusCode, 0);
+ assertEquals(output.trim(), "started\naccepted");
+ },
+);
+
+Deno.test(
+ { permissions: { net: true } },
+ async function netListenUnrefConcurrentAccept() {
+ const timer = setTimeout(() => {}, 1000);
+ const listener = Deno.listen({ port: listenPort });
+ listener.accept().catch(() => {});
+ listener.unref();
+ // Unref'd listener still causes Busy error
+ // on concurrent accept calls.
+ await assertRejects(async () => {
+ await listener.accept(); // The program exits here
+ }, Deno.errors.Busy);
+ listener.close();
+ clearTimeout(timer);
+ },
+);
+
+Deno.test({
+ ignore: Deno.build.os === "windows",
+ permissions: { read: true, write: true },
+}, function netUnixListenAddrAlreadyInUse() {
+ const filePath = tmpUnixSocketPath();
+ const listener = Deno.listen({ path: filePath, transport: "unix" });
+ assertThrows(
+ () => {
+ Deno.listen({ path: filePath, transport: "unix" });
+ },
+ Deno.errors.AddrInUse,
+ );
+ listener.close();
+});
+
+Deno.test(
+ { permissions: { net: true, read: true, run: true } },
+ async function netConnUnref() {
+ const listener = Deno.listen({ port: listenPort });
+ const intervalId = setInterval(() => {}); // This keeps event loop alive.
+
+ const program = execCode(`
+ async function main() {
+ const conn = await Deno.connect({ port: ${listenPort} });
+ conn.unref();
+ await conn.read(new Uint8Array(10)); // The program exits here
+ throw new Error(); // The program doesn't reach here
+ }
+ main();
+ `);
+ const conn = await listener.accept();
+ const [statusCode, _output] = await program;
+ conn.close();
+ listener.close();
+ clearInterval(intervalId);
+ assertEquals(statusCode, 0);
+ },
+);
+
+Deno.test(
+ { permissions: { net: true, read: true, run: true } },
+ async function netConnUnrefReadable() {
+ const listener = Deno.listen({ port: listenPort });
+ const intervalId = setInterval(() => {}); // This keeps event loop alive.
+
+ const program = execCode(`
+ async function main() {
+ const conn = await Deno.connect({ port: ${listenPort} });
+ conn.unref();
+ const reader = conn.readable.getReader();
+ await reader.read(); // The program exits here
+ throw new Error(); // The program doesn't reach here
+ }
+ main();
+ `);
+ const conn = await listener.accept();
+ const [statusCode, _output] = await program;
+ conn.close();
+ listener.close();
+ clearInterval(intervalId);
+ assertEquals(statusCode, 0);
+ },
+);
+
+Deno.test({ permissions: { net: true } }, async function netTcpReuseAddr() {
+ const listener1 = Deno.listen({
+ hostname: "127.0.0.1",
+ port: listenPort,
+ });
+ listener1.accept().then(
+ (conn) => {
+ conn.close();
+ },
+ );
+
+ const conn1 = await Deno.connect({ hostname: "127.0.0.1", port: listenPort });
+ const buf1 = new Uint8Array(1024);
+ await conn1.read(buf1);
+ listener1.close();
+ conn1.close();
+
+ const listener2 = Deno.listen({
+ hostname: "127.0.0.1",
+ port: listenPort,
+ });
+
+ listener2.accept().then(
+ (conn) => {
+ conn.close();
+ },
+ );
+
+ const conn2 = await Deno.connect({ hostname: "127.0.0.1", port: listenPort });
+ const buf2 = new Uint8Array(1024);
+ await conn2.read(buf2);
+
+ listener2.close();
+ conn2.close();
+});
+
+Deno.test(
+ { permissions: { net: true } },
+ async function netUdpReuseAddr() {
+ const sender = Deno.listenDatagram({
+ port: 4002,
+ transport: "udp",
+ });
+ const listener1 = Deno.listenDatagram({
+ port: 4000,
+ transport: "udp",
+ reuseAddress: true,
+ });
+ const listener2 = Deno.listenDatagram({
+ port: 4000,
+ transport: "udp",
+ reuseAddress: true,
+ });
+
+ const sent = new Uint8Array([1, 2, 3]);
+ await sender.send(sent, listener1.addr);
+ await Promise.any([listener1.receive(), listener2.receive()]).then(
+ ([recvd, remote]) => {
+ assert(remote.transport === "udp");
+ assertEquals(recvd.length, 3);
+ assertEquals(1, recvd[0]);
+ assertEquals(2, recvd[1]);
+ assertEquals(3, recvd[2]);
+ },
+ );
+ sender.close();
+ listener1.close();
+ listener2.close();
+ },
+);
+
+Deno.test(
+ { permissions: { net: true } },
+ function netUdpNoReuseAddr() {
+ let listener1;
+ try {
+ listener1 = Deno.listenDatagram({
+ port: 4001,
+ transport: "udp",
+ reuseAddress: false,
+ });
+ } catch (err) {
+ assert(err);
+ assert(err instanceof Deno.errors.AddrInUse); // AddrInUse from previous test
+ }
+
+ assertThrows(() => {
+ Deno.listenDatagram({
+ port: 4001,
+ transport: "udp",
+ reuseAddress: false,
+ });
+ }, Deno.errors.AddrInUse);
+ if (typeof listener1 !== "undefined") {
+ listener1.close();
+ }
+ },
+);
+
+Deno.test({
+ ignore: Deno.build.os !== "linux",
+ permissions: { net: true },
+}, async function netTcpListenReusePort() {
+ const port = 4003;
+ const listener1 = Deno.listen({ port, reusePort: true });
+ const listener2 = Deno.listen({ port, reusePort: true });
+ let p1;
+ let p2;
+ let listener1Recv = false;
+ let listener2Recv = false;
+ while (!listener1Recv || !listener2Recv) {
+ if (!p1) {
+ p1 = listener1.accept().then((conn) => {
+ conn.close();
+ listener1Recv = true;
+ p1 = undefined;
+ }).catch(() => {});
+ }
+ if (!p2) {
+ p2 = listener2.accept().then((conn) => {
+ conn.close();
+ listener2Recv = true;
+ p2 = undefined;
+ }).catch(() => {});
+ }
+ const conn = await Deno.connect({ port });
+ conn.close();
+ await Promise.race([p1, p2]);
+ }
+ listener1.close();
+ listener2.close();
+});
+
+Deno.test({
+ ignore: Deno.build.os === "linux",
+ permissions: { net: true },
+}, function netTcpListenReusePortDoesNothing() {
+ const listener1 = Deno.listen({ port: 4003, reusePort: true });
+ assertThrows(() => {
+ Deno.listen({ port: 4003, reusePort: true });
+ }, Deno.errors.AddrInUse);
+ listener1.close();
+});
+
+Deno.test({
+ permissions: { net: true },
+}, function netTcpListenDoesNotThrowOnStringPort() {
+ // @ts-ignore String port is not allowed by typing, but it shouldn't throw
+ // for backwards compatibility.
+ const listener = Deno.listen({ hostname: "localhost", port: "0" });
+ listener.close();
+});
+
+Deno.test(
+ { permissions: { net: true } },
+ async function listenerExplicitResourceManagement() {
+ let done: Promise<Deno.errors.BadResource>;
+
+ {
+ using listener = Deno.listen({ port: listenPort });
+
+ done = assertRejects(
+ () => listener.accept(),
+ Deno.errors.BadResource,
+ );
+ }
+
+ await done;
+ },
+);
+
+Deno.test(
+ { permissions: { net: true } },
+ async function listenerExplicitResourceManagementManualClose() {
+ using listener = Deno.listen({ port: listenPort });
+ listener.close();
+ await assertRejects( // definitely closed
+ () => listener.accept(),
+ Deno.errors.BadResource,
+ );
+ // calling [Symbol.dispose] after manual close is a no-op
+ },
+);
diff --git a/cli/tests/unit/network_interfaces_test.ts b/tests/unit/network_interfaces_test.ts
index 160efbfe6..160efbfe6 100644
--- a/cli/tests/unit/network_interfaces_test.ts
+++ b/tests/unit/network_interfaces_test.ts
diff --git a/cli/tests/unit/ops_test.ts b/tests/unit/ops_test.ts
index 4a0daa0a5..4a0daa0a5 100644
--- a/cli/tests/unit/ops_test.ts
+++ b/tests/unit/ops_test.ts
diff --git a/cli/tests/unit/os_test.ts b/tests/unit/os_test.ts
index e24494854..e24494854 100644
--- a/cli/tests/unit/os_test.ts
+++ b/tests/unit/os_test.ts
diff --git a/cli/tests/unit/path_from_url_test.ts b/tests/unit/path_from_url_test.ts
index b3a6406bc..b3a6406bc 100644
--- a/cli/tests/unit/path_from_url_test.ts
+++ b/tests/unit/path_from_url_test.ts
diff --git a/cli/tests/unit/performance_test.ts b/tests/unit/performance_test.ts
index 0c9ed21df..0c9ed21df 100644
--- a/cli/tests/unit/performance_test.ts
+++ b/tests/unit/performance_test.ts
diff --git a/cli/tests/unit/permissions_test.ts b/tests/unit/permissions_test.ts
index 4dab0696a..4dab0696a 100644
--- a/cli/tests/unit/permissions_test.ts
+++ b/tests/unit/permissions_test.ts
diff --git a/cli/tests/unit/process_test.ts b/tests/unit/process_test.ts
index 0cc4e99aa..0cc4e99aa 100644
--- a/cli/tests/unit/process_test.ts
+++ b/tests/unit/process_test.ts
diff --git a/cli/tests/unit/progressevent_test.ts b/tests/unit/progressevent_test.ts
index 809c2ad39..809c2ad39 100644
--- a/cli/tests/unit/progressevent_test.ts
+++ b/tests/unit/progressevent_test.ts
diff --git a/cli/tests/unit/promise_hooks_test.ts b/tests/unit/promise_hooks_test.ts
index f7c44155d..f7c44155d 100644
--- a/cli/tests/unit/promise_hooks_test.ts
+++ b/tests/unit/promise_hooks_test.ts
diff --git a/tests/unit/read_dir_test.ts b/tests/unit/read_dir_test.ts
new file mode 100644
index 000000000..cba9647e5
--- /dev/null
+++ b/tests/unit/read_dir_test.ts
@@ -0,0 +1,113 @@
+// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
+import {
+ assert,
+ assertEquals,
+ assertRejects,
+ assertThrows,
+ pathToAbsoluteFileUrl,
+} from "./test_util.ts";
+
+function assertSameContent(files: Deno.DirEntry[]) {
+ let counter = 0;
+
+ for (const entry of files) {
+ if (entry.name === "subdir") {
+ assert(entry.isDirectory);
+ counter++;
+ }
+ }
+
+ assertEquals(counter, 1);
+}
+
+Deno.test({ permissions: { read: true } }, function readDirSyncSuccess() {
+ const files = [...Deno.readDirSync("tests/testdata")];
+ assertSameContent(files);
+});
+
+Deno.test({ permissions: { read: true } }, function readDirSyncWithUrl() {
+ const files = [
+ ...Deno.readDirSync(pathToAbsoluteFileUrl("tests/testdata")),
+ ];
+ assertSameContent(files);
+});
+
+Deno.test({ permissions: { read: false } }, function readDirSyncPerm() {
+ assertThrows(() => {
+ Deno.readDirSync("tests/");
+ }, Deno.errors.PermissionDenied);
+});
+
+Deno.test({ permissions: { read: true } }, function readDirSyncNotDir() {
+ assertThrows(
+ () => {
+ Deno.readDirSync("tests/testdata/assets/fixture.json");
+ },
+ Error,
+ `readdir 'tests/testdata/assets/fixture.json'`,
+ );
+});
+
+Deno.test({ permissions: { read: true } }, function readDirSyncNotFound() {
+ assertThrows(
+ () => {
+ Deno.readDirSync("bad_dir_name");
+ },
+ Deno.errors.NotFound,
+ `readdir 'bad_dir_name'`,
+ );
+});
+
+Deno.test({ permissions: { read: true } }, async function readDirSuccess() {
+ const files = [];
+ for await (const dirEntry of Deno.readDir("tests/testdata")) {
+ files.push(dirEntry);
+ }
+ assertSameContent(files);
+});
+
+Deno.test({ permissions: { read: true } }, async function readDirWithUrl() {
+ const files = [];
+ for await (
+ const dirEntry of Deno.readDir(pathToAbsoluteFileUrl("tests/testdata"))
+ ) {
+ files.push(dirEntry);
+ }
+ assertSameContent(files);
+});
+
+Deno.test({ permissions: { read: false } }, async function readDirPerm() {
+ await assertRejects(async () => {
+ await Deno.readDir("tests/")[Symbol.asyncIterator]().next();
+ }, Deno.errors.PermissionDenied);
+});
+
+Deno.test(
+ { permissions: { read: true }, ignore: Deno.build.os == "windows" },
+ async function readDirDevFd(): Promise<
+ void
+ > {
+ for await (const _ of Deno.readDir("/dev/fd")) {
+ // We don't actually care whats in here; just that we don't panic on non regular entries
+ }
+ },
+);
+
+Deno.test(
+ { permissions: { read: true }, ignore: Deno.build.os == "windows" },
+ function readDirDevFdSync() {
+ for (const _ of Deno.readDirSync("/dev/fd")) {
+ // We don't actually care whats in here; just that we don't panic on non regular file entries
+ }
+ },
+);
+
+Deno.test({ permissions: { read: true } }, async function readDirNotFound() {
+ await assertRejects(
+ async () => {
+ await Deno.readDir("bad_dir_name")[Symbol.asyncIterator]().next();
+ },
+ Deno.errors.NotFound,
+ `readdir 'bad_dir_name'`,
+ );
+});
diff --git a/tests/unit/read_file_test.ts b/tests/unit/read_file_test.ts
new file mode 100644
index 000000000..bfb3b5085
--- /dev/null
+++ b/tests/unit/read_file_test.ts
@@ -0,0 +1,182 @@
+// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
+import {
+ assert,
+ assertEquals,
+ assertRejects,
+ assertThrows,
+ pathToAbsoluteFileUrl,
+ unreachable,
+} from "./test_util.ts";
+
+Deno.test({ permissions: { read: true } }, function readFileSyncSuccess() {
+ const data = Deno.readFileSync("tests/testdata/assets/fixture.json");
+ assert(data.byteLength > 0);
+ const decoder = new TextDecoder("utf-8");
+ const json = decoder.decode(data);
+ const pkg = JSON.parse(json);
+ assertEquals(pkg.name, "deno");
+});
+
+Deno.test({ permissions: { read: true } }, function readFileSyncUrl() {
+ const data = Deno.readFileSync(
+ pathToAbsoluteFileUrl("tests/testdata/assets/fixture.json"),
+ );
+ assert(data.byteLength > 0);
+ const decoder = new TextDecoder("utf-8");
+ const json = decoder.decode(data);
+ const pkg = JSON.parse(json);
+ assertEquals(pkg.name, "deno");
+});
+
+Deno.test({ permissions: { read: false } }, function readFileSyncPerm() {
+ assertThrows(() => {
+ Deno.readFileSync("tests/testdata/assets/fixture.json");
+ }, Deno.errors.PermissionDenied);
+});
+
+Deno.test({ permissions: { read: true } }, function readFileSyncNotFound() {
+ assertThrows(() => {
+ Deno.readFileSync("bad_filename");
+ }, Deno.errors.NotFound);
+});
+
+Deno.test({ permissions: { read: true } }, async function readFileUrl() {
+ const data = await Deno.readFile(
+ pathToAbsoluteFileUrl("tests/testdata/assets/fixture.json"),
+ );
+ assert(data.byteLength > 0);
+ const decoder = new TextDecoder("utf-8");
+ const json = decoder.decode(data);
+ const pkg = JSON.parse(json);
+ assertEquals(pkg.name, "deno");
+});
+
+Deno.test({ permissions: { read: true } }, async function readFileSuccess() {
+ const data = await Deno.readFile("tests/testdata/assets/fixture.json");
+ assert(data.byteLength > 0);
+ const decoder = new TextDecoder("utf-8");
+ const json = decoder.decode(data);
+ const pkg = JSON.parse(json);
+ assertEquals(pkg.name, "deno");
+});
+
+Deno.test({ permissions: { read: false } }, async function readFilePerm() {
+ await assertRejects(async () => {
+ await Deno.readFile("tests/testdata/assets/fixture.json");
+ }, Deno.errors.PermissionDenied);
+});
+
+Deno.test({ permissions: { read: true } }, function readFileSyncLoop() {
+ for (let i = 0; i < 256; i++) {
+ Deno.readFileSync("tests/testdata/assets/fixture.json");
+ }
+});
+
+Deno.test(
+ { permissions: { read: true } },
+ async function readFileDoesNotLeakResources() {
+ await assertRejects(async () => await Deno.readFile("cli"));
+ },
+);
+
+Deno.test(
+ { permissions: { read: true } },
+ function readFileSyncDoesNotLeakResources() {
+ assertThrows(() => Deno.readFileSync("cli"));
+ },
+);
+
+Deno.test(
+ { permissions: { read: true } },
+ async function readFileWithAbortSignal() {
+ const ac = new AbortController();
+ queueMicrotask(() => ac.abort());
+ const error = await assertRejects(
+ async () => {
+ await Deno.readFile("tests/testdata/assets/fixture.json", {
+ signal: ac.signal,
+ });
+ },
+ );
+ assert(error instanceof DOMException);
+ assertEquals(error.name, "AbortError");
+ },
+);
+
+Deno.test(
+ { permissions: { read: true } },
+ async function readFileWithAbortSignalReason() {
+ const ac = new AbortController();
+ const abortReason = new Error();
+ queueMicrotask(() => ac.abort(abortReason));
+ const error = await assertRejects(
+ async () => {
+ await Deno.readFile("tests/testdata/assets/fixture.json", {
+ signal: ac.signal,
+ });
+ },
+ );
+ assertEquals(error, abortReason);
+ },
+);
+
+Deno.test(
+ { permissions: { read: true } },
+ async function readFileWithAbortSignalPrimitiveReason() {
+ const ac = new AbortController();
+ queueMicrotask(() => ac.abort("Some string"));
+ try {
+ await Deno.readFile("tests/testdata/assets/fixture.json", {
+ signal: ac.signal,
+ });
+ unreachable();
+ } catch (e) {
+ assertEquals(e, "Some string");
+ }
+ },
+);
+
+// Test that AbortController's cancel handle is cleaned-up correctly, and do not leak resources.
+Deno.test(
+ { permissions: { read: true } },
+ async function readFileWithAbortSignalNotCalled() {
+ const ac = new AbortController();
+ await Deno.readFile("tests/testdata/assets/fixture.json", {
+ signal: ac.signal,
+ });
+ },
+);
+
+Deno.test(
+ { permissions: { read: true }, ignore: Deno.build.os !== "linux" },
+ async function readFileProcFs() {
+ const data = await Deno.readFile("/proc/self/stat");
+ assert(data.byteLength > 0);
+ },
+);
+
+Deno.test(
+ { permissions: { read: true } },
+ async function readFileNotFoundErrorCode() {
+ try {
+ await Deno.readFile("definitely-not-found.json");
+ } catch (e) {
+ assertEquals(e.code, "ENOENT");
+ }
+ },
+);
+
+Deno.test(
+ { permissions: { read: true } },
+ async function readFileIsDirectoryErrorCode() {
+ try {
+ await Deno.readFile("tests/testdata/assets/");
+ } catch (e) {
+ if (Deno.build.os === "windows") {
+ assertEquals(e.code, "ENOENT");
+ } else {
+ assertEquals(e.code, "EISDIR");
+ }
+ }
+ },
+);
diff --git a/cli/tests/unit/read_link_test.ts b/tests/unit/read_link_test.ts
index 3ed1817bb..3ed1817bb 100644
--- a/cli/tests/unit/read_link_test.ts
+++ b/tests/unit/read_link_test.ts
diff --git a/tests/unit/read_text_file_test.ts b/tests/unit/read_text_file_test.ts
new file mode 100644
index 000000000..94aa5f0a8
--- /dev/null
+++ b/tests/unit/read_text_file_test.ts
@@ -0,0 +1,208 @@
+// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
+
+import {
+ assert,
+ assertEquals,
+ assertRejects,
+ assertThrows,
+ pathToAbsoluteFileUrl,
+ unreachable,
+} from "./test_util.ts";
+
+Deno.test({ permissions: { read: true } }, function readTextFileSyncSuccess() {
+ const data = Deno.readTextFileSync("tests/testdata/assets/fixture.json");
+ assert(data.length > 0);
+ const pkg = JSON.parse(data);
+ assertEquals(pkg.name, "deno");
+});
+
+Deno.test({ permissions: { read: true } }, function readTextFileSyncByUrl() {
+ const data = Deno.readTextFileSync(
+ pathToAbsoluteFileUrl("tests/testdata/assets/fixture.json"),
+ );
+ assert(data.length > 0);
+ const pkg = JSON.parse(data);
+ assertEquals(pkg.name, "deno");
+});
+
+Deno.test({ permissions: { read: false } }, function readTextFileSyncPerm() {
+ assertThrows(() => {
+ Deno.readTextFileSync("tests/testdata/assets/fixture.json");
+ }, Deno.errors.PermissionDenied);
+});
+
+Deno.test({ permissions: { read: true } }, function readTextFileSyncNotFound() {
+ assertThrows(() => {
+ Deno.readTextFileSync("bad_filename");
+ }, Deno.errors.NotFound);
+});
+
+Deno.test(
+ { permissions: { read: true } },
+ async function readTextFileSuccess() {
+ const data = await Deno.readTextFile(
+ "tests/testdata/assets/fixture.json",
+ );
+ assert(data.length > 0);
+ const pkg = JSON.parse(data);
+ assertEquals(pkg.name, "deno");
+ },
+);
+
+Deno.test({ permissions: { read: true } }, async function readTextFileByUrl() {
+ const data = await Deno.readTextFile(
+ pathToAbsoluteFileUrl("tests/testdata/assets/fixture.json"),
+ );
+ assert(data.length > 0);
+ const pkg = JSON.parse(data);
+ assertEquals(pkg.name, "deno");
+});
+
+Deno.test({ permissions: { read: false } }, async function readTextFilePerm() {
+ await assertRejects(async () => {
+ await Deno.readTextFile("tests/testdata/assets/fixture.json");
+ }, Deno.errors.PermissionDenied);
+});
+
+Deno.test({ permissions: { read: true } }, function readTextFileSyncLoop() {
+ for (let i = 0; i < 256; i++) {
+ Deno.readTextFileSync("tests/testdata/assets/fixture.json");
+ }
+});
+
+Deno.test(
+ { permissions: { read: true } },
+ async function readTextFileDoesNotLeakResources() {
+ await assertRejects(async () => await Deno.readTextFile("cli"));
+ },
+);
+
+Deno.test(
+ { permissions: { read: true } },
+ function readTextFileSyncDoesNotLeakResources() {
+ assertThrows(() => Deno.readTextFileSync("cli"));
+ },
+);
+
+Deno.test(
+ { permissions: { read: true } },
+ async function readTextFileWithAbortSignal() {
+ const ac = new AbortController();
+ queueMicrotask(() => ac.abort());
+ const error = await assertRejects(
+ async () => {
+ await Deno.readTextFile("tests/testdata/assets/fixture.json", {
+ signal: ac.signal,
+ });
+ },
+ );
+ assert(error instanceof DOMException);
+ assertEquals(error.name, "AbortError");
+ },
+);
+
+Deno.test(
+ { permissions: { read: true } },
+ async function readTextFileWithAbortSignalReason() {
+ const ac = new AbortController();
+ const abortReason = new Error();
+ queueMicrotask(() => ac.abort(abortReason));
+ const error = await assertRejects(
+ async () => {
+ await Deno.readTextFile("tests/testdata/assets/fixture.json", {
+ signal: ac.signal,
+ });
+ },
+ );
+ assertEquals(error, abortReason);
+ },
+);
+
+Deno.test(
+ { permissions: { read: true } },
+ async function readTextFileWithAbortSignalPrimitiveReason() {
+ const ac = new AbortController();
+ queueMicrotask(() => ac.abort("Some string"));
+ try {
+ await Deno.readTextFile("tests/testdata/assets/fixture.json", {
+ signal: ac.signal,
+ });
+ unreachable();
+ } catch (e) {
+ assertEquals(e, "Some string");
+ }
+ },
+);
+
+// Test that AbortController's cancel handle is cleaned-up correctly, and do not leak resources.
+Deno.test(
+ { permissions: { read: true } },
+ async function readTextFileWithAbortSignalNotCalled() {
+ const ac = new AbortController();
+ await Deno.readTextFile("tests/testdata/assets/fixture.json", {
+ signal: ac.signal,
+ });
+ },
+);
+
+Deno.test(
+ { permissions: { read: true }, ignore: Deno.build.os !== "linux" },
+ async function readTextFileProcFs() {
+ const data = await Deno.readTextFile("/proc/self/stat");
+ assert(data.length > 0);
+ },
+);
+
+Deno.test(
+ { permissions: { read: true, write: true } },
+ function readTextFileSyncV8LimitError() {
+ const kStringMaxLengthPlusOne = 536870888 + 1;
+ const bytes = new Uint8Array(kStringMaxLengthPlusOne);
+ const filePath = "tests/testdata/too_big_a_file.txt";
+
+ try {
+ Deno.writeFileSync(filePath, bytes);
+ } catch {
+ // NOTE(bartlomieju): writing a 0.5Gb file might be too much for CI,
+ // so skip running if writing fails.
+ return;
+ }
+
+ assertThrows(
+ () => {
+ Deno.readTextFileSync(filePath);
+ },
+ TypeError,
+ "buffer exceeds maximum length",
+ );
+
+ Deno.removeSync(filePath);
+ },
+);
+
+Deno.test(
+ { permissions: { read: true, write: true } },
+ async function readTextFileV8LimitError() {
+ const kStringMaxLengthPlusOne = 536870888 + 1;
+ const bytes = new Uint8Array(kStringMaxLengthPlusOne);
+ const filePath = "tests/testdata/too_big_a_file_2.txt";
+
+ try {
+ await Deno.writeFile(filePath, bytes);
+ } catch {
+ // NOTE(bartlomieju): writing a 0.5Gb file might be too much for CI,
+ // so skip running if writing fails.
+ return;
+ }
+
+ await assertRejects(
+ async () => {
+ await Deno.readTextFile(filePath);
+ },
+ TypeError,
+ "buffer exceeds maximum length",
+ );
+
+ await Deno.remove(filePath);
+ },
+);
diff --git a/tests/unit/real_path_test.ts b/tests/unit/real_path_test.ts
new file mode 100644
index 000000000..b3656a927
--- /dev/null
+++ b/tests/unit/real_path_test.ts
@@ -0,0 +1,114 @@
+// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
+import {
+ assert,
+ assertEquals,
+ assertMatch,
+ assertRejects,
+ assertThrows,
+ pathToAbsoluteFileUrl,
+} from "./test_util.ts";
+
+Deno.test({ permissions: { read: true } }, function realPathSyncSuccess() {
+ const relative = "tests/testdata/assets/fixture.json";
+ const realPath = Deno.realPathSync(relative);
+ if (Deno.build.os !== "windows") {
+ assert(realPath.startsWith("/"));
+ assert(realPath.endsWith(relative));
+ } else {
+ assertMatch(realPath, /^[A-Z]:\\/);
+ assert(realPath.endsWith(relative.replace(/\//g, "\\")));
+ }
+});
+
+Deno.test({ permissions: { read: true } }, function realPathSyncUrl() {
+ const relative = "tests/testdata/assets/fixture.json";
+ const url = pathToAbsoluteFileUrl(relative);
+ assertEquals(Deno.realPathSync(relative), Deno.realPathSync(url));
+});
+
+Deno.test(
+ {
+ permissions: { read: true, write: true },
+ },
+ function realPathSyncSymlink() {
+ const testDir = Deno.makeTempDirSync();
+ const target = testDir + "/target";
+ const symlink = testDir + "/symln";
+ Deno.mkdirSync(target);
+ Deno.symlinkSync(target, symlink);
+ const realPath = Deno.realPathSync(symlink);
+ if (Deno.build.os !== "windows") {
+ assert(realPath.startsWith("/"));
+ assert(realPath.endsWith("/target"));
+ } else {
+ assertMatch(realPath, /^[A-Z]:\\/);
+ assert(realPath.endsWith("\\target"));
+ }
+ },
+);
+
+Deno.test({ permissions: { read: false } }, function realPathSyncPerm() {
+ assertThrows(() => {
+ Deno.realPathSync("some_file");
+ }, Deno.errors.PermissionDenied);
+});
+
+Deno.test({ permissions: { read: true } }, function realPathSyncNotFound() {
+ assertThrows(() => {
+ Deno.realPathSync("bad_filename");
+ }, Deno.errors.NotFound);
+});
+
+Deno.test({ permissions: { read: true } }, async function realPathSuccess() {
+ const relativePath = "tests/testdata/assets/fixture.json";
+ const realPath = await Deno.realPath(relativePath);
+ if (Deno.build.os !== "windows") {
+ assert(realPath.startsWith("/"));
+ assert(realPath.endsWith(relativePath));
+ } else {
+ assertMatch(realPath, /^[A-Z]:\\/);
+ assert(realPath.endsWith(relativePath.replace(/\//g, "\\")));
+ }
+});
+
+Deno.test(
+ { permissions: { read: true } },
+ async function realPathUrl() {
+ const relative = "tests/testdata/assets/fixture.json";
+ const url = pathToAbsoluteFileUrl(relative);
+ assertEquals(await Deno.realPath(relative), await Deno.realPath(url));
+ },
+);
+
+Deno.test(
+ {
+ permissions: { read: true, write: true },
+ },
+ async function realPathSymlink() {
+ const testDir = Deno.makeTempDirSync();
+ const target = testDir + "/target";
+ const symlink = testDir + "/symln";
+ Deno.mkdirSync(target);
+ Deno.symlinkSync(target, symlink);
+ const realPath = await Deno.realPath(symlink);
+ if (Deno.build.os !== "windows") {
+ assert(realPath.startsWith("/"));
+ assert(realPath.endsWith("/target"));
+ } else {
+ assertMatch(realPath, /^[A-Z]:\\/);
+ assert(realPath.endsWith("\\target"));
+ }
+ },
+);
+
+Deno.test({ permissions: { read: false } }, async function realPathPerm() {
+ await assertRejects(async () => {
+ await Deno.realPath("some_file");
+ }, Deno.errors.PermissionDenied);
+});
+
+Deno.test({ permissions: { read: true } }, async function realPathNotFound() {
+ await assertRejects(async () => {
+ await Deno.realPath("bad_filename");
+ }, Deno.errors.NotFound);
+});
diff --git a/cli/tests/unit/ref_unref_test.ts b/tests/unit/ref_unref_test.ts
index 6f5bcf0a7..6f5bcf0a7 100644
--- a/cli/tests/unit/ref_unref_test.ts
+++ b/tests/unit/ref_unref_test.ts
diff --git a/cli/tests/unit/remove_test.ts b/tests/unit/remove_test.ts
index f4e54dc52..f4e54dc52 100644
--- a/cli/tests/unit/remove_test.ts
+++ b/tests/unit/remove_test.ts
diff --git a/cli/tests/unit/rename_test.ts b/tests/unit/rename_test.ts
index 4f6bb09cf..4f6bb09cf 100644
--- a/cli/tests/unit/rename_test.ts
+++ b/tests/unit/rename_test.ts
diff --git a/cli/tests/unit/request_test.ts b/tests/unit/request_test.ts
index fe34c20a5..fe34c20a5 100644
--- a/cli/tests/unit/request_test.ts
+++ b/tests/unit/request_test.ts
diff --git a/tests/unit/resources_test.ts b/tests/unit/resources_test.ts
new file mode 100644
index 000000000..bb0b9f2f8
--- /dev/null
+++ b/tests/unit/resources_test.ts
@@ -0,0 +1,55 @@
+// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
+import { assert, assertEquals, assertThrows } from "./test_util.ts";
+
+const listenPort = 4505;
+
+Deno.test(function resourcesCloseBadArgs() {
+ assertThrows(() => {
+ Deno.close((null as unknown) as number);
+ }, TypeError);
+});
+
+Deno.test(function resourcesStdio() {
+ const res = Deno.resources();
+
+ assertEquals(res[0], "stdin");
+ assertEquals(res[1], "stdout");
+ assertEquals(res[2], "stderr");
+});
+
+Deno.test({ permissions: { net: true } }, async function resourcesNet() {
+ const listener = Deno.listen({ port: listenPort });
+ const dialerConn = await Deno.connect({ port: listenPort });
+ const listenerConn = await listener.accept();
+
+ const res = Deno.resources();
+ assertEquals(
+ Object.values(res).filter((r): boolean => r === "tcpListener").length,
+ 1,
+ );
+ const tcpStreams = Object.values(res).filter(
+ (r): boolean => r === "tcpStream",
+ );
+ assert(tcpStreams.length >= 2);
+
+ listenerConn.close();
+ dialerConn.close();
+ listener.close();
+});
+
+Deno.test({ permissions: { read: true } }, async function resourcesFile() {
+ const resourcesBefore = Deno.resources();
+ const f = await Deno.open("tests/testdata/assets/hello.txt");
+ const resourcesAfter = Deno.resources();
+ f.close();
+
+ // check that exactly one new resource (file) was added
+ assertEquals(
+ Object.keys(resourcesAfter).length,
+ Object.keys(resourcesBefore).length + 1,
+ );
+ const newRid = +Object.keys(resourcesAfter).find((rid): boolean => {
+ return !Object.prototype.hasOwnProperty.call(resourcesBefore, rid);
+ })!;
+ assertEquals(resourcesAfter[newRid], "fsFile");
+});
diff --git a/cli/tests/unit/response_test.ts b/tests/unit/response_test.ts
index bbdd5f481..bbdd5f481 100644
--- a/cli/tests/unit/response_test.ts
+++ b/tests/unit/response_test.ts
diff --git a/tests/unit/serve_test.ts b/tests/unit/serve_test.ts
new file mode 100644
index 000000000..e972b36cd
--- /dev/null
+++ b/tests/unit/serve_test.ts
@@ -0,0 +1,3932 @@
+// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
+
+import { assertMatch, assertRejects } from "@test_util/std/assert/mod.ts";
+import { Buffer, BufReader, BufWriter } from "@test_util/std/io/mod.ts";
+import { TextProtoReader } from "../testdata/run/textproto.ts";
+import {
+ assert,
+ assertEquals,
+ assertStringIncludes,
+ assertThrows,
+ execCode,
+ fail,
+ tmpUnixSocketPath,
+} from "./test_util.ts";
+
+// Since these tests may run in parallel, ensure this port is unique to this file
+const servePort = 4502;
+
+const {
+ upgradeHttpRaw,
+ addTrailers,
+ serveHttpOnListener,
+ serveHttpOnConnection,
+ // @ts-expect-error TypeScript (as of 3.7) does not support indexing namespaces by symbol
+} = Deno[Deno.internal];
+
+function createOnErrorCb(ac: AbortController): (err: unknown) => Response {
+ return (err) => {
+ console.error(err);
+ ac.abort();
+ return new Response("Internal server error", { status: 500 });
+ };
+}
+
+function onListen(
+ resolve: (value: void | PromiseLike<void>) => void,
+): ({ hostname, port }: { hostname: string; port: number }) => void {
+ return () => {
+ resolve();
+ };
+}
+
+async function makeServer(
+ handler: (req: Request) => Response | Promise<Response>,
+): Promise<
+ {
+ finished: Promise<void>;
+ abort: () => void;
+ shutdown: () => Promise<void>;
+ [Symbol.asyncDispose](): PromiseLike<void>;
+ }
+> {
+ const ac = new AbortController();
+ const { promise, resolve } = Promise.withResolvers<void>();
+
+ const server = Deno.serve({
+ handler,
+ port: servePort,
+ signal: ac.signal,
+ onListen: onListen(resolve),
+ });
+
+ await promise;
+ return {
+ finished: server.finished,
+ abort() {
+ ac.abort();
+ },
+ async shutdown() {
+ await server.shutdown();
+ },
+ [Symbol.asyncDispose]() {
+ return server[Symbol.asyncDispose]();
+ },
+ };
+}
+
+Deno.test(async function httpServerShutsDownPortBeforeResolving() {
+ const { finished, abort } = await makeServer((_req) => new Response("ok"));
+ assertThrows(() => Deno.listen({ port: servePort }));
+ abort();
+ await finished;
+
+ const listener = Deno.listen({ port: servePort });
+ listener!.close();
+});
+
+// When shutting down abruptly, we require that all in-progress connections are aborted,
+// no new connections are allowed, and no new transactions are allowed on existing connections.
+Deno.test(
+ { permissions: { net: true } },
+ async function httpServerShutdownAbruptGuaranteeHttp11() {
+ const deferredQueue: {
+ input: ReturnType<typeof Promise.withResolvers<string>>;
+ out: ReturnType<typeof Promise.withResolvers<void>>;
+ }[] = [];
+ const { finished, abort } = await makeServer((_req) => {
+ const { input, out } = deferredQueue.shift()!;
+ return new Response(
+ new ReadableStream({
+ async start(controller) {
+ controller.enqueue(new Uint8Array([46]));
+ out.resolve();
+ controller.enqueue(encoder.encode(await input.promise));
+ controller.close();
+ },
+ }),
+ );
+ });
+ const encoder = new TextEncoder();
+ const decoder = new TextDecoder();
+ const conn = await Deno.connect({ port: servePort });
+ const w = conn.writable.getWriter();
+ const r = conn.readable.getReader();
+
+ const deferred1 = {
+ input: Promise.withResolvers<string>(),
+ out: Promise.withResolvers<void>(),
+ };
+ deferredQueue.push(deferred1);
+ const deferred2 = {
+ input: Promise.withResolvers<string>(),
+ out: Promise.withResolvers<void>(),
+ };
+ deferredQueue.push(deferred2);
+ const deferred3 = {
+ input: Promise.withResolvers<string>(),
+ out: Promise.withResolvers<void>(),
+ };
+ deferredQueue.push(deferred3);
+ deferred1.input.resolve("#");
+ deferred2.input.resolve("$");
+ await w.write(encoder.encode(`GET / HTTP/1.1\nConnection: keep-alive\n\n`));
+ await w.write(encoder.encode(`GET / HTTP/1.1\nConnection: keep-alive\n\n`));
+
+ // Fully read two responses
+ let text = "";
+ while (!text.includes("$\r\n")) {
+ text += decoder.decode((await r.read()).value);
+ }
+
+ await w.write(encoder.encode(`GET / HTTP/1.1\nConnection: keep-alive\n\n`));
+ await deferred3.out.promise;
+
+ // This is half served, so wait for the chunk that has the first '.'
+ text = "";
+ while (!text.includes("1\r\n.\r\n")) {
+ text += decoder.decode((await r.read()).value);
+ }
+
+ abort();
+
+ // This doesn't actually write anything, but we release it after aborting
+ deferred3.input.resolve("!");
+
+ // Guarantee: can't connect to an aborted server (though this may not happen immediately)
+ let failed = false;
+ for (let i = 0; i < 10; i++) {
+ try {
+ const conn = await Deno.connect({ port: servePort });
+ conn.close();
+ // Give the runtime a few ticks to settle (required for Windows)
+ await new Promise((r) => setTimeout(r, 2 ** i));
+ continue;
+ } catch (_) {
+ failed = true;
+ break;
+ }
+ }
+ assert(failed, "The Deno.serve listener was not disabled promptly");
+
+ // Guarantee: the pipeline is closed abruptly
+ assert((await r.read()).done);
+
+ try {
+ conn.close();
+ } catch (_) {
+ // Ignore
+ }
+ await finished;
+ },
+);
+
+// When shutting down abruptly, we require that all in-progress connections are aborted,
+// no new connections are allowed, and no new transactions are allowed on existing connections.
+Deno.test(
+ { permissions: { net: true } },
+ async function httpServerShutdownGracefulGuaranteeHttp11() {
+ const deferredQueue: {
+ input: ReturnType<typeof Promise.withResolvers<string>>;
+ out: ReturnType<typeof Promise.withResolvers<void>>;
+ }[] = [];
+ const { finished, shutdown } = await makeServer((_req) => {
+ const { input, out } = deferredQueue.shift()!;
+ return new Response(
+ new ReadableStream({
+ async start(controller) {
+ controller.enqueue(new Uint8Array([46]));
+ out.resolve();
+ controller.enqueue(encoder.encode(await input.promise));
+ controller.close();
+ },
+ }),
+ );
+ });
+ const encoder = new TextEncoder();
+ const decoder = new TextDecoder();
+ const conn = await Deno.connect({ port: servePort });
+ const w = conn.writable.getWriter();
+ const r = conn.readable.getReader();
+
+ const deferred1 = {
+ input: Promise.withResolvers<string>(),
+ out: Promise.withResolvers<void>(),
+ };
+ deferredQueue.push(deferred1);
+ const deferred2 = {
+ input: Promise.withResolvers<string>(),
+ out: Promise.withResolvers<void>(),
+ };
+ deferredQueue.push(deferred2);
+ const deferred3 = {
+ input: Promise.withResolvers<string>(),
+ out: Promise.withResolvers<void>(),
+ };
+ deferredQueue.push(deferred3);
+ deferred1.input.resolve("#");
+ deferred2.input.resolve("$");
+ await w.write(encoder.encode(`GET / HTTP/1.1\nConnection: keep-alive\n\n`));
+ await w.write(encoder.encode(`GET / HTTP/1.1\nConnection: keep-alive\n\n`));
+
+ // Fully read two responses
+ let text = "";
+ while (!text.includes("$\r\n")) {
+ text += decoder.decode((await r.read()).value);
+ }
+
+ await w.write(encoder.encode(`GET / HTTP/1.1\nConnection: keep-alive\n\n`));
+ await deferred3.out.promise;
+
+ // This is half served, so wait for the chunk that has the first '.'
+ text = "";
+ while (!text.includes("1\r\n.\r\n")) {
+ text += decoder.decode((await r.read()).value);
+ }
+
+ const shutdownPromise = shutdown();
+
+ // Release the final response _after_ we shut down
+ deferred3.input.resolve("!");
+
+ // Guarantee: can't connect to an aborted server (though this may not happen immediately)
+ let failed = false;
+ for (let i = 0; i < 10; i++) {
+ try {
+ const conn = await Deno.connect({ port: servePort });
+ conn.close();
+ // Give the runtime a few ticks to settle (required for Windows)
+ await new Promise((r) => setTimeout(r, 2 ** i));
+ continue;
+ } catch (_) {
+ failed = true;
+ break;
+ }
+ }
+ assert(failed, "The Deno.serve listener was not disabled promptly");
+
+ // Guarantee: existing connections fully drain
+ while (!text.includes("!\r\n")) {
+ text += decoder.decode((await r.read()).value);
+ }
+
+ await shutdownPromise;
+
+ try {
+ conn.close();
+ } catch (_) {
+ // Ignore
+ }
+ await finished;
+ },
+);
+
+// Ensure that resources don't leak during a graceful shutdown
+Deno.test(
+ { permissions: { net: true, write: true, read: true } },
+ async function httpServerShutdownGracefulResources() {
+ const { promise, resolve } = Promise.withResolvers<void>();
+ const { finished, shutdown } = await makeServer(async (_req) => {
+ resolve();
+ await new Promise((r) => setTimeout(r, 10));
+ return new Response((await makeTempFile(1024 * 1024)).readable);
+ });
+
+ const f = fetch(`http://localhost:${servePort}`);
+ await promise;
+ assertEquals((await (await f).text()).length, 1048576);
+ await shutdown();
+ await finished;
+ },
+);
+
+// Ensure that resources don't leak during a graceful shutdown
+Deno.test(
+ { permissions: { net: true, write: true, read: true } },
+ async function httpServerShutdownGracefulResources2() {
+ const waitForAbort = Promise.withResolvers<void>();
+ const waitForRequest = Promise.withResolvers<void>();
+ const { finished, shutdown } = await makeServer(async (_req) => {
+ waitForRequest.resolve();
+ await waitForAbort.promise;
+ await new Promise((r) => setTimeout(r, 10));
+ return new Response((await makeTempFile(1024 * 1024)).readable);
+ });
+
+ const f = fetch(`http://localhost:${servePort}`);
+ await waitForRequest.promise;
+ const s = shutdown();
+ waitForAbort.resolve();
+ assertEquals((await (await f).text()).length, 1048576);
+ await s;
+ await finished;
+ },
+);
+
+Deno.test(
+ { permissions: { net: true, write: true, read: true } },
+ async function httpServerExplicitResourceManagement() {
+ let dataPromise;
+
+ {
+ await using _server = await makeServer(async (_req) => {
+ return new Response((await makeTempFile(1024 * 1024)).readable);
+ });
+
+ const resp = await fetch(`http://localhost:${servePort}`);
+ dataPromise = resp.arrayBuffer();
+ }
+
+ assertEquals((await dataPromise).byteLength, 1048576);
+ },
+);
+
+Deno.test(
+ { permissions: { net: true, write: true, read: true } },
+ async function httpServerExplicitResourceManagementManualClose() {
+ await using server = await makeServer(async (_req) => {
+ return new Response((await makeTempFile(1024 * 1024)).readable);
+ });
+
+ const resp = await fetch(`http://localhost:${servePort}`);
+
+ const [_, data] = await Promise.all([
+ server.shutdown(),
+ resp.arrayBuffer(),
+ ]);
+
+ assertEquals(data.byteLength, 1048576);
+ },
+);
+
+Deno.test(
+ { permissions: { read: true, run: true } },
+ async function httpServerUnref() {
+ const [statusCode, _output] = await execCode(`
+ async function main() {
+ const server = Deno.serve({ port: ${servePort}, handler: () => null });
+ server.unref();
+ await server.finished; // This doesn't block the program from exiting
+ }
+ main();
+ `);
+ assertEquals(statusCode, 0);
+ },
+);
+
+Deno.test(async function httpServerCanResolveHostnames() {
+ const ac = new AbortController();
+ const { promise, resolve } = Promise.withResolvers<void>();
+
+ const server = Deno.serve({
+ handler: (_req) => new Response("ok"),
+ hostname: "localhost",
+ port: servePort,
+ signal: ac.signal,
+ onListen: onListen(resolve),
+ onError: createOnErrorCb(ac),
+ });
+
+ await promise;
+ const resp = await fetch(`http://localhost:${servePort}/`, {
+ headers: { "connection": "close" },
+ });
+ const text = await resp.text();
+ assertEquals(text, "ok");
+ ac.abort();
+ await server.finished;
+});
+
+Deno.test(async function httpServerRejectsOnAddrInUse() {
+ const ac = new AbortController();
+ const { promise, resolve } = Promise.withResolvers<void>();
+
+ const server = Deno.serve({
+ handler: (_req) => new Response("ok"),
+ hostname: "localhost",
+ port: servePort,
+ signal: ac.signal,
+ onListen: onListen(resolve),
+ onError: createOnErrorCb(ac),
+ });
+ await promise;
+
+ assertThrows(
+ () =>
+ Deno.serve({
+ handler: (_req) => new Response("ok"),
+ hostname: "localhost",
+ port: servePort,
+ signal: ac.signal,
+ onListen: onListen(resolve),
+ onError: createOnErrorCb(ac),
+ }),
+ Deno.errors.AddrInUse,
+ );
+ ac.abort();
+ await server.finished;
+});
+
+Deno.test({ permissions: { net: true } }, async function httpServerBasic() {
+ const ac = new AbortController();
+ const deferred = Promise.withResolvers<void>();
+ const listeningDeferred = Promise.withResolvers<void>();
+
+ const server = Deno.serve({
+ handler: async (request, { remoteAddr }) => {
+ // FIXME(bartlomieju):
+ // make sure that request can be inspected
+ console.log(request);
+ assertEquals(new URL(request.url).href, `http://127.0.0.1:${servePort}/`);
+ assertEquals(await request.text(), "");
+ assertEquals(remoteAddr.hostname, "127.0.0.1");
+ deferred.resolve();
+ return new Response("Hello World", { headers: { "foo": "bar" } });
+ },
+ port: servePort,
+ signal: ac.signal,
+ onListen: onListen(listeningDeferred.resolve),
+ onError: createOnErrorCb(ac),
+ });
+
+ await listeningDeferred.promise;
+ const resp = await fetch(`http://127.0.0.1:${servePort}/`, {
+ headers: { "connection": "close" },
+ });
+ await deferred.promise;
+ const clone = resp.clone();
+ const text = await resp.text();
+ assertEquals(text, "Hello World");
+ assertEquals(resp.headers.get("foo"), "bar");
+ const cloneText = await clone.text();
+ assertEquals(cloneText, "Hello World");
+ ac.abort();
+ await server.finished;
+});
+
+// Test serving of HTTP on an arbitrary listener.
+Deno.test(
+ { permissions: { net: true } },
+ async function httpServerOnListener() {
+ const ac = new AbortController();
+ const deferred = Promise.withResolvers<void>();
+ const listeningDeferred = Promise.withResolvers<void>();
+ const listener = Deno.listen({ port: servePort });
+ const server = serveHttpOnListener(
+ listener,
+ ac.signal,
+ async (
+ request: Request,
+ { remoteAddr }: { remoteAddr: { hostname: string } },
+ ) => {
+ assertEquals(
+ new URL(request.url).href,
+ `http://127.0.0.1:${servePort}/`,
+ );
+ assertEquals(await request.text(), "");
+ assertEquals(remoteAddr.hostname, "127.0.0.1");
+ deferred.resolve();
+ return new Response("Hello World", { headers: { "foo": "bar" } });
+ },
+ createOnErrorCb(ac),
+ onListen(listeningDeferred.resolve),
+ );
+
+ await listeningDeferred.promise;
+ const resp = await fetch(`http://127.0.0.1:${servePort}/`, {
+ headers: { "connection": "close" },
+ });
+ await listeningDeferred.promise;
+ const clone = resp.clone();
+ const text = await resp.text();
+ assertEquals(text, "Hello World");
+ assertEquals(resp.headers.get("foo"), "bar");
+ const cloneText = await clone.text();
+ assertEquals(cloneText, "Hello World");
+ ac.abort();
+ await server.finished;
+ },
+);
+
+// Test serving of HTTP on an arbitrary connection.
+Deno.test(
+ { permissions: { net: true } },
+ async function httpServerOnConnection() {
+ const ac = new AbortController();
+ const deferred = Promise.withResolvers<void>();
+ const listeningDeferred = Promise.withResolvers<void>();
+ const listener = Deno.listen({ port: servePort });
+ const acceptPromise = listener.accept();
+ const fetchPromise = fetch(`http://127.0.0.1:${servePort}/`, {
+ headers: { "connection": "close" },
+ });
+
+ const server = serveHttpOnConnection(
+ await acceptPromise,
+ ac.signal,
+ async (
+ request: Request,
+ { remoteAddr }: { remoteAddr: { hostname: string } },
+ ) => {
+ assertEquals(
+ new URL(request.url).href,
+ `http://127.0.0.1:${servePort}/`,
+ );
+ assertEquals(await request.text(), "");
+ assertEquals(remoteAddr.hostname, "127.0.0.1");
+ deferred.resolve();
+ return new Response("Hello World", { headers: { "foo": "bar" } });
+ },
+ createOnErrorCb(ac),
+ onListen(listeningDeferred.resolve),
+ );
+
+ const resp = await fetchPromise;
+ await deferred.promise;
+ const clone = resp.clone();
+ const text = await resp.text();
+ assertEquals(text, "Hello World");
+ assertEquals(resp.headers.get("foo"), "bar");
+ const cloneText = await clone.text();
+ assertEquals(cloneText, "Hello World");
+ // Note that we don't need to abort this server -- it closes when the connection does
+ // ac.abort();
+ await server.finished;
+ listener.close();
+ },
+);
+
+Deno.test({ permissions: { net: true } }, async function httpServerOnError() {
+ const ac = new AbortController();
+ const { promise, resolve } = Promise.withResolvers<void>();
+ let requestStash: Request | null;
+
+ const server = Deno.serve({
+ handler: async (request: Request) => {
+ requestStash = request;
+ await new Promise((r) => setTimeout(r, 100));
+ throw "fail";
+ },
+ port: servePort,
+ signal: ac.signal,
+ onListen: onListen(resolve),
+ onError: () => {
+ return new Response("failed: " + requestStash!.url, { status: 500 });
+ },
+ });
+
+ await promise;
+ const resp = await fetch(`http://127.0.0.1:${servePort}/`, {
+ headers: { "connection": "close" },
+ });
+ const text = await resp.text();
+ ac.abort();
+ await server.finished;
+
+ assertEquals(text, `failed: http://127.0.0.1:${servePort}/`);
+});
+
+Deno.test(
+ { permissions: { net: true } },
+ async function httpServerOnErrorFails() {
+ const ac = new AbortController();
+ const { promise, resolve } = Promise.withResolvers<void>();
+ // NOTE(bartlomieju): deno lint doesn't know that it's actually used later,
+ // but TypeScript can't see that either ¯\_(ツ)_/¯
+ // deno-lint-ignore no-unused-vars
+ let requestStash: Request | null;
+
+ const server = Deno.serve({
+ handler: async (request: Request) => {
+ requestStash = request;
+ await new Promise((r) => setTimeout(r, 100));
+ throw "fail";
+ },
+ port: servePort,
+ signal: ac.signal,
+ onListen: onListen(resolve),
+ onError: () => {
+ throw "again";
+ },
+ });
+
+ await promise;
+ const resp = await fetch(`http://127.0.0.1:${servePort}/`, {
+ headers: { "connection": "close" },
+ });
+ const text = await resp.text();
+ ac.abort();
+ await server.finished;
+
+ assertEquals(text, "Internal Server Error");
+ },
+);
+
+Deno.test({ permissions: { net: true } }, async function httpServerOverload1() {
+ const ac = new AbortController();
+ const deferred = Promise.withResolvers<void>();
+ const listeningDeferred = Promise.withResolvers<void>();
+
+ const server = Deno.serve({
+ port: servePort,
+ signal: ac.signal,
+ onListen: onListen(listeningDeferred.resolve),
+ onError: createOnErrorCb(ac),
+ }, async (request) => {
+ // FIXME(bartlomieju):
+ // make sure that request can be inspected
+ console.log(request);
+ assertEquals(new URL(request.url).href, `http://127.0.0.1:${servePort}/`);
+ assertEquals(await request.text(), "");
+ deferred.resolve();
+ return new Response("Hello World", { headers: { "foo": "bar" } });
+ });
+
+ await listeningDeferred.promise;
+ const resp = await fetch(`http://127.0.0.1:${servePort}/`, {
+ headers: { "connection": "close" },
+ });
+ await deferred.promise;
+ const clone = resp.clone();
+ const text = await resp.text();
+ assertEquals(text, "Hello World");
+ assertEquals(resp.headers.get("foo"), "bar");
+ const cloneText = await clone.text();
+ assertEquals(cloneText, "Hello World");
+ ac.abort();
+ await server.finished;
+});
+
+Deno.test({ permissions: { net: true } }, async function httpServerOverload2() {
+ const ac = new AbortController();
+ const deferred = Promise.withResolvers<void>();
+ const listeningDeferred = Promise.withResolvers<void>();
+
+ const server = Deno.serve({
+ port: servePort,
+ signal: ac.signal,
+ onListen: onListen(listeningDeferred.resolve),
+ onError: createOnErrorCb(ac),
+ }, async (request) => {
+ // FIXME(bartlomieju):
+ // make sure that request can be inspected
+ console.log(request);
+ assertEquals(new URL(request.url).href, `http://127.0.0.1:${servePort}/`);
+ assertEquals(await request.text(), "");
+ deferred.resolve();
+ return new Response("Hello World", { headers: { "foo": "bar" } });
+ });
+
+ await listeningDeferred.promise;
+ const resp = await fetch(`http://127.0.0.1:${servePort}/`, {
+ headers: { "connection": "close" },
+ });
+ await deferred.promise;
+ const clone = resp.clone();
+ const text = await resp.text();
+ assertEquals(text, "Hello World");
+ assertEquals(resp.headers.get("foo"), "bar");
+ const cloneText = await clone.text();
+ assertEquals(cloneText, "Hello World");
+ ac.abort();
+ await server.finished;
+});
+
+Deno.test(
+ { permissions: { net: true } },
+ function httpServerErrorOverloadMissingHandler() {
+ // @ts-ignore - testing invalid overload
+ assertThrows(() => Deno.serve(), TypeError, "handler");
+ // @ts-ignore - testing invalid overload
+ assertThrows(() => Deno.serve({}), TypeError, "handler");
+ assertThrows(
+ // @ts-ignore - testing invalid overload
+ () => Deno.serve({ handler: undefined }),
+ TypeError,
+ "handler",
+ );
+ assertThrows(
+ // @ts-ignore - testing invalid overload
+ () => Deno.serve(undefined, { handler: () => {} }),
+ TypeError,
+ "handler",
+ );
+ },
+);
+
+Deno.test({ permissions: { net: true } }, async function httpServerPort0() {
+ const ac = new AbortController();
+
+ const server = Deno.serve({
+ handler() {
+ return new Response("Hello World");
+ },
+ port: 0,
+ signal: ac.signal,
+ onListen({ port }) {
+ assert(port > 0 && port < 65536);
+ ac.abort();
+ },
+ });
+ await server.finished;
+});
+
+Deno.test(
+ { permissions: { net: true } },
+ async function httpServerDefaultOnListenCallback() {
+ const ac = new AbortController();
+
+ const consoleLog = console.log;
+ console.log = (msg) => {
+ try {
+ const match = msg.match(/Listening on http:\/\/localhost:(\d+)\//);
+ assert(!!match, `Didn't match ${msg}`);
+ const port = +match[1];
+ assert(port > 0 && port < 65536);
+ } finally {
+ ac.abort();
+ }
+ };
+
+ try {
+ const server = Deno.serve({
+ handler() {
+ return new Response("Hello World");
+ },
+ hostname: "0.0.0.0",
+ port: 0,
+ signal: ac.signal,
+ });
+
+ await server.finished;
+ } finally {
+ console.log = consoleLog;
+ }
+ },
+);
+
+// https://github.com/denoland/deno/issues/15107
+Deno.test(
+ { permissions: { net: true } },
+ async function httpLazyHeadersIssue15107() {
+ const deferred = Promise.withResolvers<void>();
+ const listeningDeferred = Promise.withResolvers<void>();
+ const ac = new AbortController();
+
+ let headers: Headers;
+ const server = Deno.serve({
+ handler: async (request) => {
+ await request.text();
+ headers = request.headers;
+ deferred.resolve();
+ return new Response("");
+ },
+ port: servePort,
+ signal: ac.signal,
+ onListen: onListen(listeningDeferred.resolve),
+ onError: createOnErrorCb(ac),
+ });
+
+ await listeningDeferred.promise;
+ const conn = await Deno.connect({ port: servePort });
+ // Send GET request with a body + content-length.
+ const encoder = new TextEncoder();
+ const body =
+ `GET / HTTP/1.1\r\nHost: 127.0.0.1:2333\r\nContent-Length: 5\r\n\r\n12345`;
+ const writeResult = await conn.write(encoder.encode(body));
+ assertEquals(body.length, writeResult);
+ await deferred.promise;
+ conn.close();
+ assertEquals(headers!.get("content-length"), "5");
+ ac.abort();
+ await server.finished;
+ },
+);
+
+function createUrlTest(
+ name: string,
+ methodAndPath: string,
+ host: string | null,
+ expected: string,
+) {
+ Deno.test(`httpServerUrl${name}`, async () => {
+ const listeningDeferred = Promise.withResolvers<number>();
+ const urlDeferred = Promise.withResolvers<string>();
+ const ac = new AbortController();
+ const server = Deno.serve({
+ handler: (request: Request) => {
+ urlDeferred.resolve(request.url);
+ return new Response("");
+ },
+ port: 0,
+ signal: ac.signal,
+ onListen: ({ port }: { port: number }) => {
+ listeningDeferred.resolve(port);
+ },
+ onError: createOnErrorCb(ac),
+ });
+
+ const port = await listeningDeferred.promise;
+ const conn = await Deno.connect({ port });
+
+ const encoder = new TextEncoder();
+ const body = `${methodAndPath} HTTP/1.1\r\n${
+ host ? ("Host: " + host + "\r\n") : ""
+ }Content-Length: 5\r\n\r\n12345`;
+ const writeResult = await conn.write(encoder.encode(body));
+ assertEquals(body.length, writeResult);
+
+ try {
+ const expectedResult = expected.replace("HOST", "localhost").replace(
+ "PORT",
+ `${port}`,
+ );
+ assertEquals(await urlDeferred.promise, expectedResult);
+ } finally {
+ ac.abort();
+ await server.finished;
+ conn.close();
+ }
+ });
+}
+
+createUrlTest("WithPath", "GET /path", null, "http://HOST:PORT/path");
+createUrlTest(
+ "WithPathAndHost",
+ "GET /path",
+ "deno.land",
+ "http://deno.land/path",
+);
+createUrlTest(
+ "WithAbsolutePath",
+ "GET http://localhost/path",
+ null,
+ "http://localhost/path",
+);
+createUrlTest(
+ "WithAbsolutePathAndHost",
+ "GET http://localhost/path",
+ "deno.land",
+ "http://localhost/path",
+);
+createUrlTest(
+ "WithPortAbsolutePath",
+ "GET http://localhost:1234/path",
+ null,
+ "http://localhost:1234/path",
+);
+createUrlTest(
+ "WithPortAbsolutePathAndHost",
+ "GET http://localhost:1234/path",
+ "deno.land",
+ "http://localhost:1234/path",
+);
+createUrlTest(
+ "WithPortAbsolutePathAndHostWithPort",
+ "GET http://localhost:1234/path",
+ "deno.land:9999",
+ "http://localhost:1234/path",
+);
+
+createUrlTest("WithAsterisk", "OPTIONS *", null, "*");
+createUrlTest(
+ "WithAuthorityForm",
+ "CONNECT deno.land:80",
+ null,
+ "deno.land:80",
+);
+
+// TODO(mmastrac): These should probably be 400 errors
+createUrlTest("WithInvalidAsterisk", "GET *", null, "*");
+createUrlTest("WithInvalidNakedPath", "GET path", null, "path");
+createUrlTest(
+ "WithInvalidNakedAuthority",
+ "GET deno.land:1234",
+ null,
+ "deno.land:1234",
+);
+
+Deno.test(
+ { permissions: { net: true } },
+ async function httpServerGetRequestBody() {
+ const deferred = Promise.withResolvers<void>();
+ const ac = new AbortController();
+ const listeningDeferred = Promise.withResolvers<void>();
+
+ const server = Deno.serve({
+ handler: (request) => {
+ assertEquals(request.body, null);
+ deferred.resolve();
+ return new Response("", { headers: {} });
+ },
+ port: servePort,
+ signal: ac.signal,
+ onListen: onListen(listeningDeferred.resolve),
+ onError: createOnErrorCb(ac),
+ });
+
+ await listeningDeferred.promise;
+ const conn = await Deno.connect({ port: servePort });
+ // Send GET request with a body + content-length.
+ const encoder = new TextEncoder();
+ const body =
+ `GET / HTTP/1.1\r\nHost: 127.0.0.1:${servePort}\r\nContent-Length: 5\r\n\r\n12345`;
+ const writeResult = await conn.write(encoder.encode(body));
+ assertEquals(body.length, writeResult);
+
+ const resp = new Uint8Array(200);
+ const readResult = await conn.read(resp);
+ assert(readResult);
+ assert(readResult > 0);
+
+ conn.close();
+ await deferred.promise;
+ ac.abort();
+ await server.finished;
+ },
+);
+
+Deno.test(
+ { permissions: { net: true } },
+ async function httpServerAbortedRequestBody() {
+ const deferred = Promise.withResolvers<void>();
+ const ac = new AbortController();
+ const listeningDeferred = Promise.withResolvers<void>();
+
+ const server = Deno.serve({
+ handler: async (request) => {
+ await assertRejects(async () => {
+ await request.text();
+ });
+ deferred.resolve();
+ // Not actually used
+ return new Response();
+ },
+ port: servePort,
+ signal: ac.signal,
+ onListen: onListen(listeningDeferred.resolve),
+ onError: createOnErrorCb(ac),
+ });
+
+ await listeningDeferred.promise;
+ const conn = await Deno.connect({ port: servePort });
+ // Send POST request with a body + content-length, but don't send it all
+ const encoder = new TextEncoder();
+ const body =
+ `POST / HTTP/1.1\r\nHost: 127.0.0.1:${servePort}\r\nContent-Length: 10\r\n\r\n12345`;
+ const writeResult = await conn.write(encoder.encode(body));
+ assertEquals(body.length, writeResult);
+ conn.close();
+ await deferred.promise;
+ ac.abort();
+ await server.finished;
+ },
+);
+
+function createStreamTest(count: number, delay: number, action: string) {
+ function doAction(controller: ReadableStreamDefaultController, i: number) {
+ if (i == count) {
+ if (action == "Throw") {
+ controller.error(new Error("Expected error!"));
+ } else {
+ controller.close();
+ }
+ } else {
+ controller.enqueue(`a${i}`);
+
+ if (delay == 0) {
+ doAction(controller, i + 1);
+ } else {
+ setTimeout(() => doAction(controller, i + 1), delay);
+ }
+ }
+ }
+
+ function makeStream(_count: number, delay: number): ReadableStream {
+ return new ReadableStream({
+ start(controller) {
+ if (delay == 0) {
+ doAction(controller, 0);
+ } else {
+ setTimeout(() => doAction(controller, 0), delay);
+ }
+ },
+ }).pipeThrough(new TextEncoderStream());
+ }
+
+ Deno.test(`httpServerStreamCount${count}Delay${delay}${action}`, async () => {
+ const ac = new AbortController();
+ const { promise, resolve } = Promise.withResolvers<void>();
+ const server = Deno.serve({
+ handler: (_request) => {
+ return new Response(makeStream(count, delay));
+ },
+ port: servePort,
+ signal: ac.signal,
+ onListen: onListen(resolve),
+ onError: createOnErrorCb(ac),
+ });
+
+ try {
+ await promise;
+ const resp = await fetch(`http://127.0.0.1:${servePort}/`);
+ if (action == "Throw") {
+ await assertRejects(async () => {
+ await resp.text();
+ });
+ } else {
+ const text = await resp.text();
+
+ let expected = "";
+ for (let i = 0; i < count; i++) {
+ expected += `a${i}`;
+ }
+
+ assertEquals(text, expected);
+ }
+ } finally {
+ ac.abort();
+ await server.shutdown();
+ }
+ });
+}
+
+for (const count of [0, 1, 2, 3]) {
+ for (const delay of [0, 1, 25]) {
+ // Creating a stream that errors in start will throw
+ if (delay > 0) {
+ createStreamTest(count, delay, "Throw");
+ }
+ createStreamTest(count, delay, "Close");
+ }
+}
+
+Deno.test(
+ { permissions: { net: true } },
+ async function httpServerStreamRequest() {
+ const stream = new TransformStream();
+ const writer = stream.writable.getWriter();
+ writer.write(new TextEncoder().encode("hello "));
+ writer.write(new TextEncoder().encode("world"));
+ writer.close();
+ const { promise, resolve } = Promise.withResolvers<void>();
+ const ac = new AbortController();
+ const server = Deno.serve({
+ handler: async (request) => {
+ const reqBody = await request.text();
+ assertEquals("hello world", reqBody);
+ return new Response("yo");
+ },
+ port: servePort,
+ signal: ac.signal,
+ onListen: onListen(resolve),
+ onError: createOnErrorCb(ac),
+ });
+
+ await promise;
+ const resp = await fetch(`http://127.0.0.1:${servePort}/`, {
+ body: stream.readable,
+ method: "POST",
+ headers: { "connection": "close" },
+ });
+
+ assertEquals(await resp.text(), "yo");
+ ac.abort();
+ await server.finished;
+ },
+);
+
+Deno.test({ permissions: { net: true } }, async function httpServerClose() {
+ const ac = new AbortController();
+ const { promise, resolve } = Promise.withResolvers<void>();
+ const server = Deno.serve({
+ handler: () => new Response("ok"),
+ port: servePort,
+ signal: ac.signal,
+ onListen: onListen(resolve),
+ onError: createOnErrorCb(ac),
+ });
+ await promise;
+ const client = await Deno.connect({ port: servePort });
+ client.close();
+ ac.abort();
+ await server.finished;
+});
+
+// https://github.com/denoland/deno/issues/15427
+Deno.test({ permissions: { net: true } }, async function httpServerCloseGet() {
+ const ac = new AbortController();
+ const listeningDeferred = Promise.withResolvers<void>();
+ const requestDeferred = Promise.withResolvers<void>();
+ const responseDeferred = Promise.withResolvers<void>();
+ const server = Deno.serve({
+ handler: async () => {
+ requestDeferred.resolve();
+ await new Promise((r) => setTimeout(r, 500));
+ responseDeferred.resolve();
+ return new Response("ok");
+ },
+ port: servePort,
+ signal: ac.signal,
+ onListen: onListen(listeningDeferred.resolve),
+ onError: createOnErrorCb(ac),
+ });
+ await listeningDeferred.promise;
+ const conn = await Deno.connect({ port: servePort });
+ const encoder = new TextEncoder();
+ const body =
+ `GET / HTTP/1.1\r\nHost: example.domain\r\nConnection: close\r\n\r\n`;
+ const writeResult = await conn.write(encoder.encode(body));
+ assertEquals(body.length, writeResult);
+ await requestDeferred.promise;
+ conn.close();
+ await responseDeferred.promise;
+ ac.abort();
+ await server.finished;
+});
+
+// FIXME:
+Deno.test(
+ { permissions: { net: true } },
+ async function httpServerEmptyBlobResponse() {
+ const ac = new AbortController();
+ const { promise, resolve } = Promise.withResolvers<void>();
+ const server = Deno.serve({
+ handler: () => new Response(new Blob([])),
+ port: servePort,
+ signal: ac.signal,
+ onListen: onListen(resolve),
+ onError: createOnErrorCb(ac),
+ });
+
+ await promise;
+ const resp = await fetch(`http://127.0.0.1:${servePort}/`);
+ const respBody = await resp.text();
+
+ assertEquals("", respBody);
+ ac.abort();
+ await server.finished;
+ },
+);
+
+// https://github.com/denoland/deno/issues/17291
+Deno.test(
+ { permissions: { net: true } },
+ async function httpServerIncorrectChunkedResponse() {
+ const ac = new AbortController();
+ const listeningDeferred = Promise.withResolvers<void>();
+ const errorDeferred = Promise.withResolvers<void>();
+ const server = Deno.serve({
+ handler: () => {
+ const body = new ReadableStream({
+ start(controller) {
+ // Non-encoded string is not a valid readable chunk.
+ // @ts-ignore we're testing that input is invalid
+ controller.enqueue("wat");
+ },
+ type: "bytes",
+ });
+ return new Response(body);
+ },
+ port: servePort,
+ signal: ac.signal,
+ onListen: onListen(listeningDeferred.resolve),
+ onError: (err) => {
+ const errResp = new Response(
+ `Internal server error: ${(err as Error).message}`,
+ { status: 500 },
+ );
+ errorDeferred.resolve();
+ return errResp;
+ },
+ });
+
+ await listeningDeferred.promise;
+ const resp = await fetch(`http://127.0.0.1:${servePort}/`);
+ // Incorrectly implemented reader ReadableStream should reject.
+ assertStringIncludes(await resp.text(), "Failed to execute 'enqueue'");
+ await errorDeferred.promise;
+ ac.abort();
+ await server.finished;
+ },
+);
+
+Deno.test(
+ { permissions: { net: true } },
+ async function httpServerCorrectLengthForUnicodeString() {
+ const ac = new AbortController();
+ const { promise, resolve } = Promise.withResolvers<void>();
+
+ const server = Deno.serve({
+ handler: () => new Response("韓國".repeat(10)),
+ port: servePort,
+ signal: ac.signal,
+ onListen: onListen(resolve),
+ onError: createOnErrorCb(ac),
+ });
+
+ await promise;
+ const conn = await Deno.connect({ port: servePort });
+ const encoder = new TextEncoder();
+ const decoder = new TextDecoder();
+
+ const body =
+ `GET / HTTP/1.1\r\nHost: example.domain\r\nConnection: close\r\n\r\n`;
+ const writeResult = await conn.write(encoder.encode(body));
+ assertEquals(body.length, writeResult);
+
+ const buf = new Uint8Array(1024);
+ const readResult = await conn.read(buf);
+ assert(readResult);
+ const msg = decoder.decode(buf.subarray(0, readResult));
+
+ conn.close();
+
+ ac.abort();
+ await server.finished;
+ assert(msg.includes("content-length: 60"));
+ },
+);
+
+Deno.test({ permissions: { net: true } }, async function httpServerWebSocket() {
+ const ac = new AbortController();
+ const listeningDeferred = Promise.withResolvers<void>();
+ const doneDeferred = Promise.withResolvers<void>();
+ const server = Deno.serve({
+ handler: (request) => {
+ const {
+ response,
+ socket,
+ } = Deno.upgradeWebSocket(request);
+ socket.onerror = (e) => {
+ console.error(e);
+ fail();
+ };
+ socket.onmessage = (m) => {
+ socket.send(m.data);
+ socket.close(1001);
+ };
+ socket.onclose = () => doneDeferred.resolve();
+ return response;
+ },
+ port: servePort,
+ signal: ac.signal,
+ onListen: onListen(listeningDeferred.resolve),
+ onError: createOnErrorCb(ac),
+ });
+
+ await listeningDeferred.promise;
+ const def = Promise.withResolvers<void>();
+ const ws = new WebSocket(`ws://localhost:${servePort}`);
+ ws.onmessage = (m) => assertEquals(m.data, "foo");
+ ws.onerror = (e) => {
+ console.error(e);
+ fail();
+ };
+ ws.onclose = () => def.resolve();
+ ws.onopen = () => ws.send("foo");
+
+ await def.promise;
+ await doneDeferred.promise;
+ ac.abort();
+ await server.finished;
+});
+
+Deno.test(
+ { permissions: { net: true } },
+ async function httpServerWebSocketRaw() {
+ const ac = new AbortController();
+ const { promise, resolve } = Promise.withResolvers<void>();
+ const server = Deno.serve({
+ handler: async (request) => {
+ const { conn, response } = upgradeHttpRaw(request);
+ const buf = new Uint8Array(1024);
+ let read;
+
+ // Write our fake HTTP upgrade
+ await conn.write(
+ new TextEncoder().encode(
+ "HTTP/1.1 101 Switching Protocols\r\nConnection: Upgraded\r\n\r\nExtra",
+ ),
+ );
+
+ // Upgrade data
+ read = await conn.read(buf);
+ assertEquals(
+ new TextDecoder().decode(buf.subarray(0, read!)),
+ "Upgrade data",
+ );
+ // Read the packet to echo
+ read = await conn.read(buf);
+ // Echo
+ await conn.write(buf.subarray(0, read!));
+
+ conn.close();
+ return response;
+ },
+ port: servePort,
+ signal: ac.signal,
+ onListen: onListen(resolve),
+ onError: createOnErrorCb(ac),
+ });
+
+ await promise;
+
+ const conn = await Deno.connect({ port: servePort });
+ await conn.write(
+ new TextEncoder().encode(
+ "GET / HTTP/1.1\r\nConnection: Upgrade\r\nUpgrade: websocket\r\n\r\nUpgrade data",
+ ),
+ );
+ const buf = new Uint8Array(1024);
+ let len;
+
+ // Headers
+ let headers = "";
+ for (let i = 0; i < 2; i++) {
+ len = await conn.read(buf);
+ headers += new TextDecoder().decode(buf.subarray(0, len!));
+ if (headers.endsWith("Extra")) {
+ break;
+ }
+ }
+ assertMatch(
+ headers,
+ /HTTP\/1\.1 101 Switching Protocols[ ,.A-Za-z:0-9\r\n]*Extra/im,
+ );
+
+ // Data to echo
+ await conn.write(new TextEncoder().encode("buffer data"));
+
+ // Echo
+ len = await conn.read(buf);
+ assertEquals(
+ new TextDecoder().decode(buf.subarray(0, len!)),
+ "buffer data",
+ );
+
+ conn.close();
+ ac.abort();
+ await server.finished;
+ },
+);
+
+Deno.test(
+ { permissions: { net: true } },
+ async function httpServerWebSocketUpgradeTwice() {
+ const ac = new AbortController();
+ const done = Promise.withResolvers<void>();
+ const listeningDeferred = Promise.withResolvers<void>();
+ const server = Deno.serve({
+ handler: (request) => {
+ const {
+ response,
+ socket,
+ } = Deno.upgradeWebSocket(request);
+ assertThrows(
+ () => {
+ Deno.upgradeWebSocket(request);
+ },
+ Deno.errors.Http,
+ "already upgraded",
+ );
+ socket.onerror = (e) => {
+ console.error(e);
+ fail();
+ };
+ socket.onmessage = (m) => {
+ socket.send(m.data);
+ socket.close(1001);
+ };
+ socket.onclose = () => done.resolve();
+ return response;
+ },
+ port: servePort,
+ signal: ac.signal,
+ onListen: onListen(listeningDeferred.resolve),
+ onError: createOnErrorCb(ac),
+ });
+
+ await listeningDeferred.promise;
+ const def = Promise.withResolvers<void>();
+ const ws = new WebSocket(`ws://localhost:${servePort}`);
+ ws.onmessage = (m) => assertEquals(m.data, "foo");
+ ws.onerror = (e) => {
+ console.error(e);
+ fail();
+ };
+ ws.onclose = () => def.resolve();
+ ws.onopen = () => ws.send("foo");
+
+ await def.promise;
+ await done.promise;
+ ac.abort();
+ await server.finished;
+ },
+);
+
+Deno.test(
+ { permissions: { net: true } },
+ async function httpServerWebSocketCloseFast() {
+ const ac = new AbortController();
+ const done = Promise.withResolvers<void>();
+ const listeningDeferred = Promise.withResolvers<void>();
+ const server = Deno.serve({
+ handler: (request) => {
+ const {
+ response,
+ socket,
+ } = Deno.upgradeWebSocket(request);
+ socket.onopen = () => socket.close();
+ socket.onclose = () => done.resolve();
+ return response;
+ },
+ port: servePort,
+ signal: ac.signal,
+ onListen: onListen(listeningDeferred.resolve),
+ onError: createOnErrorCb(ac),
+ });
+
+ await listeningDeferred.promise;
+ const def = Promise.withResolvers<void>();
+ const ws = new WebSocket(`ws://localhost:${servePort}`);
+ ws.onerror = (e) => {
+ console.error(e);
+ fail();
+ };
+ ws.onclose = () => def.resolve();
+
+ await def.promise;
+ await done.promise;
+ ac.abort();
+ await server.finished;
+ },
+);
+
+Deno.test(
+ { permissions: { net: true } },
+ async function httpServerWebSocketCanAccessRequest() {
+ const ac = new AbortController();
+ const done = Promise.withResolvers<void>();
+ const listeningDeferred = Promise.withResolvers<void>();
+ const server = Deno.serve({
+ handler: (request) => {
+ const {
+ response,
+ socket,
+ } = Deno.upgradeWebSocket(request);
+ socket.onerror = (e) => {
+ console.error(e);
+ fail();
+ };
+ socket.onmessage = (_m) => {
+ socket.send(request.url.toString());
+ socket.close(1001);
+ };
+ socket.onclose = () => done.resolve();
+ return response;
+ },
+ port: servePort,
+ signal: ac.signal,
+ onListen: onListen(listeningDeferred.resolve),
+ onError: createOnErrorCb(ac),
+ });
+
+ await listeningDeferred.promise;
+ const def = Promise.withResolvers<void>();
+ const ws = new WebSocket(`ws://localhost:${servePort}`);
+ ws.onmessage = (m) =>
+ assertEquals(m.data, `http://localhost:${servePort}/`);
+ ws.onerror = (e) => {
+ console.error(e);
+ fail();
+ };
+ ws.onclose = () => def.resolve();
+ ws.onopen = () => ws.send("foo");
+
+ await def.promise;
+ await done.promise;
+ ac.abort();
+ await server.finished;
+ },
+);
+
+Deno.test(
+ { permissions: { net: true } },
+ async function httpVeryLargeRequest() {
+ const deferred = Promise.withResolvers<void>();
+ const listeningDeferred = Promise.withResolvers<void>();
+ const ac = new AbortController();
+
+ let headers: Headers;
+ const server = Deno.serve({
+ handler: (request) => {
+ headers = request.headers;
+ deferred.resolve();
+ return new Response("");
+ },
+ port: servePort,
+ signal: ac.signal,
+ onListen: onListen(listeningDeferred.resolve),
+ onError: createOnErrorCb(ac),
+ });
+
+ await listeningDeferred.promise;
+ const conn = await Deno.connect({ port: servePort });
+ // Send GET request with a body + content-length.
+ const encoder = new TextEncoder();
+ const smthElse = "x".repeat(16 * 1024 + 256);
+ const body =
+ `GET / HTTP/1.1\r\nHost: 127.0.0.1:2333\r\nContent-Length: 5\r\nSomething-Else: ${smthElse}\r\n\r\n`;
+ const writeResult = await conn.write(encoder.encode(body));
+ assertEquals(body.length, writeResult);
+ await deferred.promise;
+ conn.close();
+ assertEquals(headers!.get("content-length"), "5");
+ assertEquals(headers!.get("something-else"), smthElse);
+ ac.abort();
+ await server.finished;
+ },
+);
+
+Deno.test(
+ { permissions: { net: true } },
+ async function httpVeryLargeRequestAndBody() {
+ const deferred = Promise.withResolvers<void>();
+ const listeningDeferred = Promise.withResolvers<void>();
+ const ac = new AbortController();
+
+ let headers: Headers;
+ let text: string;
+ const server = Deno.serve({
+ handler: async (request) => {
+ headers = request.headers;
+ text = await request.text();
+ deferred.resolve();
+ return new Response("");
+ },
+ port: servePort,
+ signal: ac.signal,
+ onListen: onListen(listeningDeferred.resolve),
+ onError: createOnErrorCb(ac),
+ });
+
+ await listeningDeferred.promise;
+ const conn = await Deno.connect({ port: servePort });
+ // Send GET request with a body + content-length.
+ const encoder = new TextEncoder();
+ const smthElse = "x".repeat(16 * 1024 + 256);
+ const reqBody = "hello world".repeat(1024);
+ let body =
+ `PUT / HTTP/1.1\r\nHost: 127.0.0.1:2333\r\nContent-Length: ${reqBody.length}\r\nSomething-Else: ${smthElse}\r\n\r\n${reqBody}`;
+
+ while (body.length > 0) {
+ const writeResult = await conn.write(encoder.encode(body));
+ body = body.slice(writeResult);
+ }
+
+ await deferred.promise;
+ conn.close();
+
+ assertEquals(headers!.get("content-length"), `${reqBody.length}`);
+ assertEquals(headers!.get("something-else"), smthElse);
+ assertEquals(text!, reqBody);
+ ac.abort();
+ await server.finished;
+ },
+);
+
+Deno.test(
+ { permissions: { net: true } },
+ async function httpConnectionClose() {
+ const deferred = Promise.withResolvers<void>();
+ const ac = new AbortController();
+ const listeningDeferred = Promise.withResolvers<void>();
+
+ const server = Deno.serve({
+ handler: () => {
+ deferred.resolve();
+ return new Response("");
+ },
+ port: servePort,
+ signal: ac.signal,
+ onListen: onListen(listeningDeferred.resolve),
+ onError: createOnErrorCb(ac),
+ });
+
+ await listeningDeferred.promise;
+ const conn = await Deno.connect({ port: servePort });
+ // Send GET request with a body + connection: close.
+ const encoder = new TextEncoder();
+ const body =
+ `GET / HTTP/1.1\r\nHost: 127.0.0.1:2333\r\nConnection: Close\r\n\r\n`;
+ const writeResult = await conn.write(encoder.encode(body));
+ assertEquals(body.length, writeResult);
+
+ await deferred.promise;
+ conn.close();
+
+ ac.abort();
+ await server.finished;
+ },
+);
+
+async function testDuplex(
+ reader: ReadableStreamDefaultReader<Uint8Array>,
+ writable: WritableStreamDefaultWriter<Uint8Array>,
+) {
+ await writable.write(new Uint8Array([1]));
+ const chunk1 = await reader.read();
+ assert(!chunk1.done);
+ assertEquals(chunk1.value, new Uint8Array([1]));
+ await writable.write(new Uint8Array([2]));
+ const chunk2 = await reader.read();
+ assert(!chunk2.done);
+ assertEquals(chunk2.value, new Uint8Array([2]));
+ await writable.close();
+ const chunk3 = await reader.read();
+ assert(chunk3.done);
+}
+
+Deno.test(
+ { permissions: { net: true } },
+ async function httpServerStreamDuplexDirect() {
+ const { promise, resolve } = Promise.withResolvers<void>();
+ const ac = new AbortController();
+
+ const server = Deno.serve(
+ { port: servePort, signal: ac.signal },
+ (request: Request) => {
+ assert(request.body);
+ resolve();
+ return new Response(request.body);
+ },
+ );
+
+ const { readable, writable } = new TransformStream();
+ const resp = await fetch(`http://127.0.0.1:${servePort}/`, {
+ method: "POST",
+ body: readable,
+ });
+
+ await promise;
+ assert(resp.body);
+ await testDuplex(resp.body.getReader(), writable.getWriter());
+ ac.abort();
+ await server.finished;
+ },
+);
+
+// Test that a duplex stream passing through JavaScript also works (ie: that the request body resource
+// is still alive). https://github.com/denoland/deno/pull/20206
+Deno.test(
+ { permissions: { net: true } },
+ async function httpServerStreamDuplexJavascript() {
+ const { promise, resolve } = Promise.withResolvers<void>();
+ const ac = new AbortController();
+
+ const server = Deno.serve(
+ { port: servePort, signal: ac.signal },
+ (request: Request) => {
+ assert(request.body);
+ resolve();
+ const reader = request.body.getReader();
+ return new Response(
+ new ReadableStream({
+ async pull(controller) {
+ await new Promise((r) => setTimeout(r, 100));
+ const { done, value } = await reader.read();
+ if (done) {
+ controller.close();
+ } else {
+ controller.enqueue(value);
+ }
+ },
+ }),
+ );
+ },
+ );
+
+ const { readable, writable } = new TransformStream();
+ const resp = await fetch(`http://127.0.0.1:${servePort}/`, {
+ method: "POST",
+ body: readable,
+ });
+
+ await promise;
+ assert(resp.body);
+ await testDuplex(resp.body.getReader(), writable.getWriter());
+ ac.abort();
+ await server.finished;
+ },
+);
+
+Deno.test(
+ { permissions: { net: true } },
+ // Issue: https://github.com/denoland/deno/issues/10930
+ async function httpServerStreamingResponse() {
+ // This test enqueues a single chunk for readable
+ // stream and waits for client to read that chunk and signal
+ // it before enqueueing subsequent chunk. Issue linked above
+ // presented a situation where enqueued chunks were not
+ // written to the HTTP connection until the next chunk was enqueued.
+ const listeningDeferred = Promise.withResolvers<void>();
+ const deferred = Promise.withResolvers<void>();
+ const ac = new AbortController();
+
+ let counter = 0;
+
+ const deferreds = [
+ Promise.withResolvers<void>(),
+ Promise.withResolvers<void>(),
+ Promise.withResolvers<void>(),
+ ];
+
+ async function writeRequest(conn: Deno.Conn) {
+ const encoder = new TextEncoder();
+ const decoder = new TextDecoder();
+
+ const w = new BufWriter(conn);
+ const r = new BufReader(conn);
+ const body = `GET / HTTP/1.1\r\nHost: 127.0.0.1:${servePort}\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);
+ const headers = await tpr.readMimeHeader();
+ assert(headers !== null);
+
+ const chunkedReader = chunkedBodyReader(headers, r);
+
+ const buf = new Uint8Array(5);
+ const dest = new Buffer();
+
+ let result: number | null;
+
+ try {
+ while ((result = await chunkedReader.read(buf)) !== null) {
+ const len = Math.min(buf.byteLength, result);
+
+ await dest.write(buf.subarray(0, len));
+
+ // Resolve a deferred - this will make response stream to
+ // enqueue next chunk.
+ deferreds[counter - 1].resolve();
+ }
+ return decoder.decode(dest.bytes());
+ } catch (e) {
+ console.error(e);
+ }
+ }
+
+ function periodicStream() {
+ return new ReadableStream({
+ start(controller) {
+ controller.enqueue(`${counter}\n`);
+ counter++;
+ },
+
+ async pull(controller) {
+ if (counter >= 3) {
+ return controller.close();
+ }
+
+ await deferreds[counter - 1].promise;
+
+ controller.enqueue(`${counter}\n`);
+ counter++;
+ },
+ }).pipeThrough(new TextEncoderStream());
+ }
+
+ const server = Deno.serve({
+ handler: () => {
+ deferred.resolve();
+ return new Response(periodicStream());
+ },
+ port: servePort,
+ signal: ac.signal,
+ onListen: onListen(listeningDeferred.resolve),
+ onError: createOnErrorCb(ac),
+ });
+
+ await listeningDeferred.promise;
+ // start a client
+ const clientConn = await Deno.connect({ port: servePort });
+
+ const r1 = await writeRequest(clientConn);
+ assertEquals(r1, "0\n1\n2\n");
+
+ ac.abort();
+ await deferred.promise;
+ await server.finished;
+ clientConn.close();
+ },
+);
+
+// Make sure that the chunks of a large response aren't repeated or corrupted in some other way by
+// scatterning sentinels throughout.
+// https://github.com/denoland/fresh/issues/1699
+Deno.test(
+ { permissions: { net: true } },
+ async function httpLargeReadableStreamChunk() {
+ const ac = new AbortController();
+ const server = Deno.serve({
+ handler() {
+ return new Response(
+ new ReadableStream({
+ start(controller) {
+ const buffer = new Uint8Array(1024 * 1024);
+ // Mark the buffer with sentinels
+ for (let i = 0; i < 256; i++) {
+ buffer[i * 4096] = i;
+ }
+ controller.enqueue(buffer);
+ controller.close();
+ },
+ }),
+ );
+ },
+ port: servePort,
+ signal: ac.signal,
+ });
+ const response = await fetch(`http://localhost:${servePort}/`);
+ const body = await response.arrayBuffer();
+ assertEquals(1024 * 1024, body.byteLength);
+ const buffer = new Uint8Array(body);
+ for (let i = 0; i < 256; i++) {
+ assertEquals(
+ i,
+ buffer[i * 4096],
+ `sentinel mismatch at index ${i * 4096}`,
+ );
+ }
+ ac.abort();
+ await server.finished;
+ },
+);
+
+Deno.test(
+ { permissions: { net: true } },
+ async function httpRequestLatin1Headers() {
+ const listeningDeferred = Promise.withResolvers<void>();
+ const deferred = Promise.withResolvers<void>();
+ const ac = new AbortController();
+ const server = Deno.serve({
+ handler: (request) => {
+ assertEquals(request.headers.get("X-Header-Test"), "á");
+ deferred.resolve();
+ return new Response("hello", { headers: { "X-Header-Test": "Æ" } });
+ },
+ port: servePort,
+ signal: ac.signal,
+ onListen: onListen(listeningDeferred.resolve),
+ onError: createOnErrorCb(ac),
+ });
+
+ await listeningDeferred.promise;
+ const clientConn = await Deno.connect({ port: servePort });
+ const requestText =
+ `GET / HTTP/1.1\r\nHost: 127.0.0.1:${servePort}\r\nX-Header-Test: á\r\n\r\n`;
+ const requestBytes = new Uint8Array(requestText.length);
+ for (let i = 0; i < requestText.length; i++) {
+ requestBytes[i] = requestText.charCodeAt(i);
+ }
+ let written = 0;
+ while (written < requestBytes.byteLength) {
+ written += await clientConn.write(requestBytes.slice(written));
+ }
+
+ const buf = new Uint8Array(1024);
+ await clientConn.read(buf);
+
+ await deferred.promise;
+ const responseText = new TextDecoder("iso-8859-1").decode(buf);
+ clientConn.close();
+
+ ac.abort();
+ await server.finished;
+
+ assertMatch(responseText, /\r\n[Xx]-[Hh]eader-[Tt]est: Æ\r\n/);
+ },
+);
+
+Deno.test(
+ { permissions: { net: true } },
+ async function httpServerRequestWithoutPath() {
+ const deferred = Promise.withResolvers<void>();
+ const listeningDeferred = Promise.withResolvers<void>();
+ const ac = new AbortController();
+
+ const server = Deno.serve({
+ handler: async (request) => {
+ // FIXME:
+ // assertEquals(new URL(request.url).href, `http://127.0.0.1:${servePort}/`);
+ assertEquals(await request.text(), "");
+ deferred.resolve();
+ return new Response("11");
+ },
+ port: servePort,
+ signal: ac.signal,
+ onListen: onListen(listeningDeferred.resolve),
+ onError: createOnErrorCb(ac),
+ });
+
+ await listeningDeferred.promise;
+ const clientConn = await Deno.connect({ port: servePort });
+
+ async function writeRequest(conn: Deno.Conn) {
+ const encoder = new TextEncoder();
+
+ const w = new BufWriter(conn);
+ const r = new BufReader(conn);
+ const body =
+ `CONNECT 127.0.0.1:${servePort} HTTP/1.1\r\nHost: 127.0.0.1:${servePort}\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);
+ const m = statusLine.match(/^(.+?) (.+?) (.+?)$/);
+ assert(m !== null, "must be matched");
+ const [_, _proto, status, _ok] = m;
+ assertEquals(status, "200");
+ const headers = await tpr.readMimeHeader();
+ assert(headers !== null);
+ }
+
+ await writeRequest(clientConn);
+ clientConn.close();
+ await deferred.promise;
+
+ ac.abort();
+ await server.finished;
+ },
+);
+
+Deno.test(
+ { permissions: { net: true } },
+ async function httpCookieConcatenation() {
+ const deferred = Promise.withResolvers<void>();
+ const listeningDeferred = Promise.withResolvers<void>();
+ const ac = new AbortController();
+
+ const server = Deno.serve({
+ handler: async (request) => {
+ assertEquals(await request.text(), "");
+ assertEquals(request.headers.get("cookie"), "foo=bar; bar=foo");
+ deferred.resolve();
+ return new Response("ok");
+ },
+ port: servePort,
+ signal: ac.signal,
+ onListen: onListen(listeningDeferred.resolve),
+ onError: createOnErrorCb(ac),
+ reusePort: true,
+ });
+
+ await listeningDeferred.promise;
+ const resp = await fetch(`http://127.0.0.1:${servePort}/`, {
+ headers: [
+ ["connection", "close"],
+ ["cookie", "foo=bar"],
+ ["cookie", "bar=foo"],
+ ],
+ });
+ await deferred.promise;
+
+ const text = await resp.text();
+ assertEquals(text, "ok");
+
+ ac.abort();
+ await server.finished;
+ },
+);
+
+// https://github.com/denoland/deno/issues/12741
+// https://github.com/denoland/deno/pull/12746
+// https://github.com/denoland/deno/pull/12798
+Deno.test(
+ { permissions: { net: true, run: true } },
+ async function httpServerDeleteRequestHasBody() {
+ const deferred = Promise.withResolvers<void>();
+ const listeningDeferred = Promise.withResolvers<void>();
+ const ac = new AbortController();
+
+ const hostname = "localhost";
+
+ const server = Deno.serve({
+ handler: () => {
+ deferred.resolve();
+ return new Response("ok");
+ },
+ port: servePort,
+ signal: ac.signal,
+ onListen: onListen(listeningDeferred.resolve),
+ onError: createOnErrorCb(ac),
+ });
+
+ await listeningDeferred.promise;
+ const url = `http://${hostname}:${servePort}/`;
+ const args = ["-X", "DELETE", url];
+ const { success } = await new Deno.Command("curl", {
+ args,
+ stdout: "null",
+ stderr: "null",
+ }).output();
+ assert(success);
+ await deferred.promise;
+ ac.abort();
+
+ await server.finished;
+ },
+);
+
+// FIXME:
+Deno.test(
+ { permissions: { net: true } },
+ async function httpServerRespondNonAsciiUint8Array() {
+ const deferred = Promise.withResolvers<void>();
+ const listeningDeferred = Promise.withResolvers<void>();
+ const ac = new AbortController();
+
+ const server = Deno.serve({
+ handler: (request) => {
+ assertEquals(request.body, null);
+ deferred.resolve();
+ return new Response(new Uint8Array([128]));
+ },
+ port: servePort,
+ signal: ac.signal,
+ onListen: onListen(listeningDeferred.resolve),
+ onError: createOnErrorCb(ac),
+ });
+ await listeningDeferred.resolve;
+ const resp = await fetch(`http://localhost:${servePort}/`);
+
+ await deferred.promise;
+
+ assertEquals(resp.status, 200);
+ const body = await resp.arrayBuffer();
+ assertEquals(new Uint8Array(body), new Uint8Array([128]));
+
+ ac.abort();
+ await server.finished;
+ },
+);
+
+// Some of these tests are ported from Hyper
+// https://github.com/hyperium/hyper/blob/889fa2d87252108eb7668b8bf034ffcc30985117/src/proto/h1/role.rs
+// https://github.com/hyperium/hyper/blob/889fa2d87252108eb7668b8bf034ffcc30985117/tests/server.rs
+
+Deno.test(
+ { permissions: { net: true } },
+ async function httpServerParseRequest() {
+ const deferred = Promise.withResolvers<void>();
+ const listeningDeferred = Promise.withResolvers<void>();
+ const ac = new AbortController();
+
+ const server = Deno.serve({
+ handler: (request) => {
+ assertEquals(request.method, "GET");
+ assertEquals(request.headers.get("host"), "deno.land");
+ deferred.resolve();
+ return new Response("ok");
+ },
+ port: servePort,
+ signal: ac.signal,
+ onListen: onListen(listeningDeferred.resolve),
+ onError: createOnErrorCb(ac),
+ });
+
+ await listeningDeferred.promise;
+ const conn = await Deno.connect({ port: servePort });
+ const encoder = new TextEncoder();
+ const body = `GET /echo HTTP/1.1\r\nHost: deno.land\r\n\r\n`;
+ const writeResult = await conn.write(encoder.encode(body));
+ assertEquals(body.length, writeResult);
+ await deferred.promise;
+ conn.close();
+
+ ac.abort();
+ await server.finished;
+ },
+);
+
+Deno.test(
+ { permissions: { net: true } },
+ async function httpServerParseHeaderHtabs() {
+ const deferred = Promise.withResolvers<void>();
+ const listeningDeferred = Promise.withResolvers<void>();
+ const ac = new AbortController();
+
+ const server = Deno.serve({
+ handler: (request) => {
+ assertEquals(request.method, "GET");
+ assertEquals(request.headers.get("server"), "hello\tworld");
+ deferred.resolve();
+ return new Response("ok");
+ },
+ port: servePort,
+ signal: ac.signal,
+ onListen: onListen(listeningDeferred.resolve),
+ onError: createOnErrorCb(ac),
+ });
+
+ await listeningDeferred.promise;
+ const conn = await Deno.connect({ port: servePort });
+ const encoder = new TextEncoder();
+ const body = `GET / HTTP/1.1\r\nserver: hello\tworld\r\n\r\n`;
+ const writeResult = await conn.write(encoder.encode(body));
+ assertEquals(body.length, writeResult);
+ await deferred.promise;
+ conn.close();
+
+ ac.abort();
+ await server.finished;
+ },
+);
+
+Deno.test(
+ { permissions: { net: true } },
+ async function httpServerGetShouldIgnoreBody() {
+ const deferred = Promise.withResolvers<void>();
+ const listeningDeferred = Promise.withResolvers<void>();
+ const ac = new AbortController();
+
+ const server = Deno.serve({
+ handler: async (request) => {
+ assertEquals(request.method, "GET");
+ assertEquals(await request.text(), "");
+ deferred.resolve();
+ return new Response("ok");
+ },
+ port: servePort,
+ signal: ac.signal,
+ onListen: onListen(listeningDeferred.resolve),
+ onError: createOnErrorCb(ac),
+ });
+
+ await listeningDeferred.promise;
+ const conn = await Deno.connect({ port: servePort });
+ const encoder = new TextEncoder();
+ // Connection: close = don't try to parse the body as a new request
+ const body =
+ `GET / HTTP/1.1\r\nHost: example.domain\r\nConnection: close\r\n\r\nI shouldn't be read.\r\n`;
+ const writeResult = await conn.write(encoder.encode(body));
+ assertEquals(body.length, writeResult);
+ await deferred.promise;
+ conn.close();
+
+ ac.abort();
+ await server.finished;
+ },
+);
+
+Deno.test(
+ { permissions: { net: true } },
+ async function httpServerPostWithBody() {
+ const deferred = Promise.withResolvers<void>();
+ const listeningDeferred = Promise.withResolvers<void>();
+ const ac = new AbortController();
+
+ const server = Deno.serve({
+ handler: async (request) => {
+ assertEquals(request.method, "POST");
+ assertEquals(await request.text(), "I'm a good request.");
+ deferred.resolve();
+ return new Response("ok");
+ },
+ port: servePort,
+ signal: ac.signal,
+ onListen: onListen(listeningDeferred.resolve),
+ onError: createOnErrorCb(ac),
+ });
+
+ await listeningDeferred.promise;
+ const conn = await Deno.connect({ port: servePort });
+ const encoder = new TextEncoder();
+ const body =
+ `POST / HTTP/1.1\r\nHost: example.domain\r\nContent-Length: 19\r\n\r\nI'm a good request.`;
+ const writeResult = await conn.write(encoder.encode(body));
+ assertEquals(body.length, writeResult);
+ await deferred.promise;
+ conn.close();
+
+ ac.abort();
+ await server.finished;
+ },
+);
+
+type TestCase = {
+ headers?: Record<string, string>;
+ // deno-lint-ignore no-explicit-any
+ body: any;
+ expectsChunked?: boolean;
+ expectsConnLen?: boolean;
+};
+
+function hasHeader(msg: string, name: string): boolean {
+ const n = msg.indexOf("\r\n\r\n") || msg.length;
+ return msg.slice(0, n).includes(name);
+}
+
+function createServerLengthTest(name: string, testCase: TestCase) {
+ Deno.test(name, async function () {
+ const deferred = Promise.withResolvers<void>();
+ const listeningDeferred = Promise.withResolvers<void>();
+ const ac = new AbortController();
+
+ const server = Deno.serve({
+ handler: (request) => {
+ assertEquals(request.method, "GET");
+ deferred.resolve();
+ return new Response(testCase.body, testCase.headers ?? {});
+ },
+ port: servePort,
+ signal: ac.signal,
+ onListen: onListen(listeningDeferred.resolve),
+ onError: createOnErrorCb(ac),
+ });
+
+ await listeningDeferred.promise;
+ const conn = await Deno.connect({ port: servePort });
+ const encoder = new TextEncoder();
+ const body =
+ `GET / HTTP/1.1\r\nHost: example.domain\r\nConnection: close\r\n\r\n`;
+ const writeResult = await conn.write(encoder.encode(body));
+ assertEquals(body.length, writeResult);
+ await deferred.promise;
+
+ const decoder = new TextDecoder();
+ let msg = "";
+ while (true) {
+ const buf = new Uint8Array(1024);
+ const readResult = await conn.read(buf);
+ if (!readResult) {
+ break;
+ }
+ msg += decoder.decode(buf.subarray(0, readResult));
+ try {
+ assert(
+ testCase.expectsChunked == hasHeader(msg, "Transfer-Encoding:"),
+ );
+ assert(testCase.expectsChunked == hasHeader(msg, "chunked"));
+ assert(testCase.expectsConnLen == hasHeader(msg, "Content-Length:"));
+
+ const n = msg.indexOf("\r\n\r\n") + 4;
+
+ if (testCase.expectsChunked) {
+ assertEquals(msg.slice(n + 1, n + 3), "\r\n");
+ assertEquals(msg.slice(msg.length - 7), "\r\n0\r\n\r\n");
+ }
+
+ if (testCase.expectsConnLen && typeof testCase.body === "string") {
+ assertEquals(msg.slice(n), testCase.body);
+ }
+ break;
+ } catch {
+ continue;
+ }
+ }
+
+ conn.close();
+
+ ac.abort();
+ await server.finished;
+ });
+}
+
+// Quick and dirty way to make a readable stream from a string. Alternatively,
+// `readableStreamFromReader(file)` could be used.
+function stream(s: string): ReadableStream<Uint8Array> {
+ return new Response(s).body!;
+}
+
+createServerLengthTest("fixedResponseKnown", {
+ headers: { "content-length": "11" },
+ body: "foo bar baz",
+ expectsChunked: false,
+ expectsConnLen: true,
+});
+
+createServerLengthTest("fixedResponseUnknown", {
+ headers: { "content-length": "11" },
+ body: stream("foo bar baz"),
+ expectsChunked: true,
+ expectsConnLen: false,
+});
+
+createServerLengthTest("fixedResponseKnownEmpty", {
+ headers: { "content-length": "0" },
+ body: "",
+ expectsChunked: false,
+ expectsConnLen: true,
+});
+
+createServerLengthTest("chunkedRespondKnown", {
+ headers: { "transfer-encoding": "chunked" },
+ body: "foo bar baz",
+ expectsChunked: false,
+ expectsConnLen: true,
+});
+
+createServerLengthTest("chunkedRespondUnknown", {
+ headers: { "transfer-encoding": "chunked" },
+ body: stream("foo bar baz"),
+ expectsChunked: true,
+ expectsConnLen: false,
+});
+
+createServerLengthTest("autoResponseWithKnownLength", {
+ body: "foo bar baz",
+ expectsChunked: false,
+ expectsConnLen: true,
+});
+
+createServerLengthTest("autoResponseWithUnknownLength", {
+ body: stream("foo bar baz"),
+ expectsChunked: true,
+ expectsConnLen: false,
+});
+
+createServerLengthTest("autoResponseWithKnownLengthEmpty", {
+ body: "",
+ expectsChunked: false,
+ expectsConnLen: true,
+});
+
+createServerLengthTest("autoResponseWithUnknownLengthEmpty", {
+ body: stream(""),
+ expectsChunked: true,
+ expectsConnLen: false,
+});
+
+Deno.test(
+ { permissions: { net: true } },
+ async function httpServerPostWithContentLengthBody() {
+ const deferred = Promise.withResolvers<void>();
+ const listeningDeferred = Promise.withResolvers<void>();
+ const ac = new AbortController();
+
+ const server = Deno.serve({
+ handler: async (request) => {
+ assertEquals(request.method, "POST");
+ assertEquals(request.headers.get("content-length"), "5");
+ assertEquals(await request.text(), "hello");
+ deferred.resolve();
+ return new Response("ok");
+ },
+ port: servePort,
+ signal: ac.signal,
+ onListen: onListen(listeningDeferred.resolve),
+ onError: createOnErrorCb(ac),
+ });
+
+ await listeningDeferred.promise;
+ const conn = await Deno.connect({ port: servePort });
+ const encoder = new TextEncoder();
+
+ const body =
+ `POST / HTTP/1.1\r\nHost: example.domain\r\nContent-Length: 5\r\n\r\nhello`;
+ const writeResult = await conn.write(encoder.encode(body));
+ assertEquals(body.length, writeResult);
+ await deferred.promise;
+
+ conn.close();
+
+ ac.abort();
+ await server.finished;
+ },
+);
+
+Deno.test(
+ { permissions: { net: true } },
+ async function httpServerPostWithInvalidPrefixContentLength() {
+ const ac = new AbortController();
+ const { promise, resolve } = Promise.withResolvers<void>();
+ const server = Deno.serve({
+ handler: () => {
+ throw new Error("unreachable");
+ },
+ port: servePort,
+ signal: ac.signal,
+ onListen: onListen(resolve),
+ onError: createOnErrorCb(ac),
+ });
+
+ await promise;
+ const conn = await Deno.connect({ port: servePort });
+ const encoder = new TextEncoder();
+ const decoder = new TextDecoder();
+
+ const body =
+ `POST / HTTP/1.1\r\nHost: example.domain\r\nContent-Length: +5\r\n\r\nhello`;
+ const writeResult = await conn.write(encoder.encode(body));
+ assertEquals(body.length, writeResult);
+
+ const buf = new Uint8Array(1024);
+ const readResult = await conn.read(buf);
+ assert(readResult);
+ const msg = decoder.decode(buf.subarray(0, readResult));
+ assert(msg.includes("HTTP/1.1 400 Bad Request"));
+
+ conn.close();
+
+ ac.abort();
+ await server.finished;
+ },
+);
+
+Deno.test(
+ { permissions: { net: true } },
+ async function httpServerPostWithChunkedBody() {
+ const deferred = Promise.withResolvers<void>();
+ const listeningDeferred = Promise.withResolvers<void>();
+ const ac = new AbortController();
+
+ const server = Deno.serve({
+ handler: async (request) => {
+ assertEquals(request.method, "POST");
+ assertEquals(await request.text(), "qwert");
+ deferred.resolve();
+ return new Response("ok");
+ },
+ port: servePort,
+ signal: ac.signal,
+ onListen: onListen(listeningDeferred.resolve),
+ onError: createOnErrorCb(ac),
+ });
+
+ await listeningDeferred.promise;
+ const conn = await Deno.connect({ port: servePort });
+ const encoder = new TextEncoder();
+
+ const body =
+ `POST / HTTP/1.1\r\nHost: example.domain\r\nTransfer-Encoding: chunked\r\n\r\n1\r\nq\r\n2\r\nwe\r\n2\r\nrt\r\n0\r\n\r\n`;
+ const writeResult = await conn.write(encoder.encode(body));
+ assertEquals(body.length, writeResult);
+ await deferred.promise;
+
+ conn.close();
+
+ ac.abort();
+ await server.finished;
+ },
+);
+
+Deno.test(
+ { permissions: { net: true } },
+ async function httpServerPostWithIncompleteBody() {
+ const deferred = Promise.withResolvers<void>();
+ const listeningDeferred = Promise.withResolvers<void>();
+ const ac = new AbortController();
+
+ const server = Deno.serve({
+ handler: async (r) => {
+ deferred.resolve();
+ assertEquals(await r.text(), "12345");
+ return new Response("ok");
+ },
+ port: servePort,
+ signal: ac.signal,
+ onListen: onListen(listeningDeferred.resolve),
+ onError: createOnErrorCb(ac),
+ });
+
+ await listeningDeferred.promise;
+ const conn = await Deno.connect({ port: servePort });
+ const encoder = new TextEncoder();
+
+ const body =
+ `POST / HTTP/1.1\r\nHost: example.domain\r\nContent-Length: 10\r\n\r\n12345`;
+ const writeResult = await conn.write(encoder.encode(body));
+ assertEquals(body.length, writeResult);
+
+ await deferred.promise;
+ conn.close();
+
+ ac.abort();
+ await server.finished;
+ },
+);
+
+Deno.test(
+ { permissions: { net: true } },
+ async function httpServerHeadResponseDoesntSendBody() {
+ const deferred = Promise.withResolvers<void>();
+ const listeningDeferred = Promise.withResolvers<void>();
+ const ac = new AbortController();
+
+ const server = Deno.serve({
+ handler: () => {
+ deferred.resolve();
+ return new Response("NaN".repeat(100));
+ },
+ port: servePort,
+ signal: ac.signal,
+ onListen: onListen(listeningDeferred.resolve),
+ onError: createOnErrorCb(ac),
+ });
+
+ await listeningDeferred.promise;
+ const conn = await Deno.connect({ port: servePort });
+ const encoder = new TextEncoder();
+ const decoder = new TextDecoder();
+
+ const body =
+ `HEAD / HTTP/1.1\r\nHost: example.domain\r\nConnection: close\r\n\r\n`;
+ const writeResult = await conn.write(encoder.encode(body));
+ assertEquals(body.length, writeResult);
+
+ await deferred.promise;
+
+ const buf = new Uint8Array(1024);
+ const readResult = await conn.read(buf);
+ assert(readResult);
+ const msg = decoder.decode(buf.subarray(0, readResult));
+
+ assert(msg.includes("content-length: 300\r\n"));
+
+ conn.close();
+
+ ac.abort();
+ await server.finished;
+ },
+);
+
+function makeTempData(size: number) {
+ return new Uint8Array(size).fill(1);
+}
+
+async function makeTempFile(size: number) {
+ const tmpFile = await Deno.makeTempFile();
+ using file = await Deno.open(tmpFile, { write: true, read: true });
+ const data = makeTempData(size);
+ await file.write(data);
+
+ return await Deno.open(tmpFile, { write: true, read: true });
+}
+
+const compressionTestCases = [
+ { name: "Empty", length: 0, in: {}, out: {}, expect: null },
+ {
+ name: "EmptyAcceptGzip",
+ length: 0,
+ in: { "Accept-Encoding": "gzip" },
+ out: {},
+ expect: null,
+ },
+ // This technically would be compressible if not for the size, however the size_hint is not implemented
+ // for FileResource and we don't currently peek ahead on resources.
+ // {
+ // name: "EmptyAcceptGzip2",
+ // length: 0,
+ // in: { "Accept-Encoding": "gzip" },
+ // out: { "Content-Type": "text/plain" },
+ // expect: null,
+ // },
+ { name: "Incompressible", length: 1024, in: {}, out: {}, expect: null },
+ {
+ name: "IncompressibleAcceptGzip",
+ length: 1024,
+ in: { "Accept-Encoding": "gzip" },
+ out: {},
+ expect: null,
+ },
+ {
+ name: "IncompressibleType",
+ length: 1024,
+ in: { "Accept-Encoding": "gzip" },
+ out: { "Content-Type": "text/fake" },
+ expect: null,
+ },
+ {
+ name: "CompressibleType",
+ length: 1024,
+ in: { "Accept-Encoding": "gzip" },
+ out: { "Content-Type": "text/plain" },
+ expect: "gzip",
+ },
+ {
+ name: "CompressibleType2",
+ length: 1024,
+ in: { "Accept-Encoding": "gzip, deflate, br" },
+ out: { "Content-Type": "text/plain" },
+ expect: "gzip",
+ },
+ {
+ name: "CompressibleType3",
+ length: 1024,
+ in: { "Accept-Encoding": "br" },
+ out: { "Content-Type": "text/plain" },
+ expect: "br",
+ },
+ {
+ name: "IncompressibleRange",
+ length: 1024,
+ in: { "Accept-Encoding": "gzip" },
+ out: { "Content-Type": "text/plain", "Content-Range": "1" },
+ expect: null,
+ },
+ {
+ name: "IncompressibleCE",
+ length: 1024,
+ in: { "Accept-Encoding": "gzip" },
+ out: { "Content-Type": "text/plain", "Content-Encoding": "random" },
+ expect: null,
+ },
+ {
+ name: "IncompressibleCC",
+ length: 1024,
+ in: { "Accept-Encoding": "gzip" },
+ out: { "Content-Type": "text/plain", "Cache-Control": "no-transform" },
+ expect: null,
+ },
+ {
+ name: "BadHeader",
+ length: 1024,
+ in: { "Accept-Encoding": "\x81" },
+ out: { "Content-Type": "text/plain", "Cache-Control": "no-transform" },
+ expect: null,
+ },
+];
+
+for (const testCase of compressionTestCases) {
+ const name = `httpServerCompression${testCase.name}`;
+ Deno.test(
+ { permissions: { net: true, write: true, read: true } },
+ {
+ [name]: async function () {
+ const deferred = Promise.withResolvers<void>();
+ const listeningDeferred = Promise.withResolvers<void>();
+ const ac = new AbortController();
+ const server = Deno.serve({
+ handler: async (_request) => {
+ const f = await makeTempFile(testCase.length);
+ deferred.resolve();
+ // deno-lint-ignore no-explicit-any
+ const headers = testCase.out as any;
+ headers["Content-Length"] = testCase.length.toString();
+ return new Response(f.readable, {
+ headers: headers as HeadersInit,
+ });
+ },
+ port: servePort,
+ signal: ac.signal,
+ onListen: onListen(listeningDeferred.resolve),
+ onError: createOnErrorCb(ac),
+ });
+ try {
+ await listeningDeferred.promise;
+ const resp = await fetch(`http://127.0.0.1:${servePort}/`, {
+ headers: testCase.in as HeadersInit,
+ });
+ await deferred.promise;
+ const body = await resp.arrayBuffer();
+ if (testCase.expect == null) {
+ assertEquals(body.byteLength, testCase.length);
+ assertEquals(
+ resp.headers.get("content-length"),
+ testCase.length.toString(),
+ );
+ assertEquals(
+ resp.headers.get("content-encoding"),
+ testCase.out["Content-Encoding"] || null,
+ );
+ } else if (testCase.expect == "gzip") {
+ // Note the fetch will transparently decompress this response, BUT we can detect that a response
+ // was compressed by the lack of a content length.
+ assertEquals(body.byteLength, testCase.length);
+ assertEquals(resp.headers.get("content-encoding"), null);
+ assertEquals(resp.headers.get("content-length"), null);
+ }
+ } finally {
+ ac.abort();
+ await server.finished;
+ }
+ },
+ }[name],
+ );
+}
+
+Deno.test(
+ { permissions: { net: true, write: true, read: true } },
+ async function httpServerPostFile() {
+ const deferred = Promise.withResolvers<void>();
+ const listeningDeferred = Promise.withResolvers<void>();
+ const ac = new AbortController();
+
+ const server = Deno.serve({
+ handler: async (request) => {
+ assertEquals(
+ new Uint8Array(await request.arrayBuffer()),
+ makeTempData(70 * 1024),
+ );
+ deferred.resolve();
+ return new Response("ok");
+ },
+ port: servePort,
+ signal: ac.signal,
+ onListen: onListen(listeningDeferred.resolve),
+ onError: createOnErrorCb(ac),
+ });
+
+ await listeningDeferred.promise;
+ const f = await makeTempFile(70 * 1024);
+ const response = await fetch(`http://localhost:${servePort}/`, {
+ method: "POST",
+ body: f.readable,
+ });
+
+ await deferred.promise;
+
+ assertEquals(response.status, 200);
+ assertEquals(await response.text(), "ok");
+
+ ac.abort();
+ await server.finished;
+ },
+);
+
+for (const delay of ["delay", "nodelay"]) {
+ for (const url of ["text", "file", "stream"]) {
+ // Ensure that we don't panic when the incoming TCP request was dropped
+ // https://github.com/denoland/deno/issues/20315 and that we correctly
+ // close/cancel the response
+ Deno.test({
+ permissions: { read: true, write: true, net: true },
+ name: `httpServerTcpCancellation_${url}_${delay}`,
+ fn: async function () {
+ const ac = new AbortController();
+ const streamCancelled = url == "stream"
+ ? Promise.withResolvers<void>()
+ : undefined;
+ const listeningDeferred = Promise.withResolvers<void>();
+ const waitForAbort = Promise.withResolvers<void>();
+ const waitForRequest = Promise.withResolvers<void>();
+ const server = Deno.serve({
+ port: servePort,
+ signal: ac.signal,
+ onListen: onListen(listeningDeferred.resolve),
+ handler: async (req: Request) => {
+ let respBody = null;
+ if (req.url.includes("/text")) {
+ respBody = "text";
+ } else if (req.url.includes("/file")) {
+ respBody = (await makeTempFile(1024)).readable;
+ } else if (req.url.includes("/stream")) {
+ respBody = new ReadableStream({
+ start(controller) {
+ controller.enqueue(new Uint8Array([1]));
+ },
+ cancel(reason) {
+ streamCancelled!.resolve(reason);
+ },
+ });
+ } else {
+ fail();
+ }
+ waitForRequest.resolve();
+ await waitForAbort.promise;
+
+ if (delay == "delay") {
+ await new Promise((r) => setTimeout(r, 1000));
+ }
+ // Allocate the request body
+ req.body;
+ return new Response(respBody);
+ },
+ });
+
+ await listeningDeferred.promise;
+
+ // Create a POST request and drop it once the server has received it
+ const conn = await Deno.connect({ port: servePort });
+ const writer = conn.writable.getWriter();
+ await writer.write(
+ new TextEncoder().encode(`POST /${url} HTTP/1.0\n\n`),
+ );
+ await waitForRequest.promise;
+ await writer.close();
+
+ waitForAbort.resolve();
+
+ // Wait for cancellation before we shut the server down
+ if (streamCancelled !== undefined) {
+ await streamCancelled;
+ }
+
+ // Since the handler has a chance of creating resources or running async
+ // ops, we need to use a graceful shutdown here to ensure they have fully
+ // drained.
+ await server.shutdown();
+
+ await server.finished;
+ },
+ });
+ }
+}
+
+Deno.test(
+ { permissions: { net: true } },
+ async function httpServerCancelFetch() {
+ const request2 = Promise.withResolvers<void>();
+ const request2Aborted = Promise.withResolvers<string>();
+ const { finished, abort } = await makeServer(async (req) => {
+ if (req.url.endsWith("/1")) {
+ const fetchRecursive = await fetch(`http://localhost:${servePort}/2`);
+ return new Response(fetchRecursive.body);
+ } else if (req.url.endsWith("/2")) {
+ request2.resolve();
+ return new Response(
+ new ReadableStream({
+ start(_controller) {/* just hang */},
+ cancel(reason) {
+ request2Aborted.resolve(reason);
+ },
+ }),
+ );
+ }
+ fail();
+ });
+ const fetchAbort = new AbortController();
+ const fetchPromise = await fetch(`http://localhost:${servePort}/1`, {
+ signal: fetchAbort.signal,
+ });
+ await fetchPromise;
+ await request2.promise;
+ fetchAbort.abort();
+ assertEquals("resource closed", await request2Aborted.promise);
+
+ abort();
+ await finished;
+ },
+);
+
+Deno.test(
+ { permissions: { read: true, net: true } },
+ async function httpServerWithTls() {
+ const ac = new AbortController();
+ const { promise, resolve } = Promise.withResolvers<void>();
+ const hostname = "127.0.0.1";
+
+ const server = Deno.serve({
+ handler: () => new Response("Hello World"),
+ hostname,
+ port: servePort,
+ signal: ac.signal,
+ onListen: onListen(resolve),
+ onError: createOnErrorCb(ac),
+ cert: Deno.readTextFileSync("tests/testdata/tls/localhost.crt"),
+ key: Deno.readTextFileSync("tests/testdata/tls/localhost.key"),
+ });
+
+ await promise;
+ const caCert = Deno.readTextFileSync("tests/testdata/tls/RootCA.pem");
+ const client = Deno.createHttpClient({ caCerts: [caCert] });
+ const resp = await fetch(`https://localhost:${servePort}/`, {
+ client,
+ headers: { "connection": "close" },
+ });
+
+ const respBody = await resp.text();
+ assertEquals("Hello World", respBody);
+
+ client.close();
+ ac.abort();
+ await server.finished;
+ },
+);
+
+Deno.test(
+ { permissions: { net: true, write: true, read: true } },
+ async function httpServerRequestCLTE() {
+ const ac = new AbortController();
+ const listeningDeferred = Promise.withResolvers<void>();
+ const deferred = Promise.withResolvers<void>();
+
+ const server = Deno.serve({
+ handler: async (req) => {
+ assertEquals(await req.text(), "");
+ deferred.resolve();
+ return new Response("ok");
+ },
+ port: servePort,
+ signal: ac.signal,
+ onListen: onListen(listeningDeferred.resolve),
+ onError: createOnErrorCb(ac),
+ });
+
+ await listeningDeferred.promise;
+ const conn = await Deno.connect({ port: servePort });
+ const encoder = new TextEncoder();
+
+ const body =
+ `POST / HTTP/1.1\r\nHost: example.domain\r\nContent-Length: 13\r\nTransfer-Encoding: chunked\r\n\r\n0\r\n\r\nEXTRA`;
+ const writeResult = await conn.write(encoder.encode(body));
+ assertEquals(body.length, writeResult);
+ await deferred.promise;
+
+ conn.close();
+
+ ac.abort();
+ await server.finished;
+ },
+);
+
+Deno.test(
+ { permissions: { net: true, write: true, read: true } },
+ async function httpServerRequestTETE() {
+ const ac = new AbortController();
+ const { promise, resolve } = Promise.withResolvers<void>();
+
+ const server = Deno.serve({
+ handler: () => {
+ throw new Error("oops");
+ },
+ port: servePort,
+ signal: ac.signal,
+ onListen: onListen(resolve),
+ onError: createOnErrorCb(ac),
+ });
+
+ const encoder = new TextEncoder();
+ const decoder = new TextDecoder();
+
+ const variations = [
+ "Transfer-Encoding : chunked",
+ "Transfer-Encoding: xchunked",
+ "Transfer-Encoding: chunkedx",
+ "Transfer-Encoding\n: chunked",
+ ];
+
+ await promise;
+ for (const teHeader of variations) {
+ const conn = await Deno.connect({ port: servePort });
+ const body =
+ `POST / HTTP/1.1\r\nHost: example.domain\r\n${teHeader}\r\n\r\n0\r\n\r\n`;
+ const writeResult = await conn.write(encoder.encode(body));
+ assertEquals(body.length, writeResult);
+
+ const buf = new Uint8Array(1024);
+ const readResult = await conn.read(buf);
+ assert(readResult);
+ const msg = decoder.decode(buf.subarray(0, readResult));
+ assert(msg.includes("HTTP/1.1 400 Bad Request\r\n"));
+
+ conn.close();
+ }
+
+ ac.abort();
+ await server.finished;
+ },
+);
+
+Deno.test(
+ { permissions: { net: true } },
+ async function httpServer204ResponseDoesntSendContentLength() {
+ const { promise, resolve } = Promise.withResolvers<void>();
+ const ac = new AbortController();
+ const server = Deno.serve({
+ handler: (_request) => new Response(null, { status: 204 }),
+ port: servePort,
+ signal: ac.signal,
+ onListen: onListen(resolve),
+ onError: createOnErrorCb(ac),
+ });
+
+ try {
+ await promise;
+ const resp = await fetch(`http://127.0.0.1:${servePort}/`, {
+ method: "GET",
+ headers: { "connection": "close" },
+ });
+ assertEquals(resp.status, 204);
+ assertEquals(resp.headers.get("Content-Length"), null);
+ } finally {
+ ac.abort();
+ await server.finished;
+ }
+ },
+);
+
+Deno.test(
+ { permissions: { net: true } },
+ async function httpServer304ResponseDoesntSendBody() {
+ const deferred = Promise.withResolvers<void>();
+ const ac = new AbortController();
+ const listeningDeferred = Promise.withResolvers<void>();
+
+ const server = Deno.serve({
+ handler: () => {
+ deferred.resolve();
+ return new Response(null, { status: 304 });
+ },
+ port: servePort,
+ signal: ac.signal,
+ onListen: onListen(listeningDeferred.resolve),
+ onError: createOnErrorCb(ac),
+ });
+
+ await listeningDeferred.promise;
+ const conn = await Deno.connect({ port: servePort });
+ const encoder = new TextEncoder();
+ const decoder = new TextDecoder();
+
+ const body =
+ `GET / HTTP/1.1\r\nHost: example.domain\r\nConnection: close\r\n\r\n`;
+ const writeResult = await conn.write(encoder.encode(body));
+ assertEquals(body.length, writeResult);
+
+ await deferred.promise;
+
+ const buf = new Uint8Array(1024);
+ const readResult = await conn.read(buf);
+ assert(readResult);
+ const msg = decoder.decode(buf.subarray(0, readResult));
+
+ assert(msg.startsWith("HTTP/1.1 304 Not Modified"));
+ assert(msg.endsWith("\r\n\r\n"));
+
+ conn.close();
+
+ ac.abort();
+ await server.finished;
+ },
+);
+
+Deno.test(
+ { permissions: { net: true } },
+ async function httpServerExpectContinue() {
+ const deferred = Promise.withResolvers<void>();
+ const ac = new AbortController();
+ const listeningDeferred = Promise.withResolvers<void>();
+
+ const server = Deno.serve({
+ handler: async (req) => {
+ deferred.resolve();
+ assertEquals(await req.text(), "hello");
+ return new Response(null, { status: 304 });
+ },
+ port: servePort,
+ signal: ac.signal,
+ onListen: onListen(listeningDeferred.resolve),
+ onError: createOnErrorCb(ac),
+ });
+
+ await listeningDeferred.promise;
+ const conn = await Deno.connect({ port: servePort });
+ const encoder = new TextEncoder();
+ const decoder = new TextDecoder();
+
+ {
+ const body =
+ `POST / HTTP/1.1\r\nHost: example.domain\r\nExpect: 100-continue\r\nContent-Length: 5\r\nConnection: close\r\n\r\n`;
+ const writeResult = await conn.write(encoder.encode(body));
+ assertEquals(body.length, writeResult);
+ }
+
+ await deferred.promise;
+
+ {
+ const msgExpected = "HTTP/1.1 100 Continue\r\n\r\n";
+ const buf = new Uint8Array(encoder.encode(msgExpected).byteLength);
+ const readResult = await conn.read(buf);
+ assert(readResult);
+ const msg = decoder.decode(buf.subarray(0, readResult));
+ assert(msg.startsWith(msgExpected));
+ }
+
+ {
+ const body = "hello";
+ const writeResult = await conn.write(encoder.encode(body));
+ assertEquals(body.length, writeResult);
+ }
+
+ const buf = new Uint8Array(1024);
+ const readResult = await conn.read(buf);
+ assert(readResult);
+ const msg = decoder.decode(buf.subarray(0, readResult));
+
+ assert(msg.startsWith("HTTP/1.1 304 Not Modified"));
+ conn.close();
+
+ ac.abort();
+ await server.finished;
+ },
+);
+
+Deno.test(
+ { permissions: { net: true } },
+ async function httpServerExpectContinueButNoBodyLOL() {
+ const deferred = Promise.withResolvers<void>();
+ const listeningDeferred = Promise.withResolvers<void>();
+ const ac = new AbortController();
+
+ const server = Deno.serve({
+ handler: async (req) => {
+ deferred.resolve();
+ assertEquals(await req.text(), "");
+ return new Response(null, { status: 304 });
+ },
+ port: servePort,
+ signal: ac.signal,
+ onListen: onListen(listeningDeferred.resolve),
+ onError: createOnErrorCb(ac),
+ });
+
+ await listeningDeferred.promise;
+ const conn = await Deno.connect({ port: servePort });
+ const encoder = new TextEncoder();
+ const decoder = new TextDecoder();
+
+ {
+ // // no content-length or transfer-encoding means no body!
+ const body =
+ `POST / HTTP/1.1\r\nHost: example.domain\r\nExpect: 100-continue\r\nConnection: close\r\n\r\n`;
+ const writeResult = await conn.write(encoder.encode(body));
+ assertEquals(body.length, writeResult);
+ }
+
+ await deferred.promise;
+
+ const buf = new Uint8Array(1024);
+ const readResult = await conn.read(buf);
+ assert(readResult);
+ const msg = decoder.decode(buf.subarray(0, readResult));
+
+ assert(msg.startsWith("HTTP/1.1 304 Not Modified"));
+ conn.close();
+
+ ac.abort();
+ await server.finished;
+ },
+);
+
+const badRequests = [
+ ["weirdMethodName", "GE T / HTTP/1.1\r\n\r\n"],
+ ["illegalRequestLength", "POST / HTTP/1.1\r\nContent-Length: foo\r\n\r\n"],
+ ["illegalRequestLength2", "POST / HTTP/1.1\r\nContent-Length: -1\r\n\r\n"],
+ ["illegalRequestLength3", "POST / HTTP/1.1\r\nContent-Length: 1.1\r\n\r\n"],
+ ["illegalRequestLength4", "POST / HTTP/1.1\r\nContent-Length: 1.\r\n\r\n"],
+];
+
+for (const [name, req] of badRequests) {
+ const testFn = {
+ [name]: async () => {
+ const ac = new AbortController();
+ const { promise, resolve } = Promise.withResolvers<void>();
+
+ const server = Deno.serve({
+ handler: () => {
+ throw new Error("oops");
+ },
+ port: servePort,
+ signal: ac.signal,
+ onListen: onListen(resolve),
+ onError: createOnErrorCb(ac),
+ });
+
+ await promise;
+ const conn = await Deno.connect({ port: servePort });
+ const encoder = new TextEncoder();
+ const decoder = new TextDecoder();
+
+ {
+ const writeResult = await conn.write(encoder.encode(req));
+ assertEquals(req.length, writeResult);
+ }
+
+ const buf = new Uint8Array(100);
+ const readResult = await conn.read(buf);
+ assert(readResult);
+ const msg = decoder.decode(buf.subarray(0, readResult));
+
+ assert(msg.startsWith("HTTP/1.1 400 "));
+ conn.close();
+
+ ac.abort();
+ await server.finished;
+ },
+ }[name];
+
+ Deno.test(
+ { permissions: { net: true } },
+ testFn,
+ );
+}
+
+Deno.test(
+ { permissions: { net: true } },
+ async function httpServerConcurrentRequests() {
+ const ac = new AbortController();
+ const { resolve } = Promise.withResolvers<void>();
+
+ let reqCount = -1;
+ let timerId: number | undefined;
+ const server = Deno.serve({
+ handler: (_req) => {
+ reqCount++;
+ if (reqCount === 0) {
+ const msg = new TextEncoder().encode("data: hello\r\n\r\n");
+ // SSE
+ const body = new ReadableStream({
+ start(controller) {
+ timerId = setInterval(() => {
+ controller.enqueue(msg);
+ }, 1000);
+ },
+ cancel() {
+ if (typeof timerId === "number") {
+ clearInterval(timerId);
+ }
+ },
+ });
+ return new Response(body, {
+ headers: {
+ "Content-Type": "text/event-stream",
+ },
+ });
+ }
+
+ return new Response(`hello ${reqCount}`);
+ },
+ port: servePort,
+ signal: ac.signal,
+ onListen: onListen(resolve),
+ onError: createOnErrorCb(ac),
+ });
+
+ const sseRequest = await fetch(`http://localhost:${servePort}/`);
+
+ const decoder = new TextDecoder();
+ const stream = sseRequest.body!.getReader();
+ {
+ const { done, value } = await stream.read();
+ assert(!done);
+ assertEquals(decoder.decode(value), "data: hello\r\n\r\n");
+ }
+
+ const helloRequest = await fetch(`http://localhost:${servePort}/`);
+ assertEquals(helloRequest.status, 200);
+ assertEquals(await helloRequest.text(), "hello 1");
+
+ {
+ const { done, value } = await stream.read();
+ assert(!done);
+ assertEquals(decoder.decode(value), "data: hello\r\n\r\n");
+ }
+
+ await stream.cancel();
+ clearInterval(timerId);
+ ac.abort();
+ await server.finished;
+ },
+);
+
+Deno.test(
+ { permissions: { net: true } },
+ async function serveWithPrototypePollution() {
+ const originalThen = Promise.prototype.then;
+ const originalSymbolIterator = Array.prototype[Symbol.iterator];
+ try {
+ Promise.prototype.then = Array.prototype[Symbol.iterator] = () => {
+ throw new Error();
+ };
+ const ac = new AbortController();
+ const { resolve } = Promise.withResolvers<void>();
+ const server = Deno.serve({
+ handler: (_req) => new Response("ok"),
+ hostname: "localhost",
+ port: servePort,
+ signal: ac.signal,
+ onListen: onListen(resolve),
+ onError: createOnErrorCb(ac),
+ });
+ ac.abort();
+ await server.finished;
+ } finally {
+ Promise.prototype.then = originalThen;
+ Array.prototype[Symbol.iterator] = originalSymbolIterator;
+ }
+ },
+);
+
+// https://github.com/denoland/deno/issues/15549
+Deno.test(
+ { permissions: { net: true } },
+ async function testIssue15549() {
+ const ac = new AbortController();
+ const { promise, resolve } = Promise.withResolvers<void>();
+ let count = 0;
+ const server = Deno.serve({
+ async onListen({ port }: { port: number }) {
+ const res1 = await fetch(`http://localhost:${port}/`);
+ assertEquals(await res1.text(), "hello world 1");
+
+ const res2 = await fetch(`http://localhost:${port}/`);
+ assertEquals(await res2.text(), "hello world 2");
+
+ resolve();
+ ac.abort();
+ },
+ signal: ac.signal,
+ }, () => {
+ count++;
+ return new Response(`hello world ${count}`);
+ });
+
+ await promise;
+ await server.finished;
+ },
+);
+
+// https://github.com/denoland/deno/issues/15858
+Deno.test(
+ "Clone should work",
+ { permissions: { net: true } },
+ async function httpServerCanCloneRequest() {
+ const ac = new AbortController();
+ const { promise, resolve } = Promise.withResolvers<number>();
+
+ const server = Deno.serve({
+ handler: async (req) => {
+ const cloned = req.clone();
+ assertEquals(req.headers, cloned.headers);
+
+ assertEquals(cloned.url, req.url);
+ assertEquals(cloned.cache, req.cache);
+ assertEquals(cloned.destination, req.destination);
+ assertEquals(cloned.headers, req.headers);
+ assertEquals(cloned.integrity, req.integrity);
+ assertEquals(cloned.isHistoryNavigation, req.isHistoryNavigation);
+ assertEquals(cloned.isReloadNavigation, req.isReloadNavigation);
+ assertEquals(cloned.keepalive, req.keepalive);
+ assertEquals(cloned.method, req.method);
+ assertEquals(cloned.mode, req.mode);
+ assertEquals(cloned.redirect, req.redirect);
+ assertEquals(cloned.referrer, req.referrer);
+ assertEquals(cloned.referrerPolicy, req.referrerPolicy);
+
+ // both requests can read body
+ await req.text();
+ await cloned.json();
+
+ return new Response("ok");
+ },
+ signal: ac.signal,
+ onListen: ({ port }: { port: number }) => resolve(port),
+ onError: createOnErrorCb(ac),
+ });
+
+ try {
+ const port = await promise;
+ const resp = await fetch(`http://localhost:${port}/`, {
+ headers: { connection: "close" },
+ method: "POST",
+ body: '{"sus":true}',
+ });
+ const text = await resp.text();
+ assertEquals(text, "ok");
+ } finally {
+ ac.abort();
+ await server.finished;
+ }
+ },
+);
+
+// https://fetch.spec.whatwg.org/#dom-request-clone
+Deno.test(
+ "Throw if disturbed",
+ { permissions: { net: true } },
+ async function shouldThrowIfBodyIsUnusableDisturbed() {
+ const ac = new AbortController();
+ const { promise, resolve } = Promise.withResolvers<number>();
+
+ const server = Deno.serve({
+ handler: async (req) => {
+ await req.text();
+
+ try {
+ req.clone();
+ fail();
+ } catch (cloneError) {
+ assert(cloneError instanceof TypeError);
+ assert(
+ cloneError.message.endsWith("Body is unusable."),
+ );
+
+ ac.abort();
+ await server.finished;
+ }
+
+ return new Response("ok");
+ },
+ signal: ac.signal,
+ onListen: ({ port }: { port: number }) => resolve(port),
+ });
+
+ try {
+ const port = await promise;
+ await fetch(`http://localhost:${port}/`, {
+ headers: { connection: "close" },
+ method: "POST",
+ body: '{"bar":true}',
+ });
+ fail();
+ } catch (clientError) {
+ assert(clientError instanceof TypeError);
+ assert(
+ clientError.message.endsWith(
+ "connection closed before message completed",
+ ),
+ );
+ } finally {
+ ac.abort();
+ await server.finished;
+ }
+ },
+);
+
+// https://fetch.spec.whatwg.org/#dom-request-clone
+Deno.test({
+ name: "Throw if locked",
+ permissions: { net: true },
+ fn: async function shouldThrowIfBodyIsUnusableLocked() {
+ const ac = new AbortController();
+ const { promise, resolve } = Promise.withResolvers<number>();
+
+ const server = Deno.serve({
+ handler: async (req) => {
+ const _reader = req.body?.getReader();
+
+ try {
+ req.clone();
+ fail();
+ } catch (cloneError) {
+ assert(cloneError instanceof TypeError);
+ assert(
+ cloneError.message.endsWith("Body is unusable."),
+ );
+
+ ac.abort();
+ await server.finished;
+ }
+ return new Response("ok");
+ },
+ signal: ac.signal,
+ onListen: ({ port }: { port: number }) => resolve(port),
+ });
+
+ try {
+ const port = await promise;
+ await fetch(`http://localhost:${port}/`, {
+ headers: { connection: "close" },
+ method: "POST",
+ body: '{"bar":true}',
+ });
+ fail();
+ } catch (clientError) {
+ assert(clientError instanceof TypeError);
+ assert(
+ clientError.message.endsWith(
+ "connection closed before message completed",
+ ),
+ );
+ } finally {
+ ac.abort();
+ await server.finished;
+ }
+ },
+});
+
+// Checks large streaming response
+// https://github.com/denoland/deno/issues/16567
+Deno.test(
+ { permissions: { net: true } },
+ async function testIssue16567() {
+ const ac = new AbortController();
+ const { promise, resolve } = Promise.withResolvers<void>();
+ const server = Deno.serve({
+ async onListen({ port }) {
+ const res1 = await fetch(`http://localhost:${port}/`);
+ assertEquals((await res1.text()).length, 40 * 50_000);
+
+ resolve();
+ ac.abort();
+ },
+ signal: ac.signal,
+ }, () =>
+ new Response(
+ new ReadableStream({
+ start(c) {
+ // 2MB "a...a" response with 40 chunks
+ for (const _ of Array(40)) {
+ c.enqueue(new Uint8Array(50_000).fill(97));
+ }
+ c.close();
+ },
+ }),
+ ));
+
+ await promise;
+ await server.finished;
+ },
+);
+
+function chunkedBodyReader(h: Headers, r: BufReader): Deno.Reader {
+ // Based on https://tools.ietf.org/html/rfc2616#section-19.4.6
+ const tp = new TextProtoReader(r);
+ let finished = false;
+ const chunks: Array<{
+ offset: number;
+ data: Uint8Array;
+ }> = [];
+ async function read(buf: Uint8Array): Promise<number | null> {
+ if (finished) return null;
+ const [chunk] = chunks;
+ if (chunk) {
+ const chunkRemaining = chunk.data.byteLength - chunk.offset;
+ const readLength = Math.min(chunkRemaining, buf.byteLength);
+ for (let i = 0; i < readLength; i++) {
+ buf[i] = chunk.data[chunk.offset + i];
+ }
+ chunk.offset += readLength;
+ if (chunk.offset === chunk.data.byteLength) {
+ chunks.shift();
+ // Consume \r\n;
+ if ((await tp.readLine()) === null) {
+ throw new Deno.errors.UnexpectedEof();
+ }
+ }
+ return readLength;
+ }
+ const line = await tp.readLine();
+ if (line === null) throw new Deno.errors.UnexpectedEof();
+ // TODO(bartlomieju): handle chunk extension
+ const [chunkSizeString] = line.split(";");
+ const chunkSize = parseInt(chunkSizeString, 16);
+ if (Number.isNaN(chunkSize) || chunkSize < 0) {
+ throw new Deno.errors.InvalidData("Invalid chunk size");
+ }
+ if (chunkSize > 0) {
+ if (chunkSize > buf.byteLength) {
+ let eof = await r.readFull(buf);
+ if (eof === null) {
+ throw new Deno.errors.UnexpectedEof();
+ }
+ const restChunk = new Uint8Array(chunkSize - buf.byteLength);
+ eof = await r.readFull(restChunk);
+ if (eof === null) {
+ throw new Deno.errors.UnexpectedEof();
+ } else {
+ chunks.push({
+ offset: 0,
+ data: restChunk,
+ });
+ }
+ return buf.byteLength;
+ } else {
+ const bufToFill = buf.subarray(0, chunkSize);
+ const eof = await r.readFull(bufToFill);
+ if (eof === null) {
+ throw new Deno.errors.UnexpectedEof();
+ }
+ // Consume \r\n
+ if ((await tp.readLine()) === null) {
+ throw new Deno.errors.UnexpectedEof();
+ }
+ return chunkSize;
+ }
+ } else {
+ assert(chunkSize === 0);
+ // Consume \r\n
+ if ((await r.readLine()) === null) {
+ throw new Deno.errors.UnexpectedEof();
+ }
+ await readTrailers(h, r);
+ finished = true;
+ return null;
+ }
+ }
+ return { read };
+}
+
+async function readTrailers(
+ headers: Headers,
+ r: BufReader,
+) {
+ const trailers = parseTrailer(headers.get("trailer"));
+ if (trailers == null) return;
+ const trailerNames = [...trailers.keys()];
+ const tp = new TextProtoReader(r);
+ const result = await tp.readMimeHeader();
+ if (result == null) {
+ throw new Deno.errors.InvalidData("Missing trailer header.");
+ }
+ const undeclared = [...result.keys()].filter(
+ (k) => !trailerNames.includes(k),
+ );
+ if (undeclared.length > 0) {
+ throw new Deno.errors.InvalidData(
+ `Undeclared trailers: ${Deno.inspect(undeclared)}.`,
+ );
+ }
+ for (const [k, v] of result) {
+ headers.append(k, v);
+ }
+ const missingTrailers = trailerNames.filter((k) => !result.has(k));
+ if (missingTrailers.length > 0) {
+ throw new Deno.errors.InvalidData(
+ `Missing trailers: ${Deno.inspect(missingTrailers)}.`,
+ );
+ }
+ headers.delete("trailer");
+}
+
+function parseTrailer(field: string | null): Headers | undefined {
+ if (field == null) {
+ return undefined;
+ }
+ const trailerNames = field.split(",").map((v) => v.trim().toLowerCase());
+ if (trailerNames.length === 0) {
+ throw new Deno.errors.InvalidData("Empty trailer header.");
+ }
+ const prohibited = trailerNames.filter((k) => isProhibitedForTrailer(k));
+ if (prohibited.length > 0) {
+ throw new Deno.errors.InvalidData(
+ `Prohibited trailer names: ${Deno.inspect(prohibited)}.`,
+ );
+ }
+ return new Headers(trailerNames.map((key) => [key, ""]));
+}
+
+function isProhibitedForTrailer(key: string): boolean {
+ const s = new Set(["transfer-encoding", "content-length", "trailer"]);
+ return s.has(key.toLowerCase());
+}
+
+// TODO(mmastrac): curl on Windows CI stopped supporting --http2?
+Deno.test(
+ {
+ permissions: { net: true, run: true },
+ ignore: Deno.build.os === "windows",
+ },
+ async function httpServeCurlH2C() {
+ const ac = new AbortController();
+ const server = Deno.serve(
+ { port: servePort, signal: ac.signal },
+ () => new Response("hello world!"),
+ );
+
+ assertEquals(
+ "hello world!",
+ await curlRequest([`http://localhost:${servePort}/path`]),
+ );
+ assertEquals(
+ "hello world!",
+ await curlRequest([`http://localhost:${servePort}/path`, "--http2"]),
+ );
+ assertEquals(
+ "hello world!",
+ await curlRequest([
+ `http://localhost:${servePort}/path`,
+ "--http2",
+ "--http2-prior-knowledge",
+ ]),
+ );
+
+ ac.abort();
+ await server.finished;
+ },
+);
+
+// TODO(mmastrac): This test should eventually use fetch, when we support trailers there.
+// This test is ignored because it's flaky and relies on cURL's verbose output.
+Deno.test(
+ { permissions: { net: true, run: true, read: true }, ignore: true },
+ async function httpServerTrailers() {
+ const ac = new AbortController();
+ const { resolve } = Promise.withResolvers<void>();
+
+ const server = Deno.serve({
+ handler: () => {
+ const response = new Response("Hello World", {
+ headers: {
+ "trailer": "baz",
+ "transfer-encoding": "chunked",
+ "foo": "bar",
+ },
+ });
+ addTrailers(response, [["baz", "why"]]);
+ return response;
+ },
+ port: servePort,
+ signal: ac.signal,
+ onListen: onListen(resolve),
+ onError: createOnErrorCb(ac),
+ });
+
+ // We don't have a great way to access this right now, so just fetch the trailers with cURL
+ const [_, stderr] = await curlRequestWithStdErr([
+ `http://localhost:${servePort}/path`,
+ "-v",
+ "--http2",
+ "--http2-prior-knowledge",
+ ]);
+ assertMatch(stderr, /baz: why/);
+ ac.abort();
+ await server.finished;
+ },
+);
+
+// TODO(mmastrac): curl on CI stopped supporting --http2?
+Deno.test(
+ {
+ permissions: {
+ net: true,
+ run: true,
+ read: true,
+ },
+ ignore: Deno.build.os === "windows",
+ },
+ async function httpsServeCurlH2C() {
+ const ac = new AbortController();
+ const server = Deno.serve(
+ {
+ signal: ac.signal,
+ port: servePort,
+ cert: Deno.readTextFileSync("tests/testdata/tls/localhost.crt"),
+ key: Deno.readTextFileSync("tests/testdata/tls/localhost.key"),
+ },
+ () => new Response("hello world!"),
+ );
+
+ assertEquals(
+ "hello world!",
+ await curlRequest([`https://localhost:${servePort}/path`, "-k"]),
+ );
+ assertEquals(
+ "hello world!",
+ await curlRequest([
+ `https://localhost:${servePort}/path`,
+ "-k",
+ "--http2",
+ ]),
+ );
+ assertEquals(
+ "hello world!",
+ await curlRequest([
+ `https://localhost:${servePort}/path`,
+ "-k",
+ "--http2",
+ "--http2-prior-knowledge",
+ ]),
+ );
+
+ ac.abort();
+ await server.finished;
+ },
+);
+
+async function curlRequest(args: string[]) {
+ const { success, stdout, stderr } = await new Deno.Command("curl", {
+ args,
+ stdout: "piped",
+ stderr: "piped",
+ }).output();
+ assert(
+ success,
+ `Failed to cURL ${args}: stdout\n\n${stdout}\n\nstderr:\n\n${stderr}`,
+ );
+ return new TextDecoder().decode(stdout);
+}
+
+async function curlRequestWithStdErr(args: string[]) {
+ const { success, stdout, stderr } = await new Deno.Command("curl", {
+ args,
+ stdout: "piped",
+ stderr: "piped",
+ }).output();
+ assert(
+ success,
+ `Failed to cURL ${args}: stdout\n\n${stdout}\n\nstderr:\n\n${stderr}`,
+ );
+ return [new TextDecoder().decode(stdout), new TextDecoder().decode(stderr)];
+}
+
+Deno.test("Deno.HttpServer is not thenable", async () => {
+ // deno-lint-ignore require-await
+ async function serveTest() {
+ const server = Deno.serve({ port: servePort }, (_) => new Response(""));
+ assert(!("then" in server));
+ return server;
+ }
+ const server = await serveTest();
+ await server.shutdown();
+});
+
+Deno.test(
+ {
+ ignore: Deno.build.os === "windows",
+ permissions: { run: true, read: true, write: true },
+ },
+ async function httpServerUnixDomainSocket() {
+ const { promise, resolve } = Promise.withResolvers<{ path: string }>();
+ const ac = new AbortController();
+ const filePath = tmpUnixSocketPath();
+ const server = Deno.serve(
+ {
+ signal: ac.signal,
+ path: filePath,
+ onListen(info) {
+ resolve(info);
+ },
+ onError: createOnErrorCb(ac),
+ },
+ (_req, { remoteAddr }) => {
+ assertEquals(remoteAddr, { path: filePath, transport: "unix" });
+ return new Response("hello world!");
+ },
+ );
+
+ assertEquals(await promise, { path: filePath });
+ assertEquals(
+ "hello world!",
+ await curlRequest(["--unix-socket", filePath, "http://localhost"]),
+ );
+ ac.abort();
+ await server.finished;
+ },
+);
+
+// serve Handler must return Response class or promise that resolves Response class
+Deno.test(
+ { permissions: { net: true, run: true } },
+ async function handleServeCallbackReturn() {
+ const deferred = Promise.withResolvers<void>();
+ const listeningDeferred = Promise.withResolvers<void>();
+ const ac = new AbortController();
+
+ const server = Deno.serve(
+ {
+ port: servePort,
+ onListen: onListen(listeningDeferred.resolve),
+ signal: ac.signal,
+ onError: (error) => {
+ assert(error instanceof TypeError);
+ assert(
+ error.message ===
+ "Return value from serve handler must be a response or a promise resolving to a response",
+ );
+ deferred.resolve();
+ return new Response("Customized Internal Error from onError");
+ },
+ },
+ () => {
+ // Trick the typechecker
+ return <Response> <unknown> undefined;
+ },
+ );
+ await listeningDeferred.promise;
+ const respText = await curlRequest([`http://localhost:${servePort}`]);
+ await deferred.promise;
+ ac.abort();
+ await server.finished;
+ assert(respText === "Customized Internal Error from onError");
+ },
+);
+
+// onError Handler must return Response class or promise that resolves Response class
+Deno.test(
+ { permissions: { net: true, run: true } },
+ async function handleServeErrorCallbackReturn() {
+ const { promise, resolve } = Promise.withResolvers<void>();
+ const ac = new AbortController();
+
+ const server = Deno.serve(
+ {
+ port: servePort,
+ onListen: onListen(resolve),
+ signal: ac.signal,
+ onError: () => {
+ // Trick the typechecker
+ return <Response> <unknown> undefined;
+ },
+ },
+ () => {
+ // Trick the typechecker
+ return <Response> <unknown> undefined;
+ },
+ );
+ await promise;
+ const respText = await curlRequest([`http://localhost:${servePort}`]);
+ ac.abort();
+ await server.finished;
+ assert(respText === "Internal Server Error");
+ },
+);
diff --git a/cli/tests/unit/signal_test.ts b/tests/unit/signal_test.ts
index 2ba2ffb15..2ba2ffb15 100644
--- a/cli/tests/unit/signal_test.ts
+++ b/tests/unit/signal_test.ts
diff --git a/tests/unit/stat_test.ts b/tests/unit/stat_test.ts
new file mode 100644
index 000000000..6882edf25
--- /dev/null
+++ b/tests/unit/stat_test.ts
@@ -0,0 +1,342 @@
+// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
+import {
+ assert,
+ assertEquals,
+ assertRejects,
+ assertThrows,
+ pathToAbsoluteFileUrl,
+} from "./test_util.ts";
+
+Deno.test({ permissions: { read: true } }, function fstatSyncSuccess() {
+ using file = Deno.openSync("README.md");
+ const fileInfo = Deno.fstatSync(file.rid);
+ assert(fileInfo.isFile);
+ assert(!fileInfo.isSymlink);
+ assert(!fileInfo.isDirectory);
+ assert(fileInfo.size);
+ assert(fileInfo.atime);
+ assert(fileInfo.mtime);
+ // The `birthtime` field is not available on Linux before kernel version 4.11.
+ assert(fileInfo.birthtime || Deno.build.os === "linux");
+});
+
+Deno.test({ permissions: { read: true } }, async function fstatSuccess() {
+ using file = await Deno.open("README.md");
+ const fileInfo = await Deno.fstat(file.rid);
+ assert(fileInfo.isFile);
+ assert(!fileInfo.isSymlink);
+ assert(!fileInfo.isDirectory);
+ assert(fileInfo.size);
+ assert(fileInfo.atime);
+ assert(fileInfo.mtime);
+ // The `birthtime` field is not available on Linux before kernel version 4.11.
+ assert(fileInfo.birthtime || Deno.build.os === "linux");
+});
+
+Deno.test(
+ { permissions: { read: true, write: true } },
+ function statSyncSuccess() {
+ const readmeInfo = Deno.statSync("README.md");
+ assert(readmeInfo.isFile);
+ assert(!readmeInfo.isSymlink);
+
+ const modulesInfo = Deno.statSync("tests/testdata/symlink_to_subdir");
+ assert(modulesInfo.isDirectory);
+ assert(!modulesInfo.isSymlink);
+
+ const testsInfo = Deno.statSync("tests");
+ assert(testsInfo.isDirectory);
+ assert(!testsInfo.isSymlink);
+
+ const tempFile = Deno.makeTempFileSync();
+ const tempInfo = Deno.statSync(tempFile);
+ let now = Date.now();
+ assert(tempInfo.atime !== null && now - tempInfo.atime.valueOf() < 1000);
+ assert(tempInfo.mtime !== null && now - tempInfo.mtime.valueOf() < 1000);
+ assert(
+ tempInfo.birthtime === null || now - tempInfo.birthtime.valueOf() < 1000,
+ );
+
+ const readmeInfoByUrl = Deno.statSync(pathToAbsoluteFileUrl("README.md"));
+ assert(readmeInfoByUrl.isFile);
+ assert(!readmeInfoByUrl.isSymlink);
+
+ const modulesInfoByUrl = Deno.statSync(
+ pathToAbsoluteFileUrl("tests/testdata/symlink_to_subdir"),
+ );
+ assert(modulesInfoByUrl.isDirectory);
+ assert(!modulesInfoByUrl.isSymlink);
+
+ const testsInfoByUrl = Deno.statSync(pathToAbsoluteFileUrl("tests"));
+ assert(testsInfoByUrl.isDirectory);
+ assert(!testsInfoByUrl.isSymlink);
+
+ const tempFileForUrl = Deno.makeTempFileSync();
+ const tempInfoByUrl = Deno.statSync(
+ new URL(
+ `file://${Deno.build.os === "windows" ? "/" : ""}${tempFileForUrl}`,
+ ),
+ );
+ now = Date.now();
+ assert(
+ tempInfoByUrl.atime !== null &&
+ now - tempInfoByUrl.atime.valueOf() < 1000,
+ );
+ assert(
+ tempInfoByUrl.mtime !== null &&
+ now - tempInfoByUrl.mtime.valueOf() < 1000,
+ );
+ assert(
+ tempInfoByUrl.birthtime === null ||
+ now - tempInfoByUrl.birthtime.valueOf() < 1000,
+ );
+
+ Deno.removeSync(tempFile, { recursive: true });
+ Deno.removeSync(tempFileForUrl, { recursive: true });
+ },
+);
+
+Deno.test({ permissions: { read: false } }, function statSyncPerm() {
+ assertThrows(() => {
+ Deno.statSync("README.md");
+ }, Deno.errors.PermissionDenied);
+});
+
+Deno.test({ permissions: { read: true } }, function statSyncNotFound() {
+ assertThrows(
+ () => {
+ Deno.statSync("bad_file_name");
+ },
+ Deno.errors.NotFound,
+ `stat 'bad_file_name'`,
+ );
+});
+
+Deno.test({ permissions: { read: true } }, function lstatSyncSuccess() {
+ const packageInfo = Deno.lstatSync("README.md");
+ assert(packageInfo.isFile);
+ assert(!packageInfo.isSymlink);
+
+ const packageInfoByUrl = Deno.lstatSync(pathToAbsoluteFileUrl("README.md"));
+ assert(packageInfoByUrl.isFile);
+ assert(!packageInfoByUrl.isSymlink);
+
+ const modulesInfo = Deno.lstatSync("tests/testdata/symlink_to_subdir");
+ assert(!modulesInfo.isDirectory);
+ assert(modulesInfo.isSymlink);
+
+ const modulesInfoByUrl = Deno.lstatSync(
+ pathToAbsoluteFileUrl("tests/testdata/symlink_to_subdir"),
+ );
+ assert(!modulesInfoByUrl.isDirectory);
+ assert(modulesInfoByUrl.isSymlink);
+
+ const coreInfo = Deno.lstatSync("cli");
+ assert(coreInfo.isDirectory);
+ assert(!coreInfo.isSymlink);
+
+ const coreInfoByUrl = Deno.lstatSync(pathToAbsoluteFileUrl("cli"));
+ assert(coreInfoByUrl.isDirectory);
+ assert(!coreInfoByUrl.isSymlink);
+});
+
+Deno.test({ permissions: { read: false } }, function lstatSyncPerm() {
+ assertThrows(() => {
+ Deno.lstatSync("assets/hello.txt");
+ }, Deno.errors.PermissionDenied);
+});
+
+Deno.test({ permissions: { read: true } }, function lstatSyncNotFound() {
+ assertThrows(
+ () => {
+ Deno.lstatSync("bad_file_name");
+ },
+ Deno.errors.NotFound,
+ `stat 'bad_file_name'`,
+ );
+});
+
+Deno.test(
+ { permissions: { read: true, write: true } },
+ async function statSuccess() {
+ const readmeInfo = await Deno.stat("README.md");
+ assert(readmeInfo.isFile);
+ assert(!readmeInfo.isSymlink);
+
+ const readmeInfoByUrl = await Deno.stat(
+ pathToAbsoluteFileUrl("README.md"),
+ );
+ assert(readmeInfoByUrl.isFile);
+ assert(!readmeInfoByUrl.isSymlink);
+
+ const modulesInfo = await Deno.stat("tests/testdata/symlink_to_subdir");
+ assert(modulesInfo.isDirectory);
+ assert(!modulesInfo.isSymlink);
+
+ const modulesInfoByUrl = await Deno.stat(
+ pathToAbsoluteFileUrl("tests/testdata/symlink_to_subdir"),
+ );
+ assert(modulesInfoByUrl.isDirectory);
+ assert(!modulesInfoByUrl.isSymlink);
+
+ const testsInfo = await Deno.stat("tests");
+ assert(testsInfo.isDirectory);
+ assert(!testsInfo.isSymlink);
+
+ const testsInfoByUrl = await Deno.stat(pathToAbsoluteFileUrl("tests"));
+ assert(testsInfoByUrl.isDirectory);
+ assert(!testsInfoByUrl.isSymlink);
+
+ const tempFile = await Deno.makeTempFile();
+ const tempInfo = await Deno.stat(tempFile);
+ let now = Date.now();
+ assert(tempInfo.atime !== null && now - tempInfo.atime.valueOf() < 1000);
+ assert(tempInfo.mtime !== null && now - tempInfo.mtime.valueOf() < 1000);
+
+ assert(
+ tempInfo.birthtime === null || now - tempInfo.birthtime.valueOf() < 1000,
+ );
+
+ const tempFileForUrl = await Deno.makeTempFile();
+ const tempInfoByUrl = await Deno.stat(
+ new URL(
+ `file://${Deno.build.os === "windows" ? "/" : ""}${tempFileForUrl}`,
+ ),
+ );
+ now = Date.now();
+ assert(
+ tempInfoByUrl.atime !== null &&
+ now - tempInfoByUrl.atime.valueOf() < 1000,
+ );
+ assert(
+ tempInfoByUrl.mtime !== null &&
+ now - tempInfoByUrl.mtime.valueOf() < 1000,
+ );
+ assert(
+ tempInfoByUrl.birthtime === null ||
+ now - tempInfoByUrl.birthtime.valueOf() < 1000,
+ );
+
+ Deno.removeSync(tempFile, { recursive: true });
+ Deno.removeSync(tempFileForUrl, { recursive: true });
+ },
+);
+
+Deno.test({ permissions: { read: false } }, async function statPerm() {
+ await assertRejects(async () => {
+ await Deno.stat("README.md");
+ }, Deno.errors.PermissionDenied);
+});
+
+Deno.test({ permissions: { read: true } }, async function statNotFound() {
+ await assertRejects(
+ async () => {
+ await Deno.stat("bad_file_name");
+ },
+ Deno.errors.NotFound,
+ `stat 'bad_file_name'`,
+ );
+});
+
+Deno.test({ permissions: { read: true } }, async function lstatSuccess() {
+ const readmeInfo = await Deno.lstat("README.md");
+ assert(readmeInfo.isFile);
+ assert(!readmeInfo.isSymlink);
+
+ const readmeInfoByUrl = await Deno.lstat(pathToAbsoluteFileUrl("README.md"));
+ assert(readmeInfoByUrl.isFile);
+ assert(!readmeInfoByUrl.isSymlink);
+
+ const modulesInfo = await Deno.lstat("tests/testdata/symlink_to_subdir");
+ assert(!modulesInfo.isDirectory);
+ assert(modulesInfo.isSymlink);
+
+ const modulesInfoByUrl = await Deno.lstat(
+ pathToAbsoluteFileUrl("tests/testdata/symlink_to_subdir"),
+ );
+ assert(!modulesInfoByUrl.isDirectory);
+ assert(modulesInfoByUrl.isSymlink);
+
+ const coreInfo = await Deno.lstat("cli");
+ assert(coreInfo.isDirectory);
+ assert(!coreInfo.isSymlink);
+
+ const coreInfoByUrl = await Deno.lstat(pathToAbsoluteFileUrl("cli"));
+ assert(coreInfoByUrl.isDirectory);
+ assert(!coreInfoByUrl.isSymlink);
+});
+
+Deno.test({ permissions: { read: false } }, async function lstatPerm() {
+ await assertRejects(async () => {
+ await Deno.lstat("README.md");
+ }, Deno.errors.PermissionDenied);
+});
+
+Deno.test({ permissions: { read: true } }, async function lstatNotFound() {
+ await assertRejects(
+ async () => {
+ await Deno.lstat("bad_file_name");
+ },
+ Deno.errors.NotFound,
+ `stat 'bad_file_name'`,
+ );
+});
+
+Deno.test(
+ {
+ ignore: Deno.build.os !== "windows",
+ permissions: { read: true, write: true },
+ },
+ function statNoUnixFields() {
+ const enc = new TextEncoder();
+ const data = enc.encode("Hello");
+ const tempDir = Deno.makeTempDirSync();
+ const filename = tempDir + "/test.txt";
+ Deno.writeFileSync(filename, data, { mode: 0o666 });
+ const s = Deno.statSync(filename);
+ assert(s.dev !== 0);
+ assert(s.ino === null);
+ assert(s.mode === null);
+ assert(s.nlink === null);
+ assert(s.uid === null);
+ assert(s.gid === null);
+ assert(s.rdev === null);
+ assert(s.blksize === null);
+ assert(s.blocks === null);
+ assert(s.isBlockDevice === null);
+ assert(s.isCharDevice === null);
+ assert(s.isFifo === null);
+ assert(s.isSocket === null);
+ },
+);
+
+Deno.test(
+ {
+ ignore: Deno.build.os === "windows",
+ permissions: { read: true, write: true },
+ },
+ function statUnixFields() {
+ const enc = new TextEncoder();
+ const data = enc.encode("Hello");
+ const tempDir = Deno.makeTempDirSync();
+ const filename = tempDir + "/test.txt";
+ const filename2 = tempDir + "/test2.txt";
+ Deno.writeFileSync(filename, data, { mode: 0o666 });
+ // Create a link
+ Deno.linkSync(filename, filename2);
+ const s = Deno.statSync(filename);
+ assert(s.dev !== null);
+ assert(s.ino !== null);
+ assertEquals(s.mode! & 0o666, 0o666);
+ assertEquals(s.nlink, 2);
+ assert(s.uid !== null);
+ assert(s.gid !== null);
+ assert(s.rdev !== null);
+ assert(s.blksize !== null);
+ assert(s.blocks !== null);
+ assert(!s.isBlockDevice);
+ assert(!s.isCharDevice);
+ assert(!s.isFifo);
+ assert(!s.isSocket);
+ },
+);
diff --git a/cli/tests/unit/stdio_test.ts b/tests/unit/stdio_test.ts
index d24fdc8ef..d24fdc8ef 100644
--- a/cli/tests/unit/stdio_test.ts
+++ b/tests/unit/stdio_test.ts
diff --git a/cli/tests/unit/streams_test.ts b/tests/unit/streams_test.ts
index 6db9f666c..6db9f666c 100644
--- a/cli/tests/unit/streams_test.ts
+++ b/tests/unit/streams_test.ts
diff --git a/cli/tests/unit/structured_clone_test.ts b/tests/unit/structured_clone_test.ts
index 314a276dd..314a276dd 100644
--- a/cli/tests/unit/structured_clone_test.ts
+++ b/tests/unit/structured_clone_test.ts
diff --git a/cli/tests/unit/symbol_test.ts b/tests/unit/symbol_test.ts
index 54db7f5ba..54db7f5ba 100644
--- a/cli/tests/unit/symbol_test.ts
+++ b/tests/unit/symbol_test.ts
diff --git a/cli/tests/unit/symlink_test.ts b/tests/unit/symlink_test.ts
index 310c36930..310c36930 100644
--- a/cli/tests/unit/symlink_test.ts
+++ b/tests/unit/symlink_test.ts
diff --git a/cli/tests/unit/sync_test.ts b/tests/unit/sync_test.ts
index 40a8054c0..40a8054c0 100644
--- a/cli/tests/unit/sync_test.ts
+++ b/tests/unit/sync_test.ts
diff --git a/cli/tests/unit/test_util.ts b/tests/unit/test_util.ts
index 2f2730794..2f2730794 100644
--- a/cli/tests/unit/test_util.ts
+++ b/tests/unit/test_util.ts
diff --git a/cli/tests/unit/testing_test.ts b/tests/unit/testing_test.ts
index e04ab921c..e04ab921c 100644
--- a/cli/tests/unit/testing_test.ts
+++ b/tests/unit/testing_test.ts
diff --git a/cli/tests/unit/text_encoding_test.ts b/tests/unit/text_encoding_test.ts
index 719e5907e..719e5907e 100644
--- a/cli/tests/unit/text_encoding_test.ts
+++ b/tests/unit/text_encoding_test.ts
diff --git a/cli/tests/unit/timers_test.ts b/tests/unit/timers_test.ts
index 17b137231..17b137231 100644
--- a/cli/tests/unit/timers_test.ts
+++ b/tests/unit/timers_test.ts
diff --git a/tests/unit/tls_test.ts b/tests/unit/tls_test.ts
new file mode 100644
index 000000000..2bd7768bb
--- /dev/null
+++ b/tests/unit/tls_test.ts
@@ -0,0 +1,1546 @@
+// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
+import {
+ assert,
+ assertEquals,
+ assertNotEquals,
+ assertRejects,
+ assertStrictEquals,
+ assertThrows,
+} from "./test_util.ts";
+import { BufReader, BufWriter } from "@test_util/std/io/mod.ts";
+import { readAll } from "@test_util/std/streams/read_all.ts";
+import { writeAll } from "@test_util/std/streams/write_all.ts";
+import { TextProtoReader } from "../testdata/run/textproto.ts";
+
+const encoder = new TextEncoder();
+const decoder = new TextDecoder();
+const cert = await Deno.readTextFile("tests/testdata/tls/localhost.crt");
+const key = await Deno.readTextFile("tests/testdata/tls/localhost.key");
+const caCerts = [await Deno.readTextFile("tests/testdata/tls/RootCA.pem")];
+
+async function sleep(msec: number) {
+ await new Promise((res, _rej) => setTimeout(res, msec));
+}
+
+function unreachable(): never {
+ throw new Error("Unreachable code reached");
+}
+
+Deno.test({ permissions: { net: false } }, async function connectTLSNoPerm() {
+ await assertRejects(async () => {
+ await Deno.connectTls({ hostname: "deno.land", port: 443 });
+ }, Deno.errors.PermissionDenied);
+});
+
+Deno.test(
+ { permissions: { read: true, net: true } },
+ async function connectTLSInvalidHost() {
+ await assertRejects(async () => {
+ await Deno.connectTls({ hostname: "256.0.0.0", port: 3567 });
+ }, TypeError);
+ },
+);
+
+Deno.test(
+ { permissions: { net: true, read: false } },
+ async function connectTLSCertFileNoReadPerm() {
+ await assertRejects(async () => {
+ await Deno.connectTls({
+ hostname: "deno.land",
+ port: 443,
+ certFile: "tests/testdata/tls/RootCA.crt",
+ });
+ }, Deno.errors.PermissionDenied);
+ },
+);
+
+Deno.test(
+ { permissions: { read: true, net: true } },
+ function listenTLSNonExistentCertKeyFiles() {
+ const options = {
+ hostname: "localhost",
+ port: 3500,
+ certFile: "tests/testdata/tls/localhost.crt",
+ keyFile: "tests/testdata/tls/localhost.key",
+ };
+
+ assertThrows(() => {
+ Deno.listenTls({
+ ...options,
+ certFile: "./non/existent/file",
+ });
+ }, Deno.errors.NotFound);
+
+ assertThrows(() => {
+ Deno.listenTls({
+ ...options,
+ keyFile: "./non/existent/file",
+ });
+ }, Deno.errors.NotFound);
+ },
+);
+
+Deno.test(
+ { permissions: { net: true, read: false } },
+ function listenTLSNoReadPerm() {
+ assertThrows(() => {
+ Deno.listenTls({
+ hostname: "localhost",
+ port: 3500,
+ certFile: "tests/testdata/tls/localhost.crt",
+ keyFile: "tests/testdata/tls/localhost.key",
+ });
+ }, Deno.errors.PermissionDenied);
+ },
+);
+
+Deno.test(
+ {
+ permissions: { read: true, write: true, net: true },
+ },
+ function listenTLSEmptyKeyFile() {
+ const options = {
+ hostname: "localhost",
+ port: 3500,
+ certFile: "tests/testdata/tls/localhost.crt",
+ keyFile: "tests/testdata/tls/localhost.key",
+ };
+
+ const testDir = Deno.makeTempDirSync();
+ const keyFilename = testDir + "/key.pem";
+ Deno.writeFileSync(keyFilename, new Uint8Array([]), {
+ mode: 0o666,
+ });
+
+ assertThrows(() => {
+ Deno.listenTls({
+ ...options,
+ keyFile: keyFilename,
+ });
+ }, Error);
+ },
+);
+
+Deno.test(
+ { permissions: { read: true, write: true, net: true } },
+ function listenTLSEmptyCertFile() {
+ const options = {
+ hostname: "localhost",
+ port: 3500,
+ certFile: "tests/testdata/tls/localhost.crt",
+ keyFile: "tests/testdata/tls/localhost.key",
+ };
+
+ const testDir = Deno.makeTempDirSync();
+ const certFilename = testDir + "/cert.crt";
+ Deno.writeFileSync(certFilename, new Uint8Array([]), {
+ mode: 0o666,
+ });
+
+ assertThrows(() => {
+ Deno.listenTls({
+ ...options,
+ certFile: certFilename,
+ });
+ }, Error);
+ },
+);
+
+Deno.test(
+ { permissions: { net: true } },
+ async function startTlsWithoutExclusiveAccessToTcpConn() {
+ const hostname = "localhost";
+ const port = getPort();
+
+ const tcpListener = Deno.listen({ hostname, port });
+ const [serverConn, clientConn] = await Promise.all([
+ tcpListener.accept(),
+ Deno.connect({ hostname, port }),
+ ]);
+
+ const buf = new Uint8Array(128);
+ const readPromise = clientConn.read(buf);
+ // `clientConn` is being used by a pending promise (`readPromise`) so
+ // `Deno.startTls` cannot consume the connection.
+ await assertRejects(
+ () => Deno.startTls(clientConn, { hostname }),
+ Deno.errors.BadResource,
+ );
+
+ serverConn.close();
+ tcpListener.close();
+ await readPromise;
+ },
+);
+
+Deno.test(
+ { permissions: { read: true, net: true } },
+ async function dialAndListenTLS() {
+ const { promise, resolve } = Promise.withResolvers<void>();
+ const hostname = "localhost";
+ const port = 3500;
+
+ const listener = Deno.listenTls({
+ hostname,
+ port,
+ cert: await Deno.readTextFile("tests/testdata/tls/localhost.crt"),
+ key: await Deno.readTextFile("tests/testdata/tls/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, caCerts });
+ assert(conn.rid > 0);
+ 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;
+ },
+);
+Deno.test(
+ { permissions: { read: false, net: true } },
+ async function listenTlsWithCertAndKey() {
+ const { promise, resolve } = Promise.withResolvers<void>();
+ const hostname = "localhost";
+ const port = 3500;
+
+ const listener = Deno.listenTls({ hostname, port, cert, 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);
+ setTimeout(() => {
+ conn.close();
+ resolve();
+ }, 0);
+ },
+ );
+
+ const conn = await Deno.connectTls({ hostname, port, caCerts });
+ assert(conn.rid > 0);
+ 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;
+ },
+);
+
+let nextPort = 3501;
+function getPort() {
+ return nextPort++;
+}
+
+async function tlsPair(): Promise<[Deno.Conn, Deno.Conn]> {
+ const port = getPort();
+ const listener = Deno.listenTls({
+ hostname: "localhost",
+ port,
+ cert: await Deno.readTextFile("tests/testdata/tls/localhost.crt"),
+ key: await Deno.readTextFile("tests/testdata/tls/localhost.key"),
+ });
+
+ const acceptPromise = listener.accept();
+ const connectPromise = Deno.connectTls({
+ hostname: "localhost",
+ port,
+ caCerts: [Deno.readTextFileSync("tests/testdata/tls/RootCA.pem")],
+ });
+ const endpoints = await Promise.all([acceptPromise, connectPromise]);
+
+ listener.close();
+
+ return endpoints;
+}
+
+async function tlsAlpn(
+ useStartTls: boolean,
+): Promise<[Deno.TlsConn, Deno.TlsConn]> {
+ const port = getPort();
+ const listener = Deno.listenTls({
+ hostname: "localhost",
+ port,
+ cert: await Deno.readTextFile("tests/testdata/tls/localhost.crt"),
+ key: await Deno.readTextFile("tests/testdata/tls/localhost.key"),
+ alpnProtocols: ["deno", "rocks"],
+ });
+
+ const acceptPromise = listener.accept();
+
+ const caCerts = [Deno.readTextFileSync("tests/testdata/tls/RootCA.pem")];
+ const clientAlpnProtocols = ["rocks", "rises"];
+ let endpoints: [Deno.TlsConn, Deno.TlsConn];
+
+ if (!useStartTls) {
+ const connectPromise = Deno.connectTls({
+ hostname: "localhost",
+ port,
+ caCerts,
+ alpnProtocols: clientAlpnProtocols,
+ });
+ endpoints = await Promise.all([acceptPromise, connectPromise]);
+ } else {
+ const client = await Deno.connect({
+ hostname: "localhost",
+ port,
+ });
+ const connectPromise = Deno.startTls(client, {
+ hostname: "localhost",
+ caCerts,
+ alpnProtocols: clientAlpnProtocols,
+ });
+ endpoints = await Promise.all([acceptPromise, connectPromise]);
+ }
+
+ listener.close();
+ return endpoints;
+}
+
+async function sendThenCloseWriteThenReceive(
+ conn: Deno.Conn,
+ chunkCount: number,
+ chunkSize: number,
+) {
+ const byteCount = chunkCount * chunkSize;
+ const buf = new Uint8Array(chunkSize); // Note: buf is size of _chunk_.
+ let n: number;
+
+ // Slowly send 42s.
+ buf.fill(42);
+ for (let remaining = byteCount; remaining > 0; remaining -= n) {
+ n = await conn.write(buf.subarray(0, remaining));
+ assert(n >= 1);
+ await sleep(10);
+ }
+
+ // Send EOF.
+ await conn.closeWrite();
+
+ // Receive 69s.
+ for (let remaining = byteCount; remaining > 0; remaining -= n) {
+ buf.fill(0);
+ n = await conn.read(buf) as number;
+ assert(n >= 1);
+ assertStrictEquals(buf[0], 69);
+ assertStrictEquals(buf[n - 1], 69);
+ }
+
+ conn.close();
+}
+
+async function receiveThenSend(
+ conn: Deno.Conn,
+ chunkCount: number,
+ chunkSize: number,
+) {
+ const byteCount = chunkCount * chunkSize;
+ const buf = new Uint8Array(byteCount); // Note: buf size equals `byteCount`.
+ let n: number;
+
+ // Receive 42s.
+ for (let remaining = byteCount; remaining > 0; remaining -= n) {
+ buf.fill(0);
+ n = await conn.read(buf) as number;
+ assert(n >= 1);
+ assertStrictEquals(buf[0], 42);
+ assertStrictEquals(buf[n - 1], 42);
+ }
+
+ // Slowly send 69s.
+ buf.fill(69);
+ for (let remaining = byteCount; remaining > 0; remaining -= n) {
+ n = await conn.write(buf.subarray(0, remaining));
+ assert(n >= 1);
+ await sleep(10);
+ }
+
+ conn.close();
+}
+
+Deno.test(
+ { permissions: { read: true, net: true } },
+ async function tlsServerAlpnListenConnect() {
+ const [serverConn, clientConn] = await tlsAlpn(false);
+ const [serverHS, clientHS] = await Promise.all([
+ serverConn.handshake(),
+ clientConn.handshake(),
+ ]);
+ assertStrictEquals(serverHS.alpnProtocol, "rocks");
+ assertStrictEquals(clientHS.alpnProtocol, "rocks");
+
+ serverConn.close();
+ clientConn.close();
+ },
+);
+
+Deno.test(
+ { permissions: { read: true, net: true } },
+ async function tlsServerAlpnListenStartTls() {
+ const [serverConn, clientConn] = await tlsAlpn(true);
+ const [serverHS, clientHS] = await Promise.all([
+ serverConn.handshake(),
+ clientConn.handshake(),
+ ]);
+ assertStrictEquals(serverHS.alpnProtocol, "rocks");
+ assertStrictEquals(clientHS.alpnProtocol, "rocks");
+
+ serverConn.close();
+ clientConn.close();
+ },
+);
+
+Deno.test(
+ { permissions: { read: true, net: true } },
+ async function tlsServerStreamHalfCloseSendOneByte() {
+ const [serverConn, clientConn] = await tlsPair();
+ await Promise.all([
+ sendThenCloseWriteThenReceive(serverConn, 1, 1),
+ receiveThenSend(clientConn, 1, 1),
+ ]);
+ },
+);
+
+Deno.test(
+ { permissions: { read: true, net: true } },
+ async function tlsClientStreamHalfCloseSendOneByte() {
+ const [serverConn, clientConn] = await tlsPair();
+ await Promise.all([
+ sendThenCloseWriteThenReceive(clientConn, 1, 1),
+ receiveThenSend(serverConn, 1, 1),
+ ]);
+ },
+);
+
+Deno.test(
+ { permissions: { read: true, net: true } },
+ async function tlsServerStreamHalfCloseSendOneChunk() {
+ const [serverConn, clientConn] = await tlsPair();
+ await Promise.all([
+ sendThenCloseWriteThenReceive(serverConn, 1, 1 << 20 /* 1 MB */),
+ receiveThenSend(clientConn, 1, 1 << 20 /* 1 MB */),
+ ]);
+ },
+);
+
+Deno.test(
+ { permissions: { read: true, net: true } },
+ async function tlsClientStreamHalfCloseSendOneChunk() {
+ const [serverConn, clientConn] = await tlsPair();
+ await Promise.all([
+ sendThenCloseWriteThenReceive(clientConn, 1, 1 << 20 /* 1 MB */),
+ receiveThenSend(serverConn, 1, 1 << 20 /* 1 MB */),
+ ]);
+ },
+);
+
+Deno.test(
+ { permissions: { read: true, net: true } },
+ async function tlsServerStreamHalfCloseSendManyBytes() {
+ const [serverConn, clientConn] = await tlsPair();
+ await Promise.all([
+ sendThenCloseWriteThenReceive(serverConn, 100, 1),
+ receiveThenSend(clientConn, 100, 1),
+ ]);
+ },
+);
+
+Deno.test(
+ { permissions: { read: true, net: true } },
+ async function tlsClientStreamHalfCloseSendManyBytes() {
+ const [serverConn, clientConn] = await tlsPair();
+ await Promise.all([
+ sendThenCloseWriteThenReceive(clientConn, 100, 1),
+ receiveThenSend(serverConn, 100, 1),
+ ]);
+ },
+);
+
+Deno.test(
+ { permissions: { read: true, net: true } },
+ async function tlsServerStreamHalfCloseSendManyChunks() {
+ const [serverConn, clientConn] = await tlsPair();
+ await Promise.all([
+ sendThenCloseWriteThenReceive(serverConn, 100, 1 << 16 /* 64 kB */),
+ receiveThenSend(clientConn, 100, 1 << 16 /* 64 kB */),
+ ]);
+ },
+);
+
+Deno.test(
+ { permissions: { read: true, net: true } },
+ async function tlsClientStreamHalfCloseSendManyChunks() {
+ const [serverConn, clientConn] = await tlsPair();
+ await Promise.all([
+ sendThenCloseWriteThenReceive(clientConn, 100, 1 << 16 /* 64 kB */),
+ receiveThenSend(serverConn, 100, 1 << 16 /* 64 kB */),
+ ]);
+ },
+);
+
+const largeAmount = 1 << 20 /* 1 MB */;
+
+async function sendAlotReceiveNothing(conn: Deno.Conn) {
+ // Start receive op.
+ const readBuf = new Uint8Array(1024);
+ const readPromise = conn.read(readBuf);
+
+ const timeout = setTimeout(() => {
+ throw new Error("Failed to send buffer in a reasonable amount of time");
+ }, 10_000);
+
+ // Send 1 MB of data.
+ const writeBuf = new Uint8Array(largeAmount);
+ writeBuf.fill(42);
+ await writeAll(conn, writeBuf);
+
+ clearTimeout(timeout);
+
+ // Send EOF.
+ await conn.closeWrite();
+
+ // Close the connection.
+ conn.close();
+
+ // Read op should be canceled.
+ await assertRejects(
+ async () => await readPromise,
+ Deno.errors.Interrupted,
+ );
+}
+
+async function receiveAlotSendNothing(conn: Deno.Conn) {
+ const readBuf = new Uint8Array(1024);
+ let n: number | null;
+ let nread = 0;
+
+ const timeout = setTimeout(() => {
+ throw new Error(
+ `Failed to read buffer in a reasonable amount of time (got ${nread}/${largeAmount})`,
+ );
+ }, 10_000);
+
+ // Receive 1 MB of data.
+ try {
+ for (; nread < largeAmount; nread += n!) {
+ n = await conn.read(readBuf);
+ assertStrictEquals(typeof n, "number");
+ assert(n! > 0);
+ assertStrictEquals(readBuf[0], 42);
+ }
+ } catch (e) {
+ throw new Error(
+ `Got an error (${e.message}) after reading ${nread}/${largeAmount} bytes`,
+ { cause: e },
+ );
+ }
+ clearTimeout(timeout);
+
+ // Close the connection, without sending anything at all.
+ conn.close();
+}
+
+Deno.test(
+ { permissions: { read: true, net: true } },
+ async function tlsServerStreamCancelRead() {
+ const [serverConn, clientConn] = await tlsPair();
+ await Promise.all([
+ sendAlotReceiveNothing(serverConn),
+ receiveAlotSendNothing(clientConn),
+ ]);
+ },
+);
+
+Deno.test(
+ { permissions: { read: true, net: true } },
+ async function tlsClientStreamCancelRead() {
+ const [serverConn, clientConn] = await tlsPair();
+ await Promise.all([
+ sendAlotReceiveNothing(clientConn),
+ receiveAlotSendNothing(serverConn),
+ ]);
+ },
+);
+
+async function sendReceiveEmptyBuf(conn: Deno.Conn) {
+ const byteBuf = new Uint8Array([1]);
+ const emptyBuf = new Uint8Array(0);
+ let n: number | null;
+
+ n = await conn.write(emptyBuf);
+ assertStrictEquals(n, 0);
+
+ n = await conn.read(emptyBuf);
+ assertStrictEquals(n, 0);
+
+ n = await conn.write(byteBuf);
+ assertStrictEquals(n, 1);
+
+ n = await conn.read(byteBuf);
+ assertStrictEquals(n, 1);
+
+ await conn.closeWrite();
+
+ n = await conn.write(emptyBuf);
+ assertStrictEquals(n, 0);
+
+ await assertRejects(async () => {
+ await conn.write(byteBuf);
+ }, Deno.errors.NotConnected);
+
+ n = await conn.write(emptyBuf);
+ assertStrictEquals(n, 0);
+
+ n = await conn.read(byteBuf);
+ assertStrictEquals(n, null);
+
+ conn.close();
+}
+
+Deno.test(
+ { permissions: { read: true, net: true } },
+ async function tlsStreamSendReceiveEmptyBuf() {
+ const [serverConn, clientConn] = await tlsPair();
+ await Promise.all([
+ sendReceiveEmptyBuf(serverConn),
+ sendReceiveEmptyBuf(clientConn),
+ ]);
+ },
+);
+
+function immediateClose(conn: Deno.Conn) {
+ conn.close();
+ return Promise.resolve();
+}
+
+async function closeWriteAndClose(conn: Deno.Conn) {
+ await conn.closeWrite();
+
+ if (await conn.read(new Uint8Array(1)) !== null) {
+ throw new Error("did not expect to receive data on TLS stream");
+ }
+
+ conn.close();
+}
+
+Deno.test(
+ { permissions: { read: true, net: true } },
+ async function tlsServerStreamImmediateClose() {
+ const [serverConn, clientConn] = await tlsPair();
+ await Promise.all([
+ immediateClose(serverConn),
+ closeWriteAndClose(clientConn),
+ ]);
+ },
+);
+
+Deno.test(
+ { permissions: { read: true, net: true } },
+ async function tlsClientStreamImmediateClose() {
+ const [serverConn, clientConn] = await tlsPair();
+ await Promise.all([
+ closeWriteAndClose(serverConn),
+ immediateClose(clientConn),
+ ]);
+ },
+);
+
+Deno.test(
+ { permissions: { read: true, net: true } },
+ async function tlsClientAndServerStreamImmediateClose() {
+ const [serverConn, clientConn] = await tlsPair();
+ await Promise.all([
+ immediateClose(serverConn),
+ immediateClose(clientConn),
+ ]);
+ },
+);
+
+async function tlsWithTcpFailureTestImpl(
+ phase: "handshake" | "traffic",
+ cipherByteCount: number,
+ failureMode: "corruption" | "shutdown",
+ reverse: boolean,
+) {
+ const tlsPort = getPort();
+ const tlsListener = Deno.listenTls({
+ hostname: "localhost",
+ port: tlsPort,
+ cert: await Deno.readTextFile("tests/testdata/tls/localhost.crt"),
+ key: await Deno.readTextFile("tests/testdata/tls/localhost.key"),
+ });
+
+ const tcpPort = getPort();
+ const tcpListener = Deno.listen({ hostname: "localhost", port: tcpPort });
+
+ const [tlsServerConn, tcpServerConn] = await Promise.all([
+ tlsListener.accept(),
+ Deno.connect({ hostname: "localhost", port: tlsPort }),
+ ]);
+
+ const [tcpClientConn, tlsClientConn] = await Promise.all([
+ tcpListener.accept(),
+ Deno.connectTls({
+ hostname: "localhost",
+ port: tcpPort,
+ caCerts: [Deno.readTextFileSync("tests/testdata/tls/RootCA.pem")],
+ }),
+ ]);
+
+ tlsListener.close();
+ tcpListener.close();
+
+ const {
+ tlsConn1,
+ tlsConn2,
+ tcpConn1,
+ tcpConn2,
+ } = reverse
+ ? {
+ tlsConn1: tlsClientConn,
+ tlsConn2: tlsServerConn,
+ tcpConn1: tcpClientConn,
+ tcpConn2: tcpServerConn,
+ }
+ : {
+ tlsConn1: tlsServerConn,
+ tlsConn2: tlsClientConn,
+ tcpConn1: tcpServerConn,
+ tcpConn2: tcpClientConn,
+ };
+
+ const tcpForwardingInterruptDeferred1 = Promise.withResolvers<void>();
+ const tcpForwardingPromise1 = forwardBytes(
+ tcpConn2,
+ tcpConn1,
+ cipherByteCount,
+ tcpForwardingInterruptDeferred1,
+ );
+
+ const tcpForwardingInterruptDeferred2 = Promise.withResolvers<void>();
+ const tcpForwardingPromise2 = forwardBytes(
+ tcpConn1,
+ tcpConn2,
+ Infinity,
+ tcpForwardingInterruptDeferred2,
+ );
+
+ switch (phase) {
+ case "handshake": {
+ let expectedError;
+ switch (failureMode) {
+ case "corruption":
+ expectedError = Deno.errors.InvalidData;
+ break;
+ case "shutdown":
+ expectedError = Deno.errors.UnexpectedEof;
+ break;
+ default:
+ unreachable();
+ }
+
+ const tlsTrafficPromise1 = Promise.all([
+ assertRejects(
+ () => sendBytes(tlsConn1, 0x01, 1),
+ expectedError,
+ ),
+ assertRejects(
+ () => receiveBytes(tlsConn1, 0x02, 1),
+ expectedError,
+ ),
+ ]);
+
+ const tlsTrafficPromise2 = Promise.all([
+ assertRejects(
+ () => sendBytes(tlsConn2, 0x02, 1),
+ Deno.errors.UnexpectedEof,
+ ),
+ assertRejects(
+ () => receiveBytes(tlsConn2, 0x01, 1),
+ Deno.errors.UnexpectedEof,
+ ),
+ ]);
+
+ await tcpForwardingPromise1;
+
+ switch (failureMode) {
+ case "corruption":
+ await sendBytes(tcpConn1, 0xff, 1 << 14 /* 16 kB */);
+ break;
+ case "shutdown":
+ await tcpConn1.closeWrite();
+ break;
+ default:
+ unreachable();
+ }
+ await tlsTrafficPromise1;
+
+ tcpForwardingInterruptDeferred2.resolve();
+ await tcpForwardingPromise2;
+ await tcpConn2.closeWrite();
+ await tlsTrafficPromise2;
+
+ break;
+ }
+
+ case "traffic": {
+ await Promise.all([
+ sendBytes(tlsConn2, 0x88, 8888),
+ receiveBytes(tlsConn1, 0x88, 8888),
+ sendBytes(tlsConn1, 0x99, 99999),
+ receiveBytes(tlsConn2, 0x99, 99999),
+ ]);
+
+ tcpForwardingInterruptDeferred1.resolve();
+ await tcpForwardingInterruptDeferred1.promise;
+
+ switch (failureMode) {
+ case "corruption":
+ await sendBytes(tcpConn1, 0xff, 1 << 14 /* 16 kB */);
+ await assertRejects(
+ () => receiveEof(tlsConn1),
+ Deno.errors.InvalidData,
+ );
+ tcpForwardingInterruptDeferred2.resolve();
+ break;
+ case "shutdown":
+ await Promise.all([
+ tcpConn1.closeWrite(),
+ await assertRejects(
+ () => receiveEof(tlsConn1),
+ Deno.errors.UnexpectedEof,
+ ),
+ await tlsConn1.closeWrite(),
+ await receiveEof(tlsConn2),
+ ]);
+ break;
+ default:
+ unreachable();
+ }
+
+ await tcpForwardingPromise2;
+
+ break;
+ }
+
+ default:
+ unreachable();
+ }
+
+ tlsServerConn.close();
+ tlsClientConn.close();
+ tcpServerConn.close();
+ tcpClientConn.close();
+
+ async function sendBytes(
+ conn: Deno.Conn,
+ byte: number,
+ count: number,
+ ) {
+ let buf = new Uint8Array(1 << 12 /* 4 kB */);
+ buf.fill(byte);
+
+ while (count > 0) {
+ buf = buf.subarray(0, Math.min(buf.length, count));
+ const nwritten = await conn.write(buf);
+ assertStrictEquals(nwritten, buf.length);
+ count -= nwritten;
+ }
+ }
+
+ async function receiveBytes(
+ conn: Deno.Conn,
+ byte: number,
+ count: number,
+ ) {
+ let buf = new Uint8Array(1 << 12 /* 4 kB */);
+ while (count > 0) {
+ buf = buf.subarray(0, Math.min(buf.length, count));
+ const r = await conn.read(buf);
+ assertNotEquals(r, null);
+ assert(buf.subarray(0, r!).every((b) => b === byte));
+ count -= r!;
+ }
+ }
+
+ async function receiveEof(conn: Deno.Conn) {
+ const buf = new Uint8Array(1);
+ const r = await conn.read(buf);
+ assertStrictEquals(r, null);
+ }
+
+ async function forwardBytes(
+ source: Deno.Conn,
+ sink: Deno.Conn,
+ count: number,
+ interruptPromise: ReturnType<typeof Promise.withResolvers<void>>,
+ ) {
+ let buf = new Uint8Array(1 << 12 /* 4 kB */);
+ while (count > 0) {
+ buf = buf.subarray(0, Math.min(buf.length, count));
+ const nread = await Promise.race([
+ source.read(buf),
+ interruptPromise.promise,
+ ]);
+ if (nread == null) break; // Either EOF or interrupted.
+ const nwritten = await sink.write(buf.subarray(0, nread));
+ assertStrictEquals(nread, nwritten);
+ count -= nwritten;
+ }
+ }
+}
+
+Deno.test(
+ { permissions: { read: true, net: true } },
+ async function tlsHandshakeWithTcpCorruptionImmediately() {
+ await tlsWithTcpFailureTestImpl("handshake", 0, "corruption", false);
+ await tlsWithTcpFailureTestImpl("handshake", 0, "corruption", true);
+ },
+);
+
+Deno.test(
+ { permissions: { read: true, net: true } },
+ async function tlsHandshakeWithTcpShutdownImmediately() {
+ await tlsWithTcpFailureTestImpl("handshake", 0, "shutdown", false);
+ await tlsWithTcpFailureTestImpl("handshake", 0, "shutdown", true);
+ },
+);
+
+Deno.test(
+ { permissions: { read: true, net: true } },
+ async function tlsHandshakeWithTcpCorruptionAfter70Bytes() {
+ await tlsWithTcpFailureTestImpl("handshake", 76, "corruption", false);
+ await tlsWithTcpFailureTestImpl("handshake", 78, "corruption", true);
+ },
+);
+
+Deno.test(
+ { permissions: { read: true, net: true } },
+ async function tlsHandshakeWithTcpShutdownAfter70bytes() {
+ await tlsWithTcpFailureTestImpl("handshake", 77, "shutdown", false);
+ await tlsWithTcpFailureTestImpl("handshake", 79, "shutdown", true);
+ },
+);
+
+Deno.test(
+ { permissions: { read: true, net: true } },
+ async function tlsHandshakeWithTcpCorruptionAfter200Bytes() {
+ await tlsWithTcpFailureTestImpl("handshake", 200, "corruption", false);
+ await tlsWithTcpFailureTestImpl("handshake", 202, "corruption", true);
+ },
+);
+
+Deno.test(
+ { permissions: { read: true, net: true } },
+ async function tlsHandshakeWithTcpShutdownAfter200bytes() {
+ await tlsWithTcpFailureTestImpl("handshake", 201, "shutdown", false);
+ await tlsWithTcpFailureTestImpl("handshake", 203, "shutdown", true);
+ },
+);
+
+Deno.test(
+ { permissions: { read: true, net: true } },
+ async function tlsTrafficWithTcpCorruption() {
+ await tlsWithTcpFailureTestImpl("traffic", Infinity, "corruption", false);
+ await tlsWithTcpFailureTestImpl("traffic", Infinity, "corruption", true);
+ },
+);
+
+Deno.test(
+ { permissions: { read: true, net: true } },
+ async function tlsTrafficWithTcpShutdown() {
+ await tlsWithTcpFailureTestImpl("traffic", Infinity, "shutdown", false);
+ await tlsWithTcpFailureTestImpl("traffic", Infinity, "shutdown", true);
+ },
+);
+
+function createHttpsListener(port: number): Deno.Listener {
+ // Query format: `curl --insecure https://localhost:8443/z/12345`
+ // The server returns a response consisting of 12345 times the letter 'z'.
+ const listener = Deno.listenTls({
+ hostname: "localhost",
+ port,
+ cert: Deno.readTextFileSync("./tests/testdata/tls/localhost.crt"),
+ key: Deno.readTextFileSync("./tests/testdata/tls/localhost.key"),
+ });
+
+ serve(listener);
+ return listener;
+
+ async function serve(listener: Deno.Listener) {
+ for await (const conn of listener) {
+ const EOL = "\r\n";
+
+ // Read GET request plus headers.
+ const buf = new Uint8Array(1 << 12 /* 4 kB */);
+ const decoder = new TextDecoder();
+ let req = "";
+ while (!req.endsWith(EOL + EOL)) {
+ const n = await conn.read(buf);
+ if (n === null) throw new Error("Unexpected EOF");
+ req += decoder.decode(buf.subarray(0, n));
+ }
+
+ // Parse GET request.
+ const { filler, count, version } =
+ /^GET \/(?<filler>[^\/]+)\/(?<count>\d+) HTTP\/(?<version>1\.\d)\r\n/
+ .exec(req)!.groups as {
+ filler: string;
+ count: string;
+ version: string;
+ };
+
+ // Generate response.
+ const resBody = new TextEncoder().encode(filler.repeat(+count));
+ const resHead = new TextEncoder().encode(
+ [
+ `HTTP/${version} 200 OK`,
+ `Content-Length: ${resBody.length}`,
+ "Content-Type: text/plain",
+ ].join(EOL) + EOL + EOL,
+ );
+
+ // Send response.
+ await writeAll(conn, resHead);
+ await writeAll(conn, resBody);
+
+ // Close TCP connection.
+ conn.close();
+ }
+ }
+}
+
+async function curl(url: string): Promise<string> {
+ const { success, code, stdout, stderr } = await new Deno.Command("curl", {
+ args: ["--insecure", url],
+ }).output();
+
+ if (!success) {
+ throw new Error(
+ `curl ${url} failed: ${code}:\n${new TextDecoder().decode(stderr)}`,
+ );
+ }
+ return new TextDecoder().decode(stdout);
+}
+
+Deno.test(
+ { permissions: { read: true, net: true, run: true } },
+ async function curlFakeHttpsServer() {
+ const port = getPort();
+ const listener = createHttpsListener(port);
+
+ const res1 = await curl(`https://localhost:${port}/d/1`);
+ assertStrictEquals(res1, "d");
+
+ const res2 = await curl(`https://localhost:${port}/e/12345`);
+ assertStrictEquals(res2, "e".repeat(12345));
+
+ const count3 = 1 << 17; // 128 kB.
+ const res3 = await curl(`https://localhost:${port}/n/${count3}`);
+ assertStrictEquals(res3, "n".repeat(count3));
+
+ const count4 = 12345678;
+ const res4 = await curl(`https://localhost:${port}/o/${count4}`);
+ assertStrictEquals(res4, "o".repeat(count4));
+
+ listener.close();
+ },
+);
+
+Deno.test(
+ // Ignored because gmail appears to reject us on CI sometimes
+ { ignore: true, permissions: { read: true, net: true } },
+ async function startTls() {
+ const hostname = "smtp.gmail.com";
+ const port = 587;
+ const encoder = new TextEncoder();
+
+ const conn = await Deno.connect({
+ hostname,
+ port,
+ });
+
+ let writer = new BufWriter(conn);
+ let reader = new TextProtoReader(new BufReader(conn));
+
+ let line: string | null = (await reader.readLine()) as string;
+ assert(line.startsWith("220"));
+
+ await writer.write(encoder.encode(`EHLO ${hostname}\r\n`));
+ await writer.flush();
+
+ while ((line = (await reader.readLine()) as string)) {
+ assert(line.startsWith("250"));
+ if (line.startsWith("250 ")) break;
+ }
+
+ await writer.write(encoder.encode("STARTTLS\r\n"));
+ await writer.flush();
+
+ line = await reader.readLine();
+
+ // Received the message that the server is ready to establish TLS
+ assertEquals(line, "220 2.0.0 Ready to start TLS");
+
+ const tlsConn = await Deno.startTls(conn, { hostname });
+ writer = new BufWriter(tlsConn);
+ reader = new TextProtoReader(new BufReader(tlsConn));
+
+ // After that use TLS communication again
+ await writer.write(encoder.encode(`EHLO ${hostname}\r\n`));
+ await writer.flush();
+
+ while ((line = (await reader.readLine()) as string)) {
+ assert(line.startsWith("250"));
+ if (line.startsWith("250 ")) break;
+ }
+
+ tlsConn.close();
+ },
+);
+
+Deno.test(
+ { permissions: { read: true, net: true } },
+ async function connectTLSBadClientCertPrivateKey(): Promise<void> {
+ await assertRejects(async () => {
+ await Deno.connectTls({
+ hostname: "deno.land",
+ port: 443,
+ certChain: "bad data",
+ privateKey: await Deno.readTextFile(
+ "tests/testdata/tls/localhost.key",
+ ),
+ });
+ }, Deno.errors.InvalidData);
+ },
+);
+
+Deno.test(
+ { permissions: { read: true, net: true } },
+ async function connectTLSBadPrivateKey(): Promise<void> {
+ await assertRejects(async () => {
+ await Deno.connectTls({
+ hostname: "deno.land",
+ port: 443,
+ certChain: await Deno.readTextFile(
+ "tests/testdata/tls/localhost.crt",
+ ),
+ privateKey: "bad data",
+ });
+ }, Deno.errors.InvalidData);
+ },
+);
+
+Deno.test(
+ { permissions: { read: true, net: true } },
+ async function connectTLSNotPrivateKey(): Promise<void> {
+ await assertRejects(async () => {
+ await Deno.connectTls({
+ hostname: "deno.land",
+ port: 443,
+ certChain: await Deno.readTextFile(
+ "tests/testdata/tls/localhost.crt",
+ ),
+ privateKey: "",
+ });
+ }, Deno.errors.InvalidData);
+ },
+);
+
+Deno.test(
+ { permissions: { read: true, net: true } },
+ async function connectWithClientCert() {
+ // The test_server running on port 4552 responds with 'PASS' if client
+ // authentication was successful. Try it by running test_server and
+ // curl --key tests/testdata/tls/localhost.key \
+ // --cert tests/testdata/tls/localhost.crt \
+ // --cacert tests/testdata/tls/RootCA.crt https://localhost:4552/
+ const conn = await Deno.connectTls({
+ hostname: "localhost",
+ port: 4552,
+ certChain: await Deno.readTextFile(
+ "tests/testdata/tls/localhost.crt",
+ ),
+ privateKey: await Deno.readTextFile(
+ "tests/testdata/tls/localhost.key",
+ ),
+ caCerts: [Deno.readTextFileSync("tests/testdata/tls/RootCA.pem")],
+ });
+ const result = decoder.decode(await readAll(conn));
+ assertEquals(result, "PASS");
+ conn.close();
+ },
+);
+
+Deno.test(
+ { permissions: { read: true, net: true } },
+ async function connectTLSCaCerts() {
+ const conn = await Deno.connectTls({
+ hostname: "localhost",
+ port: 4557,
+ caCerts: [Deno.readTextFileSync("tests/testdata/tls/RootCA.pem")],
+ });
+ const result = decoder.decode(await readAll(conn));
+ assertEquals(result, "PASS");
+ conn.close();
+ },
+);
+
+Deno.test(
+ { permissions: { read: true, net: true } },
+ async function connectTLSCertFile() {
+ const conn = await Deno.connectTls({
+ hostname: "localhost",
+ port: 4557,
+ certFile: "tests/testdata/tls/RootCA.pem",
+ });
+ const result = decoder.decode(await readAll(conn));
+ assertEquals(result, "PASS");
+ conn.close();
+ },
+);
+
+Deno.test(
+ { permissions: { read: true, net: true } },
+ async function startTLSCaCerts() {
+ const plainConn = await Deno.connect({
+ hostname: "localhost",
+ port: 4557,
+ });
+ const conn = await Deno.startTls(plainConn, {
+ hostname: "localhost",
+ caCerts: [Deno.readTextFileSync("tests/testdata/tls/RootCA.pem")],
+ });
+ const result = decoder.decode(await readAll(conn));
+ assertEquals(result, "PASS");
+ conn.close();
+ },
+);
+
+Deno.test(
+ { permissions: { read: true, net: true } },
+ async function tlsHandshakeSuccess() {
+ const hostname = "localhost";
+ const port = getPort();
+
+ const listener = Deno.listenTls({
+ hostname,
+ port,
+ cert: await Deno.readTextFile("tests/testdata/tls/localhost.crt"),
+ key: await Deno.readTextFile("tests/testdata/tls/localhost.key"),
+ });
+ const acceptPromise = listener.accept();
+ const connectPromise = Deno.connectTls({
+ hostname,
+ port,
+ certFile: "tests/testdata/tls/RootCA.crt",
+ });
+ const [conn1, conn2] = await Promise.all([acceptPromise, connectPromise]);
+ listener.close();
+
+ await Promise.all([conn1.handshake(), conn2.handshake()]);
+
+ // Begin sending a 10mb blob over the TLS connection.
+ const whole = new Uint8Array(10 << 20); // 10mb.
+ whole.fill(42);
+ const sendPromise = writeAll(conn1, whole);
+ // Set up the other end to receive half of the large blob.
+ const half = new Uint8Array(whole.byteLength / 2);
+ const receivePromise = readFull(conn2, half);
+
+ await conn1.handshake();
+ await conn2.handshake();
+
+ // Finish receiving the first 5mb.
+ assertEquals(await receivePromise, half.length);
+
+ // See that we can call `handshake()` in the middle of large reads and writes.
+ await conn1.handshake();
+ await conn2.handshake();
+
+ // Receive second half of large blob. Wait for the send promise and check it.
+ assertEquals(await readFull(conn2, half), half.length);
+ await sendPromise;
+
+ await conn1.handshake();
+ await conn2.handshake();
+
+ await conn1.closeWrite();
+ await conn2.closeWrite();
+
+ await conn1.handshake();
+ await conn2.handshake();
+
+ conn1.close();
+ conn2.close();
+
+ async function readFull(conn: Deno.Conn, buf: Uint8Array) {
+ let offset, n;
+ for (offset = 0; offset < buf.length; offset += n) {
+ n = await conn.read(buf.subarray(offset, buf.length));
+ assert(n != null && n > 0);
+ }
+ return offset;
+ }
+ },
+);
+
+Deno.test(
+ { permissions: { read: true, net: true } },
+ async function tlsHandshakeFailure() {
+ const hostname = "localhost";
+ const port = getPort();
+
+ async function server() {
+ const listener = Deno.listenTls({
+ hostname,
+ port,
+ cert: Deno.readTextFileSync("tests/testdata/tls/localhost.crt"),
+ key: Deno.readTextFileSync("tests/testdata/tls/localhost.key"),
+ });
+ for await (const conn of listener) {
+ for (let i = 0; i < 10; i++) {
+ // Handshake fails because the client rejects the server certificate.
+ await assertRejects(
+ () => conn.handshake(),
+ Deno.errors.InvalidData,
+ "received fatal alert",
+ );
+ }
+ conn.close();
+ break;
+ }
+ }
+
+ async function connectTlsClient() {
+ const conn = await Deno.connectTls({ hostname, port });
+ // Handshake fails because the server presents a self-signed certificate.
+ await assertRejects(
+ () => conn.handshake(),
+ Deno.errors.InvalidData,
+ "invalid peer certificate: UnknownIssuer",
+ );
+ conn.close();
+ }
+
+ await Promise.all([server(), connectTlsClient()]);
+
+ async function startTlsClient() {
+ const tcpConn = await Deno.connect({ hostname, port });
+ const tlsConn = await Deno.startTls(tcpConn, {
+ hostname: "foo.land",
+ caCerts: [Deno.readTextFileSync("tests/testdata/tls/RootCA.pem")],
+ });
+ // Handshake fails because hostname doesn't match the certificate.
+ await assertRejects(
+ () => tlsConn.handshake(),
+ Deno.errors.InvalidData,
+ "NotValidForName",
+ );
+ tlsConn.close();
+ }
+
+ await Promise.all([server(), startTlsClient()]);
+ },
+);
+
+Deno.test(
+ { permissions: { net: true } },
+ async function listenTlsWithReuseAddr() {
+ const deferred1 = Promise.withResolvers<void>();
+ const hostname = "localhost";
+ const port = 3500;
+
+ const listener1 = Deno.listenTls({ hostname, port, cert, key });
+
+ listener1.accept().then((conn) => {
+ conn.close();
+ deferred1.resolve();
+ });
+
+ const conn1 = await Deno.connectTls({ hostname, port, caCerts });
+ conn1.close();
+ await deferred1.promise;
+ listener1.close();
+
+ const deferred2 = Promise.withResolvers<void>();
+ const listener2 = Deno.listenTls({ hostname, port, cert, key });
+
+ listener2.accept().then((conn) => {
+ conn.close();
+ deferred2.resolve();
+ });
+
+ const conn2 = await Deno.connectTls({ hostname, port, caCerts });
+ conn2.close();
+ await deferred2.promise;
+ listener2.close();
+ },
+);
+
+Deno.test({
+ ignore: Deno.build.os !== "linux",
+ permissions: { net: true },
+}, async function listenTlsReusePort() {
+ const hostname = "localhost";
+ const port = 4003;
+ const listener1 = Deno.listenTls({
+ hostname,
+ port,
+ cert,
+ key,
+ reusePort: true,
+ });
+ const listener2 = Deno.listenTls({
+ hostname,
+ port,
+ cert,
+ key,
+ reusePort: true,
+ });
+ let p1;
+ let p2;
+ let listener1Recv = false;
+ let listener2Recv = false;
+ while (!listener1Recv || !listener2Recv) {
+ if (!p1) {
+ p1 = listener1.accept().then((conn) => {
+ conn.close();
+ listener1Recv = true;
+ p1 = undefined;
+ }).catch(() => {});
+ }
+ if (!p2) {
+ p2 = listener2.accept().then((conn) => {
+ conn.close();
+ listener2Recv = true;
+ p2 = undefined;
+ }).catch(() => {});
+ }
+ const conn = await Deno.connectTls({ hostname, port, caCerts });
+ conn.close();
+ await Promise.race([p1, p2]);
+ }
+ listener1.close();
+ listener2.close();
+});
+
+Deno.test({
+ ignore: Deno.build.os === "linux",
+ permissions: { net: true },
+}, function listenTlsReusePortDoesNothing() {
+ const hostname = "localhost";
+ const port = 4003;
+ const listener1 = Deno.listenTls({
+ hostname,
+ port,
+ cert,
+ key,
+ reusePort: true,
+ });
+ assertThrows(() => {
+ Deno.listenTls({ hostname, port, cert, key, reusePort: true });
+ }, Deno.errors.AddrInUse);
+ listener1.close();
+});
+
+Deno.test({
+ permissions: { net: true },
+}, function listenTlsDoesNotThrowOnStringPort() {
+ const listener = Deno.listenTls({
+ hostname: "localhost",
+ // @ts-ignore String port is not allowed by typing, but it shouldn't throw
+ // for backwards compatibility.
+ port: "0",
+ cert,
+ key,
+ });
+ listener.close();
+});
+
+Deno.test(
+ { permissions: { net: true, read: true } },
+ function listenTLSInvalidCert() {
+ assertThrows(() => {
+ Deno.listenTls({
+ hostname: "localhost",
+ port: 3500,
+ certFile: "tests/testdata/tls/invalid.crt",
+ keyFile: "tests/testdata/tls/localhost.key",
+ });
+ }, Deno.errors.InvalidData);
+ },
+);
+
+Deno.test(
+ { permissions: { net: true, read: true } },
+ function listenTLSInvalidKey() {
+ assertThrows(() => {
+ Deno.listenTls({
+ hostname: "localhost",
+ port: 3500,
+ certFile: "tests/testdata/tls/localhost.crt",
+ keyFile: "tests/testdata/tls/invalid.key",
+ });
+ }, Deno.errors.InvalidData);
+ },
+);
diff --git a/cli/tests/unit/truncate_test.ts b/tests/unit/truncate_test.ts
index 95b76052d..95b76052d 100644
--- a/cli/tests/unit/truncate_test.ts
+++ b/tests/unit/truncate_test.ts
diff --git a/cli/tests/unit/tty_color_test.ts b/tests/unit/tty_color_test.ts
index 6f26891e3..6f26891e3 100644
--- a/cli/tests/unit/tty_color_test.ts
+++ b/tests/unit/tty_color_test.ts
diff --git a/tests/unit/tty_test.ts b/tests/unit/tty_test.ts
new file mode 100644
index 000000000..f135ae7cf
--- /dev/null
+++ b/tests/unit/tty_test.ts
@@ -0,0 +1,32 @@
+// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
+import { assert } from "./test_util.ts";
+
+// Note tests for Deno.stdin.setRaw is in integration tests.
+
+Deno.test(function consoleSize() {
+ if (!Deno.stdout.isTerminal()) {
+ return;
+ }
+ const result = Deno.consoleSize();
+ assert(typeof result.columns !== "undefined");
+ assert(typeof result.rows !== "undefined");
+});
+
+Deno.test({ permissions: { read: true } }, function isatty() {
+ // CI not under TTY, so cannot test stdin/stdout/stderr.
+ const f = Deno.openSync("tests/testdata/assets/hello.txt");
+ assert(!Deno.isatty(f.rid));
+ f.close();
+});
+
+Deno.test(function isattyError() {
+ let caught = false;
+ try {
+ // Absurdly large rid.
+ Deno.isatty(0x7fffffff);
+ } catch (e) {
+ caught = true;
+ assert(e instanceof Deno.errors.BadResource);
+ }
+ assert(caught);
+});
diff --git a/cli/tests/unit/umask_test.ts b/tests/unit/umask_test.ts
index 0e97f0d35..0e97f0d35 100644
--- a/cli/tests/unit/umask_test.ts
+++ b/tests/unit/umask_test.ts
diff --git a/cli/tests/unit/url_search_params_test.ts b/tests/unit/url_search_params_test.ts
index c547ef938..c547ef938 100644
--- a/cli/tests/unit/url_search_params_test.ts
+++ b/tests/unit/url_search_params_test.ts
diff --git a/cli/tests/unit/url_test.ts b/tests/unit/url_test.ts
index b0dc86232..b0dc86232 100644
--- a/cli/tests/unit/url_test.ts
+++ b/tests/unit/url_test.ts
diff --git a/cli/tests/unit/urlpattern_test.ts b/tests/unit/urlpattern_test.ts
index 7730dbe40..7730dbe40 100644
--- a/cli/tests/unit/urlpattern_test.ts
+++ b/tests/unit/urlpattern_test.ts
diff --git a/cli/tests/unit/utime_test.ts b/tests/unit/utime_test.ts
index 9f5f25bee..9f5f25bee 100644
--- a/cli/tests/unit/utime_test.ts
+++ b/tests/unit/utime_test.ts
diff --git a/cli/tests/unit/version_test.ts b/tests/unit/version_test.ts
index 4eadb7620..4eadb7620 100644
--- a/cli/tests/unit/version_test.ts
+++ b/tests/unit/version_test.ts
diff --git a/cli/tests/unit/wasm_test.ts b/tests/unit/wasm_test.ts
index fab9c9308..fab9c9308 100644
--- a/cli/tests/unit/wasm_test.ts
+++ b/tests/unit/wasm_test.ts
diff --git a/tests/unit/webcrypto_test.ts b/tests/unit/webcrypto_test.ts
new file mode 100644
index 000000000..58f59edc6
--- /dev/null
+++ b/tests/unit/webcrypto_test.ts
@@ -0,0 +1,2047 @@
+// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
+
+import {
+ assert,
+ assertEquals,
+ assertNotEquals,
+ assertRejects,
+} from "./test_util.ts";
+
+// https://github.com/denoland/deno/issues/11664
+Deno.test(async function testImportArrayBufferKey() {
+ const subtle = window.crypto.subtle;
+ assert(subtle);
+
+ // deno-fmt-ignore
+ const key = new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]);
+
+ const cryptoKey = await subtle.importKey(
+ "raw",
+ key.buffer,
+ { name: "HMAC", hash: "SHA-1" },
+ true,
+ ["sign"],
+ );
+ assert(cryptoKey);
+
+ // Test key usage
+ await subtle.sign({ name: "HMAC" }, cryptoKey, new Uint8Array(8));
+});
+
+Deno.test(async function testSignVerify() {
+ const subtle = window.crypto.subtle;
+ assert(subtle);
+ for (const algorithm of ["RSA-PSS", "RSASSA-PKCS1-v1_5"]) {
+ for (
+ const hash of [
+ "SHA-1",
+ "SHA-256",
+ "SHA-384",
+ "SHA-512",
+ ]
+ ) {
+ const keyPair = await subtle.generateKey(
+ {
+ name: algorithm,
+ modulusLength: 2048,
+ publicExponent: new Uint8Array([1, 0, 1]),
+ hash,
+ },
+ true,
+ ["sign", "verify"],
+ );
+
+ const data = new Uint8Array([1, 2, 3]);
+
+ const signAlgorithm = { name: algorithm, saltLength: 32 };
+
+ const signature = await subtle.sign(
+ signAlgorithm,
+ keyPair.privateKey,
+ data,
+ );
+
+ assert(signature);
+ assert(signature.byteLength > 0);
+ assert(signature.byteLength % 8 == 0);
+ assert(signature instanceof ArrayBuffer);
+
+ const verified = await subtle.verify(
+ signAlgorithm,
+ keyPair.publicKey,
+ signature,
+ data,
+ );
+ assert(verified);
+ }
+ }
+});
+
+// deno-fmt-ignore
+const plainText = new Uint8Array([95, 77, 186, 79, 50, 12, 12, 232, 118, 114, 90, 252, 229, 251, 210, 91, 248, 62, 90, 113, 37, 160, 140, 175, 231, 60, 62, 186, 196, 33, 119, 157, 249, 213, 93, 24, 12, 58, 233, 148, 38, 69, 225, 216, 47, 238, 140, 157, 41, 75, 60, 177, 160, 138, 153, 49, 32, 27, 60, 14, 129, 252, 71, 202, 207, 131, 21, 162, 175, 102, 50, 65, 19, 195, 182, 98, 48, 195, 70, 8, 196, 244, 89, 54, 52, 206, 2, 178, 103, 54, 34, 119, 240, 168, 64, 202, 116, 188, 61, 26, 98, 54, 149, 44, 94, 215, 170, 248, 168, 254, 203, 221, 250, 117, 132, 230, 151, 140, 234, 93, 42, 91, 159, 183, 241, 180, 140, 139, 11, 229, 138, 48, 82, 2, 117, 77, 131, 118, 16, 115, 116, 121, 60, 240, 38, 170, 238, 83, 0, 114, 125, 131, 108, 215, 30, 113, 179, 69, 221, 178, 228, 68, 70, 255, 197, 185, 1, 99, 84, 19, 137, 13, 145, 14, 163, 128, 152, 74, 144, 25, 16, 49, 50, 63, 22, 219, 204, 157, 107, 225, 104, 184, 72, 133, 56, 76, 160, 62, 18, 96, 10, 193, 194, 72, 2, 138, 243, 114, 108, 201, 52, 99, 136, 46, 168, 192, 42, 171]);
+
+// Passing
+const hashPlainTextVector = [
+ {
+ hash: "SHA-1",
+ plainText: plainText.slice(0, 214),
+ },
+ {
+ hash: "SHA-256",
+ plainText: plainText.slice(0, 190),
+ },
+ {
+ hash: "SHA-384",
+ plainText: plainText.slice(0, 158),
+ },
+ {
+ hash: "SHA-512",
+ plainText: plainText.slice(0, 126),
+ },
+];
+
+Deno.test(async function testEncryptDecrypt() {
+ const subtle = window.crypto.subtle;
+ assert(subtle);
+ for (
+ const { hash, plainText } of hashPlainTextVector
+ ) {
+ const keyPair = await subtle.generateKey(
+ {
+ name: "RSA-OAEP",
+ modulusLength: 2048,
+ publicExponent: new Uint8Array([1, 0, 1]),
+ hash,
+ },
+ true,
+ ["encrypt", "decrypt"],
+ );
+
+ const encryptAlgorithm = { name: "RSA-OAEP" };
+ const cipherText = await subtle.encrypt(
+ encryptAlgorithm,
+ keyPair.publicKey,
+ plainText,
+ );
+
+ assert(cipherText);
+ assert(cipherText.byteLength > 0);
+ assertEquals(cipherText.byteLength * 8, 2048);
+ assert(cipherText instanceof ArrayBuffer);
+
+ const decrypted = await subtle.decrypt(
+ encryptAlgorithm,
+ keyPair.privateKey,
+ cipherText,
+ );
+ assert(decrypted);
+ assert(decrypted instanceof ArrayBuffer);
+ assertEquals(new Uint8Array(decrypted), plainText);
+
+ const badPlainText = new Uint8Array(plainText.byteLength + 1);
+ badPlainText.set(plainText, 0);
+ badPlainText.set(new Uint8Array([32]), plainText.byteLength);
+ await assertRejects(async () => {
+ // Should fail
+ await subtle.encrypt(
+ encryptAlgorithm,
+ keyPair.publicKey,
+ badPlainText,
+ );
+ throw new TypeError("unreachable");
+ }, DOMException);
+ }
+});
+
+Deno.test(async function testGenerateRSAKey() {
+ const subtle = window.crypto.subtle;
+ assert(subtle);
+
+ const keyPair = await subtle.generateKey(
+ {
+ name: "RSA-PSS",
+ modulusLength: 2048,
+ publicExponent: new Uint8Array([1, 0, 1]),
+ hash: "SHA-256",
+ },
+ true,
+ ["sign", "verify"],
+ );
+
+ assert(keyPair.privateKey);
+ assert(keyPair.publicKey);
+ assertEquals(keyPair.privateKey.extractable, true);
+ assert(keyPair.privateKey.usages.includes("sign"));
+});
+
+Deno.test(async function testGenerateHMACKey() {
+ const key = await window.crypto.subtle.generateKey(
+ {
+ name: "HMAC",
+ hash: "SHA-512",
+ },
+ true,
+ ["sign", "verify"],
+ );
+
+ assert(key);
+ assertEquals(key.extractable, true);
+ assert(key.usages.includes("sign"));
+});
+
+Deno.test(async function testECDSASignVerify() {
+ const key = await window.crypto.subtle.generateKey(
+ {
+ name: "ECDSA",
+ namedCurve: "P-384",
+ },
+ true,
+ ["sign", "verify"],
+ );
+
+ const encoder = new TextEncoder();
+ const encoded = encoder.encode("Hello, World!");
+ const signature = await window.crypto.subtle.sign(
+ { name: "ECDSA", hash: "SHA-384" },
+ key.privateKey,
+ encoded,
+ );
+
+ assert(signature);
+ assert(signature instanceof ArrayBuffer);
+
+ const verified = await window.crypto.subtle.verify(
+ { hash: { name: "SHA-384" }, name: "ECDSA" },
+ key.publicKey,
+ signature,
+ encoded,
+ );
+ assert(verified);
+});
+
+// Tests the "bad paths" as a temporary replacement for sign_verify/ecdsa WPT.
+Deno.test(async function testECDSASignVerifyFail() {
+ const key = await window.crypto.subtle.generateKey(
+ {
+ name: "ECDSA",
+ namedCurve: "P-384",
+ },
+ true,
+ ["sign", "verify"],
+ );
+
+ const encoded = new Uint8Array([1]);
+ // Signing with a public key (InvalidAccessError)
+ await assertRejects(async () => {
+ await window.crypto.subtle.sign(
+ { name: "ECDSA", hash: "SHA-384" },
+ key.publicKey,
+ new Uint8Array([1]),
+ );
+ throw new TypeError("unreachable");
+ }, DOMException);
+
+ // Do a valid sign for later verifying.
+ const signature = await window.crypto.subtle.sign(
+ { name: "ECDSA", hash: "SHA-384" },
+ key.privateKey,
+ encoded,
+ );
+
+ // Verifying with a private key (InvalidAccessError)
+ await assertRejects(async () => {
+ await window.crypto.subtle.verify(
+ { hash: { name: "SHA-384" }, name: "ECDSA" },
+ key.privateKey,
+ signature,
+ encoded,
+ );
+ throw new TypeError("unreachable");
+ }, DOMException);
+});
+
+// https://github.com/denoland/deno/issues/11313
+Deno.test(async function testSignRSASSAKey() {
+ const subtle = window.crypto.subtle;
+ assert(subtle);
+
+ const keyPair = await subtle.generateKey(
+ {
+ name: "RSASSA-PKCS1-v1_5",
+ modulusLength: 2048,
+ publicExponent: new Uint8Array([1, 0, 1]),
+ hash: "SHA-256",
+ },
+ true,
+ ["sign", "verify"],
+ );
+
+ assert(keyPair.privateKey);
+ assert(keyPair.publicKey);
+ assertEquals(keyPair.privateKey.extractable, true);
+ assert(keyPair.privateKey.usages.includes("sign"));
+
+ const encoder = new TextEncoder();
+ const encoded = encoder.encode("Hello, World!");
+
+ const signature = await window.crypto.subtle.sign(
+ { name: "RSASSA-PKCS1-v1_5" },
+ keyPair.privateKey,
+ encoded,
+ );
+
+ assert(signature);
+});
+
+// deno-fmt-ignore
+const rawKey = new Uint8Array([
+ 1, 2, 3, 4, 5, 6, 7, 8,
+ 9, 10, 11, 12, 13, 14, 15, 16
+]);
+
+const jwk: JsonWebKey = {
+ kty: "oct",
+ // unpadded base64 for rawKey.
+ k: "AQIDBAUGBwgJCgsMDQ4PEA",
+ alg: "HS256",
+ ext: true,
+ "key_ops": ["sign"],
+};
+
+Deno.test(async function subtleCryptoHmacImportExport() {
+ const key1 = await crypto.subtle.importKey(
+ "raw",
+ rawKey,
+ { name: "HMAC", hash: "SHA-256" },
+ true,
+ ["sign"],
+ );
+ const key2 = await crypto.subtle.importKey(
+ "jwk",
+ jwk,
+ { name: "HMAC", hash: "SHA-256" },
+ true,
+ ["sign"],
+ );
+ const actual1 = await crypto.subtle.sign(
+ { name: "HMAC" },
+ key1,
+ new Uint8Array([1, 2, 3, 4]),
+ );
+
+ const actual2 = await crypto.subtle.sign(
+ { name: "HMAC" },
+ key2,
+ new Uint8Array([1, 2, 3, 4]),
+ );
+ // deno-fmt-ignore
+ const expected = new Uint8Array([
+ 59, 170, 255, 216, 51, 141, 51, 194,
+ 213, 48, 41, 191, 184, 40, 216, 47,
+ 130, 165, 203, 26, 163, 43, 38, 71,
+ 23, 122, 222, 1, 146, 46, 182, 87,
+ ]);
+ assertEquals(
+ new Uint8Array(actual1),
+ expected,
+ );
+ assertEquals(
+ new Uint8Array(actual2),
+ expected,
+ );
+
+ const exportedKey1 = await crypto.subtle.exportKey("raw", key1);
+ assertEquals(new Uint8Array(exportedKey1), rawKey);
+
+ const exportedKey2 = await crypto.subtle.exportKey("jwk", key2);
+ assertEquals(exportedKey2, jwk);
+});
+
+// https://github.com/denoland/deno/issues/12085
+Deno.test(async function generateImportHmacJwk() {
+ const key = await crypto.subtle.generateKey(
+ {
+ name: "HMAC",
+ hash: "SHA-512",
+ },
+ true,
+ ["sign"],
+ );
+ assert(key);
+ assertEquals(key.type, "secret");
+ assertEquals(key.extractable, true);
+ assertEquals(key.usages, ["sign"]);
+
+ const exportedKey = await crypto.subtle.exportKey("jwk", key);
+ assertEquals(exportedKey.kty, "oct");
+ assertEquals(exportedKey.alg, "HS512");
+ assertEquals(exportedKey.key_ops, ["sign"]);
+ assertEquals(exportedKey.ext, true);
+ assert(typeof exportedKey.k == "string");
+ assertEquals(exportedKey.k.length, 171);
+});
+
+// 2048-bits publicExponent=65537
+const pkcs8TestVectors = [
+ // rsaEncryption
+ { pem: "tests/testdata/webcrypto/id_rsaEncryption.pem", hash: "SHA-256" },
+];
+
+Deno.test({ permissions: { read: true } }, async function importRsaPkcs8() {
+ const pemHeader = "-----BEGIN PRIVATE KEY-----";
+ const pemFooter = "-----END PRIVATE KEY-----";
+ for (const { pem, hash } of pkcs8TestVectors) {
+ const keyFile = await Deno.readTextFile(pem);
+ const pemContents = keyFile.substring(
+ pemHeader.length,
+ keyFile.length - pemFooter.length,
+ );
+ const binaryDerString = atob(pemContents);
+ const binaryDer = new Uint8Array(binaryDerString.length);
+ for (let i = 0; i < binaryDerString.length; i++) {
+ binaryDer[i] = binaryDerString.charCodeAt(i);
+ }
+
+ const key = await crypto.subtle.importKey(
+ "pkcs8",
+ binaryDer,
+ { name: "RSA-PSS", hash },
+ true,
+ ["sign"],
+ );
+
+ assert(key);
+ assertEquals(key.type, "private");
+ assertEquals(key.extractable, true);
+ assertEquals(key.usages, ["sign"]);
+ const algorithm = key.algorithm as RsaHashedKeyAlgorithm;
+ assertEquals(algorithm.name, "RSA-PSS");
+ assertEquals(algorithm.hash.name, hash);
+ assertEquals(algorithm.modulusLength, 2048);
+ assertEquals(algorithm.publicExponent, new Uint8Array([1, 0, 1]));
+ }
+});
+
+const nonInteroperableVectors = [
+ // id-RSASSA-PSS (sha256)
+ // `openssl genpkey -algorithm rsa-pss -pkeyopt rsa_pss_keygen_md:sha256 -out id_rsassaPss.pem`
+ { pem: "tests/testdata/webcrypto/id_rsassaPss.pem", hash: "SHA-256" },
+ // id-RSASSA-PSS (default parameters)
+ // `openssl genpkey -algorithm rsa-pss -out id_rsassaPss.pem`
+ {
+ pem: "tests/testdata/webcrypto/id_rsassaPss_default.pem",
+ hash: "SHA-1",
+ },
+ // id-RSASSA-PSS (default hash)
+ // `openssl genpkey -algorithm rsa-pss -pkeyopt rsa_pss_keygen_saltlen:30 -out rsaPss_saltLen_30.pem`
+ {
+ pem: "tests/testdata/webcrypto/id_rsassaPss_saltLen_30.pem",
+ hash: "SHA-1",
+ },
+];
+
+Deno.test(
+ { permissions: { read: true } },
+ async function importNonInteroperableRsaPkcs8() {
+ const pemHeader = "-----BEGIN PRIVATE KEY-----";
+ const pemFooter = "-----END PRIVATE KEY-----";
+ for (const { pem, hash } of nonInteroperableVectors) {
+ const keyFile = await Deno.readTextFile(pem);
+ const pemContents = keyFile.substring(
+ pemHeader.length,
+ keyFile.length - pemFooter.length,
+ );
+ const binaryDerString = atob(pemContents);
+ const binaryDer = new Uint8Array(binaryDerString.length);
+ for (let i = 0; i < binaryDerString.length; i++) {
+ binaryDer[i] = binaryDerString.charCodeAt(i);
+ }
+
+ await assertRejects(
+ () =>
+ crypto.subtle.importKey(
+ "pkcs8",
+ binaryDer,
+ { name: "RSA-PSS", hash },
+ true,
+ ["sign"],
+ ),
+ DOMException,
+ "unsupported algorithm",
+ );
+ }
+ },
+);
+
+// deno-fmt-ignore
+const asn1AlgorithmIdentifier = new Uint8Array([
+ 0x02, 0x01, 0x00, // INTEGER
+ 0x30, 0x0d, // SEQUENCE (2 elements)
+ 0x06, 0x09, // OBJECT IDENTIFIER
+ 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, // 1.2.840.113549.1.1.1 (rsaEncryption)
+ 0x05, 0x00, // NULL
+]);
+
+Deno.test(async function rsaExport() {
+ for (const algorithm of ["RSASSA-PKCS1-v1_5", "RSA-PSS", "RSA-OAEP"]) {
+ const keyPair = await crypto.subtle.generateKey(
+ {
+ name: algorithm,
+ modulusLength: 2048,
+ publicExponent: new Uint8Array([1, 0, 1]),
+ hash: "SHA-256",
+ },
+ true,
+ algorithm !== "RSA-OAEP" ? ["sign", "verify"] : ["encrypt", "decrypt"],
+ );
+
+ assert(keyPair.privateKey);
+ assert(keyPair.publicKey);
+ assertEquals(keyPair.privateKey.extractable, true);
+
+ const exportedPrivateKey = await crypto.subtle.exportKey(
+ "pkcs8",
+ keyPair.privateKey,
+ );
+
+ assert(exportedPrivateKey);
+ assert(exportedPrivateKey instanceof ArrayBuffer);
+
+ const pkcs8 = new Uint8Array(exportedPrivateKey);
+ assert(pkcs8.length > 0);
+
+ assertEquals(
+ pkcs8.slice(4, asn1AlgorithmIdentifier.byteLength + 4),
+ asn1AlgorithmIdentifier,
+ );
+
+ const exportedPublicKey = await crypto.subtle.exportKey(
+ "spki",
+ keyPair.publicKey,
+ );
+
+ const spki = new Uint8Array(exportedPublicKey);
+ assert(spki.length > 0);
+
+ assertEquals(
+ spki.slice(4, asn1AlgorithmIdentifier.byteLength + 1),
+ asn1AlgorithmIdentifier.slice(3),
+ );
+ }
+});
+
+Deno.test(async function testHkdfDeriveBits() {
+ const rawKey = crypto.getRandomValues(new Uint8Array(16));
+ const key = await crypto.subtle.importKey(
+ "raw",
+ rawKey,
+ { name: "HKDF", hash: "SHA-256" },
+ false,
+ ["deriveBits"],
+ );
+ const salt = crypto.getRandomValues(new Uint8Array(16));
+ const info = crypto.getRandomValues(new Uint8Array(16));
+ const result = await crypto.subtle.deriveBits(
+ {
+ name: "HKDF",
+ hash: "SHA-256",
+ salt: salt,
+ info: info,
+ },
+ key,
+ 128,
+ );
+ assertEquals(result.byteLength, 128 / 8);
+});
+
+Deno.test(async function testHkdfDeriveBitsWithLargeKeySize() {
+ const key = await crypto.subtle.importKey(
+ "raw",
+ new Uint8Array([0x00]),
+ "HKDF",
+ false,
+ ["deriveBits"],
+ );
+ await assertRejects(
+ () =>
+ crypto.subtle.deriveBits(
+ {
+ name: "HKDF",
+ hash: "SHA-1",
+ salt: new Uint8Array(),
+ info: new Uint8Array(),
+ },
+ key,
+ ((20 * 255) << 3) + 8,
+ ),
+ DOMException,
+ "The length provided for HKDF is too large",
+ );
+});
+
+Deno.test(async function testEcdhDeriveBitsWithShorterLength() {
+ const keypair = await crypto.subtle.generateKey(
+ {
+ name: "ECDH",
+ namedCurve: "P-384",
+ },
+ true,
+ ["deriveBits", "deriveKey"],
+ );
+ const result = await crypto.subtle.deriveBits(
+ {
+ name: "ECDH",
+ public: keypair.publicKey,
+ },
+ keypair.privateKey,
+ 256,
+ );
+ assertEquals(result.byteLength * 8, 256);
+});
+
+Deno.test(async function testEcdhDeriveBitsWithLongerLength() {
+ const keypair = await crypto.subtle.generateKey(
+ {
+ name: "ECDH",
+ namedCurve: "P-384",
+ },
+ true,
+ ["deriveBits", "deriveKey"],
+ );
+ await assertRejects(
+ () =>
+ crypto.subtle.deriveBits(
+ {
+ name: "ECDH",
+ public: keypair.publicKey,
+ },
+ keypair.privateKey,
+ 512,
+ ),
+ DOMException,
+ "Invalid length",
+ );
+});
+
+Deno.test(async function testEcdhDeriveBitsWithNullLength() {
+ const keypair = await crypto.subtle.generateKey(
+ {
+ name: "ECDH",
+ namedCurve: "P-384",
+ },
+ true,
+ ["deriveBits", "deriveKey"],
+ );
+ const result = await crypto.subtle.deriveBits(
+ {
+ name: "ECDH",
+ public: keypair.publicKey,
+ },
+ keypair.privateKey,
+ // @ts-ignore: necessary until .d.ts file allows passing null (see https://github.com/microsoft/TypeScript-DOM-lib-generator/pull/1416)
+ null,
+ );
+ assertEquals(result.byteLength * 8, 384);
+});
+
+Deno.test(async function testDeriveKey() {
+ // Test deriveKey
+ const rawKey = crypto.getRandomValues(new Uint8Array(16));
+ const key = await crypto.subtle.importKey(
+ "raw",
+ rawKey,
+ "PBKDF2",
+ false,
+ ["deriveKey", "deriveBits"],
+ );
+
+ const salt = crypto.getRandomValues(new Uint8Array(16));
+ const derivedKey = await crypto.subtle.deriveKey(
+ {
+ name: "PBKDF2",
+ salt,
+ iterations: 1000,
+ hash: "SHA-256",
+ },
+ key,
+ { name: "HMAC", hash: "SHA-256" },
+ true,
+ ["sign"],
+ );
+
+ assert(derivedKey instanceof CryptoKey);
+ assertEquals(derivedKey.type, "secret");
+ assertEquals(derivedKey.extractable, true);
+ assertEquals(derivedKey.usages, ["sign"]);
+
+ const algorithm = derivedKey.algorithm as HmacKeyAlgorithm;
+ assertEquals(algorithm.name, "HMAC");
+ assertEquals(algorithm.hash.name, "SHA-256");
+ assertEquals(algorithm.length, 512);
+});
+
+Deno.test(async function testAesCbcEncryptDecrypt() {
+ const key = await crypto.subtle.generateKey(
+ { name: "AES-CBC", length: 128 },
+ true,
+ ["encrypt", "decrypt"],
+ );
+
+ const iv = crypto.getRandomValues(new Uint8Array(16));
+ const encrypted = await crypto.subtle.encrypt(
+ {
+ name: "AES-CBC",
+ iv,
+ },
+ key as CryptoKey,
+ new Uint8Array([1, 2, 3, 4, 5, 6]),
+ );
+
+ assert(encrypted instanceof ArrayBuffer);
+ assertEquals(encrypted.byteLength, 16);
+
+ const decrypted = await crypto.subtle.decrypt(
+ {
+ name: "AES-CBC",
+ iv,
+ },
+ key as CryptoKey,
+ encrypted,
+ );
+
+ assert(decrypted instanceof ArrayBuffer);
+ assertEquals(decrypted.byteLength, 6);
+ assertEquals(new Uint8Array(decrypted), new Uint8Array([1, 2, 3, 4, 5, 6]));
+});
+
+Deno.test(async function testAesCtrEncryptDecrypt() {
+ async function aesCtrRoundTrip(
+ key: CryptoKey,
+ counter: Uint8Array,
+ length: number,
+ plainText: Uint8Array,
+ ) {
+ const cipherText = await crypto.subtle.encrypt(
+ {
+ name: "AES-CTR",
+ counter,
+ length,
+ },
+ key,
+ plainText,
+ );
+
+ assert(cipherText instanceof ArrayBuffer);
+ assertEquals(cipherText.byteLength, plainText.byteLength);
+ assertNotEquals(new Uint8Array(cipherText), plainText);
+
+ const decryptedText = await crypto.subtle.decrypt(
+ {
+ name: "AES-CTR",
+ counter,
+ length,
+ },
+ key,
+ cipherText,
+ );
+
+ assert(decryptedText instanceof ArrayBuffer);
+ assertEquals(decryptedText.byteLength, plainText.byteLength);
+ assertEquals(new Uint8Array(decryptedText), plainText);
+ }
+ for (const keySize of [128, 192, 256]) {
+ const key = await crypto.subtle.generateKey(
+ { name: "AES-CTR", length: keySize },
+ true,
+ ["encrypt", "decrypt"],
+ ) as CryptoKey;
+
+ // test normal operation
+ for (const length of [128 /*, 64, 128 */]) {
+ const counter = crypto.getRandomValues(new Uint8Array(16));
+
+ await aesCtrRoundTrip(
+ key,
+ counter,
+ length,
+ new Uint8Array([1, 2, 3, 4, 5, 6]),
+ );
+ }
+
+ // test counter-wrapping
+ for (const length of [32, 64, 128]) {
+ const plaintext1 = crypto.getRandomValues(new Uint8Array(32));
+ const counter = new Uint8Array(16);
+
+ // fixed upper part
+ for (let off = 0; off < 16 - (length / 8); ++off) {
+ counter[off] = off;
+ }
+ const ciphertext1 = await crypto.subtle.encrypt(
+ {
+ name: "AES-CTR",
+ counter,
+ length,
+ },
+ key,
+ plaintext1,
+ );
+
+ // Set lower [length] counter bits to all '1's
+ for (let off = 16 - (length / 8); off < 16; ++off) {
+ counter[off] = 0xff;
+ }
+
+ // = [ 1 block of 0x00 + plaintext1 ]
+ const plaintext2 = new Uint8Array(48);
+ plaintext2.set(plaintext1, 16);
+
+ const ciphertext2 = await crypto.subtle.encrypt(
+ {
+ name: "AES-CTR",
+ counter,
+ length,
+ },
+ key,
+ plaintext2,
+ );
+
+ // If counter wrapped, 2nd block of ciphertext2 should be equal to 1st block of ciphertext1
+ // since ciphertext1 used counter = 0x00...00
+ // and ciphertext2 used counter = 0xFF..FF which should wrap to 0x00..00 without affecting
+ // higher bits
+ assertEquals(
+ new Uint8Array(ciphertext1),
+ new Uint8Array(ciphertext2).slice(16),
+ );
+ }
+ }
+});
+
+Deno.test(async function testECDH() {
+ for (const keySize of [256, 384]) {
+ const keyPair = await crypto.subtle.generateKey(
+ {
+ name: "ECDH",
+ namedCurve: "P-" + keySize,
+ },
+ true,
+ ["deriveBits"],
+ );
+
+ const derivedKey = await crypto.subtle.deriveBits(
+ {
+ name: "ECDH",
+ public: keyPair.publicKey,
+ },
+ keyPair.privateKey,
+ keySize,
+ );
+
+ assert(derivedKey instanceof ArrayBuffer);
+ assertEquals(derivedKey.byteLength, keySize / 8);
+ }
+});
+
+Deno.test(async function testWrapKey() {
+ // Test wrapKey
+ const key = await crypto.subtle.generateKey(
+ {
+ name: "RSA-OAEP",
+ modulusLength: 4096,
+ publicExponent: new Uint8Array([1, 0, 1]),
+ hash: "SHA-256",
+ },
+ true,
+ ["wrapKey", "unwrapKey"],
+ );
+
+ const hmacKey = await crypto.subtle.generateKey(
+ {
+ name: "HMAC",
+ hash: "SHA-256",
+ length: 128,
+ },
+ true,
+ ["sign"],
+ );
+
+ const wrappedKey = await crypto.subtle.wrapKey(
+ "raw",
+ hmacKey,
+ key.publicKey,
+ {
+ name: "RSA-OAEP",
+ label: new Uint8Array(8),
+ },
+ );
+
+ assert(wrappedKey instanceof ArrayBuffer);
+ assertEquals(wrappedKey.byteLength, 512);
+});
+
+// Doesn't need to cover all cases.
+// Only for testing types.
+Deno.test(async function testAesKeyGen() {
+ const key = await crypto.subtle.generateKey(
+ {
+ name: "AES-GCM",
+ length: 256,
+ },
+ true,
+ ["encrypt", "decrypt"],
+ );
+
+ assert(key);
+ assertEquals(key.type, "secret");
+ assertEquals(key.extractable, true);
+ assertEquals(key.usages, ["encrypt", "decrypt"]);
+ const algorithm = key.algorithm as AesKeyAlgorithm;
+ assertEquals(algorithm.name, "AES-GCM");
+ assertEquals(algorithm.length, 256);
+});
+
+Deno.test(async function testUnwrapKey() {
+ const subtle = crypto.subtle;
+
+ const AES_KEY: AesKeyAlgorithm & AesCbcParams = {
+ name: "AES-CBC",
+ length: 128,
+ iv: new Uint8Array(16),
+ };
+
+ const RSA_KEY: RsaHashedKeyGenParams & RsaOaepParams = {
+ name: "RSA-OAEP",
+ modulusLength: 2048,
+ publicExponent: new Uint8Array([1, 0, 1]),
+ hash: "SHA-1",
+ };
+
+ const aesKey = await subtle.generateKey(AES_KEY, true, [
+ "encrypt",
+ "decrypt",
+ ]);
+
+ const rsaKeyPair = await subtle.generateKey(
+ {
+ name: "RSA-OAEP",
+ hash: "SHA-1",
+ publicExponent: new Uint8Array([1, 0, 1]),
+ modulusLength: 2048,
+ },
+ false,
+ ["wrapKey", "encrypt", "unwrapKey", "decrypt"],
+ );
+
+ const enc = await subtle.wrapKey(
+ "raw",
+ aesKey,
+ rsaKeyPair.publicKey,
+ RSA_KEY,
+ );
+ const unwrappedKey = await subtle.unwrapKey(
+ "raw",
+ enc,
+ rsaKeyPair.privateKey,
+ RSA_KEY,
+ AES_KEY,
+ false,
+ ["encrypt", "decrypt"],
+ );
+
+ assert(unwrappedKey instanceof CryptoKey);
+ assertEquals(unwrappedKey.type, "secret");
+ assertEquals(unwrappedKey.extractable, false);
+ assertEquals(unwrappedKey.usages, ["encrypt", "decrypt"]);
+});
+
+Deno.test(async function testDecryptWithInvalidIntializationVector() {
+ // deno-fmt-ignore
+ const data = new Uint8Array([42,42,42,42,42,42,42,42,42,42,42,42,42,42,42]);
+ const key = await crypto.subtle.importKey(
+ "raw",
+ new Uint8Array(16),
+ { name: "AES-CBC", length: 256 },
+ true,
+ ["encrypt", "decrypt"],
+ );
+ // deno-fmt-ignore
+ const initVector = new Uint8Array([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]);
+ const encrypted = await crypto.subtle.encrypt(
+ { name: "AES-CBC", iv: initVector },
+ key,
+ data,
+ );
+ // deno-fmt-ignore
+ const initVector2 = new Uint8Array([15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0]);
+ await assertRejects(async () => {
+ await crypto.subtle.decrypt(
+ { name: "AES-CBC", iv: initVector2 },
+ key,
+ encrypted,
+ );
+ }, DOMException);
+});
+
+const jwtRSAKeys = {
+ "1024": {
+ size: 1024,
+ publicJWK: {
+ kty: "RSA",
+ n: "zZn4sRGfjQos56yL_Qy1R9NI-THMnFynn94g5RxA6wGrJh4BJT3x6I9x0IbpS3q-d4ORA6R2vuDMh8dDFRr9RDH6XY-gUScc9U5Jz3UA2KmVfsCbnUPvcAmMV_ENA7_TF0ivVjuIFodyDTx7EKHNVTrHHSlrbt7spbmcivs23Zc",
+ e: "AQAB",
+ },
+ privateJWK: {
+ kty: "RSA",
+ n: "zZn4sRGfjQos56yL_Qy1R9NI-THMnFynn94g5RxA6wGrJh4BJT3x6I9x0IbpS3q-d4ORA6R2vuDMh8dDFRr9RDH6XY-gUScc9U5Jz3UA2KmVfsCbnUPvcAmMV_ENA7_TF0ivVjuIFodyDTx7EKHNVTrHHSlrbt7spbmcivs23Zc",
+ e: "AQAB",
+ d: "YqIK_GdH85F-GWZdgfgmv15NE78gOaL5h2g4v7DeM9-JC7A5PHSLKNYn87HFGcC4vv0PBIBRtyCA_mJJfEaGWORVCOXSBpWNepMYpio52n3w5uj5UZEsBnbtZc0EtWhVF2Auqa7VbiKrWcQUEgEI8V0gE5D4tyBg8GXv9975dQE",
+ p: "9BrAg5L1zfqGPuWJDuDCBX-TmtZdrOI3Ys4ZaN-yMPlTjwWSEPO0qnfjEZcw2VgXHgJJmbVco6TxckJCmEYqeQ",
+ q: "157jDJ1Ya5nmQvTPbhKAPAeMWogxCyaQTkBrp30pEKd6mGSB385hqr4BIk8s3f7MdXpM-USpaZgUoT4o_2VEjw",
+ dp:
+ "qdd_QUzcaB-6jkKo1Ug-1xKIAgDLFsIjJUUfWt_iHL8ti2Kl2dOnTcCypgebPm5TT1bqHN-agGYAdK5zpX2UiQ",
+ dq:
+ "hNRfwOSplNfhLvxLUN7a2qA3yYm-1MSz_1DWQP7srlLORlUcYPht2FZmsnEeDcAqynBGPQUcbG2Av_hgHz2OZw",
+ qi:
+ "zbpJQAhinrxSbVKxBQ2EZGFUD2e3WCXbAJRYpk8HVQ5AA52OhKTicOye2hEHnrgpFKzC8iznTsCG3FMkvwcj4Q",
+ },
+ },
+
+ "2048": {
+ size: 2048,
+ publicJWK: {
+ kty: "RSA",
+ // unpadded base64 for rawKey.
+ n: "09eVwAhT9SPBxdEN-74BBeEANGaVGwqH-YglIc4VV7jfhR2by5ivzVq8NCeQ1_ACDIlTDY8CTMQ5E1c1SEXmo_T7q84XUGXf8U9mx6uRg46sV7fF-hkwJR80BFVsvWxp4ahPlVJYj__94ft7rIVvchb5tyalOjrYFCJoFnSgq-i3ZjU06csI9XnO5klINucD_Qq0vUhO23_Add2HSYoRjab8YiJJR_Eths7Pq6HHd2RSXmwYp5foRnwe0_U75XmesHWDJlJUHYbwCZo0kP9G8g4QbucwU-MSNBkZOO2x2ZtZNexpHd0ThkATbnNlpVG_z2AGNORp_Ve3rlXwrGIXXw",
+ e: "AQAB",
+ },
+ privateJWK: {
+ kty: "RSA",
+ // unpadded base64 for rawKey.
+ n: "09eVwAhT9SPBxdEN-74BBeEANGaVGwqH-YglIc4VV7jfhR2by5ivzVq8NCeQ1_ACDIlTDY8CTMQ5E1c1SEXmo_T7q84XUGXf8U9mx6uRg46sV7fF-hkwJR80BFVsvWxp4ahPlVJYj__94ft7rIVvchb5tyalOjrYFCJoFnSgq-i3ZjU06csI9XnO5klINucD_Qq0vUhO23_Add2HSYoRjab8YiJJR_Eths7Pq6HHd2RSXmwYp5foRnwe0_U75XmesHWDJlJUHYbwCZo0kP9G8g4QbucwU-MSNBkZOO2x2ZtZNexpHd0ThkATbnNlpVG_z2AGNORp_Ve3rlXwrGIXXw",
+ e: "AQAB",
+ d: "H4xboN2co0VP9kXL71G8lUOM5EDis8Q9u8uqu_4U75t4rjpamVeD1vFMVfgOehokM_m_hKVnkkcmuNqj9L90ObaiRFPM5QxG7YkFpXbHlPAKeoXD1hsqMF0VQg_2wb8DhberInHA_rEA_kaVhHvavQLu7Xez45gf1d_J4I4931vjlCB6cupbLL0H5hHsxbMsX_5nnmAJdL_U3gD-U7ZdQheUPhDBJR2KeGzvnTm3KVKpOnwn-1Cd45MU4-KDdP0FcBVEuBsSrsQHliTaciBgkbyj__BangPj3edDxTkb-fKkEvhkXRjAoJs1ixt8nfSGDce9cM_GqAX9XGb4s2QkAQ",
+ dp:
+ "mM82RBwzGzi9LAqjGbi-badLtHRRBoH9sfMrJuOtzxRnmwBFccg_lwy-qAhUTqnN9kvD0H1FzXWzoFPFJbyi-AOmumYGpWm_PvzQGldne5CPJ02pYaeg-t1BePsT3OpIq0Am8E2Kjf9polpRJwIjO7Kx8UJKkhg5bISnsy0V8wE",
+ dq:
+ "ZlM4AvrWIpXwqsH_5Q-6BsLJdbnN_GypFCXoT9VXniXncSBZIWCkgDndBdWkSzyzIN65NiMRBfZaf9yduTFj4kvOPwb3ch3J0OxGJk0Ary4OGSlS1zNwMl93ALGal1FzpWUuiia9L9RraGqXAUr13L7TIIMRobRjpAV-z7M-ruM",
+ p: "7VwGt_tJcAFQHrmDw5dM1EBru6fidM45NDv6VVOEbxKuD5Sh2EfAHfm5c6oouA1gZqwvKH0sn_XpB1NsyYyHEQd3sBVdK0zRjTo-E9mRP-1s-LMd5YDXVq6HE339nxpXsmO25slQEF6zBrj1bSNNXBFc7fgDnlq-HIeleMvsY_E",
+ q: "5HqMHLzb4IgXhUl4pLz7E4kjY8PH2YGzaQfK805zJMbOXzmlZK0hizKo34Qqd2nB9xos7QgzOYQrNfSWheARwVsSQzAE0vGvw3zHIPP_lTtChBlCTPctQcURjw4dXcnK1oQ-IT321FNOW3EO-YTsyGcypJqJujlZrLbxYjOjQE8",
+ qi:
+ "OQXzi9gypDnpdHatIi0FaUGP8LSzfVH0AUugURJXs4BTJpvA9y4hcpBQLrcl7H_vq6kbGmvC49V-9I5HNVX_AuxGIXKuLZr5WOxPq8gLTqHV7X5ZJDtWIP_nq2NNgCQQyNNRrxebiWlwGK9GnX_unewT6jopI_oFhwp0Q13rBR0",
+ },
+ },
+ "4096": {
+ size: 4096,
+ publicJWK: {
+ kty: "RSA",
+ n: "2qr2TL2c2JmbsN0OLIRnaAB_ZKb1-Gh9H0qb4lrBuDaqkW_eFPwT-JIsvnNJvDT7BLJ57tTMIj56ZMtv6efSSTWSk9MOoW2J1K_iEretZ2cegB_aRX7qQVjnoFsz9U02BKfAIUT0o_K7b9G08d1rrAUohi_SVQhwObodg7BddMbKUmz70QNIS487LN44WUVnn9OgE9atTYUARNukT0DuQb3J-K20ksTuVujXbSelohDmLobqlGoi5sY_548Qs9BtFmQ2nGuEHNB2zdlZ5EvEqbUFVZ2QboG6jXdoos6qcwdgUvAhj1Hz10Ngic_RFqL7bNDoIOzNp66hdA35uxbwuaygZ16ikxoPj7eTYud1hrkyQCgeGw2YhCiKIE6eos_U5dL7WHRD5aSkkzsgXtnF8pVmStsuf0QcdAoC-eeCex0tSTgRw9AtGTz8Yr1tGQD9l_580zAXnE6jmrwRRQ68EEA7vohGov3tnG8pGyg_zcxeADLtPlfTc1tEwmh3SGrioDClioYCipm1JvkweEgP9eMPpEC8SgRU1VNDSVe1SF4uNsH8vA7PHFKfg6juqJEc5ht-l10FYER-Qq6bZXsU2oNcfE5SLDeLTWmxiHmxK00M8ABMFIV5gUkPoMiWcl87O6XwzA2chsIERp7Vb-Vn2O-EELiXzv7lPhc6fTGQ0Nc",
+ e: "AQAB",
+ },
+ privateJWK: {
+ kty: "RSA",
+ n: "2qr2TL2c2JmbsN0OLIRnaAB_ZKb1-Gh9H0qb4lrBuDaqkW_eFPwT-JIsvnNJvDT7BLJ57tTMIj56ZMtv6efSSTWSk9MOoW2J1K_iEretZ2cegB_aRX7qQVjnoFsz9U02BKfAIUT0o_K7b9G08d1rrAUohi_SVQhwObodg7BddMbKUmz70QNIS487LN44WUVnn9OgE9atTYUARNukT0DuQb3J-K20ksTuVujXbSelohDmLobqlGoi5sY_548Qs9BtFmQ2nGuEHNB2zdlZ5EvEqbUFVZ2QboG6jXdoos6qcwdgUvAhj1Hz10Ngic_RFqL7bNDoIOzNp66hdA35uxbwuaygZ16ikxoPj7eTYud1hrkyQCgeGw2YhCiKIE6eos_U5dL7WHRD5aSkkzsgXtnF8pVmStsuf0QcdAoC-eeCex0tSTgRw9AtGTz8Yr1tGQD9l_580zAXnE6jmrwRRQ68EEA7vohGov3tnG8pGyg_zcxeADLtPlfTc1tEwmh3SGrioDClioYCipm1JvkweEgP9eMPpEC8SgRU1VNDSVe1SF4uNsH8vA7PHFKfg6juqJEc5ht-l10FYER-Qq6bZXsU2oNcfE5SLDeLTWmxiHmxK00M8ABMFIV5gUkPoMiWcl87O6XwzA2chsIERp7Vb-Vn2O-EELiXzv7lPhc6fTGQ0Nc",
+ e: "AQAB",
+ d: "uXPRXBhcE5-DWabBRKQuhxgU8ype5gTISWefeYP7U96ZHqu_sBByZ5ihdgyU9pgAZGVx4Ep9rnVKnH2lNr2zrP9Qhyqy99nM0aMxmypIWLAuP__DwLj4t99M4sU29c48CAq1egHfccSFjzpNuetOTCA71EJuokt70pm0OmGzgTyvjuR7VTLxd5PMXitBowSn8_cphmnFpT8tkTiuy8CH0R3DU7MOuINomDD1s8-yPBcVAVTPUnwJiauNuzestLQKMLlhT5wn-cAbYk36XRKdgkjSc2AkhHRl4WDqT1nzWYdh_DVIYSLiKSktkPO9ovMrRYiPtozfhl0m9SR9Ll0wXtcnnDlWXc_MSGpw18vmUBSJ4PIhkiFsvLn-db3wUkA8uve-iqqfk0sxlGWughWx03kGmZDmprWbXugCBHfsI4X93w4exznXH_tapxPnmjbhVUQR6p41MvO2lcHWPLwGJgLIoejBHpnn3TmMN0UjFZki7q9B_dJ3fXh0mX9DzAlC0sil1NgCPhMPq02393_giinQquMknrBvgKxGSfGUrDKuflCx611ZZlRM3R7YMX2OIy1g4DyhPzBVjxRMtm8PnIs3m3Hi-O-C_PHF93w9J8Wqd0yIw7SpavDqZXLPC6Cqi8K7MBZyVECXHtRj1bBqT-h_xZmFCDjSU0NqfOdgApE",
+ p: "9NrXwq4kY9kBBOwLoFZVQc4kJI_NbKa_W9FLdQdRIbMsZZHXJ3XDUR9vJAcaaR75WwIC7X6N55nVtWTq28Bys9flJ9RrCTfciOntHEphBhYaL5ZTUl-6khYmsOf_psff2VaOOCvHGff5ejuOmBQxkw2E-cv7knRgWFHoLWpku2NJIMuGHt9ks7OAUfIZVYl9YJnw4FYUzhgaxemknjLeZ8XTkGW2zckzF-d95YI9i8zD80Umubsw-YxriSfqFQ0rGHBsbQ8ZOTd_KJju42BWnXIjNDYmjFUqdzVjI4XQ8EGrCEf_8_iwphGyXD7LOJ4fqd97B3bYpoRTPnCgY_SEHQ",
+ q: "5J758_NeKr1XPZiLxXohYQQnh0Lb4QtGZ1xzCgjhBQLcIBeTOG_tYjCues9tmLt93LpJfypSJ-SjDLwkR2s069_IByYGpxyeGtV-ulqYhSw1nD2CXKMDGyO5jXDs9tJrS_UhfobXKQH03CRdFugyPkSNmXY-AafFynG7xLr7oYBC05FnhUXPm3VBTPt9K-BpqwYd_h9vkAWeprSPo83UlwcLMupSJY9LaHxhRdz2yi0ZKNwXXHRwcszGjDBvvzUcCYbqWqjzbEvFY6KtH8Jh4LhM46rHaoEOTernJsDF6a6W8Df88RthqTExcwnaQf0O_dlbjSxEIPfbxx8t1EQugw",
+ dp:
+ "4Y7Hu5tYAnLhMXuQqj9dgqU3PkcKYdCp7xc6f7Ah2P2JJHfYz4z4RD7Ez1eLyNKzulZ8A_PVHUjlSZiRkaYTBAEaJDrV70P6cFWuC6WpA0ZREQ1V7EgrQnANbGILa8QsPbYyhSQu4YlB1IwQq5_OmzyVBtgWA7AZIMMzMsMT0FuB_if-gWohBjmRN-vh0p45VUf6UW568-_YmgDFmMYbg1UFs7s_TwrNenPR0h7MO4CB8hP9vJLoZrooRczzIjljPbwy5bRG9CJfjTJ0vhj9MUT3kR1hHV1HJVGU5iBbfTfBKnvJGSI6-IDM4ZUm-B0R5hbs6s9cfOjhFmACIJIbMQ",
+ dq:
+ "gT4iPbfyHyVEwWyQb4X4grjvg7bXSKSwG1SXMDAOzV9tg7LwJjKYNy8gJAtJgNNVdsfVLs-E_Epzpoph1AIWO9YZZXkov6Yc9zyEVONMX9S7ReU74hTBd8E9b2lMfMg9ogYk9jtSPTt-6kigW4fOh4cHqZ6_tP3cgfLD3JZ8FDPHE4WaySvLDq49yUBO5dQKyIU_xV6OGhQjOUjP_yEoMmzn9tOittsIHTxbXTxqQ6c1FvU9O6YTv8Jl5_Cl66khfX1I1RG38xvurcHULyUbYgeuZ_Iuo9XreT73h9_owo9RguGT29XH4vcNZmRGf5GIvRb4e5lvtleIZkwJA3u78w",
+ qi:
+ "JHmVKb1zwW5iRR6RCeexYnh2fmY-3DrPSdM8Dxhr0F8dayi-tlRqEdnG0hvp45n8gLUskWWcB9EXlUJObZGKDfGuxgMa3g_xeLA2vmFQ12MxPsyH4iCNZvsgmGxx7TuOHrnDh5EBVnM4_de63crEJON2sYI8Ozi-xp2OEmAr2seWKq4sxkFni6exLhqb-NE4m9HMKlng1EtQh2rLBFG1VYD3SYYpMLc5fxzqGvSxn3Fa-Xgg-IZPY3ubrcm52KYgmLUGmnYStfVqGSWSdhDXHlNgI5pdAA0FzpyBk3ZX-JsxhwcnneKrYBBweq06kRMGWgvdbdAQ-7wSeGqqj5VPwA",
+ },
+ },
+};
+
+Deno.test(async function testImportRsaJwk() {
+ const subtle = window.crypto.subtle;
+ assert(subtle);
+
+ for (const [_key, jwkData] of Object.entries(jwtRSAKeys)) {
+ const { size, publicJWK, privateJWK } = jwkData;
+ if (size < 2048) {
+ continue;
+ }
+
+ // 1. Test import PSS
+ for (const hash of ["SHA-1", "SHA-256", "SHA-384", "SHA-512"]) {
+ const hashMapPSS: Record<string, string> = {
+ "SHA-1": "PS1",
+ "SHA-256": "PS256",
+ "SHA-384": "PS384",
+ "SHA-512": "PS512",
+ };
+
+ if (size == 1024 && hash == "SHA-512") {
+ continue;
+ }
+
+ const privateKeyPSS = await crypto.subtle.importKey(
+ "jwk",
+ {
+ alg: hashMapPSS[hash],
+ ...privateJWK,
+ ext: true,
+ "key_ops": ["sign"],
+ },
+ { name: "RSA-PSS", hash },
+ true,
+ ["sign"],
+ );
+
+ const publicKeyPSS = await crypto.subtle.importKey(
+ "jwk",
+ {
+ alg: hashMapPSS[hash],
+ ...publicJWK,
+ ext: true,
+ "key_ops": ["verify"],
+ },
+ { name: "RSA-PSS", hash },
+ true,
+ ["verify"],
+ );
+
+ const signaturePSS = await crypto.subtle.sign(
+ { name: "RSA-PSS", saltLength: 32 },
+ privateKeyPSS,
+ new Uint8Array([1, 2, 3, 4]),
+ );
+
+ const verifyPSS = await crypto.subtle.verify(
+ { name: "RSA-PSS", saltLength: 32 },
+ publicKeyPSS,
+ signaturePSS,
+ new Uint8Array([1, 2, 3, 4]),
+ );
+ assert(verifyPSS);
+ }
+
+ // 2. Test import PKCS1
+ for (const hash of ["SHA-1", "SHA-256", "SHA-384", "SHA-512"]) {
+ const hashMapPKCS1: Record<string, string> = {
+ "SHA-1": "RS1",
+ "SHA-256": "RS256",
+ "SHA-384": "RS384",
+ "SHA-512": "RS512",
+ };
+
+ if (size == 1024 && hash == "SHA-512") {
+ continue;
+ }
+
+ const privateKeyPKCS1 = await crypto.subtle.importKey(
+ "jwk",
+ {
+ alg: hashMapPKCS1[hash],
+ ...privateJWK,
+ ext: true,
+ "key_ops": ["sign"],
+ },
+ { name: "RSASSA-PKCS1-v1_5", hash },
+ true,
+ ["sign"],
+ );
+
+ const publicKeyPKCS1 = await crypto.subtle.importKey(
+ "jwk",
+ {
+ alg: hashMapPKCS1[hash],
+ ...publicJWK,
+ ext: true,
+ "key_ops": ["verify"],
+ },
+ { name: "RSASSA-PKCS1-v1_5", hash },
+ true,
+ ["verify"],
+ );
+
+ const signaturePKCS1 = await crypto.subtle.sign(
+ { name: "RSASSA-PKCS1-v1_5", saltLength: 32 },
+ privateKeyPKCS1,
+ new Uint8Array([1, 2, 3, 4]),
+ );
+
+ const verifyPKCS1 = await crypto.subtle.verify(
+ { name: "RSASSA-PKCS1-v1_5", saltLength: 32 },
+ publicKeyPKCS1,
+ signaturePKCS1,
+ new Uint8Array([1, 2, 3, 4]),
+ );
+ assert(verifyPKCS1);
+ }
+
+ // 3. Test import OAEP
+ for (
+ const { hash, plainText } of hashPlainTextVector
+ ) {
+ const hashMapOAEP: Record<string, string> = {
+ "SHA-1": "RSA-OAEP",
+ "SHA-256": "RSA-OAEP-256",
+ "SHA-384": "RSA-OAEP-384",
+ "SHA-512": "RSA-OAEP-512",
+ };
+
+ if (size == 1024 && hash == "SHA-512") {
+ continue;
+ }
+
+ const encryptAlgorithm = { name: "RSA-OAEP" };
+
+ const privateKeyOAEP = await crypto.subtle.importKey(
+ "jwk",
+ {
+ alg: hashMapOAEP[hash],
+ ...privateJWK,
+ ext: true,
+ "key_ops": ["decrypt"],
+ },
+ { ...encryptAlgorithm, hash },
+ true,
+ ["decrypt"],
+ );
+
+ const publicKeyOAEP = await crypto.subtle.importKey(
+ "jwk",
+ {
+ alg: hashMapOAEP[hash],
+ ...publicJWK,
+ ext: true,
+ "key_ops": ["encrypt"],
+ },
+ { ...encryptAlgorithm, hash },
+ true,
+ ["encrypt"],
+ );
+ const cipherText = await subtle.encrypt(
+ encryptAlgorithm,
+ publicKeyOAEP,
+ plainText,
+ );
+
+ assert(cipherText);
+ assert(cipherText.byteLength > 0);
+ assertEquals(cipherText.byteLength * 8, size);
+ assert(cipherText instanceof ArrayBuffer);
+
+ const decrypted = await subtle.decrypt(
+ encryptAlgorithm,
+ privateKeyOAEP,
+ cipherText,
+ );
+ assert(decrypted);
+ assert(decrypted instanceof ArrayBuffer);
+ assertEquals(new Uint8Array(decrypted), plainText);
+ }
+ }
+});
+
+const jwtECKeys = {
+ "256": {
+ size: 256,
+ algo: "ES256",
+ publicJWK: {
+ kty: "EC",
+ crv: "P-256",
+ x: "0hCwpvnZ8BKGgFi0P6T0cQGFQ7ugDJJQ35JXwqyuXdE",
+ y: "zgN1UtSBRQzjm00QlXAbF1v6s0uObAmeGPHBmDWDYeg",
+ },
+ privateJWK: {
+ kty: "EC",
+ crv: "P-256",
+ x: "0hCwpvnZ8BKGgFi0P6T0cQGFQ7ugDJJQ35JXwqyuXdE",
+ y: "zgN1UtSBRQzjm00QlXAbF1v6s0uObAmeGPHBmDWDYeg",
+ d: "E9M6LVq_nPnrsh_4YNSu_m5W53eQ9N7ptAiE69M1ROo",
+ },
+ },
+ "384": {
+ size: 384,
+ algo: "ES384",
+ publicJWK: {
+ kty: "EC",
+ crv: "P-384",
+ x: "IZwU1mYXs27G2IVrOFtzp000T9iude8EZDXdpU47RL1fvevR0I3Wni19wdwhjLQ1",
+ y: "vSgTjMd4M3qEL2vWGyQOdCSfJGZ8KlgQp2v8KOAzX4imUB3sAZdtqFr7AIactqzo",
+ },
+ privateJWK: {
+ kty: "EC",
+ crv: "P-384",
+ x: "IZwU1mYXs27G2IVrOFtzp000T9iude8EZDXdpU47RL1fvevR0I3Wni19wdwhjLQ1",
+ y: "vSgTjMd4M3qEL2vWGyQOdCSfJGZ8KlgQp2v8KOAzX4imUB3sAZdtqFr7AIactqzo",
+ d: "RTe1mQeE08LSLpao-S-hqkku6HPldqQVguFEGDyYiNEOa560ztSyzEAS5KxeqEBz",
+ },
+ },
+};
+
+type JWK = Record<string, string>;
+
+function equalJwk(expected: JWK, got: JWK): boolean {
+ const fields = Object.keys(expected);
+
+ for (let i = 0; i < fields.length; i++) {
+ const fieldName = fields[i];
+
+ if (!(fieldName in got)) {
+ return false;
+ }
+ if (expected[fieldName] !== got[fieldName]) {
+ return false;
+ }
+ }
+
+ return true;
+}
+
+Deno.test(async function testImportExportEcDsaJwk() {
+ const subtle = crypto.subtle;
+ assert(subtle);
+
+ for (
+ const [_key, keyData] of Object.entries(jwtECKeys)
+ ) {
+ const { publicJWK, privateJWK, algo } = keyData;
+
+ // 1. Test import EcDsa
+ const privateKeyECDSA = await subtle.importKey(
+ "jwk",
+ {
+ alg: algo,
+ ...privateJWK,
+ ext: true,
+ "key_ops": ["sign"],
+ },
+ { name: "ECDSA", namedCurve: privateJWK.crv },
+ true,
+ ["sign"],
+ );
+ const expPrivateKeyJWK = await subtle.exportKey(
+ "jwk",
+ privateKeyECDSA,
+ );
+ assert(equalJwk(privateJWK, expPrivateKeyJWK as JWK));
+
+ const publicKeyECDSA = await subtle.importKey(
+ "jwk",
+ {
+ alg: algo,
+ ...publicJWK,
+ ext: true,
+ "key_ops": ["verify"],
+ },
+ { name: "ECDSA", namedCurve: publicJWK.crv },
+ true,
+ ["verify"],
+ );
+
+ const expPublicKeyJWK = await subtle.exportKey(
+ "jwk",
+ publicKeyECDSA,
+ );
+
+ assert(equalJwk(publicJWK, expPublicKeyJWK as JWK));
+
+ const signatureECDSA = await subtle.sign(
+ { name: "ECDSA", hash: `SHA-${keyData.size}` },
+ privateKeyECDSA,
+ new Uint8Array([1, 2, 3, 4]),
+ );
+
+ const verifyECDSA = await subtle.verify(
+ { name: "ECDSA", hash: `SHA-${keyData.size}` },
+ publicKeyECDSA,
+ signatureECDSA,
+ new Uint8Array([1, 2, 3, 4]),
+ );
+ assert(verifyECDSA);
+ }
+});
+
+Deno.test(async function testImportEcDhJwk() {
+ const subtle = crypto.subtle;
+ assert(subtle);
+
+ for (
+ const [_key, jwkData] of Object.entries(jwtECKeys)
+ ) {
+ const { size, publicJWK, privateJWK } = jwkData;
+
+ // 1. Test import EcDsa
+ const privateKeyECDH = await subtle.importKey(
+ "jwk",
+ {
+ ...privateJWK,
+ ext: true,
+ "key_ops": ["deriveBits"],
+ },
+ { name: "ECDH", namedCurve: privateJWK.crv },
+ true,
+ ["deriveBits"],
+ );
+
+ const expPrivateKeyJWK = await subtle.exportKey(
+ "jwk",
+ privateKeyECDH,
+ );
+ assert(equalJwk(privateJWK, expPrivateKeyJWK as JWK));
+
+ const publicKeyECDH = await subtle.importKey(
+ "jwk",
+ {
+ ...publicJWK,
+ ext: true,
+ "key_ops": [],
+ },
+ { name: "ECDH", namedCurve: publicJWK.crv },
+ true,
+ [],
+ );
+ const expPublicKeyJWK = await subtle.exportKey(
+ "jwk",
+ publicKeyECDH,
+ );
+ assert(equalJwk(publicJWK, expPublicKeyJWK as JWK));
+
+ const derivedKey = await subtle.deriveBits(
+ {
+ name: "ECDH",
+ public: publicKeyECDH,
+ },
+ privateKeyECDH,
+ size,
+ );
+
+ assert(derivedKey instanceof ArrayBuffer);
+ assertEquals(derivedKey.byteLength, size / 8);
+ }
+});
+
+const ecTestKeys = [
+ {
+ size: 256,
+ namedCurve: "P-256",
+ signatureLength: 64,
+ // deno-fmt-ignore
+ raw: new Uint8Array([
+ 4, 210, 16, 176, 166, 249, 217, 240, 18, 134, 128, 88, 180, 63, 164, 244,
+ 113, 1, 133, 67, 187, 160, 12, 146, 80, 223, 146, 87, 194, 172, 174, 93,
+ 209, 206, 3, 117, 82, 212, 129, 69, 12, 227, 155, 77, 16, 149, 112, 27,
+ 23, 91, 250, 179, 75, 142, 108, 9, 158, 24, 241, 193, 152, 53, 131, 97,
+ 232,
+ ]),
+ // deno-fmt-ignore
+ spki: new Uint8Array([
+ 48, 89, 48, 19, 6, 7, 42, 134, 72, 206, 61, 2, 1, 6, 8, 42, 134, 72, 206,
+ 61, 3, 1, 7, 3, 66, 0, 4, 210, 16, 176, 166, 249, 217, 240, 18, 134, 128,
+ 88, 180, 63, 164, 244, 113, 1, 133, 67, 187, 160, 12, 146, 80, 223, 146,
+ 87, 194, 172, 174, 93, 209, 206, 3, 117, 82, 212, 129, 69, 12, 227, 155,
+ 77, 16, 149, 112, 27, 23, 91, 250, 179, 75, 142, 108, 9, 158, 24, 241,
+ 193, 152, 53, 131, 97, 232,
+ ]),
+ // deno-fmt-ignore
+ pkcs8: new Uint8Array([
+ 48, 129, 135, 2, 1, 0, 48, 19, 6, 7, 42, 134, 72, 206, 61, 2, 1, 6, 8, 42,
+ 134, 72, 206, 61, 3, 1, 7, 4, 109, 48, 107, 2, 1, 1, 4, 32, 19, 211, 58,
+ 45, 90, 191, 156, 249, 235, 178, 31, 248, 96, 212, 174, 254, 110, 86, 231,
+ 119, 144, 244, 222, 233, 180, 8, 132, 235, 211, 53, 68, 234, 161, 68, 3,
+ 66, 0, 4, 210, 16, 176, 166, 249, 217, 240, 18, 134, 128, 88, 180, 63,
+ 164, 244, 113, 1, 133, 67, 187, 160, 12, 146, 80, 223, 146, 87, 194, 172,
+ 174, 93, 209, 206, 3, 117, 82, 212, 129, 69, 12, 227, 155, 77, 16, 149,
+ 112, 27, 23, 91, 250, 179, 75, 142, 108, 9, 158, 24, 241, 193, 152, 53,
+ 131, 97, 232,
+ ]),
+ },
+ {
+ size: 384,
+ namedCurve: "P-384",
+ signatureLength: 96,
+ // deno-fmt-ignore
+ raw: new Uint8Array([
+ 4, 118, 64, 176, 165, 100, 177, 112, 49, 254, 58, 53, 158, 63, 73, 200,
+ 148, 248, 242, 216, 186, 80, 92, 160, 53, 64, 232, 157, 19, 1, 12, 226,
+ 115, 51, 42, 143, 98, 206, 55, 220, 108, 78, 24, 71, 157, 21, 120, 126,
+ 104, 157, 86, 48, 226, 110, 96, 52, 48, 77, 170, 9, 231, 159, 26, 165,
+ 200, 26, 164, 99, 46, 227, 169, 105, 172, 225, 60, 102, 141, 145, 139,
+ 165, 47, 72, 53, 17, 17, 246, 161, 220, 26, 21, 23, 219, 1, 107, 185,
+ 163, 215,
+ ]),
+ // deno-fmt-ignore
+ spki: new Uint8Array([
+ 48, 118, 48, 16, 6, 7, 42, 134, 72, 206, 61, 2, 1, 6, 5, 43, 129, 4, 0,
+ 34, 3, 98, 0, 4, 118, 64, 176, 165, 100, 177, 112, 49, 254, 58, 53, 158,
+ 63, 73, 200, 148, 248, 242, 216, 186, 80, 92, 160, 53, 64, 232, 157, 19,
+ 1, 12, 226, 115, 51, 42, 143, 98, 206, 55, 220, 108, 78, 24, 71, 157, 21,
+ 120, 126, 104, 157, 86, 48, 226, 110, 96, 52, 48, 77, 170, 9, 231, 159,
+ 26, 165, 200, 26, 164, 99, 46, 227, 169, 105, 172, 225, 60, 102, 141,
+ 145, 139, 165, 47, 72, 53, 17, 17, 246, 161, 220, 26, 21, 23, 219, 1,
+ 107, 185, 163, 215,
+ ]),
+ // deno-fmt-ignore
+ pkcs8: new Uint8Array([
+ 48, 129, 182, 2, 1, 0, 48, 16, 6, 7, 42, 134, 72, 206, 61, 2, 1, 6, 5, 43,
+ 129, 4, 0, 34, 4, 129, 158, 48, 129, 155, 2, 1, 1, 4, 48, 202, 7, 195,
+ 169, 124, 170, 81, 169, 253, 127, 56, 28, 98, 90, 255, 165, 72, 142, 133,
+ 138, 237, 200, 176, 92, 179, 192, 83, 28, 47, 118, 157, 152, 47, 65, 133,
+ 140, 50, 83, 182, 191, 224, 96, 216, 179, 59, 150, 15, 233, 161, 100, 3,
+ 98, 0, 4, 118, 64, 176, 165, 100, 177, 112, 49, 254, 58, 53, 158, 63, 73,
+ 200, 148, 248, 242, 216, 186, 80, 92, 160, 53, 64, 232, 157, 19, 1, 12,
+ 226, 115, 51, 42, 143, 98, 206, 55, 220, 108, 78, 24, 71, 157, 21, 120,
+ 126, 104, 157, 86, 48, 226, 110, 96, 52, 48, 77, 170, 9, 231, 159, 26,
+ 165, 200, 26, 164, 99, 46, 227, 169, 105, 172, 225, 60, 102, 141, 145,
+ 139, 165, 47, 72, 53, 17, 17, 246, 161, 220, 26, 21, 23, 219, 1, 107,
+ 185, 163, 215,
+ ]),
+ },
+];
+
+Deno.test(async function testImportEcSpkiPkcs8() {
+ const subtle = window.crypto.subtle;
+ assert(subtle);
+
+ for (
+ const { namedCurve, raw, spki, pkcs8, signatureLength } of ecTestKeys
+ ) {
+ const rawPublicKeyECDSA = await subtle.importKey(
+ "raw",
+ raw,
+ { name: "ECDSA", namedCurve },
+ true,
+ ["verify"],
+ );
+
+ const expPublicKeyRaw = await subtle.exportKey(
+ "raw",
+ rawPublicKeyECDSA,
+ );
+
+ assertEquals(new Uint8Array(expPublicKeyRaw), raw);
+
+ const privateKeyECDSA = await subtle.importKey(
+ "pkcs8",
+ pkcs8,
+ { name: "ECDSA", namedCurve },
+ true,
+ ["sign"],
+ );
+
+ const expPrivateKeyPKCS8 = await subtle.exportKey(
+ "pkcs8",
+ privateKeyECDSA,
+ );
+
+ assertEquals(new Uint8Array(expPrivateKeyPKCS8), pkcs8);
+
+ const expPrivateKeyJWK = await subtle.exportKey(
+ "jwk",
+ privateKeyECDSA,
+ );
+
+ assertEquals(expPrivateKeyJWK.crv, namedCurve);
+
+ const publicKeyECDSA = await subtle.importKey(
+ "spki",
+ spki,
+ { name: "ECDSA", namedCurve },
+ true,
+ ["verify"],
+ );
+
+ const expPublicKeySPKI = await subtle.exportKey(
+ "spki",
+ publicKeyECDSA,
+ );
+
+ assertEquals(new Uint8Array(expPublicKeySPKI), spki);
+
+ const expPublicKeyJWK = await subtle.exportKey(
+ "jwk",
+ publicKeyECDSA,
+ );
+
+ assertEquals(expPublicKeyJWK.crv, namedCurve);
+
+ for (
+ const hash of ["SHA-1", "SHA-256", "SHA-384", "SHA-512"]
+ ) {
+ if (
+ (hash == "SHA-256" && namedCurve == "P-256") ||
+ (hash == "SHA-384" && namedCurve == "P-384")
+ ) {
+ const signatureECDSA = await subtle.sign(
+ { name: "ECDSA", hash },
+ privateKeyECDSA,
+ new Uint8Array([1, 2, 3, 4]),
+ );
+
+ const verifyECDSA = await subtle.verify(
+ { name: "ECDSA", hash },
+ publicKeyECDSA,
+ signatureECDSA,
+ new Uint8Array([1, 2, 3, 4]),
+ );
+ assert(verifyECDSA);
+ } else {
+ await assertRejects(
+ async () => {
+ await subtle.sign(
+ { name: "ECDSA", hash },
+ privateKeyECDSA,
+ new Uint8Array([1, 2, 3, 4]),
+ );
+ },
+ DOMException,
+ "Not implemented",
+ );
+ await assertRejects(
+ async () => {
+ await subtle.verify(
+ { name: "ECDSA", hash },
+ publicKeyECDSA,
+ new Uint8Array(signatureLength),
+ new Uint8Array([1, 2, 3, 4]),
+ );
+ },
+ DOMException,
+ "Not implemented",
+ );
+ }
+ }
+ }
+});
+
+Deno.test(async function testAesGcmEncrypt() {
+ const key = await crypto.subtle.importKey(
+ "raw",
+ new Uint8Array(16),
+ { name: "AES-GCM", length: 256 },
+ true,
+ ["encrypt", "decrypt"],
+ );
+
+ const nonces = [{
+ iv: new Uint8Array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]),
+ ciphertext: new Uint8Array([
+ 50,
+ 223,
+ 112,
+ 178,
+ 166,
+ 156,
+ 255,
+ 110,
+ 125,
+ 138,
+ 95,
+ 141,
+ 82,
+ 47,
+ 14,
+ 164,
+ 134,
+ 247,
+ 22,
+ ]),
+ }, {
+ iv: new Uint8Array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]),
+ ciphertext: new Uint8Array([
+ 210,
+ 101,
+ 81,
+ 216,
+ 151,
+ 9,
+ 192,
+ 197,
+ 62,
+ 254,
+ 28,
+ 132,
+ 89,
+ 106,
+ 40,
+ 29,
+ 175,
+ 232,
+ 201,
+ ]),
+ }];
+ for (const { iv, ciphertext: fixture } of nonces) {
+ const data = new Uint8Array([1, 2, 3]);
+
+ const cipherText = await crypto.subtle.encrypt(
+ { name: "AES-GCM", iv },
+ key,
+ data,
+ );
+
+ assert(cipherText instanceof ArrayBuffer);
+ assertEquals(cipherText.byteLength, 19);
+ assertEquals(
+ new Uint8Array(cipherText),
+ fixture,
+ );
+
+ const plainText = await crypto.subtle.decrypt(
+ { name: "AES-GCM", iv },
+ key,
+ cipherText,
+ );
+ assert(plainText instanceof ArrayBuffer);
+ assertEquals(plainText.byteLength, 3);
+ assertEquals(new Uint8Array(plainText), data);
+ }
+});
+
+async function roundTripSecretJwk(
+ jwk: JsonWebKey,
+ algId: AlgorithmIdentifier | HmacImportParams,
+ ops: KeyUsage[],
+ validateKeys: (
+ key: CryptoKey,
+ originalJwk: JsonWebKey,
+ exportedJwk: JsonWebKey,
+ ) => void,
+) {
+ const key = await crypto.subtle.importKey(
+ "jwk",
+ jwk,
+ algId,
+ true,
+ ops,
+ );
+
+ assert(key instanceof CryptoKey);
+ assertEquals(key.type, "secret");
+
+ const exportedKey = await crypto.subtle.exportKey("jwk", key);
+
+ validateKeys(key, jwk, exportedKey);
+}
+
+Deno.test(async function testSecretJwkBase64Url() {
+ // Test 16bits with "overflow" in 3rd pos of 'quartet', no padding
+ const keyData = `{
+ "kty": "oct",
+ "k": "xxx",
+ "alg": "HS512",
+ "key_ops": ["sign", "verify"],
+ "ext": true
+ }`;
+
+ await roundTripSecretJwk(
+ JSON.parse(keyData),
+ { name: "HMAC", hash: "SHA-512" },
+ ["sign", "verify"],
+ (key, _orig, exp) => {
+ assertEquals((key.algorithm as HmacKeyAlgorithm).length, 16);
+
+ assertEquals(exp.k, "xxw");
+ },
+ );
+
+ // HMAC 128bits with base64url characters (-_)
+ await roundTripSecretJwk(
+ {
+ kty: "oct",
+ k: "HnZXRyDKn-_G5Fx4JWR1YA",
+ alg: "HS256",
+ "key_ops": ["sign", "verify"],
+ ext: true,
+ },
+ { name: "HMAC", hash: "SHA-256" },
+ ["sign", "verify"],
+ (key, orig, exp) => {
+ assertEquals((key.algorithm as HmacKeyAlgorithm).length, 128);
+
+ assertEquals(orig.k, exp.k);
+ },
+ );
+
+ // HMAC 104bits/(12+1) bytes with base64url characters (-_), padding and overflow in 2rd pos of "quartet"
+ await roundTripSecretJwk(
+ {
+ kty: "oct",
+ k: "a-_AlFa-2-OmEGa_-z==",
+ alg: "HS384",
+ "key_ops": ["sign", "verify"],
+ ext: true,
+ },
+ { name: "HMAC", hash: "SHA-384" },
+ ["sign", "verify"],
+ (key, _orig, exp) => {
+ assertEquals((key.algorithm as HmacKeyAlgorithm).length, 104);
+
+ assertEquals("a-_AlFa-2-OmEGa_-w", exp.k);
+ },
+ );
+
+ // AES-CBC 128bits with base64url characters (-_) no padding
+ await roundTripSecretJwk(
+ {
+ kty: "oct",
+ k: "_u3K_gEjRWf-7cr-ASNFZw",
+ alg: "A128CBC",
+ "key_ops": ["encrypt", "decrypt"],
+ ext: true,
+ },
+ { name: "AES-CBC" },
+ ["encrypt", "decrypt"],
+ (_key, orig, exp) => {
+ assertEquals(orig.k, exp.k);
+ },
+ );
+
+ // AES-CBC 128bits of '1' with padding chars
+ await roundTripSecretJwk(
+ {
+ kty: "oct",
+ k: "_____________________w==",
+ alg: "A128CBC",
+ "key_ops": ["encrypt", "decrypt"],
+ ext: true,
+ },
+ { name: "AES-CBC" },
+ ["encrypt", "decrypt"],
+ (_key, _orig, exp) => {
+ assertEquals(exp.k, "_____________________w");
+ },
+ );
+});
+
+Deno.test(async function testAESWrapKey() {
+ const key = await crypto.subtle.generateKey(
+ {
+ name: "AES-KW",
+ length: 128,
+ },
+ true,
+ ["wrapKey", "unwrapKey"],
+ );
+
+ const hmacKey = await crypto.subtle.generateKey(
+ {
+ name: "HMAC",
+ hash: "SHA-256",
+ length: 128,
+ },
+ true,
+ ["sign"],
+ );
+
+ //round-trip
+ // wrap-unwrap-export compare
+ const wrappedKey = await crypto.subtle.wrapKey(
+ "raw",
+ hmacKey,
+ key,
+ {
+ name: "AES-KW",
+ },
+ );
+
+ assert(wrappedKey instanceof ArrayBuffer);
+ assertEquals(wrappedKey.byteLength, 16 + 8); // 8 = 'auth tag'
+
+ const unwrappedKey = await crypto.subtle.unwrapKey(
+ "raw",
+ wrappedKey,
+ key,
+ {
+ name: "AES-KW",
+ },
+ {
+ name: "HMAC",
+ hash: "SHA-256",
+ },
+ true,
+ ["sign"],
+ );
+
+ assert(unwrappedKey instanceof CryptoKey);
+ assertEquals((unwrappedKey.algorithm as HmacKeyAlgorithm).length, 128);
+
+ const hmacKeyBytes = await crypto.subtle.exportKey("raw", hmacKey);
+ const unwrappedKeyBytes = await crypto.subtle.exportKey("raw", unwrappedKey);
+
+ assertEquals(new Uint8Array(hmacKeyBytes), new Uint8Array(unwrappedKeyBytes));
+});
+
+// https://github.com/denoland/deno/issues/13534
+Deno.test(async function testAesGcmTagLength() {
+ const key = await crypto.subtle.importKey(
+ "raw",
+ new Uint8Array(32),
+ "AES-GCM",
+ false,
+ ["encrypt", "decrypt"],
+ );
+
+ const iv = crypto.getRandomValues(new Uint8Array(12));
+
+ // encrypt won't fail, it will simply truncate the tag
+ // as expected.
+ const encrypted = await crypto.subtle.encrypt(
+ { name: "AES-GCM", iv, tagLength: 96 },
+ key,
+ new Uint8Array(32),
+ );
+
+ await assertRejects(async () => {
+ await crypto.subtle.decrypt(
+ { name: "AES-GCM", iv, tagLength: 96 },
+ key,
+ encrypted,
+ );
+ });
+});
+
+Deno.test(async function ecPrivateKeyMaterialExportSpki() {
+ // `generateKey` generates a key pair internally stored as "private" key.
+ const keys = await crypto.subtle.generateKey(
+ { name: "ECDSA", namedCurve: "P-256" },
+ true,
+ ["sign", "verify"],
+ );
+
+ assert(keys.privateKey instanceof CryptoKey);
+ assert(keys.publicKey instanceof CryptoKey);
+
+ // `exportKey` should be able to perform necessary conversion to export spki.
+ const spki = await crypto.subtle.exportKey("spki", keys.publicKey);
+ assert(spki instanceof ArrayBuffer);
+});
+
+// https://github.com/denoland/deno/issues/13911
+Deno.test(async function importJwkWithUse() {
+ const jwk = {
+ "kty": "EC",
+ "use": "sig",
+ "crv": "P-256",
+ "x": "FWZ9rSkLt6Dx9E3pxLybhdM6xgR5obGsj5_pqmnz5J4",
+ "y": "_n8G69C-A2Xl4xUW2lF0i8ZGZnk_KPYrhv4GbTGu5G4",
+ };
+
+ const algorithm = { name: "ECDSA", namedCurve: "P-256" };
+
+ const key = await crypto.subtle.importKey(
+ "jwk",
+ jwk,
+ algorithm,
+ true,
+ ["verify"],
+ );
+
+ assert(key instanceof CryptoKey);
+});
+
+// https://github.com/denoland/deno/issues/14215
+Deno.test(async function exportKeyNotExtractable() {
+ const key = await crypto.subtle.generateKey(
+ {
+ name: "HMAC",
+ hash: "SHA-512",
+ },
+ false,
+ ["sign", "verify"],
+ );
+
+ assert(key);
+ assertEquals(key.extractable, false);
+
+ await assertRejects(async () => {
+ // Should fail
+ await crypto.subtle.exportKey("raw", key);
+ }, DOMException);
+});
+
+// https://github.com/denoland/deno/issues/15126
+Deno.test(async function testImportLeadingZeroesKey() {
+ const alg = { name: "ECDSA", namedCurve: "P-256" };
+
+ const jwk = {
+ kty: "EC",
+ crv: "P-256",
+ alg: "ES256",
+ x: "EvidcdFB1xC6tgfakqZsU9aIURxAJkcX62zHe1Nt6xU",
+ y: "AHsk6BioGM7MZWeXOE_49AGmtuaXFT3Ill3DYtz9uYg",
+ d: "WDeYo4o1heCF9l_2VIaClRyIeO16zsMlN8UG6Le9dU8",
+ "key_ops": ["sign"],
+ ext: true,
+ };
+
+ const key = await crypto.subtle.importKey(
+ "jwk",
+ jwk,
+ alg,
+ true,
+ ["sign"],
+ );
+
+ assert(key instanceof CryptoKey);
+ assertEquals(key.type, "private");
+});
+
+// https://github.com/denoland/deno/issues/15523
+Deno.test(async function testECspkiRoundTrip() {
+ const alg = { name: "ECDH", namedCurve: "P-256" };
+ const { publicKey } = await crypto.subtle.generateKey(alg, true, [
+ "deriveBits",
+ ]);
+ const spki = await crypto.subtle.exportKey("spki", publicKey);
+ await crypto.subtle.importKey("spki", spki, alg, true, []);
+});
+
+Deno.test(async function testHmacJwkImport() {
+ await crypto.subtle.importKey(
+ "jwk",
+ {
+ kty: "oct",
+ use: "sig",
+ alg: "HS256",
+ k: "hJtXIZ2uSN5kbQfbtTNWbpdmhkV8FJG-Onbc6mxCcYg",
+ },
+ { name: "HMAC", hash: "SHA-256" },
+ false,
+ ["sign", "verify"],
+ );
+});
+
+Deno.test(async function p521Import() {
+ const jwk = {
+ "crv": "P-521",
+ "ext": true,
+ "key_ops": [
+ "verify",
+ ],
+ "kty": "EC",
+ "x":
+ "AXkSI8nfkc6bu3fifXGuKKbu08g5LKPfxUNQJJYzzPgmN8XLDzx0C9Sdeejl1XoWGrheKPHl0k4tUmHw0cdInpfj",
+ "y":
+ "AT4vjsO0bzVRlN3Wthv9DewncDXS2tlTob5QojV8WX1GzOAikRfWFEP3nspoSv88U447acZAsk5IvgGJuVjgMDlx",
+ };
+ const algorithm = { name: "ECDSA", namedCurve: "P-521" };
+
+ const key = await crypto.subtle.importKey(
+ "jwk",
+ jwk,
+ algorithm,
+ true,
+ ["verify"],
+ );
+
+ assert(key instanceof CryptoKey);
+});
+
+Deno.test(async function p521Generate() {
+ const algorithm = { name: "ECDSA", namedCurve: "P-521" };
+
+ const key = await crypto.subtle.generateKey(
+ algorithm,
+ true,
+ ["sign", "verify"],
+ );
+
+ assert(key.privateKey instanceof CryptoKey);
+ assert(key.publicKey instanceof CryptoKey);
+});
diff --git a/tests/unit/webgpu_test.ts b/tests/unit/webgpu_test.ts
new file mode 100644
index 000000000..517c75f9e
--- /dev/null
+++ b/tests/unit/webgpu_test.ts
@@ -0,0 +1,267 @@
+// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
+
+import { assert, assertEquals, assertThrows } from "./test_util.ts";
+
+let isCI: boolean;
+try {
+ isCI = (Deno.env.get("CI")?.length ?? 0) > 0;
+} catch {
+ isCI = true;
+}
+
+// Skip these tests on linux CI, because the vulkan emulator is not good enough
+// yet, and skip on macOS CI because these do not have virtual GPUs.
+const isLinuxOrMacCI =
+ (Deno.build.os === "linux" || Deno.build.os === "darwin") && isCI;
+// Skip these tests in WSL because it doesn't have good GPU support.
+const isWsl = await checkIsWsl();
+
+Deno.test({
+ permissions: { read: true, env: true },
+ ignore: isWsl || isLinuxOrMacCI,
+}, async function webgpuComputePass() {
+ const adapter = await navigator.gpu.requestAdapter();
+ assert(adapter);
+
+ const numbers = [1, 4, 3, 295];
+
+ const device = await adapter.requestDevice();
+ assert(device);
+
+ const shaderCode = await Deno.readTextFile(
+ "tests/testdata/webgpu/computepass_shader.wgsl",
+ );
+
+ const shaderModule = device.createShaderModule({
+ code: shaderCode,
+ });
+
+ const size = new Uint32Array(numbers).byteLength;
+
+ const stagingBuffer = device.createBuffer({
+ size: size,
+ usage: GPUBufferUsage.MAP_READ | GPUBufferUsage.COPY_DST,
+ });
+
+ const storageBuffer = device.createBuffer({
+ label: "Storage Buffer",
+ size: size,
+ usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST |
+ GPUBufferUsage.COPY_SRC,
+ mappedAtCreation: true,
+ });
+
+ const buf = new Uint32Array(storageBuffer.getMappedRange());
+
+ buf.set(numbers);
+
+ storageBuffer.unmap();
+
+ const computePipeline = device.createComputePipeline({
+ layout: "auto",
+ compute: {
+ module: shaderModule,
+ entryPoint: "main",
+ },
+ });
+ const bindGroupLayout = computePipeline.getBindGroupLayout(0);
+
+ const bindGroup = device.createBindGroup({
+ layout: bindGroupLayout,
+ entries: [
+ {
+ binding: 0,
+ resource: {
+ buffer: storageBuffer,
+ },
+ },
+ ],
+ });
+
+ const encoder = device.createCommandEncoder();
+
+ const computePass = encoder.beginComputePass();
+ computePass.setPipeline(computePipeline);
+ computePass.setBindGroup(0, bindGroup);
+ computePass.insertDebugMarker("compute collatz iterations");
+ computePass.dispatchWorkgroups(numbers.length);
+ computePass.end();
+
+ encoder.copyBufferToBuffer(storageBuffer, 0, stagingBuffer, 0, size);
+
+ device.queue.submit([encoder.finish()]);
+
+ await stagingBuffer.mapAsync(1);
+
+ const data = stagingBuffer.getMappedRange();
+
+ assertEquals(new Uint32Array(data), new Uint32Array([0, 2, 7, 55]));
+
+ stagingBuffer.unmap();
+
+ device.destroy();
+
+ // TODO(lucacasonato): webgpu spec should add a explicit destroy method for
+ // adapters.
+ const resources = Object.keys(Deno.resources());
+ Deno.close(Number(resources[resources.length - 1]));
+});
+
+Deno.test({
+ permissions: { read: true, env: true },
+ ignore: isWsl || isLinuxOrMacCI,
+}, async function webgpuHelloTriangle() {
+ const adapter = await navigator.gpu.requestAdapter();
+ assert(adapter);
+
+ const device = await adapter.requestDevice();
+ assert(device);
+
+ const shaderCode = await Deno.readTextFile(
+ "tests/testdata/webgpu/hellotriangle_shader.wgsl",
+ );
+
+ const shaderModule = device.createShaderModule({
+ code: shaderCode,
+ });
+
+ const pipelineLayout = device.createPipelineLayout({
+ bindGroupLayouts: [],
+ });
+
+ const renderPipeline = device.createRenderPipeline({
+ layout: pipelineLayout,
+ vertex: {
+ module: shaderModule,
+ entryPoint: "vs_main",
+ },
+ fragment: {
+ module: shaderModule,
+ entryPoint: "fs_main",
+ targets: [
+ {
+ format: "rgba8unorm-srgb",
+ },
+ ],
+ },
+ });
+
+ const dimensions = {
+ width: 200,
+ height: 200,
+ };
+ const unpaddedBytesPerRow = dimensions.width * 4;
+ const align = 256;
+ const paddedBytesPerRowPadding = (align - unpaddedBytesPerRow % align) %
+ align;
+ const paddedBytesPerRow = unpaddedBytesPerRow + paddedBytesPerRowPadding;
+
+ const outputBuffer = device.createBuffer({
+ label: "Capture",
+ size: paddedBytesPerRow * dimensions.height,
+ usage: GPUBufferUsage.MAP_READ | GPUBufferUsage.COPY_DST,
+ });
+ const texture = device.createTexture({
+ label: "Capture",
+ size: dimensions,
+ format: "rgba8unorm-srgb",
+ usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.COPY_SRC,
+ });
+
+ const encoder = device.createCommandEncoder();
+ const view = texture.createView();
+ const renderPass = encoder.beginRenderPass({
+ colorAttachments: [
+ {
+ view,
+ storeOp: "store",
+ loadOp: "clear",
+ clearValue: [0, 1, 0, 1],
+ },
+ ],
+ });
+ renderPass.setPipeline(renderPipeline);
+ renderPass.draw(3, 1);
+ renderPass.end();
+
+ encoder.copyTextureToBuffer(
+ {
+ texture,
+ },
+ {
+ buffer: outputBuffer,
+ bytesPerRow: paddedBytesPerRow,
+ rowsPerImage: 0,
+ },
+ dimensions,
+ );
+
+ const bundle = encoder.finish();
+ device.queue.submit([bundle]);
+
+ await outputBuffer.mapAsync(1);
+ const data = new Uint8Array(outputBuffer.getMappedRange());
+
+ assertEquals(
+ data,
+ await Deno.readFile("tests/testdata/webgpu/hellotriangle.out"),
+ );
+
+ outputBuffer.unmap();
+
+ device.destroy();
+
+ // TODO(lucacasonato): webgpu spec should add a explicit destroy method for
+ // adapters.
+ const resources = Object.keys(Deno.resources());
+ Deno.close(Number(resources[resources.length - 1]));
+});
+
+Deno.test({
+ ignore: isWsl || isLinuxOrMacCI,
+}, async function webgpuAdapterHasFeatures() {
+ const adapter = await navigator.gpu.requestAdapter();
+ assert(adapter);
+ assert(adapter.features);
+ const resources = Object.keys(Deno.resources());
+ Deno.close(Number(resources[resources.length - 1]));
+});
+
+Deno.test({
+ ignore: isWsl || isLinuxOrMacCI,
+}, async function webgpuNullWindowSurfaceThrows() {
+ const adapter = await navigator.gpu.requestAdapter();
+ assert(adapter);
+
+ const device = await adapter.requestDevice();
+ assert(device);
+
+ assertThrows(
+ () => {
+ new Deno.UnsafeWindowSurface("cocoa", null, null);
+ },
+ );
+
+ device.destroy();
+ const resources = Object.keys(Deno.resources());
+ Deno.close(Number(resources[resources.length - 1]));
+});
+
+Deno.test(function getPreferredCanvasFormat() {
+ const preferredFormat = navigator.gpu.getPreferredCanvasFormat();
+ assert(preferredFormat === "bgra8unorm" || preferredFormat === "rgba8unorm");
+});
+
+async function checkIsWsl() {
+ return Deno.build.os === "linux" && await hasMicrosoftProcVersion();
+
+ async function hasMicrosoftProcVersion() {
+ // https://github.com/microsoft/WSL/issues/423#issuecomment-221627364
+ try {
+ const procVersion = await Deno.readTextFile("/proc/version");
+ return /microsoft/i.test(procVersion);
+ } catch {
+ return false;
+ }
+ }
+}
diff --git a/tests/unit/websocket_test.ts b/tests/unit/websocket_test.ts
new file mode 100644
index 000000000..223b13404
--- /dev/null
+++ b/tests/unit/websocket_test.ts
@@ -0,0 +1,738 @@
+// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
+import { assert, assertEquals, assertThrows, fail } from "./test_util.ts";
+
+const servePort = 4248;
+const serveUrl = `ws://localhost:${servePort}/`;
+
+Deno.test({ permissions: "none" }, function websocketPermissionless() {
+ assertThrows(
+ () => new WebSocket("ws://localhost"),
+ Deno.errors.PermissionDenied,
+ );
+});
+
+Deno.test(async function websocketConstructorTakeURLObjectAsParameter() {
+ const { promise, resolve, reject } = Promise.withResolvers<void>();
+ const ws = new WebSocket(new URL("ws://localhost:4242/"));
+ assertEquals(ws.url, "ws://localhost:4242/");
+ ws.onerror = (e) => reject(e);
+ ws.onopen = () => ws.close();
+ ws.onclose = () => {
+ resolve();
+ };
+ await promise;
+});
+
+Deno.test(async function websocketH2SendSmallPacket() {
+ const { promise, resolve, reject } = Promise.withResolvers<void>();
+ const ws = new WebSocket(new URL("wss://localhost:4249/"));
+ assertEquals(ws.url, "wss://localhost:4249/");
+ let messageCount = 0;
+ ws.onerror = (e) => reject(e);
+ ws.onopen = () => {
+ ws.send("a".repeat(16));
+ ws.send("a".repeat(16));
+ ws.send("a".repeat(16));
+ };
+ ws.onmessage = () => {
+ if (++messageCount == 3) {
+ ws.close();
+ }
+ };
+ ws.onclose = () => {
+ resolve();
+ };
+ await promise;
+});
+
+Deno.test(async function websocketH2SendLargePacket() {
+ const { promise, resolve, reject } = Promise.withResolvers<void>();
+ const ws = new WebSocket(new URL("wss://localhost:4249/"));
+ assertEquals(ws.url, "wss://localhost:4249/");
+ let messageCount = 0;
+ ws.onerror = (e) => reject(e);
+ ws.onopen = () => {
+ ws.send("a".repeat(65000));
+ ws.send("a".repeat(65000));
+ ws.send("a".repeat(65000));
+ };
+ ws.onmessage = () => {
+ if (++messageCount == 3) {
+ ws.close();
+ }
+ };
+ ws.onclose = () => {
+ resolve();
+ };
+ await promise;
+});
+
+Deno.test(async function websocketSendLargePacket() {
+ const { promise, resolve, reject } = Promise.withResolvers<void>();
+ const ws = new WebSocket(new URL("wss://localhost:4243/"));
+ assertEquals(ws.url, "wss://localhost:4243/");
+ ws.onerror = (e) => reject(e);
+ ws.onopen = () => {
+ ws.send("a".repeat(65000));
+ };
+ ws.onmessage = () => {
+ ws.close();
+ };
+ ws.onclose = () => {
+ resolve();
+ };
+ await promise;
+});
+
+Deno.test(async function websocketSendLargeBinaryPacket() {
+ const { promise, resolve, reject } = Promise.withResolvers<void>();
+ const ws = new WebSocket(new URL("wss://localhost:4243/"));
+ ws.binaryType = "arraybuffer";
+ assertEquals(ws.url, "wss://localhost:4243/");
+ ws.onerror = (e) => reject(e);
+ ws.onopen = () => {
+ ws.send(new Uint8Array(65000));
+ };
+ ws.onmessage = (msg: MessageEvent) => {
+ assertEquals(msg.data.byteLength, 65000);
+ ws.close();
+ };
+ ws.onclose = () => {
+ resolve();
+ };
+ await promise;
+});
+
+Deno.test(async function websocketSendLargeBlobPacket() {
+ const { promise, resolve, reject } = Promise.withResolvers<void>();
+ const ws = new WebSocket(new URL("wss://localhost:4243/"));
+ ws.binaryType = "arraybuffer";
+ assertEquals(ws.url, "wss://localhost:4243/");
+ ws.onerror = (e) => reject(e);
+ ws.onopen = () => {
+ ws.send(new Blob(["a".repeat(65000)]));
+ };
+ ws.onmessage = (msg: MessageEvent) => {
+ assertEquals(msg.data.byteLength, 65000);
+ ws.close();
+ };
+ ws.onclose = () => {
+ resolve();
+ };
+ await promise;
+});
+
+// https://github.com/denoland/deno/pull/17762
+// https://github.com/denoland/deno/issues/17761
+Deno.test(async function websocketPingPong() {
+ const { promise, resolve, reject } = Promise.withResolvers<void>();
+ const ws = new WebSocket("ws://localhost:4245/");
+ assertEquals(ws.url, "ws://localhost:4245/");
+ ws.onerror = (e) => reject(e);
+ ws.onmessage = (e) => {
+ ws.send(e.data);
+ };
+ ws.onclose = () => {
+ resolve();
+ };
+ await promise;
+ ws.close();
+});
+
+// TODO(mmastrac): This requires us to ignore bad certs
+// Deno.test(async function websocketSecureConnect() {
+// const { promise, resolve } = Promise.withResolvers<void>();
+// const ws = new WebSocket("wss://localhost:4243/");
+// assertEquals(ws.url, "wss://localhost:4243/");
+// ws.onerror = (error) => {
+// console.log(error);
+// fail();
+// };
+// ws.onopen = () => ws.close();
+// ws.onclose = () => {
+// resolve();
+// };
+// await promise;
+// });
+
+// https://github.com/denoland/deno/issues/18700
+Deno.test(
+ { sanitizeOps: false, sanitizeResources: false },
+ async function websocketWriteLock() {
+ const ac = new AbortController();
+ const listeningDeferred = Promise.withResolvers<void>();
+
+ const server = Deno.serve({
+ handler: (req) => {
+ const { socket, response } = Deno.upgradeWebSocket(req);
+ socket.onopen = function () {
+ setTimeout(() => socket.send("Hello"), 500);
+ };
+ socket.onmessage = function (e) {
+ assertEquals(e.data, "Hello");
+ ac.abort();
+ };
+ return response;
+ },
+ signal: ac.signal,
+ onListen: () => listeningDeferred.resolve(),
+ hostname: "localhost",
+ port: servePort,
+ });
+
+ await listeningDeferred.promise;
+ const deferred = Promise.withResolvers<void>();
+ const ws = new WebSocket(serveUrl);
+ assertEquals(ws.url, serveUrl);
+ ws.onerror = () => fail();
+ ws.onmessage = (e) => {
+ assertEquals(e.data, "Hello");
+ setTimeout(() => {
+ ws.send(e.data);
+ }, 1000);
+ deferred.resolve();
+ };
+ ws.onclose = () => {
+ deferred.resolve();
+ };
+
+ await Promise.all([deferred.promise, server.finished]);
+ ws.close();
+ },
+);
+
+// https://github.com/denoland/deno/issues/18775
+Deno.test({
+ sanitizeOps: false,
+ sanitizeResources: false,
+}, async function websocketDoubleClose() {
+ const deferred = Promise.withResolvers<void>();
+
+ const ac = new AbortController();
+ const listeningDeferred = Promise.withResolvers<void>();
+
+ const server = Deno.serve({
+ handler: (req) => {
+ const { response, socket } = Deno.upgradeWebSocket(req);
+ let called = false;
+ socket.onopen = () => socket.send("Hello");
+ socket.onmessage = () => {
+ assert(!called);
+ called = true;
+ socket.send("bye");
+ socket.close();
+ };
+ socket.onclose = () => ac.abort();
+ socket.onerror = () => fail();
+ return response;
+ },
+ signal: ac.signal,
+ onListen: () => listeningDeferred.resolve(),
+ hostname: "localhost",
+ port: servePort,
+ });
+
+ await listeningDeferred.promise;
+
+ const ws = new WebSocket(serveUrl);
+ assertEquals(ws.url, serveUrl);
+ ws.onerror = () => fail();
+ ws.onmessage = (m: MessageEvent) => {
+ if (m.data == "Hello") ws.send("bye");
+ };
+ ws.onclose = () => {
+ deferred.resolve();
+ };
+ await Promise.all([deferred.promise, server.finished]);
+});
+
+// https://github.com/denoland/deno/issues/19483
+Deno.test({
+ sanitizeOps: false,
+ sanitizeResources: false,
+}, async function websocketCloseFlushes() {
+ const deferred = Promise.withResolvers<void>();
+
+ const ac = new AbortController();
+ const listeningDeferred = Promise.withResolvers<void>();
+
+ const server = Deno.serve({
+ handler: (req) => {
+ const { response, socket } = Deno.upgradeWebSocket(req);
+ socket.onopen = () => socket.send("Hello");
+ socket.onmessage = () => {
+ socket.send("Bye");
+ socket.close();
+ };
+ socket.onclose = () => ac.abort();
+ socket.onerror = () => fail();
+ return response;
+ },
+ signal: ac.signal,
+ onListen: () => listeningDeferred.resolve(),
+ hostname: "localhost",
+ port: servePort,
+ });
+
+ await listeningDeferred.promise;
+
+ const ws = new WebSocket(serveUrl);
+ assertEquals(ws.url, serveUrl);
+ let seenBye = false;
+ ws.onerror = () => fail();
+ ws.onmessage = ({ data }) => {
+ if (data == "Hello") {
+ ws.send("Hello!");
+ } else {
+ assertEquals(data, "Bye");
+ seenBye = true;
+ }
+ };
+ ws.onclose = () => {
+ deferred.resolve();
+ };
+ await Promise.all([deferred.promise, server.finished]);
+
+ assert(seenBye);
+});
+
+Deno.test(
+ { sanitizeOps: false },
+ function websocketConstructorWithPrototypePollution() {
+ const originalSymbolIterator = Array.prototype[Symbol.iterator];
+ try {
+ Array.prototype[Symbol.iterator] = () => {
+ throw Error("unreachable");
+ };
+ assertThrows(() => {
+ new WebSocket(
+ new URL("ws://localhost:4242/"),
+ // Allow `Symbol.iterator` to be called in WebIDL conversion to `sequence<DOMString>`
+ // deno-lint-ignore no-explicit-any
+ ["soap", "soap"].values() as any,
+ );
+ }, DOMException);
+ } finally {
+ Array.prototype[Symbol.iterator] = originalSymbolIterator;
+ }
+ },
+);
+
+Deno.test(async function websocketTlsSocketWorks() {
+ const cert = await Deno.readTextFile("tests/testdata/tls/localhost.crt");
+ const key = await Deno.readTextFile("tests/testdata/tls/localhost.key");
+
+ const messages: string[] = [],
+ errors: { server?: Event; client?: Event }[] = [];
+ const promise = new Promise((okay, nope) => {
+ const ac = new AbortController();
+ const server = Deno.serve({
+ handler: (req) => {
+ const { response, socket } = Deno.upgradeWebSocket(req);
+ socket.onopen = () => socket.send("ping");
+ socket.onmessage = (e) => {
+ messages.push(e.data);
+ socket.close();
+ };
+ socket.onerror = (e) => errors.push({ server: e });
+ socket.onclose = () => ac.abort();
+ return response;
+ },
+ signal: ac.signal,
+ hostname: "localhost",
+ port: servePort,
+ cert,
+ key,
+ });
+ setTimeout(() => {
+ const ws = new WebSocket(`wss://localhost:${servePort}`);
+ ws.onmessage = (e) => {
+ messages.push(e.data);
+ ws.send("pong");
+ };
+ ws.onerror = (e) => {
+ errors.push({ client: e });
+ nope();
+ };
+ ws.onclose = () => okay(server.finished);
+ }, 1000);
+ });
+
+ const finished = await promise;
+
+ assertEquals(errors, []);
+ assertEquals(messages, ["ping", "pong"]);
+
+ await finished;
+});
+
+// https://github.com/denoland/deno/issues/15340
+Deno.test(
+ async function websocketServerFieldInit() {
+ const ac = new AbortController();
+ const listeningDeferred = Promise.withResolvers<void>();
+
+ const server = Deno.serve({
+ handler: (req) => {
+ const { socket, response } = Deno.upgradeWebSocket(req, {
+ idleTimeout: 0,
+ });
+ socket.onopen = function () {
+ assert(typeof socket.url == "string");
+ assert(socket.readyState == WebSocket.OPEN);
+ assert(socket.protocol == "");
+ assert(socket.binaryType == "arraybuffer");
+ socket.close();
+ };
+ socket.onclose = () => ac.abort();
+ return response;
+ },
+ signal: ac.signal,
+ onListen: () => listeningDeferred.resolve(),
+ hostname: "localhost",
+ port: servePort,
+ });
+
+ await listeningDeferred.promise;
+ const deferred = Promise.withResolvers<void>();
+ const ws = new WebSocket(serveUrl);
+ assertEquals(ws.url, serveUrl);
+ ws.onerror = () => fail();
+ ws.onclose = () => {
+ deferred.resolve();
+ };
+
+ await Promise.all([deferred.promise, server.finished]);
+ },
+);
+
+Deno.test(
+ { sanitizeOps: false },
+ async function websocketServerGetsGhosted() {
+ const ac = new AbortController();
+ const listeningDeferred = Promise.withResolvers<void>();
+
+ const server = Deno.serve({
+ handler: (req) => {
+ const { socket, response } = Deno.upgradeWebSocket(req, {
+ idleTimeout: 2,
+ });
+ socket.onerror = () => socket.close();
+ socket.onclose = () => ac.abort();
+ return response;
+ },
+ signal: ac.signal,
+ onListen: () => listeningDeferred.resolve(),
+ hostname: "localhost",
+ port: servePort,
+ });
+
+ await listeningDeferred.promise;
+ const r = await fetch("http://localhost:4545/ghost_ws_client");
+ assertEquals(r.status, 200);
+ await r.body?.cancel();
+
+ await server.finished;
+ },
+);
+
+Deno.test("invalid scheme", () => {
+ assertThrows(() => new WebSocket("foo://localhost:4242"));
+});
+
+Deno.test("fragment", () => {
+ assertThrows(() => new WebSocket("ws://localhost:4242/#"));
+ assertThrows(() => new WebSocket("ws://localhost:4242/#foo"));
+});
+
+Deno.test("duplicate protocols", () => {
+ assertThrows(() => new WebSocket("ws://localhost:4242", ["foo", "foo"]));
+});
+
+Deno.test("invalid server", async () => {
+ const { promise, resolve } = Promise.withResolvers<void>();
+ const ws = new WebSocket("ws://localhost:2121");
+ let err = false;
+ ws.onerror = () => {
+ err = true;
+ };
+ ws.onclose = () => {
+ if (err) {
+ resolve();
+ } else {
+ fail();
+ }
+ };
+ ws.onopen = () => fail();
+ await promise;
+});
+
+Deno.test("connect & close", async () => {
+ const { promise, resolve } = Promise.withResolvers<void>();
+ const ws = new WebSocket("ws://localhost:4242");
+ ws.onerror = () => fail();
+ ws.onopen = () => {
+ ws.close();
+ };
+ ws.onclose = () => {
+ resolve();
+ };
+ await promise;
+});
+
+Deno.test("connect & abort", async () => {
+ const { promise, resolve } = Promise.withResolvers<void>();
+ const ws = new WebSocket("ws://localhost:4242");
+ ws.close();
+ let err = false;
+ ws.onerror = () => {
+ err = true;
+ };
+ ws.onclose = () => {
+ if (err) {
+ resolve();
+ } else {
+ fail();
+ }
+ };
+ ws.onopen = () => fail();
+ await promise;
+});
+
+Deno.test("connect & close custom valid code", async () => {
+ const { promise, resolve } = Promise.withResolvers<void>();
+ const ws = new WebSocket("ws://localhost:4242");
+ ws.onerror = () => fail();
+ ws.onopen = () => ws.close(1000);
+ ws.onclose = () => {
+ resolve();
+ };
+ await promise;
+});
+
+Deno.test("connect & close custom invalid code", async () => {
+ const { promise, resolve } = Promise.withResolvers<void>();
+ const ws = new WebSocket("ws://localhost:4242");
+ ws.onerror = () => fail();
+ ws.onopen = () => {
+ assertThrows(() => ws.close(1001));
+ ws.close();
+ };
+ ws.onclose = () => {
+ resolve();
+ };
+ await promise;
+});
+
+Deno.test("connect & close custom valid reason", async () => {
+ const { promise, resolve } = Promise.withResolvers<void>();
+ const ws = new WebSocket("ws://localhost:4242");
+ ws.onerror = () => fail();
+ ws.onopen = () => ws.close(1000, "foo");
+ ws.onclose = () => {
+ resolve();
+ };
+ await promise;
+});
+
+Deno.test("connect & close custom invalid reason", async () => {
+ const { promise, resolve } = Promise.withResolvers<void>();
+ const ws = new WebSocket("ws://localhost:4242");
+ ws.onerror = () => fail();
+ ws.onopen = () => {
+ assertThrows(() => ws.close(1000, "".padEnd(124, "o")));
+ ws.close();
+ };
+ ws.onclose = () => {
+ resolve();
+ };
+ await promise;
+});
+
+Deno.test("echo string", async () => {
+ const { promise, resolve } = Promise.withResolvers<void>();
+ const ws = new WebSocket("ws://localhost:4242");
+ ws.onerror = () => fail();
+ ws.onopen = () => ws.send("foo");
+ ws.onmessage = (e) => {
+ assertEquals(e.data, "foo");
+ ws.close();
+ };
+ ws.onclose = () => {
+ resolve();
+ };
+ await promise;
+});
+
+Deno.test("echo string tls", async () => {
+ const deferred1 = Promise.withResolvers<void>();
+ const deferred2 = Promise.withResolvers<void>();
+ const ws = new WebSocket("wss://localhost:4243");
+ ws.onerror = () => fail();
+ ws.onopen = () => ws.send("foo");
+ ws.onmessage = (e) => {
+ assertEquals(e.data, "foo");
+ ws.close();
+ deferred1.resolve();
+ };
+ ws.onclose = () => {
+ deferred2.resolve();
+ };
+ await deferred1.promise;
+ await deferred2.promise;
+});
+
+Deno.test("websocket error", async () => {
+ const { promise, resolve } = Promise.withResolvers<void>();
+ const ws = new WebSocket("wss://localhost:4242");
+ ws.onopen = () => fail();
+ ws.onerror = (err) => {
+ assert(err instanceof ErrorEvent);
+ assertEquals(
+ err.message,
+ "NetworkError: failed to connect to WebSocket: received corrupt message of type InvalidContentType",
+ );
+ resolve();
+ };
+ await promise;
+});
+
+Deno.test("echo blob with binaryType blob", async () => {
+ const { promise, resolve } = Promise.withResolvers<void>();
+ const ws = new WebSocket("ws://localhost:4242");
+ const blob = new Blob(["foo"]);
+ ws.onerror = () => fail();
+ ws.onopen = () => ws.send(blob);
+ ws.onmessage = (e) => {
+ e.data.text().then((actual: string) => {
+ blob.text().then((expected) => {
+ assertEquals(actual, expected);
+ });
+ });
+ ws.close();
+ };
+ ws.onclose = () => {
+ resolve();
+ };
+ await promise;
+});
+
+Deno.test("echo blob with binaryType arraybuffer", async () => {
+ const { promise, resolve } = Promise.withResolvers<void>();
+ const ws = new WebSocket("ws://localhost:4242");
+ ws.binaryType = "arraybuffer";
+ const blob = new Blob(["foo"]);
+ ws.onerror = () => fail();
+ ws.onopen = () => ws.send(blob);
+ ws.onmessage = (e) => {
+ blob.arrayBuffer().then((expected) => {
+ assertEquals(e.data, expected);
+ });
+ ws.close();
+ };
+ ws.onclose = () => {
+ resolve();
+ };
+ await promise;
+});
+
+Deno.test("echo uint8array with binaryType blob", async () => {
+ const { promise, resolve } = Promise.withResolvers<void>();
+ const ws = new WebSocket("ws://localhost:4242");
+ const uint = new Uint8Array([102, 111, 111]);
+ ws.onerror = () => fail();
+ ws.onopen = () => ws.send(uint);
+ ws.onmessage = (e) => {
+ e.data.arrayBuffer().then((actual: ArrayBuffer) => {
+ assertEquals(actual, uint.buffer);
+ });
+ ws.close();
+ };
+ ws.onclose = () => {
+ resolve();
+ };
+ await promise;
+});
+
+Deno.test("echo uint8array with binaryType arraybuffer", async () => {
+ const { promise, resolve } = Promise.withResolvers<void>();
+ const ws = new WebSocket("ws://localhost:4242");
+ ws.binaryType = "arraybuffer";
+ const uint = new Uint8Array([102, 111, 111]);
+ ws.onerror = () => fail();
+ ws.onopen = () => ws.send(uint);
+ ws.onmessage = (e) => {
+ assertEquals(e.data, uint.buffer);
+ ws.close();
+ };
+ ws.onclose = () => {
+ resolve();
+ };
+ await promise;
+});
+
+Deno.test("echo arraybuffer with binaryType blob", async () => {
+ const { promise, resolve } = Promise.withResolvers<void>();
+ const ws = new WebSocket("ws://localhost:4242");
+ const buffer = new ArrayBuffer(3);
+ ws.onerror = () => fail();
+ ws.onopen = () => ws.send(buffer);
+ ws.onmessage = (e) => {
+ e.data.arrayBuffer().then((actual: ArrayBuffer) => {
+ assertEquals(actual, buffer);
+ });
+ ws.close();
+ };
+ ws.onclose = () => {
+ resolve();
+ };
+ await promise;
+});
+
+Deno.test("echo arraybuffer with binaryType arraybuffer", async () => {
+ const { promise, resolve } = Promise.withResolvers<void>();
+ const ws = new WebSocket("ws://localhost:4242");
+ ws.binaryType = "arraybuffer";
+ const buffer = new ArrayBuffer(3);
+ ws.onerror = () => fail();
+ ws.onopen = () => ws.send(buffer);
+ ws.onmessage = (e) => {
+ assertEquals(e.data, buffer);
+ ws.close();
+ };
+ ws.onclose = () => {
+ resolve();
+ };
+ await promise;
+});
+
+Deno.test("Event Handlers order", async () => {
+ const { promise, resolve } = Promise.withResolvers<void>();
+ const ws = new WebSocket("ws://localhost:4242");
+ const arr: number[] = [];
+ ws.onerror = () => fail();
+ ws.addEventListener("message", () => arr.push(1));
+ ws.onmessage = () => fail();
+ ws.addEventListener("message", () => {
+ arr.push(3);
+ ws.close();
+ assertEquals(arr, [1, 2, 3]);
+ });
+ ws.onmessage = () => arr.push(2);
+ ws.onopen = () => ws.send("Echo");
+ ws.onclose = () => {
+ resolve();
+ };
+ await promise;
+});
+
+Deno.test("Close without frame", async () => {
+ const { promise, resolve } = Promise.withResolvers<void>();
+ const ws = new WebSocket("ws://localhost:4244");
+ ws.onerror = () => fail();
+ ws.onclose = (e) => {
+ assertEquals(e.code, 1005);
+ resolve();
+ };
+ await promise;
+});
diff --git a/cli/tests/unit/websocketstream_test.ts.disabled b/tests/unit/websocketstream_test.ts.disabled
index eaedb71bd..eaedb71bd 100644
--- a/cli/tests/unit/websocketstream_test.ts.disabled
+++ b/tests/unit/websocketstream_test.ts.disabled
diff --git a/cli/tests/unit/webstorage_test.ts b/tests/unit/webstorage_test.ts
index 9dc560af1..9dc560af1 100644
--- a/cli/tests/unit/webstorage_test.ts
+++ b/tests/unit/webstorage_test.ts
diff --git a/cli/tests/unit/worker_permissions_test.ts b/tests/unit/worker_permissions_test.ts
index 28bf9f92a..28bf9f92a 100644
--- a/cli/tests/unit/worker_permissions_test.ts
+++ b/tests/unit/worker_permissions_test.ts
diff --git a/cli/tests/unit/worker_test.ts b/tests/unit/worker_test.ts
index eea0e8106..eea0e8106 100644
--- a/cli/tests/unit/worker_test.ts
+++ b/tests/unit/worker_test.ts
diff --git a/cli/tests/unit/write_file_test.ts b/tests/unit/write_file_test.ts
index 6cd08e2d1..6cd08e2d1 100644
--- a/cli/tests/unit/write_file_test.ts
+++ b/tests/unit/write_file_test.ts
diff --git a/cli/tests/unit/write_text_file_test.ts b/tests/unit/write_text_file_test.ts
index a58d91997..a58d91997 100644
--- a/cli/tests/unit/write_text_file_test.ts
+++ b/tests/unit/write_text_file_test.ts
diff --git a/cli/tests/unit_node/_fs/_fs_access_test.ts b/tests/unit_node/_fs/_fs_access_test.ts
index 5b5b7f34d..5b5b7f34d 100644
--- a/cli/tests/unit_node/_fs/_fs_access_test.ts
+++ b/tests/unit_node/_fs/_fs_access_test.ts
diff --git a/cli/tests/unit_node/_fs/_fs_appendFile_test.ts b/tests/unit_node/_fs/_fs_appendFile_test.ts
index 57271efdb..57271efdb 100644
--- a/cli/tests/unit_node/_fs/_fs_appendFile_test.ts
+++ b/tests/unit_node/_fs/_fs_appendFile_test.ts
diff --git a/cli/tests/unit_node/_fs/_fs_chmod_test.ts b/tests/unit_node/_fs/_fs_chmod_test.ts
index 2bddcb293..2bddcb293 100644
--- a/cli/tests/unit_node/_fs/_fs_chmod_test.ts
+++ b/tests/unit_node/_fs/_fs_chmod_test.ts
diff --git a/cli/tests/unit_node/_fs/_fs_chown_test.ts b/tests/unit_node/_fs/_fs_chown_test.ts
index d4f6ea0e8..d4f6ea0e8 100644
--- a/cli/tests/unit_node/_fs/_fs_chown_test.ts
+++ b/tests/unit_node/_fs/_fs_chown_test.ts
diff --git a/cli/tests/unit_node/_fs/_fs_close_test.ts b/tests/unit_node/_fs/_fs_close_test.ts
index 155667305..155667305 100644
--- a/cli/tests/unit_node/_fs/_fs_close_test.ts
+++ b/tests/unit_node/_fs/_fs_close_test.ts
diff --git a/cli/tests/unit_node/_fs/_fs_copy_test.ts b/tests/unit_node/_fs/_fs_copy_test.ts
index 915ee93bd..915ee93bd 100644
--- a/cli/tests/unit_node/_fs/_fs_copy_test.ts
+++ b/tests/unit_node/_fs/_fs_copy_test.ts
diff --git a/cli/tests/unit_node/_fs/_fs_dir_test.ts b/tests/unit_node/_fs/_fs_dir_test.ts
index 697929fee..697929fee 100644
--- a/cli/tests/unit_node/_fs/_fs_dir_test.ts
+++ b/tests/unit_node/_fs/_fs_dir_test.ts
diff --git a/cli/tests/unit_node/_fs/_fs_dirent_test.ts b/tests/unit_node/_fs/_fs_dirent_test.ts
index a42f6a25c..a42f6a25c 100644
--- a/cli/tests/unit_node/_fs/_fs_dirent_test.ts
+++ b/tests/unit_node/_fs/_fs_dirent_test.ts
diff --git a/cli/tests/unit_node/_fs/_fs_exists_test.ts b/tests/unit_node/_fs/_fs_exists_test.ts
index baf959502..baf959502 100644
--- a/cli/tests/unit_node/_fs/_fs_exists_test.ts
+++ b/tests/unit_node/_fs/_fs_exists_test.ts
diff --git a/cli/tests/unit_node/_fs/_fs_fdatasync_test.ts b/tests/unit_node/_fs/_fs_fdatasync_test.ts
index 7a61bd4c1..7a61bd4c1 100644
--- a/cli/tests/unit_node/_fs/_fs_fdatasync_test.ts
+++ b/tests/unit_node/_fs/_fs_fdatasync_test.ts
diff --git a/cli/tests/unit_node/_fs/_fs_fstat_test.ts b/tests/unit_node/_fs/_fs_fstat_test.ts
index d15ef5a80..d15ef5a80 100644
--- a/cli/tests/unit_node/_fs/_fs_fstat_test.ts
+++ b/tests/unit_node/_fs/_fs_fstat_test.ts
diff --git a/cli/tests/unit_node/_fs/_fs_fsync_test.ts b/tests/unit_node/_fs/_fs_fsync_test.ts
index 870055c00..870055c00 100644
--- a/cli/tests/unit_node/_fs/_fs_fsync_test.ts
+++ b/tests/unit_node/_fs/_fs_fsync_test.ts
diff --git a/cli/tests/unit_node/_fs/_fs_ftruncate_test.ts b/tests/unit_node/_fs/_fs_ftruncate_test.ts
index 1e669fb60..1e669fb60 100644
--- a/cli/tests/unit_node/_fs/_fs_ftruncate_test.ts
+++ b/tests/unit_node/_fs/_fs_ftruncate_test.ts
diff --git a/cli/tests/unit_node/_fs/_fs_futimes_test.ts b/tests/unit_node/_fs/_fs_futimes_test.ts
index bf3746957..bf3746957 100644
--- a/cli/tests/unit_node/_fs/_fs_futimes_test.ts
+++ b/tests/unit_node/_fs/_fs_futimes_test.ts
diff --git a/cli/tests/unit_node/_fs/_fs_handle_test.ts b/tests/unit_node/_fs/_fs_handle_test.ts
index 151d4d752..151d4d752 100644
--- a/cli/tests/unit_node/_fs/_fs_handle_test.ts
+++ b/tests/unit_node/_fs/_fs_handle_test.ts
diff --git a/cli/tests/unit_node/_fs/_fs_link_test.ts b/tests/unit_node/_fs/_fs_link_test.ts
index 15f15c706..15f15c706 100644
--- a/cli/tests/unit_node/_fs/_fs_link_test.ts
+++ b/tests/unit_node/_fs/_fs_link_test.ts
diff --git a/cli/tests/unit_node/_fs/_fs_lstat_test.ts b/tests/unit_node/_fs/_fs_lstat_test.ts
index ccd21a3cd..ccd21a3cd 100644
--- a/cli/tests/unit_node/_fs/_fs_lstat_test.ts
+++ b/tests/unit_node/_fs/_fs_lstat_test.ts
diff --git a/cli/tests/unit_node/_fs/_fs_mkdir_test.ts b/tests/unit_node/_fs/_fs_mkdir_test.ts
index fb7fcf9c5..fb7fcf9c5 100644
--- a/cli/tests/unit_node/_fs/_fs_mkdir_test.ts
+++ b/tests/unit_node/_fs/_fs_mkdir_test.ts
diff --git a/cli/tests/unit_node/_fs/_fs_mkdtemp_test.ts b/tests/unit_node/_fs/_fs_mkdtemp_test.ts
index 9f8975113..9f8975113 100644
--- a/cli/tests/unit_node/_fs/_fs_mkdtemp_test.ts
+++ b/tests/unit_node/_fs/_fs_mkdtemp_test.ts
diff --git a/cli/tests/unit_node/_fs/_fs_open_test.ts b/tests/unit_node/_fs/_fs_open_test.ts
index 8cb9b0ec2..8cb9b0ec2 100644
--- a/cli/tests/unit_node/_fs/_fs_open_test.ts
+++ b/tests/unit_node/_fs/_fs_open_test.ts
diff --git a/cli/tests/unit_node/_fs/_fs_opendir_test.ts b/tests/unit_node/_fs/_fs_opendir_test.ts
index d4abb349c..d4abb349c 100644
--- a/cli/tests/unit_node/_fs/_fs_opendir_test.ts
+++ b/tests/unit_node/_fs/_fs_opendir_test.ts
diff --git a/cli/tests/unit_node/_fs/_fs_readFile_test.ts b/tests/unit_node/_fs/_fs_readFile_test.ts
index 00653955d..00653955d 100644
--- a/cli/tests/unit_node/_fs/_fs_readFile_test.ts
+++ b/tests/unit_node/_fs/_fs_readFile_test.ts
diff --git a/cli/tests/unit_node/_fs/_fs_read_test.ts b/tests/unit_node/_fs/_fs_read_test.ts
index de741e377..de741e377 100644
--- a/cli/tests/unit_node/_fs/_fs_read_test.ts
+++ b/tests/unit_node/_fs/_fs_read_test.ts
diff --git a/cli/tests/unit_node/_fs/_fs_readdir_test.ts b/tests/unit_node/_fs/_fs_readdir_test.ts
index eaacbfc5e..eaacbfc5e 100644
--- a/cli/tests/unit_node/_fs/_fs_readdir_test.ts
+++ b/tests/unit_node/_fs/_fs_readdir_test.ts
diff --git a/cli/tests/unit_node/_fs/_fs_readlink_test.ts b/tests/unit_node/_fs/_fs_readlink_test.ts
index 02d84c6c3..02d84c6c3 100644
--- a/cli/tests/unit_node/_fs/_fs_readlink_test.ts
+++ b/tests/unit_node/_fs/_fs_readlink_test.ts
diff --git a/cli/tests/unit_node/_fs/_fs_realpath_test.ts b/tests/unit_node/_fs/_fs_realpath_test.ts
index 6f22ff72a..6f22ff72a 100644
--- a/cli/tests/unit_node/_fs/_fs_realpath_test.ts
+++ b/tests/unit_node/_fs/_fs_realpath_test.ts
diff --git a/cli/tests/unit_node/_fs/_fs_rename_test.ts b/tests/unit_node/_fs/_fs_rename_test.ts
index dd0a01f8a..dd0a01f8a 100644
--- a/cli/tests/unit_node/_fs/_fs_rename_test.ts
+++ b/tests/unit_node/_fs/_fs_rename_test.ts
diff --git a/cli/tests/unit_node/_fs/_fs_rm_test.ts b/tests/unit_node/_fs/_fs_rm_test.ts
index 1cc82a0cc..1cc82a0cc 100644
--- a/cli/tests/unit_node/_fs/_fs_rm_test.ts
+++ b/tests/unit_node/_fs/_fs_rm_test.ts
diff --git a/cli/tests/unit_node/_fs/_fs_rmdir_test.ts b/tests/unit_node/_fs/_fs_rmdir_test.ts
index d2b075bdf..d2b075bdf 100644
--- a/cli/tests/unit_node/_fs/_fs_rmdir_test.ts
+++ b/tests/unit_node/_fs/_fs_rmdir_test.ts
diff --git a/cli/tests/unit_node/_fs/_fs_stat_test.ts b/tests/unit_node/_fs/_fs_stat_test.ts
index 38d5ca985..38d5ca985 100644
--- a/cli/tests/unit_node/_fs/_fs_stat_test.ts
+++ b/tests/unit_node/_fs/_fs_stat_test.ts
diff --git a/cli/tests/unit_node/_fs/_fs_symlink_test.ts b/tests/unit_node/_fs/_fs_symlink_test.ts
index 4e42da293..4e42da293 100644
--- a/cli/tests/unit_node/_fs/_fs_symlink_test.ts
+++ b/tests/unit_node/_fs/_fs_symlink_test.ts
diff --git a/cli/tests/unit_node/_fs/_fs_truncate_test.ts b/tests/unit_node/_fs/_fs_truncate_test.ts
index 9b7a9c490..9b7a9c490 100644
--- a/cli/tests/unit_node/_fs/_fs_truncate_test.ts
+++ b/tests/unit_node/_fs/_fs_truncate_test.ts
diff --git a/cli/tests/unit_node/_fs/_fs_unlink_test.ts b/tests/unit_node/_fs/_fs_unlink_test.ts
index 1bdd9ee29..1bdd9ee29 100644
--- a/cli/tests/unit_node/_fs/_fs_unlink_test.ts
+++ b/tests/unit_node/_fs/_fs_unlink_test.ts
diff --git a/cli/tests/unit_node/_fs/_fs_utimes_test.ts b/tests/unit_node/_fs/_fs_utimes_test.ts
index 1c6c7455e..1c6c7455e 100644
--- a/cli/tests/unit_node/_fs/_fs_utimes_test.ts
+++ b/tests/unit_node/_fs/_fs_utimes_test.ts
diff --git a/cli/tests/unit_node/_fs/_fs_watch_test.ts b/tests/unit_node/_fs/_fs_watch_test.ts
index ffa6cac45..ffa6cac45 100644
--- a/cli/tests/unit_node/_fs/_fs_watch_test.ts
+++ b/tests/unit_node/_fs/_fs_watch_test.ts
diff --git a/cli/tests/unit_node/_fs/_fs_writeFile_test.ts b/tests/unit_node/_fs/_fs_writeFile_test.ts
index 44f1403df..44f1403df 100644
--- a/cli/tests/unit_node/_fs/_fs_writeFile_test.ts
+++ b/tests/unit_node/_fs/_fs_writeFile_test.ts
diff --git a/cli/tests/unit_node/_fs/_fs_write_test.ts b/tests/unit_node/_fs/_fs_write_test.ts
index 7e75f321f..7e75f321f 100644
--- a/cli/tests/unit_node/_fs/_fs_write_test.ts
+++ b/tests/unit_node/_fs/_fs_write_test.ts
diff --git a/cli/tests/unit_node/_fs/testdata/hello.txt b/tests/unit_node/_fs/testdata/hello.txt
index 95d09f2b1..95d09f2b1 100644
--- a/cli/tests/unit_node/_fs/testdata/hello.txt
+++ b/tests/unit_node/_fs/testdata/hello.txt
diff --git a/cli/tests/unit_node/_test_utils.ts b/tests/unit_node/_test_utils.ts
index 3942cf0a9..3942cf0a9 100644
--- a/cli/tests/unit_node/_test_utils.ts
+++ b/tests/unit_node/_test_utils.ts
diff --git a/cli/tests/unit_node/assertion_error_test.ts b/tests/unit_node/assertion_error_test.ts
index b61baee93..b61baee93 100644
--- a/cli/tests/unit_node/assertion_error_test.ts
+++ b/tests/unit_node/assertion_error_test.ts
diff --git a/cli/tests/unit_node/async_hooks_test.ts b/tests/unit_node/async_hooks_test.ts
index 1d0910d10..1d0910d10 100644
--- a/cli/tests/unit_node/async_hooks_test.ts
+++ b/tests/unit_node/async_hooks_test.ts
diff --git a/cli/tests/unit_node/buffer_test.ts b/tests/unit_node/buffer_test.ts
index af83c9ada..af83c9ada 100644
--- a/cli/tests/unit_node/buffer_test.ts
+++ b/tests/unit_node/buffer_test.ts
diff --git a/cli/tests/unit_node/child_process_test.ts b/tests/unit_node/child_process_test.ts
index 5314d66e7..5314d66e7 100644
--- a/cli/tests/unit_node/child_process_test.ts
+++ b/tests/unit_node/child_process_test.ts
diff --git a/cli/tests/unit_node/console_test.ts b/tests/unit_node/console_test.ts
index bf6f667f2..bf6f667f2 100644
--- a/cli/tests/unit_node/console_test.ts
+++ b/tests/unit_node/console_test.ts
diff --git a/cli/tests/unit_node/crypto/crypto_cipher_gcm_test.ts b/tests/unit_node/crypto/crypto_cipher_gcm_test.ts
index b7b616546..b7b616546 100644
--- a/cli/tests/unit_node/crypto/crypto_cipher_gcm_test.ts
+++ b/tests/unit_node/crypto/crypto_cipher_gcm_test.ts
diff --git a/cli/tests/unit_node/crypto/crypto_cipher_test.ts b/tests/unit_node/crypto/crypto_cipher_test.ts
index 3da7ae3f1..3da7ae3f1 100644
--- a/cli/tests/unit_node/crypto/crypto_cipher_test.ts
+++ b/tests/unit_node/crypto/crypto_cipher_test.ts
diff --git a/cli/tests/unit_node/crypto/crypto_hash_test.ts b/tests/unit_node/crypto/crypto_hash_test.ts
index ff1c9c598..ff1c9c598 100644
--- a/cli/tests/unit_node/crypto/crypto_hash_test.ts
+++ b/tests/unit_node/crypto/crypto_hash_test.ts
diff --git a/cli/tests/unit_node/crypto/crypto_key_test.ts b/tests/unit_node/crypto/crypto_key_test.ts
index 8d1b24b21..8d1b24b21 100644
--- a/cli/tests/unit_node/crypto/crypto_key_test.ts
+++ b/tests/unit_node/crypto/crypto_key_test.ts
diff --git a/cli/tests/unit_node/crypto/crypto_sign_test.ts b/tests/unit_node/crypto/crypto_sign_test.ts
index 287b54cc1..287b54cc1 100644
--- a/cli/tests/unit_node/crypto/crypto_sign_test.ts
+++ b/tests/unit_node/crypto/crypto_sign_test.ts
diff --git a/cli/tests/unit_node/crypto/ec_private_secp256r1.pem b/tests/unit_node/crypto/ec_private_secp256r1.pem
index f1d5c5769..f1d5c5769 100644
--- a/cli/tests/unit_node/crypto/ec_private_secp256r1.pem
+++ b/tests/unit_node/crypto/ec_private_secp256r1.pem
diff --git a/cli/tests/unit_node/crypto/gcmEncryptExtIV128.json b/tests/unit_node/crypto/gcmEncryptExtIV128.json
index 64896642d..64896642d 100644
--- a/cli/tests/unit_node/crypto/gcmEncryptExtIV128.json
+++ b/tests/unit_node/crypto/gcmEncryptExtIV128.json
diff --git a/cli/tests/unit_node/crypto/gcmEncryptExtIV256.json b/tests/unit_node/crypto/gcmEncryptExtIV256.json
index cb8ba3086..cb8ba3086 100644
--- a/cli/tests/unit_node/crypto/gcmEncryptExtIV256.json
+++ b/tests/unit_node/crypto/gcmEncryptExtIV256.json
diff --git a/cli/tests/unit_node/dgram_test.ts b/tests/unit_node/dgram_test.ts
index 4c6e49577..4c6e49577 100644
--- a/cli/tests/unit_node/dgram_test.ts
+++ b/tests/unit_node/dgram_test.ts
diff --git a/cli/tests/unit_node/events_test.ts b/tests/unit_node/events_test.ts
index 13abf5f79..13abf5f79 100644
--- a/cli/tests/unit_node/events_test.ts
+++ b/tests/unit_node/events_test.ts
diff --git a/tests/unit_node/fs_test.ts b/tests/unit_node/fs_test.ts
new file mode 100644
index 000000000..e0cdf3a23
--- /dev/null
+++ b/tests/unit_node/fs_test.ts
@@ -0,0 +1,116 @@
+// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
+
+import {
+ assert,
+ assertEquals,
+ assertThrows,
+} from "@test_util/std/assert/mod.ts";
+import { join } from "node:path";
+import { tmpdir } from "node:os";
+import {
+ constants,
+ existsSync,
+ mkdtempSync,
+ promises,
+ readFileSync,
+ writeFileSync,
+} from "node:fs";
+import { constants as fsPromiseConstants, cp } from "node:fs/promises";
+import { pathToAbsoluteFileUrl } from "../unit/test_util.ts";
+
+Deno.test(
+ "[node/fs writeFileSync] write file without option",
+ () => {
+ const data = "Hello";
+ const filename = mkdtempSync(join(tmpdir(), "foo-")) + "/test.txt";
+
+ writeFileSync(filename, data);
+ const dataRead = readFileSync(filename, "utf8");
+
+ assert(dataRead === "Hello");
+ },
+);
+
+Deno.test(
+ "[node/fs writeFileSync] write file with option ASCII",
+ () => {
+ const data = "Hello";
+ const filename = mkdtempSync(join(tmpdir(), "foo-")) + "/test.txt";
+
+ writeFileSync(filename, data, { encoding: "ascii" });
+ const dataRead = readFileSync(filename, "utf8");
+
+ assert(dataRead === "Hello");
+ },
+);
+
+Deno.test(
+ "[node/fs writeFileSync] write file throws error when encoding is not implemented",
+ () => {
+ const data = "Hello";
+ const filename = mkdtempSync(join(tmpdir(), "foo-")) + "/test.txt";
+
+ assertThrows(
+ () => writeFileSync(filename, data, { encoding: "utf16le" }),
+ 'The value "utf16le" is invalid for option "encoding"',
+ );
+ },
+);
+
+Deno.test(
+ "[node/fs existsSync] path",
+ { permissions: { read: true } },
+ () => {
+ assert(existsSync("tests/testdata/assets/fixture.json"));
+ },
+);
+
+Deno.test(
+ "[node/fs existsSync] url",
+ { permissions: { read: true } },
+ () => {
+ assert(existsSync(
+ pathToAbsoluteFileUrl("tests/testdata/assets/fixture.json"),
+ ));
+ },
+);
+
+Deno.test(
+ "[node/fs existsSync] no permission",
+ { permissions: { read: false } },
+ () => {
+ assertThrows(() => {
+ existsSync("tests/testdata/assets/fixture.json");
+ }, Deno.errors.PermissionDenied);
+ },
+);
+
+Deno.test(
+ "[node/fs existsSync] not exists",
+ { permissions: { read: true } },
+ () => {
+ assert(!existsSync("bad_filename"));
+ },
+);
+
+Deno.test(
+ "[node/fs/promises constants] is the same as from node:fs",
+ () => {
+ assertEquals(constants, fsPromiseConstants);
+ assertEquals(constants, promises.constants);
+ },
+);
+
+Deno.test(
+ "[node/fs/promises cp] copy file",
+ async () => {
+ const src = mkdtempSync(join(tmpdir(), "foo-")) + "/test.txt";
+ const dest = mkdtempSync(join(tmpdir(), "foo-")) + "/test.txt";
+ writeFileSync(src, "Hello");
+
+ await cp(src, dest);
+
+ const dataRead = readFileSync(dest, "utf8");
+ assert(dataRead === "Hello");
+ },
+);
diff --git a/cli/tests/unit_node/http2_test.ts b/tests/unit_node/http2_test.ts
index 5db5cc8e8..5db5cc8e8 100644
--- a/cli/tests/unit_node/http2_test.ts
+++ b/tests/unit_node/http2_test.ts
diff --git a/tests/unit_node/http_test.ts b/tests/unit_node/http_test.ts
new file mode 100644
index 000000000..28e67ddad
--- /dev/null
+++ b/tests/unit_node/http_test.ts
@@ -0,0 +1,940 @@
+// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
+
+import EventEmitter from "node:events";
+import http, { type RequestOptions } from "node:http";
+import https from "node:https";
+import { assert, assertEquals, fail } from "@test_util/std/assert/mod.ts";
+import { assertSpyCalls, spy } from "@test_util/std/testing/mock.ts";
+
+import { gzip } from "node:zlib";
+import { Buffer } from "node:buffer";
+import { serve } from "@test_util/std/http/server.ts";
+import { execCode } from "../unit/test_util.ts";
+
+Deno.test("[node/http listen]", async () => {
+ {
+ const server = http.createServer();
+ assertEquals(0, EventEmitter.listenerCount(server, "request"));
+ }
+
+ {
+ const server = http.createServer(() => {});
+ assertEquals(1, EventEmitter.listenerCount(server, "request"));
+ }
+
+ {
+ const { promise, resolve } = Promise.withResolvers<void>();
+ const server = http.createServer();
+
+ server.listen(() => {
+ server.close();
+ });
+ server.on("close", () => {
+ resolve();
+ });
+
+ await promise;
+ }
+
+ {
+ const { promise, resolve } = Promise.withResolvers<void>();
+ const server = http.createServer();
+
+ server.listen().on("listening", () => {
+ server.close();
+ });
+ server.on("close", () => {
+ resolve();
+ });
+
+ await promise;
+ }
+
+ for (const port of [0, -0, 0.0, "0", null, undefined]) {
+ const { promise, resolve } = Promise.withResolvers<void>();
+ const server = http.createServer();
+
+ server.listen(port, () => {
+ server.close();
+ });
+ server.on("close", () => {
+ resolve();
+ });
+
+ await promise;
+ }
+});
+
+Deno.test("[node/http close]", async () => {
+ {
+ const deferred1 = Promise.withResolvers<void>();
+ const deferred2 = Promise.withResolvers<void>();
+ // Node quirk: callback gets exception object, event listener does not.
+ // deno-lint-ignore no-explicit-any
+ const server = http.createServer().close((err: any) => {
+ assertEquals(err.code, "ERR_SERVER_NOT_RUNNING");
+ deferred1.resolve();
+ });
+ // deno-lint-ignore no-explicit-any
+ server.on("close", (err: any) => {
+ assertEquals(err, undefined);
+ deferred2.resolve();
+ });
+ server.on("listening", () => {
+ throw Error("unreachable");
+ });
+ await deferred1.promise;
+ await deferred2.promise;
+ }
+
+ {
+ const deferred1 = Promise.withResolvers<void>();
+ const deferred2 = Promise.withResolvers<void>();
+ const server = http.createServer().listen().close((err) => {
+ assertEquals(err, undefined);
+ deferred1.resolve();
+ });
+ // deno-lint-ignore no-explicit-any
+ server.on("close", (err: any) => {
+ assertEquals(err, undefined);
+ deferred2.resolve();
+ });
+ server.on("listening", () => {
+ throw Error("unreachable");
+ });
+ await deferred1.promise;
+ await deferred2.promise;
+ }
+});
+
+Deno.test("[node/http] chunked response", async () => {
+ for (
+ const body of [undefined, "", "ok"]
+ ) {
+ const expected = body ?? "";
+ const { promise, resolve } = Promise.withResolvers<void>();
+
+ const server = http.createServer((_req, res) => {
+ res.writeHead(200, { "transfer-encoding": "chunked" });
+ res.end(body);
+ });
+
+ server.listen(async () => {
+ const res = await fetch(
+ // deno-lint-ignore no-explicit-any
+ `http://127.0.0.1:${(server.address() as any).port}/`,
+ );
+ assert(res.ok);
+
+ const actual = await res.text();
+ assertEquals(actual, expected);
+
+ server.close(() => resolve());
+ });
+
+ await promise;
+ }
+});
+
+// Test empty chunks: https://github.com/denoland/deno/issues/17194
+Deno.test("[node/http] empty chunk in the middle of response", async () => {
+ const { promise, resolve } = Promise.withResolvers<void>();
+
+ const server = http.createServer((_req, res) => {
+ res.write("a");
+ res.write("");
+ res.write("b");
+ res.end();
+ });
+
+ server.listen(async () => {
+ const res = await fetch(
+ // deno-lint-ignore no-explicit-any
+ `http://127.0.0.1:${(server.address() as any).port}/`,
+ );
+ const actual = await res.text();
+ assertEquals(actual, "ab");
+ server.close(() => resolve());
+ });
+
+ await promise;
+});
+
+Deno.test("[node/http] server can respond with 101, 204, 205, 304 status", async () => {
+ for (const status of [101, 204, 205, 304]) {
+ const { promise, resolve } = Promise.withResolvers<void>();
+ const server = http.createServer((_req, res) => {
+ res.statusCode = status;
+ res.end("");
+ });
+ server.listen(async () => {
+ const res = await fetch(
+ // deno-lint-ignore no-explicit-any
+ `http://127.0.0.1:${(server.address() as any).port}/`,
+ );
+ await res.arrayBuffer();
+ assertEquals(res.status, status);
+ server.close(() => resolve());
+ });
+ await promise;
+ }
+});
+
+Deno.test("[node/http] IncomingRequest socket has remoteAddress + remotePort", async () => {
+ const { promise, resolve } = Promise.withResolvers<void>();
+
+ let remoteAddress: string | undefined;
+ let remotePort: number | undefined;
+ const server = http.createServer((req, res) => {
+ remoteAddress = req.socket.remoteAddress;
+ remotePort = req.socket.remotePort;
+ res.end();
+ });
+ server.listen(async () => {
+ // deno-lint-ignore no-explicit-any
+ const port = (server.address() as any).port;
+ const res = await fetch(
+ `http://127.0.0.1:${port}/`,
+ );
+ await res.arrayBuffer();
+ assertEquals(remoteAddress, "127.0.0.1");
+ assertEquals(typeof remotePort, "number");
+ server.close(() => resolve());
+ });
+ await promise;
+});
+
+Deno.test("[node/http] request default protocol", async () => {
+ const deferred1 = Promise.withResolvers<void>();
+ const deferred2 = Promise.withResolvers<void>();
+ const server = http.createServer((_, res) => {
+ res.end("ok");
+ });
+
+ // @ts-ignore IncomingMessageForClient
+ // deno-lint-ignore no-explicit-any
+ let clientRes: any;
+ // deno-lint-ignore no-explicit-any
+ let clientReq: any;
+ server.listen(() => {
+ clientReq = http.request(
+ // deno-lint-ignore no-explicit-any
+ { host: "localhost", port: (server.address() as any).port },
+ (res) => {
+ assert(res.socket instanceof EventEmitter);
+ assertEquals(res.complete, false);
+ res.on("data", () => {});
+ res.on("end", () => {
+ server.close();
+ });
+ clientRes = res;
+ assertEquals(res.statusCode, 200);
+ deferred2.resolve();
+ },
+ );
+ clientReq.end();
+ });
+ server.on("close", () => {
+ deferred1.resolve();
+ });
+ await deferred1.promise;
+ await deferred2.promise;
+ assert(clientReq.socket instanceof EventEmitter);
+ assertEquals(clientRes!.complete, true);
+});
+
+Deno.test("[node/http] request with headers", async () => {
+ const { promise, resolve } = Promise.withResolvers<void>();
+ const server = http.createServer((req, res) => {
+ assertEquals(req.headers["x-foo"], "bar");
+ res.end("ok");
+ });
+ server.listen(() => {
+ const req = http.request(
+ {
+ host: "localhost",
+ // deno-lint-ignore no-explicit-any
+ port: (server.address() as any).port,
+ headers: { "x-foo": "bar" },
+ },
+ (res) => {
+ res.on("data", () => {});
+ res.on("end", () => {
+ server.close();
+ });
+ assertEquals(res.statusCode, 200);
+ },
+ );
+ req.end();
+ });
+ server.on("close", () => {
+ resolve();
+ });
+ await promise;
+});
+
+Deno.test("[node/http] non-string buffer response", {
+ // TODO(kt3k): Enable sanitizer. A "zlib" resource is leaked in this test case.
+ sanitizeResources: false,
+}, async () => {
+ const { promise, resolve } = Promise.withResolvers<void>();
+ const server = http.createServer((_, res) => {
+ res.socket!.end();
+ gzip(
+ Buffer.from("a".repeat(100), "utf8"),
+ {},
+ (_err: Error | null, data: Buffer) => {
+ res.setHeader("Content-Encoding", "gzip");
+ res.end(data);
+ },
+ );
+ });
+ server.listen(async () => {
+ const res = await fetch(
+ // deno-lint-ignore no-explicit-any
+ `http://localhost:${(server.address() as any).port}`,
+ );
+ try {
+ const text = await res.text();
+ assertEquals(text, "a".repeat(100));
+ } catch (e) {
+ server.emit("error", e);
+ } finally {
+ server.close(() => resolve());
+ }
+ });
+ await promise;
+});
+
+// TODO(kt3k): Enable this test
+// Currently IncomingMessage constructor has incompatible signature.
+/*
+Deno.test("[node/http] http.IncomingMessage can be created without url", () => {
+ const message = new http.IncomingMessage(
+ // adapted from https://github.com/dougmoscrop/serverless-http/blob/80bfb3e940057d694874a8b0bc12ad96d2abe7ab/lib/request.js#L7
+ {
+ // @ts-expect-error - non-request properties will also be passed in, e.g. by serverless-http
+ encrypted: true,
+ readable: false,
+ remoteAddress: "foo",
+ address: () => ({ port: 443 }),
+ // deno-lint-ignore no-explicit-any
+ end: Function.prototype as any,
+ // deno-lint-ignore no-explicit-any
+ destroy: Function.prototype as any,
+ },
+ );
+ message.url = "https://example.com";
+});
+*/
+
+Deno.test("[node/http] send request with non-chunked body", async () => {
+ let requestHeaders: Headers;
+ let requestBody = "";
+
+ const hostname = "localhost";
+ const port = 4505;
+
+ // NOTE: Instead of node/http.createServer(), serve() in std/http/server.ts is used.
+ // https://github.com/denoland/deno_std/pull/2755#discussion_r1005592634
+ const handler = async (req: Request) => {
+ requestHeaders = req.headers;
+ requestBody = await req.text();
+ return new Response("ok");
+ };
+ const abortController = new AbortController();
+ const servePromise = serve(handler, {
+ hostname,
+ port,
+ signal: abortController.signal,
+ onListen: undefined,
+ });
+
+ const opts: RequestOptions = {
+ host: hostname,
+ port,
+ method: "POST",
+ headers: {
+ "Content-Type": "text/plain; charset=utf-8",
+ "Content-Length": "11",
+ },
+ };
+ const req = http.request(opts, (res) => {
+ res.on("data", () => {});
+ res.on("end", () => {
+ abortController.abort();
+ });
+ assertEquals(res.statusCode, 200);
+ assertEquals(requestHeaders.get("content-length"), "11");
+ assertEquals(requestHeaders.has("transfer-encoding"), false);
+ assertEquals(requestBody, "hello world");
+ });
+ req.on("socket", (socket) => {
+ assert(socket.writable);
+ assert(socket.readable);
+ socket.setKeepAlive();
+ socket.destroy();
+ socket.setTimeout(100);
+ });
+ req.write("hello ");
+ req.write("world");
+ req.end();
+
+ await servePromise;
+});
+
+Deno.test("[node/http] send request with chunked body", async () => {
+ let requestHeaders: Headers;
+ let requestBody = "";
+
+ const hostname = "localhost";
+ const port = 4505;
+
+ // NOTE: Instead of node/http.createServer(), serve() in std/http/server.ts is used.
+ // https://github.com/denoland/deno_std/pull/2755#discussion_r1005592634
+ const handler = async (req: Request) => {
+ requestHeaders = req.headers;
+ requestBody = await req.text();
+ return new Response("ok");
+ };
+ const abortController = new AbortController();
+ const servePromise = serve(handler, {
+ hostname,
+ port,
+ signal: abortController.signal,
+ onListen: undefined,
+ });
+
+ const opts: RequestOptions = {
+ host: hostname,
+ port,
+ method: "POST",
+ headers: {
+ "Content-Type": "text/plain; charset=utf-8",
+ "Content-Length": "11",
+ "Transfer-Encoding": "chunked",
+ },
+ };
+ const req = http.request(opts, (res) => {
+ res.on("data", () => {});
+ res.on("end", () => {
+ abortController.abort();
+ });
+ assertEquals(res.statusCode, 200);
+ assertEquals(requestHeaders.has("content-length"), false);
+ assertEquals(requestHeaders.get("transfer-encoding"), "chunked");
+ assertEquals(requestBody, "hello world");
+ });
+ req.write("hello ");
+ req.write("world");
+ req.end();
+
+ await servePromise;
+});
+
+Deno.test("[node/http] send request with chunked body as default", async () => {
+ let requestHeaders: Headers;
+ let requestBody = "";
+
+ const hostname = "localhost";
+ const port = 4505;
+
+ // NOTE: Instead of node/http.createServer(), serve() in std/http/server.ts is used.
+ // https://github.com/denoland/deno_std/pull/2755#discussion_r1005592634
+ const handler = async (req: Request) => {
+ requestHeaders = req.headers;
+ requestBody = await req.text();
+ return new Response("ok");
+ };
+ const abortController = new AbortController();
+ const servePromise = serve(handler, {
+ hostname,
+ port,
+ signal: abortController.signal,
+ onListen: undefined,
+ });
+
+ const opts: RequestOptions = {
+ host: hostname,
+ port,
+ method: "POST",
+ headers: {
+ "Content-Type": "text/plain; charset=utf-8",
+ },
+ };
+ const req = http.request(opts, (res) => {
+ res.on("data", () => {});
+ res.on("end", () => {
+ abortController.abort();
+ });
+ assertEquals(res.statusCode, 200);
+ assertEquals(requestHeaders.has("content-length"), false);
+ assertEquals(requestHeaders.get("transfer-encoding"), "chunked");
+ assertEquals(requestBody, "hello world");
+ });
+ req.write("hello ");
+ req.write("world");
+ req.end();
+
+ await servePromise;
+});
+
+Deno.test("[node/http] ServerResponse _implicitHeader", async () => {
+ const { promise, resolve } = Promise.withResolvers<void>();
+ const server = http.createServer((_req, res) => {
+ const writeHeadSpy = spy(res, "writeHead");
+ // deno-lint-ignore no-explicit-any
+ (res as any)._implicitHeader();
+ assertSpyCalls(writeHeadSpy, 1);
+ writeHeadSpy.restore();
+ res.end("Hello World");
+ });
+
+ server.listen(async () => {
+ const { port } = server.address() as { port: number };
+ const res = await fetch(`http://localhost:${port}`);
+ assertEquals(await res.text(), "Hello World");
+ server.close(() => {
+ resolve();
+ });
+ });
+
+ await promise;
+});
+
+// https://github.com/denoland/deno/issues/21509
+Deno.test("[node/http] ServerResponse flushHeaders", async () => {
+ const { promise, resolve } = Promise.withResolvers<void>();
+ const server = http.createServer((_req, res) => {
+ res.flushHeaders(); // no-op
+ res.end("Hello World");
+ });
+
+ server.listen(async () => {
+ const { port } = server.address() as { port: number };
+ const res = await fetch(`http://localhost:${port}`);
+ assertEquals(await res.text(), "Hello World");
+ server.close(() => {
+ resolve();
+ });
+ });
+
+ await promise;
+});
+
+Deno.test("[node/http] server unref", async () => {
+ const [statusCode, _output] = await execCode(`
+ import http from "node:http";
+ const server = http.createServer((_req, res) => {
+ res.statusCode = status;
+ res.end("");
+ });
+
+ // This should let the program to exit without waiting for the
+ // server to close.
+ server.unref();
+
+ server.listen(async () => {
+ });
+ `);
+ assertEquals(statusCode, 0);
+});
+
+Deno.test("[node/http] ClientRequest handle non-string headers", async () => {
+ // deno-lint-ignore no-explicit-any
+ let headers: any;
+ const { promise, resolve, reject } = Promise.withResolvers<void>();
+ const req = http.request("http://localhost:4545/echo_server", {
+ method: "POST",
+ headers: { 1: 2 },
+ }, (resp) => {
+ headers = resp.headers;
+
+ resp.on("data", () => {});
+
+ resp.on("end", () => {
+ resolve();
+ });
+ });
+ req.once("error", (e) => reject(e));
+ req.end();
+ await promise;
+ assertEquals(headers!["1"], "2");
+});
+
+Deno.test("[node/http] ClientRequest uses HTTP/1.1", async () => {
+ let body = "";
+ const { promise, resolve, reject } = Promise.withResolvers<void>();
+ const req = https.request("https://localhost:5545/http_version", {
+ method: "POST",
+ headers: { 1: 2 },
+ }, (resp) => {
+ resp.on("data", (chunk) => {
+ body += chunk;
+ });
+
+ resp.on("end", () => {
+ resolve();
+ });
+ });
+ req.once("error", (e) => reject(e));
+ req.end();
+ await promise;
+ assertEquals(body, "HTTP/1.1");
+});
+
+Deno.test("[node/http] ClientRequest setTimeout", async () => {
+ let body = "";
+ const { promise, resolve, reject } = Promise.withResolvers<void>();
+ const timer = setTimeout(() => reject("timed out"), 50000);
+ const req = http.request("http://localhost:4545/http_version", (resp) => {
+ resp.on("data", (chunk) => {
+ body += chunk;
+ });
+
+ resp.on("end", () => {
+ resolve();
+ });
+ });
+ req.setTimeout(120000);
+ req.once("error", (e) => reject(e));
+ req.end();
+ await promise;
+ clearTimeout(timer);
+ assertEquals(body, "HTTP/1.1");
+});
+
+Deno.test("[node/http] ClientRequest setNoDelay", async () => {
+ let body = "";
+ const { promise, resolve, reject } = Promise.withResolvers<void>();
+ const timer = setTimeout(() => reject("timed out"), 50000);
+ const req = http.request("http://localhost:4545/http_version", (resp) => {
+ resp.on("data", (chunk) => {
+ body += chunk;
+ });
+
+ resp.on("end", () => {
+ resolve();
+ });
+ });
+ req.setNoDelay(true);
+ req.once("error", (e) => reject(e));
+ req.end();
+ await promise;
+ clearTimeout(timer);
+ assertEquals(body, "HTTP/1.1");
+});
+
+Deno.test("[node/http] ClientRequest PATCH", async () => {
+ let body = "";
+ const { promise, resolve, reject } = Promise.withResolvers<void>();
+ const req = http.request("http://localhost:4545/echo_server", {
+ method: "PATCH",
+ }, (resp) => {
+ resp.on("data", (chunk) => {
+ body += chunk;
+ });
+
+ resp.on("end", () => {
+ resolve();
+ });
+ });
+ req.write("hello ");
+ req.write("world");
+ req.once("error", (e) => reject(e));
+ req.end();
+ await promise;
+ assertEquals(body, "hello world");
+});
+
+Deno.test("[node/http] ClientRequest PUT", async () => {
+ let body = "";
+ const { promise, resolve, reject } = Promise.withResolvers<void>();
+ const req = http.request("http://localhost:4545/echo_server", {
+ method: "PUT",
+ }, (resp) => {
+ resp.on("data", (chunk) => {
+ body += chunk;
+ });
+
+ resp.on("end", () => {
+ resolve();
+ });
+ });
+ req.write("hello ");
+ req.write("world");
+ req.once("error", (e) => reject(e));
+ req.end();
+ await promise;
+ assertEquals(body, "hello world");
+});
+
+Deno.test("[node/http] ClientRequest search params", async () => {
+ let body = "";
+ const { promise, resolve, reject } = Promise.withResolvers<void>();
+ const req = http.request({
+ host: "localhost:4545",
+ path: "search_params?foo=bar",
+ }, (resp) => {
+ resp.on("data", (chunk) => {
+ body += chunk;
+ });
+
+ resp.on("end", () => {
+ resolve();
+ });
+ });
+ req.once("error", (e) => reject(e));
+ req.end();
+ await promise;
+ assertEquals(body, "foo=bar");
+});
+
+Deno.test("[node/http] HTTPS server", async () => {
+ const deferred = Promise.withResolvers<void>();
+ const deferred2 = Promise.withResolvers<void>();
+ const client = Deno.createHttpClient({
+ caCerts: [Deno.readTextFileSync("tests/testdata/tls/RootCA.pem")],
+ });
+ const server = https.createServer({
+ cert: Deno.readTextFileSync("tests/testdata/tls/localhost.crt"),
+ key: Deno.readTextFileSync("tests/testdata/tls/localhost.key"),
+ }, (req, res) => {
+ // @ts-ignore: It exists on TLSSocket
+ assert(req.socket.encrypted);
+ res.end("success!");
+ });
+ server.listen(() => {
+ // deno-lint-ignore no-explicit-any
+ fetch(`https://localhost:${(server.address() as any).port}`, {
+ client,
+ }).then(async (res) => {
+ assertEquals(res.status, 200);
+ assertEquals(await res.text(), "success!");
+ server.close();
+ deferred2.resolve();
+ });
+ })
+ .on("error", () => fail());
+ server.on("close", () => {
+ deferred.resolve();
+ });
+ await Promise.all([deferred.promise, deferred2.promise]);
+ client.close();
+});
+
+Deno.test(
+ "[node/http] client upgrade",
+ { permissions: { net: true } },
+ async () => {
+ const { promise, resolve } = Promise.withResolvers<void>();
+ const server = http.createServer((req, res) => {
+ // @ts-ignore: It exists on TLSSocket
+ assert(!req.socket.encrypted);
+ res.writeHead(200, { "Content-Type": "text/plain" });
+ res.end("okay");
+ });
+ // @ts-ignore it's a socket for real
+ let serverSocket;
+ server.on("upgrade", (req, socket, _head) => {
+ // https://github.com/denoland/deno/issues/21979
+ assert(req.socket?.write);
+ socket.write(
+ "HTTP/1.1 101 Web Socket Protocol Handshake\r\n" +
+ "Upgrade: WebSocket\r\n" +
+ "Connection: Upgrade\r\n" +
+ "\r\n",
+ );
+ serverSocket = socket;
+ });
+
+ // Now that server is running
+ server.listen(1337, "127.0.0.1", () => {
+ // make a request
+ const options = {
+ port: 1337,
+ host: "127.0.0.1",
+ headers: {
+ "Connection": "Upgrade",
+ "Upgrade": "websocket",
+ },
+ };
+
+ const req = http.request(options);
+ req.end();
+
+ req.on("upgrade", (_res, socket, _upgradeHead) => {
+ socket.end();
+ // @ts-ignore it's a socket for real
+ serverSocket!.end();
+ server.close(() => {
+ resolve();
+ });
+ });
+ });
+
+ await promise;
+ },
+);
+
+Deno.test(
+ "[node/http] client end with callback",
+ { permissions: { net: true } },
+ async () => {
+ let received = false;
+ const ac = new AbortController();
+ const server = Deno.serve({ port: 5928, signal: ac.signal }, (_req) => {
+ received = true;
+ return new Response("hello");
+ });
+ const { promise, resolve, reject } = Promise.withResolvers<void>();
+ let body = "";
+
+ const request = http.request(
+ "http://localhost:5928/",
+ (resp) => {
+ resp.on("data", (chunk) => {
+ body += chunk;
+ });
+
+ resp.on("end", () => {
+ resolve();
+ });
+ },
+ );
+ request.on("error", reject);
+ request.end(() => {
+ assert(received);
+ });
+
+ await promise;
+ ac.abort();
+ await server.finished;
+
+ assertEquals(body, "hello");
+ },
+);
+
+Deno.test("[node/http] server emits error if addr in use", async () => {
+ const deferred1 = Promise.withResolvers<void>();
+ const deferred2 = Promise.withResolvers<Error>();
+
+ const server = http.createServer();
+ server.listen(9001);
+
+ const server2 = http.createServer();
+ server2.on("error", (e) => {
+ deferred2.resolve(e);
+ });
+ server2.listen(9001);
+
+ const err = await deferred2.promise;
+ server.close(() => deferred1.resolve());
+ server2.close();
+ await deferred1.promise;
+ const expectedMsg = Deno.build.os === "windows"
+ ? "Only one usage of each socket address"
+ : "Address already in use";
+ assert(
+ err.message.startsWith(expectedMsg),
+ `Wrong error: ${err.message}`,
+ );
+});
+
+Deno.test(
+ "[node/http] client destroy doesn't leak",
+ { permissions: { net: true } },
+ async () => {
+ const ac = new AbortController();
+ let timerId;
+
+ const server = Deno.serve(
+ { port: 5929, signal: ac.signal },
+ async (_req) => {
+ await new Promise((resolve) => {
+ timerId = setTimeout(resolve, 5000);
+ });
+ return new Response("hello");
+ },
+ );
+ const { promise, resolve, reject } = Promise.withResolvers<void>();
+
+ const request = http.request("http://localhost:5929/");
+ request.on("error", reject);
+ request.on("close", () => {});
+ request.end();
+ setTimeout(() => {
+ request.destroy(new Error());
+ resolve();
+ }, 100);
+
+ await promise;
+ clearTimeout(timerId);
+ ac.abort();
+ await server.finished;
+ },
+);
+
+Deno.test("[node/http] node:http exports globalAgent", async () => {
+ const http = await import("node:http");
+ assert(
+ http.globalAgent,
+ "node:http must export 'globalAgent' on module namespace",
+ );
+ assert(
+ http.default.globalAgent,
+ "node:http must export 'globalAgent' on module default export",
+ );
+});
+
+Deno.test("[node/https] node:https exports globalAgent", async () => {
+ const https = await import("node:https");
+ assert(
+ https.globalAgent,
+ "node:https must export 'globalAgent' on module namespace",
+ );
+ assert(
+ https.default.globalAgent,
+ "node:https must export 'globalAgent' on module default export",
+ );
+});
+
+Deno.test("[node/http] node:http request.setHeader(header, null) doesn't throw", () => {
+ {
+ const req = http.request("http://localhost:4545/");
+ req.on("error", () => {});
+ // @ts-expect-error - null is not a valid header value
+ req.setHeader("foo", null);
+ req.end();
+ req.destroy();
+ }
+ {
+ const req = https.request("https://localhost:4545/");
+ req.on("error", () => {});
+ // @ts-expect-error - null is not a valid header value
+ req.setHeader("foo", null);
+ req.end();
+ req.destroy();
+ }
+});
+
+Deno.test("[node/http] ServerResponse getHeader", async () => {
+ const { promise, resolve } = Promise.withResolvers<void>();
+ const server = http.createServer((_req, res) => {
+ res.setHeader("foo", "bar");
+ assertEquals(res.getHeader("foo"), "bar");
+ assertEquals(res.getHeader("ligma"), undefined);
+ res.end("Hello World");
+ });
+
+ server.listen(async () => {
+ const { port } = server.address() as { port: number };
+ const res = await fetch(`http://localhost:${port}`);
+ assertEquals(await res.text(), "Hello World");
+ server.close(() => {
+ resolve();
+ });
+ });
+
+ await promise;
+});
diff --git a/cli/tests/unit_node/internal/_randomBytes_test.ts b/tests/unit_node/internal/_randomBytes_test.ts
index 13ee82566..13ee82566 100644
--- a/cli/tests/unit_node/internal/_randomBytes_test.ts
+++ b/tests/unit_node/internal/_randomBytes_test.ts
diff --git a/cli/tests/unit_node/internal/_randomFill_test.ts b/tests/unit_node/internal/_randomFill_test.ts
index d85569960..d85569960 100644
--- a/cli/tests/unit_node/internal/_randomFill_test.ts
+++ b/tests/unit_node/internal/_randomFill_test.ts
diff --git a/cli/tests/unit_node/internal/_randomInt_test.ts b/tests/unit_node/internal/_randomInt_test.ts
index 2639f77ce..2639f77ce 100644
--- a/cli/tests/unit_node/internal/_randomInt_test.ts
+++ b/tests/unit_node/internal/_randomInt_test.ts
diff --git a/cli/tests/unit_node/internal/pbkdf2_test.ts b/tests/unit_node/internal/pbkdf2_test.ts
index 019e76dcd..019e76dcd 100644
--- a/cli/tests/unit_node/internal/pbkdf2_test.ts
+++ b/tests/unit_node/internal/pbkdf2_test.ts
diff --git a/cli/tests/unit_node/internal/scrypt_test.ts b/tests/unit_node/internal/scrypt_test.ts
index bd846ba8d..bd846ba8d 100644
--- a/cli/tests/unit_node/internal/scrypt_test.ts
+++ b/tests/unit_node/internal/scrypt_test.ts
diff --git a/tests/unit_node/module_test.ts b/tests/unit_node/module_test.ts
new file mode 100644
index 000000000..f8e117254
--- /dev/null
+++ b/tests/unit_node/module_test.ts
@@ -0,0 +1,72 @@
+// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
+
+import { createRequire, Module } from "node:module";
+import { assert, assertEquals } from "@test_util/std/assert/mod.ts";
+import process from "node:process";
+import * as path from "node:path";
+
+Deno.test("[node/module _preloadModules] has internal require hook", () => {
+ // Check if it's there
+ // deno-lint-ignore no-explicit-any
+ (Module as any)._preloadModules([
+ "./tests/unit_node/testdata/add_global_property.js",
+ ]);
+ // deno-lint-ignore no-explicit-any
+ assertEquals((globalThis as any).foo, "Hello");
+});
+
+Deno.test("[node/module runMain] loads module using the current process.argv", () => {
+ process.argv = [
+ process.argv[0],
+ "./tests/unit_node/testdata/add_global_property_run_main.js",
+ ];
+
+ // deno-lint-ignore no-explicit-any
+ (Module as any).runMain();
+ // deno-lint-ignore no-explicit-any
+ assertEquals((globalThis as any).calledViaRunMain, true);
+});
+
+Deno.test("[node/module _nodeModulePaths] prevents duplicate /node_modules/node_modules suffix", () => {
+ // deno-lint-ignore no-explicit-any
+ const actual: string[] = (Module as any)._nodeModulePaths(
+ path.join(process.cwd(), "testdata", "node_modules", "foo"),
+ );
+
+ assert(
+ !actual.some((dir) => /node_modules[/\\]node_modules/g.test(dir)),
+ "Duplicate 'node_modules/node_modules' suffix found",
+ );
+});
+
+Deno.test("[node/module _nodeModulePaths] prevents duplicate root /node_modules", () => {
+ // deno-lint-ignore no-explicit-any
+ const actual: string[] = (Module as any)._nodeModulePaths(
+ path.join(process.cwd(), "testdata", "node_modules", "foo"),
+ );
+
+ assert(
+ new Set(actual).size === actual.length,
+ "Duplicate path entries found",
+ );
+ const root = path.parse(actual[0]).root;
+ assert(
+ actual.includes(path.join(root, "node_modules")),
+ "Missing root 'node_modules' directory",
+ );
+});
+
+Deno.test("Built-in Node modules have `node:` prefix", () => {
+ let thrown = false;
+ try {
+ // @ts-ignore We want to explicitly test wrong call signature
+ createRequire();
+ } catch (e) {
+ thrown = true;
+ const stackLines = e.stack.split("\n");
+ // Assert that built-in node modules have `node:<mod_name>` specifiers.
+ assert(stackLines.some((line: string) => line.includes("(node:module:")));
+ }
+
+ assert(thrown);
+});
diff --git a/cli/tests/unit_node/net_test.ts b/tests/unit_node/net_test.ts
index 60cf9d8fc..60cf9d8fc 100644
--- a/cli/tests/unit_node/net_test.ts
+++ b/tests/unit_node/net_test.ts
diff --git a/cli/tests/unit_node/os_test.ts b/tests/unit_node/os_test.ts
index c18aa07c3..c18aa07c3 100644
--- a/cli/tests/unit_node/os_test.ts
+++ b/tests/unit_node/os_test.ts
diff --git a/cli/tests/unit_node/path_test.ts b/tests/unit_node/path_test.ts
index a6c4ec5a8..a6c4ec5a8 100644
--- a/cli/tests/unit_node/path_test.ts
+++ b/tests/unit_node/path_test.ts
diff --git a/cli/tests/unit_node/perf_hooks_test.ts b/tests/unit_node/perf_hooks_test.ts
index 004eedfd6..004eedfd6 100644
--- a/cli/tests/unit_node/perf_hooks_test.ts
+++ b/tests/unit_node/perf_hooks_test.ts
diff --git a/cli/tests/unit_node/process_test.ts b/tests/unit_node/process_test.ts
index 4f4703d35..4f4703d35 100644
--- a/cli/tests/unit_node/process_test.ts
+++ b/tests/unit_node/process_test.ts
diff --git a/cli/tests/unit_node/querystring_test.ts b/tests/unit_node/querystring_test.ts
index 9831d92ed..9831d92ed 100644
--- a/cli/tests/unit_node/querystring_test.ts
+++ b/tests/unit_node/querystring_test.ts
diff --git a/cli/tests/unit_node/readline_test.ts b/tests/unit_node/readline_test.ts
index ecd1a893d..ecd1a893d 100644
--- a/cli/tests/unit_node/readline_test.ts
+++ b/tests/unit_node/readline_test.ts
diff --git a/cli/tests/unit_node/repl_test.ts b/tests/unit_node/repl_test.ts
index adfc1d60a..adfc1d60a 100644
--- a/cli/tests/unit_node/repl_test.ts
+++ b/tests/unit_node/repl_test.ts
diff --git a/cli/tests/unit_node/stream_test.ts b/tests/unit_node/stream_test.ts
index ab81497d1..ab81497d1 100644
--- a/cli/tests/unit_node/stream_test.ts
+++ b/tests/unit_node/stream_test.ts
diff --git a/cli/tests/unit_node/string_decoder_test.ts b/tests/unit_node/string_decoder_test.ts
index 768ae3b3a..768ae3b3a 100644
--- a/cli/tests/unit_node/string_decoder_test.ts
+++ b/tests/unit_node/string_decoder_test.ts
diff --git a/cli/tests/unit_node/testdata/add_global_property.js b/tests/unit_node/testdata/add_global_property.js
index 814d17d0d..814d17d0d 100644
--- a/cli/tests/unit_node/testdata/add_global_property.js
+++ b/tests/unit_node/testdata/add_global_property.js
diff --git a/cli/tests/unit_node/testdata/add_global_property_run_main.js b/tests/unit_node/testdata/add_global_property_run_main.js
index c9db1cea6..c9db1cea6 100644
--- a/cli/tests/unit_node/testdata/add_global_property_run_main.js
+++ b/tests/unit_node/testdata/add_global_property_run_main.js
diff --git a/cli/tests/unit_node/testdata/binary_stdio.js b/tests/unit_node/testdata/binary_stdio.js
index aa370a933..aa370a933 100644
--- a/cli/tests/unit_node/testdata/binary_stdio.js
+++ b/tests/unit_node/testdata/binary_stdio.js
diff --git a/cli/tests/unit_node/testdata/child_process_stdio.js b/tests/unit_node/testdata/child_process_stdio.js
index b13b09562..b13b09562 100644
--- a/cli/tests/unit_node/testdata/child_process_stdio.js
+++ b/tests/unit_node/testdata/child_process_stdio.js
diff --git a/cli/tests/unit_node/testdata/child_process_stdio_012.js b/tests/unit_node/testdata/child_process_stdio_012.js
index e3717f985..e3717f985 100644
--- a/cli/tests/unit_node/testdata/child_process_stdio_012.js
+++ b/tests/unit_node/testdata/child_process_stdio_012.js
diff --git a/cli/tests/unit_node/testdata/child_process_unref.js b/tests/unit_node/testdata/child_process_unref.js
index 8201ac44d..8201ac44d 100644
--- a/cli/tests/unit_node/testdata/child_process_unref.js
+++ b/tests/unit_node/testdata/child_process_unref.js
diff --git a/cli/tests/unit_node/testdata/exec_file_text_error.js b/tests/unit_node/testdata/exec_file_text_error.js
index 9697e6044..9697e6044 100644
--- a/cli/tests/unit_node/testdata/exec_file_text_error.js
+++ b/tests/unit_node/testdata/exec_file_text_error.js
diff --git a/cli/tests/unit_node/testdata/exec_file_text_output.js b/tests/unit_node/testdata/exec_file_text_output.js
index 019c0f4bc..019c0f4bc 100644
--- a/cli/tests/unit_node/testdata/exec_file_text_output.js
+++ b/tests/unit_node/testdata/exec_file_text_output.js
diff --git a/cli/tests/unit_node/testdata/infinite_loop.js b/tests/unit_node/testdata/infinite_loop.js
index 0e6540a7b..0e6540a7b 100644
--- a/cli/tests/unit_node/testdata/infinite_loop.js
+++ b/tests/unit_node/testdata/infinite_loop.js
diff --git a/cli/tests/unit_node/testdata/lorem_ipsum.txt b/tests/unit_node/testdata/lorem_ipsum.txt
index 08e00ed29..08e00ed29 100644
--- a/cli/tests/unit_node/testdata/lorem_ipsum.txt
+++ b/tests/unit_node/testdata/lorem_ipsum.txt
diff --git a/cli/tests/unit_node/testdata/node_modules/foo/index.js b/tests/unit_node/testdata/node_modules/foo/index.js
index 24faba789..24faba789 100644
--- a/cli/tests/unit_node/testdata/node_modules/foo/index.js
+++ b/tests/unit_node/testdata/node_modules/foo/index.js
diff --git a/cli/tests/unit_node/testdata/node_modules/foo/package.json b/tests/unit_node/testdata/node_modules/foo/package.json
index bde99de92..bde99de92 100644
--- a/cli/tests/unit_node/testdata/node_modules/foo/package.json
+++ b/tests/unit_node/testdata/node_modules/foo/package.json
diff --git a/cli/tests/unit_node/testdata/process_exit.ts b/tests/unit_node/testdata/process_exit.ts
index 57351c087..57351c087 100644
--- a/cli/tests/unit_node/testdata/process_exit.ts
+++ b/tests/unit_node/testdata/process_exit.ts
diff --git a/cli/tests/unit_node/testdata/process_exit2.ts b/tests/unit_node/testdata/process_exit2.ts
index 3731f745a..3731f745a 100644
--- a/cli/tests/unit_node/testdata/process_exit2.ts
+++ b/tests/unit_node/testdata/process_exit2.ts
diff --git a/cli/tests/unit_node/testdata/process_really_exit.ts b/tests/unit_node/testdata/process_really_exit.ts
index 16f30b33d..16f30b33d 100644
--- a/cli/tests/unit_node/testdata/process_really_exit.ts
+++ b/tests/unit_node/testdata/process_really_exit.ts
diff --git a/cli/tests/unit_node/testdata/process_stdin.ts b/tests/unit_node/testdata/process_stdin.ts
index 23562b090..23562b090 100644
--- a/cli/tests/unit_node/testdata/process_stdin.ts
+++ b/tests/unit_node/testdata/process_stdin.ts
diff --git a/cli/tests/unit_node/testdata/process_stdin_dummy.txt b/tests/unit_node/testdata/process_stdin_dummy.txt
index a907ec3f4..a907ec3f4 100644
--- a/cli/tests/unit_node/testdata/process_stdin_dummy.txt
+++ b/tests/unit_node/testdata/process_stdin_dummy.txt
diff --git a/cli/tests/unit_node/testdata/rsa_private.pem b/tests/unit_node/testdata/rsa_private.pem
index cd274ae6d..cd274ae6d 100644
--- a/cli/tests/unit_node/testdata/rsa_private.pem
+++ b/tests/unit_node/testdata/rsa_private.pem
diff --git a/cli/tests/unit_node/testdata/rsa_private_pkcs1.pem b/tests/unit_node/testdata/rsa_private_pkcs1.pem
index 215e5cc51..215e5cc51 100644
--- a/cli/tests/unit_node/testdata/rsa_private_pkcs1.pem
+++ b/tests/unit_node/testdata/rsa_private_pkcs1.pem
diff --git a/cli/tests/unit_node/testdata/rsa_public.pem b/tests/unit_node/testdata/rsa_public.pem
index 8c30cfa52..8c30cfa52 100644
--- a/cli/tests/unit_node/testdata/rsa_public.pem
+++ b/tests/unit_node/testdata/rsa_public.pem
diff --git a/cli/tests/unit_node/testdata/worker_module/index.js b/tests/unit_node/testdata/worker_module/index.js
index a3e976b65..a3e976b65 100644
--- a/cli/tests/unit_node/testdata/worker_module/index.js
+++ b/tests/unit_node/testdata/worker_module/index.js
diff --git a/cli/tests/unit_node/testdata/worker_module/other_file.js b/tests/unit_node/testdata/worker_module/other_file.js
index 41789dfe8..41789dfe8 100644
--- a/cli/tests/unit_node/testdata/worker_module/other_file.js
+++ b/tests/unit_node/testdata/worker_module/other_file.js
diff --git a/cli/tests/unit_node/testdata/worker_module/package.json b/tests/unit_node/testdata/worker_module/package.json
index 486d2f82b..486d2f82b 100644
--- a/cli/tests/unit_node/testdata/worker_module/package.json
+++ b/tests/unit_node/testdata/worker_module/package.json
diff --git a/cli/tests/unit_node/testdata/worker_threads.mjs b/tests/unit_node/testdata/worker_threads.mjs
index 03dc462f0..03dc462f0 100644
--- a/cli/tests/unit_node/testdata/worker_threads.mjs
+++ b/tests/unit_node/testdata/worker_threads.mjs
diff --git a/cli/tests/unit_node/timers_test.ts b/tests/unit_node/timers_test.ts
index f5cccc9a9..f5cccc9a9 100644
--- a/cli/tests/unit_node/timers_test.ts
+++ b/tests/unit_node/timers_test.ts
diff --git a/cli/tests/unit_node/tls_test.ts b/tests/unit_node/tls_test.ts
index d87df4e33..d87df4e33 100644
--- a/cli/tests/unit_node/tls_test.ts
+++ b/tests/unit_node/tls_test.ts
diff --git a/cli/tests/unit_node/tty_test.ts b/tests/unit_node/tty_test.ts
index 43beda4bc..43beda4bc 100644
--- a/cli/tests/unit_node/tty_test.ts
+++ b/tests/unit_node/tty_test.ts
diff --git a/cli/tests/unit_node/util_test.ts b/tests/unit_node/util_test.ts
index 8480266c1..8480266c1 100644
--- a/cli/tests/unit_node/util_test.ts
+++ b/tests/unit_node/util_test.ts
diff --git a/cli/tests/unit_node/v8_test.ts b/tests/unit_node/v8_test.ts
index e48285d4e..e48285d4e 100644
--- a/cli/tests/unit_node/v8_test.ts
+++ b/tests/unit_node/v8_test.ts
diff --git a/cli/tests/unit_node/vm_test.ts b/tests/unit_node/vm_test.ts
index 30449a7b1..30449a7b1 100644
--- a/cli/tests/unit_node/vm_test.ts
+++ b/tests/unit_node/vm_test.ts
diff --git a/cli/tests/unit_node/worker_threads_test.ts b/tests/unit_node/worker_threads_test.ts
index e79049229..e79049229 100644
--- a/cli/tests/unit_node/worker_threads_test.ts
+++ b/tests/unit_node/worker_threads_test.ts
diff --git a/cli/tests/unit_node/zlib_test.ts b/tests/unit_node/zlib_test.ts
index 31ebe0b4f..31ebe0b4f 100644
--- a/cli/tests/unit_node/zlib_test.ts
+++ b/tests/unit_node/zlib_test.ts
diff --git a/tools/copyright_checker.js b/tools/copyright_checker.js
index 8aaa77fa1..15bba2229 100644
--- a/tools/copyright_checker.js
+++ b/tools/copyright_checker.js
@@ -24,15 +24,15 @@ export async function checkCopyright() {
"*.js",
"*.ts",
":!:.github/mtime_cache/action.js",
- ":!:cli/tests/testdata/**",
+ ":!:tests/testdata/**",
":!:cli/bench/testdata/**",
":!:cli/tsc/dts/**",
":!:cli/tsc/*typescript.js",
":!:cli/tsc/compiler.d.ts",
":!:test_util/wpt/**",
":!:cli/tools/init/templates/**",
- ":!:cli/tests/unit_node/testdata/**",
- ":!:cli/tests/node_compat/test/**",
+ ":!:tests/unit_node/testdata/**",
+ ":!:tests/node_compat/test/**",
":!:cli/tools/bench/mitata.rs",
// rust
diff --git a/tools/lint.js b/tools/lint.js
index 0eae493fd..8d6e2e64a 100755
--- a/tools/lint.js
+++ b/tools/lint.js
@@ -41,22 +41,22 @@ async function dlint() {
"*.js",
"*.ts",
":!:.github/mtime_cache/action.js",
- ":!:cli/tests/testdata/swc_syntax_error.ts",
- ":!:cli/tests/testdata/error_008_checkjs.js",
+ ":!:tests/testdata/swc_syntax_error.ts",
+ ":!:tests/testdata/error_008_checkjs.js",
":!:cli/bench/testdata/npm/*",
":!:cli/bench/testdata/express-router.js",
":!:cli/bench/testdata/react-dom.js",
":!:cli/compilers/wasm_wrap.js",
":!:cli/tsc/dts/**",
- ":!:cli/tests/testdata/encoding/**",
- ":!:cli/tests/testdata/error_syntax.js",
- ":!:cli/tests/testdata/file_extensions/ts_with_js_extension.js",
- ":!:cli/tests/testdata/fmt/**",
- ":!:cli/tests/testdata/npm/**",
- ":!:cli/tests/testdata/lint/**",
- ":!:cli/tests/testdata/run/**",
- ":!:cli/tests/testdata/tsc/**",
- ":!:cli/tests/testdata/test/glob/**",
+ ":!:tests/testdata/encoding/**",
+ ":!:tests/testdata/error_syntax.js",
+ ":!:tests/testdata/file_extensions/ts_with_js_extension.js",
+ ":!:tests/testdata/fmt/**",
+ ":!:tests/testdata/npm/**",
+ ":!:tests/testdata/lint/**",
+ ":!:tests/testdata/run/**",
+ ":!:tests/testdata/tsc/**",
+ ":!:tests/testdata/test/glob/**",
":!:cli/tsc/*typescript.js",
":!:cli/tsc/compiler.d.ts",
":!:test_util/wpt/**",
diff --git a/tools/node_compat/TODO.md b/tools/node_compat/TODO.md
index d22e8811d..eb288c65e 100644
--- a/tools/node_compat/TODO.md
+++ b/tools/node_compat/TODO.md
@@ -1,7 +1,7 @@
<!-- deno-fmt-ignore-file -->
# Remaining Node Tests
-NOTE: This file should not be manually edited. Please edit `cli/tests/node_compat/config.json` and run `deno task setup` in `tools/node_compat` dir instead.
+NOTE: This file should not be manually edited. Please edit `tests/node_compat/config.json` and run `deno task setup` in `tools/node_compat` dir instead.
Total: 2999
diff --git a/tools/node_compat/setup.ts b/tools/node_compat/setup.ts
index 4770fbc50..47588350d 100755
--- a/tools/node_compat/setup.ts
+++ b/tools/node_compat/setup.ts
@@ -1,7 +1,7 @@
#!/usr/bin/env -S deno run --allow-read=. --allow-write=. --allow-run=git
// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
-/** This copies the test files according to the config file `cli/tests/node_compat/config.jsonc` */
+/** This copies the test files according to the config file `tests/node_compat/config.jsonc` */
import { walk } from "@test_util/std/fs/walk.ts";
import { sep } from "@test_util/std/path/mod.ts";
@@ -10,7 +10,7 @@ import { writeAll } from "@test_util/std/streams/write_all.ts";
import { withoutAll } from "@test_util/std/collections/without_all.ts";
import { relative } from "@test_util/std/path/posix.ts";
-import { config, ignoreList } from "../../cli/tests/node_compat/common.ts";
+import { config, ignoreList } from "../../tests/node_compat/common.ts";
const encoder = new TextEncoder();
@@ -39,7 +39,7 @@ const NODE_IGNORED_TEST_DIRS = [
const VENDORED_NODE_TEST = new URL("node/test/", import.meta.url);
const NODE_COMPAT_TEST_DEST_URL = new URL(
- "../../cli/tests/node_compat/test/",
+ "../../tests/node_compat/test/",
import.meta.url,
);
@@ -76,7 +76,7 @@ async function updateToDo() {
await file.write(encoder.encode(`<!-- deno-fmt-ignore-file -->
# Remaining Node Tests
-NOTE: This file should not be manually edited. Please edit \`cli/tests/node_compat/config.json\` and run \`deno task setup\` in \`tools/node_compat\` dir instead.
+NOTE: This file should not be manually edited. Please edit \`tests/node_compat/config.json\` and run \`deno task setup\` in \`tools/node_compat\` dir instead.
Total: ${missingTests.length}