diff --git a/cli/args/flags.rs b/cli/args/flags.rs index 150d8f00a2..38b9f9e68f 100644 --- a/cli/args/flags.rs +++ b/cli/args/flags.rs @@ -2661,7 +2661,7 @@ Ignore formatting a file by adding an ignore comment at the top of the file: .long("ext") .help("Set content type of the supplied file") .value_parser([ - "ts", "tsx", "js", "jsx", "md", "json", "jsonc", "css", "scss", + "ts", "tsx", "js", "jsx", "mts", "mjs", "cts", "cjs", "md", "json", "jsonc", "css", "scss", "sass", "less", "html", "svelte", "vue", "astro", "yml", "yaml", "ipynb", "sql", "vto", "njk" ]) @@ -4457,7 +4457,7 @@ fn executable_ext_arg() -> Arg { Arg::new("ext") .long("ext") .help("Set content type of the supplied file") - .value_parser(["ts", "tsx", "js", "jsx"]) + .value_parser(["ts", "tsx", "js", "jsx", "mts", "mjs", "cts", "cjs"]) } fn location_arg() -> Arg { diff --git a/cli/args/mod.rs b/cli/args/mod.rs index 6c39635f53..ea25376120 100644 --- a/cli/args/mod.rs +++ b/cli/args/mod.rs @@ -678,14 +678,23 @@ impl CliOptions { resolve_url_or_path(&compile_flags.source_file, self.initial_cwd())? } DenoSubcommand::Eval(_) => { - resolve_url_or_path("./$deno$eval.mts", self.initial_cwd())? - } - DenoSubcommand::Repl(_) => { - resolve_url_or_path("./$deno$repl.mts", self.initial_cwd())? + let specifier = format!( + "./$deno$eval.{}", + self.flags.ext.as_deref().unwrap_or("mts") + ); + deno_path_util::resolve_path(&specifier, self.initial_cwd())? } + DenoSubcommand::Repl(_) => deno_path_util::resolve_path( + "./$deno$repl.mts", + self.initial_cwd(), + )?, DenoSubcommand::Run(run_flags) => { if run_flags.is_stdin() { - resolve_url_or_path("./$deno$stdin.mts", self.initial_cwd())? + let specifier = format!( + "./$deno$stdin.{}", + self.flags.ext.as_deref().unwrap_or("mts") + ); + deno_path_util::resolve_path(&specifier, self.initial_cwd())? } else { let default_resolve = || { let url = @@ -738,15 +747,10 @@ impl CliOptions { &self, ) -> HashMap> { let maybe_main_specifier = self.resolve_main_module().ok(); - // TODO(Cre3per): This mapping moved to deno_ast with https://github.com/denoland/deno_ast/issues/133 and should be available in deno_ast >= 0.25.0 via `MediaType::from_path(...).as_media_type()` - let maybe_content_type = - self.flags.ext.as_ref().and_then(|el| match el.as_str() { - "ts" => Some("text/typescript"), - "tsx" => Some("text/tsx"), - "js" => Some("text/javascript"), - "jsx" => Some("text/jsx"), - _ => None, - }); + let maybe_content_type = self.flags.ext.as_ref().and_then(|ext| { + let media_type = MediaType::from_filename(&format!("file.{}", ext)); + media_type.as_content_type() + }); if let (Some(main_specifier), Some(content_type)) = (maybe_main_specifier, maybe_content_type) diff --git a/cli/factory.rs b/cli/factory.rs index 03efd896e3..0d1570fd85 100644 --- a/cli/factory.rs +++ b/cli/factory.rs @@ -40,6 +40,7 @@ use deno_resolver::factory::ResolverFactoryOptions; use deno_resolver::factory::SpecifiedImportMapProvider; use deno_resolver::factory::WorkspaceDirectoryProvider; use deno_resolver::import_map::WorkspaceExternalImportMapLoader; +use deno_resolver::loader::MemoryFiles; use deno_resolver::npm::DenoInNpmPackageChecker; use deno_resolver::workspace::WorkspaceResolver; use deno_runtime::FeatureChecker; @@ -304,6 +305,7 @@ struct CliFactoryServices { main_graph_container: Deferred>, maybe_file_watcher_reporter: Deferred>, maybe_inspector_server: Deferred>>, + memory_files: Arc, module_graph_builder: Deferred>, module_graph_creator: Deferred>, module_info_cache: Deferred>, @@ -486,6 +488,7 @@ impl CliFactory { self.blob_store().clone(), self.http_cache()?.clone(), self.http_client_provider().clone(), + self.services.memory_files.clone(), self.sys(), CreateCliFileFetcherOptions { allow_remote: !cli_options.no_remote(), @@ -501,6 +504,10 @@ impl CliFactory { self.services.fs.get_or_init(|| Arc::new(RealFs)) } + pub fn memory_files(&self) -> &Arc { + &self.services.memory_files + } + pub fn sys(&self) -> CliSys { CliSys::default() // very cheap to make } @@ -948,6 +955,7 @@ impl CliFactory { self.file_fetcher()?.clone(), in_npm_pkg_checker.clone(), self.main_module_graph_container().await?.clone(), + self.memory_files().clone(), self.module_load_preparer().await?.clone(), npm_registry_permission_checker, cli_npm_resolver.clone(), diff --git a/cli/file_fetcher.rs b/cli/file_fetcher.rs index 0cde5938e8..55ab3484fa 100644 --- a/cli/file_fetcher.rs +++ b/cli/file_fetcher.rs @@ -14,6 +14,7 @@ use deno_core::anyhow::Context; use deno_core::error::AnyError; use deno_core::url::Url; use deno_resolver::file_fetcher::PermissionedFileFetcherOptions; +use deno_resolver::loader::MemoryFiles; use deno_runtime::deno_web::BlobStore; use http::HeaderMap; use http::StatusCode; @@ -83,6 +84,7 @@ pub fn create_cli_file_fetcher( blob_store: Arc, http_cache: GlobalOrLocalHttpCache, http_client_provider: Arc, + memory_files: Arc, sys: CliSys, options: CreateCliFileFetcherOptions, ) -> CliFileFetcher { @@ -94,6 +96,7 @@ pub fn create_cli_file_fetcher( download_log_level: options.download_log_level, progress_bar: options.progress_bar, }, + memory_files, sys, PermissionedFileFetcherOptions { allow_remote: options.allow_remote, @@ -247,6 +250,7 @@ mod tests { use deno_core::resolve_url; use deno_resolver::file_fetcher::FetchErrorKind; use deno_resolver::file_fetcher::FetchPermissionsOptionRef; + use deno_resolver::loader::MemoryFilesRc; use deno_runtime::deno_web::Blob; use deno_runtime::deno_web::InMemoryBlobPart; use test_util::TempDir; @@ -291,6 +295,7 @@ mod tests { blob_store.clone(), GlobalOrLocalHttpCache::Global(cache.clone()), Arc::new(HttpClientProvider::new(None, None)), + MemoryFilesRc::default(), CliSys::default(), CreateCliFileFetcherOptions { allow_remote: true, @@ -514,6 +519,7 @@ mod tests { Default::default(), Arc::new(GlobalHttpCache::new(CliSys::default(), location)).into(), Arc::new(HttpClientProvider::new(None, None)), + MemoryFilesRc::default(), CliSys::default(), CreateCliFileFetcherOptions { allow_remote: true, @@ -547,6 +553,7 @@ mod tests { Default::default(), http_cache.clone().into(), Arc::new(HttpClientProvider::new(None, None)), + MemoryFilesRc::default(), CliSys::default(), CreateCliFileFetcherOptions { allow_remote: true, @@ -571,6 +578,7 @@ mod tests { Default::default(), Arc::new(GlobalHttpCache::new(CliSys::default(), location)).into(), Arc::new(HttpClientProvider::new(None, None)), + MemoryFilesRc::default(), CliSys::default(), CreateCliFileFetcherOptions { allow_remote: true, @@ -706,6 +714,7 @@ mod tests { Default::default(), http_cache.clone().into(), Arc::new(HttpClientProvider::new(None, None)), + MemoryFilesRc::default(), CliSys::default(), CreateCliFileFetcherOptions { allow_remote: true, @@ -731,6 +740,7 @@ mod tests { Default::default(), http_cache.clone().into(), Arc::new(HttpClientProvider::new(None, None)), + MemoryFilesRc::default(), CliSys::default(), CreateCliFileFetcherOptions { allow_remote: true, @@ -840,6 +850,7 @@ mod tests { Default::default(), Arc::new(GlobalHttpCache::new(CliSys::default(), location)).into(), Arc::new(HttpClientProvider::new(None, None)), + MemoryFilesRc::default(), CliSys::default(), CreateCliFileFetcherOptions { allow_remote: false, @@ -888,6 +899,7 @@ mod tests { Arc::new(GlobalHttpCache::new(CliSys::default(), location.clone())) .into(), Arc::new(HttpClientProvider::new(None, None)), + MemoryFilesRc::default(), CliSys::default(), CreateCliFileFetcherOptions { allow_remote: true, @@ -900,6 +912,7 @@ mod tests { Default::default(), Arc::new(GlobalHttpCache::new(CliSys::default(), location)).into(), Arc::new(HttpClientProvider::new(None, None)), + MemoryFilesRc::default(), CliSys::default(), CreateCliFileFetcherOptions { allow_remote: true, diff --git a/cli/lsp/language_server.rs b/cli/lsp/language_server.rs index 0d1bac3df4..57cbef5af5 100644 --- a/cli/lsp/language_server.rs +++ b/cli/lsp/language_server.rs @@ -33,6 +33,7 @@ use deno_lib::args::get_root_cert_store; use deno_lib::version::DENO_VERSION_INFO; use deno_npm_installer::graph::NpmCachingStrategy; use deno_path_util::url_to_file_path; +use deno_resolver::loader::MemoryFilesRc; use deno_runtime::deno_tls::RootCertStoreProvider; use deno_runtime::deno_tls::rustls::RootCertStore; use deno_semver::jsr::JsrPackageReqReference; @@ -1136,6 +1137,7 @@ impl Inner { Default::default(), GlobalOrLocalHttpCache::Global(self.cache.global().clone()), self.http_client_provider.clone(), + MemoryFilesRc::default(), CliSys::default(), CreateCliFileFetcherOptions { allow_remote: true, diff --git a/cli/lsp/registries.rs b/cli/lsp/registries.rs index 2813a8bd03..17b73db6c2 100644 --- a/cli/lsp/registries.rs +++ b/cli/lsp/registries.rs @@ -19,6 +19,7 @@ use deno_core::url::Url; use deno_graph::Dependency; use deno_resolver::file_fetcher::FetchOptions; use deno_resolver::file_fetcher::FetchPermissionsOptionRef; +use deno_resolver::loader::MemoryFilesRc; use log::error; use once_cell::sync::Lazy; use tower_lsp::lsp_types as lsp; @@ -456,6 +457,7 @@ impl ModuleRegistry { Default::default(), http_cache.clone().into(), http_client_provider, + MemoryFilesRc::default(), CliSys::default(), CreateCliFileFetcherOptions { allow_remote: true, diff --git a/cli/module_loader.rs b/cli/module_loader.rs index ed87437490..83abe75ca0 100644 --- a/cli/module_loader.rs +++ b/cli/module_loader.rs @@ -18,6 +18,7 @@ use std::time::SystemTime; use deno_ast::MediaType; use deno_ast::ModuleKind; use deno_cache_dir::file_fetcher::FetchLocalOptions; +use deno_cache_dir::file_fetcher::MemoryFiles as _; use deno_core::FastString; use deno_core::ModuleLoader; use deno_core::ModuleResolutionError; @@ -60,6 +61,7 @@ use deno_resolver::loader::LoadCodeSourceError; use deno_resolver::loader::LoadPreparedModuleError; use deno_resolver::loader::LoadedModule; use deno_resolver::loader::LoadedModuleOrAsset; +use deno_resolver::loader::MemoryFiles; use deno_resolver::loader::StrippingTypesNodeModulesError; use deno_resolver::npm::DenoInNpmPackageChecker; use deno_runtime::code_cache; @@ -327,6 +329,7 @@ struct SharedCliModuleLoaderState { file_fetcher: Arc, in_npm_pkg_checker: DenoInNpmPackageChecker, main_module_graph_container: Arc, + memory_files: Arc, module_load_preparer: Arc, npm_registry_permission_checker: Arc>, @@ -388,6 +391,7 @@ impl CliModuleLoaderFactory { file_fetcher: Arc, in_npm_pkg_checker: DenoInNpmPackageChecker, main_module_graph_container: Arc, + memory_files: Arc, module_load_preparer: Arc, npm_registry_permission_checker: Arc< NpmRegistryReadPermissionChecker, @@ -416,6 +420,7 @@ impl CliModuleLoaderFactory { file_fetcher, in_npm_pkg_checker, main_module_graph_container, + memory_files, module_load_preparer, npm_registry_permission_checker, npm_resolver, @@ -458,6 +463,7 @@ impl CliModuleLoaderFactory { sys: self.shared.sys.clone(), graph_container, in_npm_pkg_checker: self.shared.in_npm_pkg_checker.clone(), + memory_files: self.shared.memory_files.clone(), npm_registry_permission_checker: self .shared .npm_registry_permission_checker @@ -1271,6 +1277,7 @@ impl ModuleGraphUpdatePermit for WorkerModuleGraphUpdatePermit { struct CliNodeRequireLoader { cjs_tracker: Arc, emitter: Arc, + memory_files: Arc, npm_resolver: CliNpmResolver, sys: CliSys, graph_container: TGraphContainer, @@ -1305,10 +1312,21 @@ impl NodeRequireLoader ) -> Result { // todo(dsherret): use the preloaded module from the graph if available? let media_type = MediaType::from_path(path); - let text = self - .sys - .fs_read_to_string_lossy(path) - .map_err(JsErrorBox::from_err)?; + let text_result = self.sys.fs_read_to_string_lossy(path); + let text = match text_result { + Ok(text) => text, + Err(err) => { + // only bother on error for performance reasons + if let Some(file) = deno_path_util::url_from_file_path(path) + .ok() + .and_then(|s| self.memory_files.get(&s)) + { + Cow::Owned(String::from_utf8_lossy(&file.source).into_owned()) + } else { + return Err(JsErrorBox::from_err(err)); + } + } + }; if media_type.is_emittable() { let specifier = deno_path_util::url_from_file_path(path) .map_err(JsErrorBox::from_err)?; diff --git a/cli/tools/coverage/mod.rs b/cli/tools/coverage/mod.rs index 2a00cdcc30..1ca68b252d 100644 --- a/cli/tools/coverage/mod.rs +++ b/cli/tools/coverage/mod.rs @@ -586,7 +586,7 @@ fn filter_coverages( || e.url.starts_with("data:") || e.url.ends_with("__anonymous__") || e.url.ends_with("$deno$test.mjs") - || e.url.ends_with("$deno$stdin.mts") + || e.url.contains("/$deno$stdin.") || e.url.ends_with(".snap") || is_supported_test_path(Path::new(e.url.as_str())) || doc_test_re.is_match(e.url.as_str()) diff --git a/cli/tools/installer/mod.rs b/cli/tools/installer/mod.rs index 132e6bfdc0..c182d2c302 100644 --- a/cli/tools/installer/mod.rs +++ b/cli/tools/installer/mod.rs @@ -329,6 +329,7 @@ async fn install_global( Default::default(), deno_cache_dir::GlobalOrLocalHttpCache::Global(deps_http_cache.clone()), http_client.clone(), + factory.memory_files().clone(), factory.sys(), CreateCliFileFetcherOptions { allow_remote: true, diff --git a/cli/tools/pm/mod.rs b/cli/tools/pm/mod.rs index 1d7efc4142..8594e0ea09 100644 --- a/cli/tools/pm/mod.rs +++ b/cli/tools/pm/mod.rs @@ -425,6 +425,7 @@ pub async fn add( Default::default(), GlobalOrLocalHttpCache::Global(deps_http_cache.clone()), http_client.clone(), + cli_factory.memory_files().clone(), cli_factory.sys(), CreateCliFileFetcherOptions { allow_remote: true, diff --git a/cli/tools/pm/outdated/mod.rs b/cli/tools/pm/outdated/mod.rs index 7c0eab9faf..8030b23429 100644 --- a/cli/tools/pm/outdated/mod.rs +++ b/cli/tools/pm/outdated/mod.rs @@ -189,6 +189,7 @@ pub async fn outdated( Default::default(), GlobalOrLocalHttpCache::Global(deps_http_cache.clone()), http_client.clone(), + factory.memory_files().clone(), factory.sys(), CreateCliFileFetcherOptions { allow_remote: true, diff --git a/ext/node/ops/require.rs b/ext/node/ops/require.rs index 6c7096e074..39fec44403 100644 --- a/ext/node/ops/require.rs +++ b/ext/node/ops/require.rs @@ -395,9 +395,21 @@ pub fn op_require_real_path< let path = ensure_read_permission::

(state, path) .map_err(RequireErrorKind::Permission)?; let sys = state.borrow::(); - let canonicalized_path = deno_path_util::strip_unc_prefix( - sys.fs_canonicalize(&path).map_err(RequireErrorKind::Io)?, - ); + let canonicalized_path = + deno_path_util::strip_unc_prefix(match sys.fs_canonicalize(&path) { + Ok(path) => path, + Err(err) => { + if path.ends_with("$deno$eval.cjs") + || path.ends_with("$deno$eval.cts") + || path.ends_with("$deno$stdin.cjs") + || path.ends_with("$deno$stdin.cts") + { + path.to_path_buf() + } else { + return Err(RequireErrorKind::Io(err).into_box()); + } + } + }); Ok(canonicalized_path.to_string_lossy().into_owned()) } diff --git a/ext/node/polyfills/01_require.js b/ext/node/polyfills/01_require.js index abb9abea73..7336f0dc60 100644 --- a/ext/node/polyfills/01_require.js +++ b/ext/node/polyfills/01_require.js @@ -840,20 +840,6 @@ Module._resolveFilename = function ( if (filename) { return op_require_real_path(filename); } - const requireStack = []; - for (let cursor = parent; cursor; cursor = moduleParentCache.get(cursor)) { - ArrayPrototypePush(requireStack, cursor.filename || cursor.id); - } - let message = `Cannot find module '${request}'`; - if (requireStack.length > 0) { - message = message + "\nRequire stack:\n- " + - ArrayPrototypeJoin(requireStack, "\n- "); - } - // eslint-disable-next-line no-restricted-syntax - const err = new Error(message); - err.code = "MODULE_NOT_FOUND"; - err.requireStack = requireStack; - // fallback and attempt to resolve bare specifiers using // the global cache when not using --node-modules-dir if ( @@ -875,7 +861,29 @@ Module._resolveFilename = function ( } } - // throw the original error + if ( + typeof request === "string" && + (StringPrototypeEndsWith(request, "$deno$eval.cjs") || + StringPrototypeEndsWith(request, "$deno$eval.cts") || + StringPrototypeEndsWith(request, "$deno$stdin.cjs") || + StringPrototypeEndsWith(request, "$deno$stdin.cts")) + ) { + return request; + } + + const requireStack = []; + for (let cursor = parent; cursor; cursor = moduleParentCache.get(cursor)) { + ArrayPrototypePush(requireStack, cursor.filename || cursor.id); + } + let message = `Cannot find module '${request}'`; + if (requireStack.length > 0) { + message = message + "\nRequire stack:\n- " + + ArrayPrototypeJoin(requireStack, "\n- "); + } + // eslint-disable-next-line no-restricted-syntax + const err = new Error(message); + err.code = "MODULE_NOT_FOUND"; + err.requireStack = requireStack; throw err; }; @@ -919,9 +927,7 @@ Module.prototype.load = function (filename) { // Canonicalize the path so it's not pointing to the symlinked directory // in `node_modules` directory of the referrer. this.filename = op_require_real_path(filename); - this.paths = Module._nodeModulePaths( - pathDirname(this.filename), - ); + this.paths = Module._nodeModulePaths(pathDirname(this.filename)); const extension = findLongestRegisteredExtension(filename); Module._extensions[extension](this, this.filename); this.loaded = true; diff --git a/libs/resolver/file_fetcher.rs b/libs/resolver/file_fetcher.rs index 6006b42e12..57cc72eb0a 100644 --- a/libs/resolver/file_fetcher.rs +++ b/libs/resolver/file_fetcher.rs @@ -34,31 +34,12 @@ use futures::FutureExt; use futures::future::LocalBoxFuture; use http::header; use node_resolver::InNpmPackageChecker; -use parking_lot::Mutex; use thiserror::Error; use url::Url; +use crate::loader::MemoryFilesRc; use crate::npm::DenoInNpmPackageChecker; -#[derive(Debug, Default)] -struct MemoryFiles(Mutex>); - -impl MemoryFiles { - pub fn insert(&self, specifier: Url, file: File) -> Option { - self.0.lock().insert(specifier, file) - } - - pub fn clear(&self) { - self.0.lock().clear(); - } -} - -impl deno_cache_dir::file_fetcher::MemoryFiles for MemoryFiles { - fn get(&self, specifier: &Url) -> Option { - self.0.lock().get(specifier).cloned() - } -} - #[derive(Debug, Boxed, JsError)] pub struct FetchError(pub Box); @@ -149,8 +130,6 @@ pub trait PermissionedFileFetcherSys: #[allow(clippy::disallowed_types)] type PermissionedFileFetcherRc = crate::sync::MaybeArc>; -#[allow(clippy::disallowed_types)] -type MemoryFilesRc = crate::sync::MaybeArc; pub struct PermissionedFileFetcherOptions { pub allow_remote: bool, @@ -179,10 +158,10 @@ impl< blob_store: TBlobStore, http_cache: HttpCacheRc, http_client: THttpClient, + memory_files: MemoryFilesRc, sys: TSys, options: PermissionedFileFetcherOptions, ) -> Self { - let memory_files = crate::sync::new_rc(MemoryFiles::default()); let auth_tokens = AuthTokens::new_from_sys(&sys); let file_fetcher = deno_cache_dir::file_fetcher::FileFetcher::new( blob_store, diff --git a/libs/resolver/loader/mod.rs b/libs/resolver/loader/mod.rs index 296ea1d51d..526f17dc8c 100644 --- a/libs/resolver/loader/mod.rs +++ b/libs/resolver/loader/mod.rs @@ -6,11 +6,14 @@ mod npm; mod module_loader; use std::borrow::Cow; +use std::collections::HashMap; +use deno_cache_dir::file_fetcher::File; use deno_media_type::MediaType; #[cfg(all(feature = "graph", feature = "deno_ast"))] pub use module_loader::*; pub use npm::*; +use parking_lot::RwLock; use url::Url; #[derive(Debug)] @@ -60,3 +63,25 @@ impl LoadedModuleSource { } } } + +#[allow(clippy::disallowed_types)] +pub type MemoryFilesRc = crate::sync::MaybeArc; + +#[derive(Debug, Default)] +pub struct MemoryFiles(RwLock>); + +impl MemoryFiles { + pub fn insert(&self, specifier: Url, file: File) -> Option { + self.0.write().insert(specifier, file) + } + + pub fn clear(&self) { + self.0.write().clear(); + } +} + +impl deno_cache_dir::file_fetcher::MemoryFiles for MemoryFiles { + fn get(&self, specifier: &Url) -> Option { + self.0.read().get(specifier).cloned() + } +} diff --git a/libs/resolver/loader/npm.rs b/libs/resolver/loader/npm.rs index a8730eb64a..cd8d5f3d5b 100644 --- a/libs/resolver/loader/npm.rs +++ b/libs/resolver/loader/npm.rs @@ -115,7 +115,6 @@ pub struct NpmModuleLoader< TSys: NpmModuleLoaderSys, > { cjs_tracker: CjsTrackerRc, - sys: TSys, node_code_translator: NodeCodeTranslatorRc< TCjsCodeAnalyzer, TInNpmPackageChecker, @@ -123,6 +122,7 @@ pub struct NpmModuleLoader< TNpmPackageFolderResolver, TSys, >, + sys: TSys, } impl< diff --git a/tests/specs/eval/cjs/__test__.jsonc b/tests/specs/eval/cjs/__test__.jsonc new file mode 100644 index 0000000000..7f266746dd --- /dev/null +++ b/tests/specs/eval/cjs/__test__.jsonc @@ -0,0 +1,17 @@ +{ + "tests": { + "cjs": { + "args": ["eval", "--quiet", "--ext=cjs", "require('./say_hello')"], + "output": "Hello!\n" + }, + "cts": { + "args": [ + "eval", + "--quiet", + "--ext=cts", + "import test = require('./say_hello.js');" + ], + "output": "Hello!\n" + } + } +} diff --git a/tests/specs/eval/cjs/say_hello.js b/tests/specs/eval/cjs/say_hello.js new file mode 100644 index 0000000000..b6211f244c --- /dev/null +++ b/tests/specs/eval/cjs/say_hello.js @@ -0,0 +1 @@ +console.log("Hello!"); diff --git a/tests/specs/run/stdin_cjs/__test__.jsonc b/tests/specs/run/stdin_cjs/__test__.jsonc new file mode 100644 index 0000000000..09689b6efe --- /dev/null +++ b/tests/specs/run/stdin_cjs/__test__.jsonc @@ -0,0 +1,5 @@ +{ + "args": "run --allow-read=. --quiet --ext=cjs -", + "output": "Hello!\n", + "input": "require('./say_hello.js');" +} diff --git a/tests/specs/run/stdin_cjs/say_hello.js b/tests/specs/run/stdin_cjs/say_hello.js new file mode 100644 index 0000000000..b6211f244c --- /dev/null +++ b/tests/specs/run/stdin_cjs/say_hello.js @@ -0,0 +1 @@ +console.log("Hello!"); diff --git a/tests/specs/run/stdin_type_cjs/__test__.jsonc b/tests/specs/run/stdin_type_cjs/__test__.jsonc deleted file mode 100644 index e60af4a803..0000000000 --- a/tests/specs/run/stdin_type_cjs/__test__.jsonc +++ /dev/null @@ -1,5 +0,0 @@ -{ - "args": "run --quiet -", - "output": "1\n", - "input": "console.log(1)" -} diff --git a/tests/specs/run/stdin_type_cjs/package.json b/tests/specs/run/stdin_type_cjs/package.json deleted file mode 100644 index 5bbefffbab..0000000000 --- a/tests/specs/run/stdin_type_cjs/package.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "type": "commonjs" -} diff --git a/tests/specs/run/stdin_type_cjs/stdin_read_all.ts b/tests/specs/run/stdin_type_cjs/stdin_read_all.ts deleted file mode 100644 index 2ecae40b71..0000000000 --- a/tests/specs/run/stdin_type_cjs/stdin_read_all.ts +++ /dev/null @@ -1 +0,0 @@ -Deno.stdin.readable.pipeTo(Deno.stdout.writable);