1
0
Fork 0
mirror of https://github.com/denoland/deno.git synced 2025-01-03 04:48:52 -05:00

port check_if_should_use_esm_loader to rust (#12562)

This commit is contained in:
Ryan Dahl 2021-11-01 14:46:07 -04:00 committed by GitHub
parent 1b684d333d
commit b92019a847
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 42 additions and 32 deletions

View file

@ -926,6 +926,20 @@ struct PackageConfig {
typ: String, typ: String,
} }
pub fn check_if_should_use_esm_loader(
main_module: &ModuleSpecifier,
) -> Result<bool, AnyError> {
let s = main_module.as_str();
if s.ends_with(".mjs") {
return Ok(true);
}
if s.ends_with(".cjs") {
return Ok(false);
}
let package_config = get_package_scope_config(main_module)?;
Ok(package_config.typ == "module")
}
fn get_package_config( fn get_package_config(
path: PathBuf, path: PathBuf,
specifier: &str, specifier: &str,
@ -1219,4 +1233,18 @@ mod tests {
assert!(is_relative_specifier("./foo.js")); assert!(is_relative_specifier("./foo.js"));
assert!(!is_relative_specifier("https://deno.land/std/node/http.ts")); assert!(!is_relative_specifier("https://deno.land/std/node/http.ts"));
} }
#[test]
fn test_check_if_should_use_esm_loader() {
let basic = testdir("basic");
let main = Url::from_file_path(basic.join("main.js")).unwrap();
assert!(check_if_should_use_esm_loader(&main).unwrap());
let cjs = Url::from_file_path(basic.join("main.cjs")).unwrap();
assert!(!check_if_should_use_esm_loader(&cjs).unwrap());
let not_esm = testdir("not_esm");
let main = Url::from_file_path(not_esm.join("main.js")).unwrap();
assert!(!check_if_should_use_esm_loader(&main).unwrap());
}
} }

View file

@ -8,6 +8,7 @@ use deno_core::located_script_name;
use deno_core::url::Url; use deno_core::url::Url;
use deno_core::JsRuntime; use deno_core::JsRuntime;
pub use esm_resolver::check_if_should_use_esm_loader;
pub(crate) use esm_resolver::NodeEsmResolver; pub(crate) use esm_resolver::NodeEsmResolver;
// TODO(bartlomieju): this needs to be bumped manually for // TODO(bartlomieju): this needs to be bumped manually for
@ -86,33 +87,6 @@ fn try_resolve_builtin_module(specifier: &str) -> Option<Url> {
} }
} }
pub(crate) async fn check_if_should_use_esm_loader(
js_runtime: &mut JsRuntime,
main_module: &str,
) -> Result<bool, AnyError> {
// Decide if we're running with Node ESM loader or CJS loader.
let source_code = &format!(
r#"(async function checkIfEsm(main) {{
const {{ resolveMainPath, shouldUseESMLoader }} = await import("{}");
const resolvedMain = resolveMainPath(main);
const useESMLoader = shouldUseESMLoader(resolvedMain);
return useESMLoader;
}})('{}');"#,
MODULE_URL_STR.as_str(),
escape_for_single_quote_string(main_module),
);
let result =
js_runtime.execute_script(&located_script_name!(), source_code)?;
let use_esm_loader_global = js_runtime.resolve_value(result).await?;
let use_esm_loader = {
let scope = &mut js_runtime.handle_scope();
let use_esm_loader_local = use_esm_loader_global.open(scope);
use_esm_loader_local.boolean_value(scope)
};
Ok(use_esm_loader)
}
pub(crate) fn load_cjs_module( pub(crate) fn load_cjs_module(
js_runtime: &mut JsRuntime, js_runtime: &mut JsRuntime,
main_module: &str, main_module: &str,

1
cli/compat/testdata/not_esm/main.js vendored Normal file
View file

@ -0,0 +1 @@
require("foo");

View file

View file

@ -0,0 +1,5 @@
{
"name": "foo",
"type": "module",
"exports": "./index.js"
}

View file

@ -0,0 +1,6 @@
{
"name": "bar",
"dependencies": {
"foo": "1.0.0"
}
}

View file

@ -1153,11 +1153,7 @@ async fn run_command(
// this file. // this file.
worker.execute_side_module(&compat::MODULE_URL).await?; worker.execute_side_module(&compat::MODULE_URL).await?;
let use_esm_loader = compat::check_if_should_use_esm_loader( let use_esm_loader = compat::check_if_should_use_esm_loader(&main_module)?;
&mut worker.js_runtime,
&main_module.to_file_path().unwrap().display().to_string(),
)
.await?;
if use_esm_loader { if use_esm_loader {
// ES module execution in Node compatiblity mode // ES module execution in Node compatiblity mode