diff --git a/ext/node/lib.rs b/ext/node/lib.rs index 80296a6cc2..c61e270791 100644 --- a/ext/node/lib.rs +++ b/ext/node/lib.rs @@ -5,9 +5,12 @@ use deno_core::include_js_files; use deno_core::normalize_path; use deno_core::op; use deno_core::Extension; +use deno_core::OpState; use std::path::PathBuf; -pub fn init() -> Extension { +pub struct Unstable(pub bool); + +pub fn init(unstable: bool) -> Extension { Extension::builder() .js(include_js_files!( prefix "deno:ext/node", @@ -29,11 +32,26 @@ pub fn init() -> Extension { op_require_path_basename::decl(), op_require_read_file::decl(), ]) + .state(move |state| { + state.put(Unstable(unstable)); + Ok(()) + }) .build() } +fn check_unstable(state: &OpState) { + let unstable = state.borrow::(); + + if !unstable.0 { + eprintln!("Unstable API 'require'. The --unstable flag must be provided.",); + std::process::exit(70); + } +} + #[op] -pub fn op_require_init_paths() -> Vec { +pub fn op_require_init_paths(state: &mut OpState) -> Vec { + check_unstable(state); + let (home_dir, node_path) = if cfg!(windows) { ( std::env::var("USERPROFILE").unwrap_or_else(|_| "".into()), @@ -80,7 +98,11 @@ pub fn op_require_init_paths() -> Vec { } #[op] -pub fn op_require_node_module_paths(from: String) -> Vec { +pub fn op_require_node_module_paths( + state: &mut OpState, + from: String, +) -> Vec { + check_unstable(state); // Guarantee that "from" is absolute. let from = deno_core::resolve_path(&from) .unwrap() @@ -126,7 +148,8 @@ pub fn op_require_node_module_paths(from: String) -> Vec { } #[op] -fn op_require_proxy_path(filename: String) -> String { +fn op_require_proxy_path(state: &mut OpState, filename: String) -> String { + check_unstable(state); // Allow a directory to be passed as the filename let trailing_slash = if cfg!(windows) { filename.ends_with('\\') @@ -143,7 +166,11 @@ fn op_require_proxy_path(filename: String) -> String { } #[op] -fn op_require_is_request_relative(request: String) -> bool { +fn op_require_is_request_relative( + state: &mut OpState, + request: String, +) -> bool { + check_unstable(state); if request.starts_with("./") { return true; } @@ -167,10 +194,12 @@ fn op_require_is_request_relative(request: String) -> bool { #[op] fn op_require_resolve_lookup_paths( + state: &mut OpState, request: String, maybe_parent_paths: Option>, parent_filename: String, ) -> Option> { + check_unstable(state); if !request.starts_with('.') || (request.len() > 1 && !request.starts_with("..") @@ -207,12 +236,14 @@ fn op_require_resolve_lookup_paths( } #[op] -fn op_require_path_is_absolute(p: String) -> bool { +fn op_require_path_is_absolute(state: &mut OpState, p: String) -> bool { + check_unstable(state); PathBuf::from(p).is_absolute() } #[op] -fn op_require_stat(filename: String) -> i32 { +fn op_require_stat(state: &mut OpState, filename: String) -> i32 { + check_unstable(state); if let Ok(metadata) = std::fs::metadata(&filename) { if metadata.is_file() { return 0; @@ -225,7 +256,11 @@ fn op_require_stat(filename: String) -> i32 { } #[op] -fn op_require_real_path(request: String) -> Result { +fn op_require_real_path( + state: &mut OpState, + request: String, +) -> Result { + check_unstable(state); let mut canonicalized_path = PathBuf::from(request).canonicalize()?; if cfg!(windows) { canonicalized_path = PathBuf::from( @@ -239,7 +274,8 @@ fn op_require_real_path(request: String) -> Result { } #[op] -fn op_require_path_resolve(parts: Vec) -> String { +fn op_require_path_resolve(state: &mut OpState, parts: Vec) -> String { + check_unstable(state); assert!(!parts.is_empty()); let mut p = PathBuf::from(&parts[0]); if parts.len() > 1 { @@ -251,23 +287,27 @@ fn op_require_path_resolve(parts: Vec) -> String { } #[op] -fn op_require_path_dirname(request: String) -> String { +fn op_require_path_dirname(state: &mut OpState, request: String) -> String { + check_unstable(state); let p = PathBuf::from(request); p.parent().unwrap().to_string_lossy().to_string() } #[op] -fn op_require_path_basename(request: String) -> String { +fn op_require_path_basename(state: &mut OpState, request: String) -> String { + check_unstable(state); let p = PathBuf::from(request); p.file_name().unwrap().to_string_lossy().to_string() } #[op] fn op_require_try_self_parent_path( + state: &mut OpState, has_parent: bool, maybe_parent_filename: Option, maybe_parent_id: Option, ) -> Option { + check_unstable(state); if !has_parent { return None; } @@ -288,10 +328,12 @@ fn op_require_try_self_parent_path( #[op] fn op_require_try_self( + state: &mut OpState, has_parent: bool, maybe_parent_filename: Option, maybe_parent_id: Option, ) -> Option { + check_unstable(state); if !has_parent { return None; } @@ -311,6 +353,10 @@ fn op_require_try_self( } #[op] -fn op_require_read_file(_filename: String) -> Result { +fn op_require_read_file( + state: &mut OpState, + _filename: String, +) -> Result { + check_unstable(state); todo!("not implemented"); } diff --git a/runtime/build.rs b/runtime/build.rs index b389462b59..0c9c0d0d03 100644 --- a/runtime/build.rs +++ b/runtime/build.rs @@ -158,7 +158,7 @@ mod not_docs { deno_broadcast_channel::InMemoryBroadcastChannel::default(), false, // No --unstable. ), - deno_node::init(), + // deno_node::init(), // todo(dsherret): re-enable deno_ffi::init::(false), deno_net::init::( None, false, // No --unstable. diff --git a/runtime/web_worker.rs b/runtime/web_worker.rs index ec6cd50410..ca11cc18fa 100644 --- a/runtime/web_worker.rs +++ b/runtime/web_worker.rs @@ -419,7 +419,7 @@ impl WebWorker { unstable, options.unsafely_ignore_certificate_errors.clone(), ), - deno_node::init(), + // deno_node::init(), // todo(dsherret): re-enable ops::os::init_for_worker(), ops::permissions::init(), ops::process::init(), diff --git a/runtime/worker.rs b/runtime/worker.rs index c90129ab33..b8ab8b8cad 100644 --- a/runtime/worker.rs +++ b/runtime/worker.rs @@ -161,7 +161,7 @@ impl MainWorker { unstable, options.unsafely_ignore_certificate_errors.clone(), ), - deno_node::init(), + // deno_node::init() // todo(dsherret): re-enable, ops::os::init(exit_code.clone()), ops::permissions::init(), ops::process::init(),