From f9007d3386bbe9f709ce413ac0cf099b86d4c4bf Mon Sep 17 00:00:00 2001 From: snek Date: Tue, 10 Sep 2024 13:12:36 -0700 Subject: feat: require(esm) (#25501) implement require(esm) using `op_import_sync` from deno_core. possible future changes: - cts and mts - replace Deno.core.evalContext to optimize esm syntax detection Fixes: https://github.com/denoland/deno/issues/25487 --- ext/node/ops/require.rs | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) (limited to 'ext/node/ops/require.rs') diff --git a/ext/node/ops/require.rs b/ext/node/ops/require.rs index 4f88c1913..3578719d0 100644 --- a/ext/node/ops/require.rs +++ b/ext/node/ops/require.rs @@ -6,6 +6,7 @@ use deno_core::error::AnyError; use deno_core::normalize_path; use deno_core::op2; use deno_core::url::Url; +use deno_core::v8; use deno_core::JsRuntimeInspector; use deno_core::ModuleSpecifier; use deno_core::OpState; @@ -614,3 +615,29 @@ fn url_to_file_path(url: &Url) -> Result { } } } + +#[op2(fast)] +pub fn op_require_can_parse_as_esm( + scope: &mut v8::HandleScope, + #[string] source: &str, +) -> bool { + let scope = &mut v8::TryCatch::new(scope); + let Some(source) = v8::String::new(scope, source) else { + return false; + }; + let origin = v8::ScriptOrigin::new( + scope, + source.into(), + 0, + 0, + false, + 0, + None, + true, + false, + true, + None, + ); + let mut source = v8::script_compiler::Source::new(source, Some(&origin)); + v8::script_compiler::compile_module(scope, &mut source).is_some() +} -- cgit v1.2.3