diff options
author | snek <snek@deno.com> | 2024-09-10 13:12:36 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-09-10 20:12:36 +0000 |
commit | f9007d3386bbe9f709ce413ac0cf099b86d4c4bf (patch) | |
tree | 3254119b37ef434062c431b2b4964d9317fb5f1a /ext/node/ops | |
parent | ee3829a7787b337b2a7e98251b40d5937b2c255b (diff) |
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
Diffstat (limited to 'ext/node/ops')
-rw-r--r-- | ext/node/ops/require.rs | 27 |
1 files changed, 27 insertions, 0 deletions
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<PathBuf, AnyError> { } } } + +#[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() +} |