1#![deny(clippy::print_stderr)]
4#![deny(clippy::print_stdout)]
5#![allow(clippy::too_many_arguments)]
6
7use std::borrow::Cow;
8use std::collections::HashSet;
9use std::path::Path;
10
11use deno_core::FastString;
12use deno_core::OpState;
13use deno_core::op2;
14use deno_core::url::Url;
15#[allow(unused_imports)]
16use deno_core::v8;
17use deno_core::v8::ExternalReference;
18use deno_error::JsErrorBox;
19use deno_permissions::CheckedPath;
20use deno_permissions::OpenAccessKind;
21use deno_permissions::PermissionsContainer;
22use node_resolver::DenoIsBuiltInNodeModuleChecker;
23use node_resolver::InNpmPackageChecker;
24use node_resolver::IsBuiltInNodeModuleChecker;
25use node_resolver::NpmPackageFolderResolver;
26use node_resolver::PackageJsonResolverRc;
27use node_resolver::errors::PackageJsonLoadError;
28use once_cell::sync::Lazy;
29
30extern crate libz_sys as zlib;
31
32mod global;
33pub mod ops;
34
35pub use deno_package_json::PackageJson;
36use deno_permissions::PermissionCheckError;
37pub use node_resolver::DENO_SUPPORTED_BUILTIN_NODE_MODULES as SUPPORTED_BUILTIN_NODE_MODULES;
38pub use node_resolver::PathClean;
39use ops::handle_wrap::AsyncId;
40pub use ops::ipc::ChildPipeFd;
41use ops::vm;
42pub use ops::vm::ContextInitMode;
43pub use ops::vm::VM_CONTEXT_INDEX;
44pub use ops::vm::create_v8_context;
45pub use ops::vm::init_global_template;
46
47pub use crate::global::GlobalsStorage;
48use crate::global::global_object_middleware;
49use crate::global::global_template_middleware;
50
51pub fn is_builtin_node_module(module_name: &str) -> bool {
52 DenoIsBuiltInNodeModuleChecker.is_builtin_node_module(module_name)
53}
54
55pub trait NodePermissions {
56 fn check_net_url(
57 &mut self,
58 url: &Url,
59 api_name: &str,
60 ) -> Result<(), PermissionCheckError>;
61 fn check_net(
62 &mut self,
63 host: (&str, Option<u16>),
64 api_name: &str,
65 ) -> Result<(), PermissionCheckError>;
66 #[must_use = "the resolved return value to mitigate time-of-check to time-of-use issues"]
67 fn check_open<'a>(
68 &mut self,
69 path: Cow<'a, Path>,
70 open_access: OpenAccessKind,
71 api_name: Option<&str>,
72 ) -> Result<CheckedPath<'a>, PermissionCheckError>;
73 fn query_read_all(&mut self) -> bool;
74 fn check_sys(
75 &mut self,
76 kind: &str,
77 api_name: &str,
78 ) -> Result<(), PermissionCheckError>;
79}
80
81impl NodePermissions for deno_permissions::PermissionsContainer {
82 #[inline(always)]
83 fn check_net_url(
84 &mut self,
85 url: &Url,
86 api_name: &str,
87 ) -> Result<(), PermissionCheckError> {
88 deno_permissions::PermissionsContainer::check_net_url(self, url, api_name)
89 }
90
91 fn check_net(
92 &mut self,
93 host: (&str, Option<u16>),
94 api_name: &str,
95 ) -> Result<(), PermissionCheckError> {
96 deno_permissions::PermissionsContainer::check_net(self, &host, api_name)
97 }
98
99 fn check_open<'a>(
100 &mut self,
101 path: Cow<'a, Path>,
102 open_access: OpenAccessKind,
103 api_name: Option<&str>,
104 ) -> Result<CheckedPath<'a>, PermissionCheckError> {
105 deno_permissions::PermissionsContainer::check_open(
106 self,
107 path,
108 open_access,
109 api_name,
110 )
111 }
112
113 fn query_read_all(&mut self) -> bool {
114 deno_permissions::PermissionsContainer::query_read_all(self)
115 }
116
117 fn check_sys(
118 &mut self,
119 kind: &str,
120 api_name: &str,
121 ) -> Result<(), PermissionCheckError> {
122 deno_permissions::PermissionsContainer::check_sys(self, kind, api_name)
123 }
124}
125
126#[allow(clippy::disallowed_types)]
127pub type NodeRequireLoaderRc = std::rc::Rc<dyn NodeRequireLoader>;
128
129pub trait NodeRequireLoader {
130 #[must_use = "the resolved return value to mitigate time-of-check to time-of-use issues"]
131 fn ensure_read_permission<'a>(
132 &self,
133 permissions: &mut dyn NodePermissions,
134 path: Cow<'a, Path>,
135 ) -> Result<Cow<'a, Path>, JsErrorBox>;
136
137 fn load_text_file_lossy(&self, path: &Path)
138 -> Result<FastString, JsErrorBox>;
139
140 fn is_maybe_cjs(&self, specifier: &Url)
143 -> Result<bool, PackageJsonLoadError>;
144
145 fn resolve_require_node_module_paths(&self, from: &Path) -> Vec<String> {
146 default_resolve_require_node_module_paths(from)
147 }
148}
149
150pub fn default_resolve_require_node_module_paths(from: &Path) -> Vec<String> {
151 let mut paths = Vec::with_capacity(from.components().count());
152 let mut current_path = from;
153 let mut maybe_parent = Some(current_path);
154 while let Some(parent) = maybe_parent {
155 if !parent.ends_with("node_modules") {
156 paths.push(parent.join("node_modules").to_string_lossy().into_owned());
157 }
158 current_path = parent;
159 maybe_parent = current_path.parent();
160 }
161
162 paths
163}
164
165pub static NODE_ENV_VAR_ALLOWLIST: Lazy<HashSet<String>> = Lazy::new(|| {
166 let mut set = HashSet::new();
169 set.insert("NODE_DEBUG".to_string());
170 set.insert("NODE_OPTIONS".to_string());
171 set
172});
173
174#[op2]
175#[string]
176fn op_node_build_os() -> String {
177 env!("TARGET").split('-').nth(2).unwrap().to_string()
178}
179
180#[derive(Debug, thiserror::Error, deno_error::JsError)]
181enum DotEnvLoadErr {
182 #[class(generic)]
183 #[error(transparent)]
184 DotEnv(#[from] dotenvy::Error),
185 #[class(inherit)]
186 #[error(transparent)]
187 Permission(
188 #[from]
189 #[inherit]
190 PermissionCheckError,
191 ),
192}
193
194#[op2(fast)]
195#[undefined]
196fn op_node_load_env_file(
197 state: &mut OpState,
198 #[string] path: &str,
199) -> Result<(), DotEnvLoadErr> {
200 let path = state
201 .borrow::<PermissionsContainer>()
202 .check_open(
203 Cow::Borrowed(Path::new(path)),
204 OpenAccessKind::ReadNoFollow,
205 Some("process.loadEnvFile"),
206 )
207 .map_err(DotEnvLoadErr::Permission)?;
208
209 dotenvy::from_filename(path).map_err(DotEnvLoadErr::DotEnv)?;
210
211 Ok(())
212}
213
214#[derive(Clone)]
215pub struct NodeExtInitServices<
216 TInNpmPackageChecker: InNpmPackageChecker,
217 TNpmPackageFolderResolver: NpmPackageFolderResolver,
218 TSys: ExtNodeSys,
219> {
220 pub node_require_loader: NodeRequireLoaderRc,
221 pub node_resolver:
222 NodeResolverRc<TInNpmPackageChecker, TNpmPackageFolderResolver, TSys>,
223 pub pkg_json_resolver: PackageJsonResolverRc<TSys>,
224 pub sys: TSys,
225}
226
227deno_core::extension!(deno_node,
228 deps = [ deno_io, deno_fs ],
229 parameters = [P: NodePermissions, TInNpmPackageChecker: InNpmPackageChecker, TNpmPackageFolderResolver: NpmPackageFolderResolver, TSys: ExtNodeSys],
230 ops = [
231 ops::blocklist::op_socket_address_parse,
232 ops::blocklist::op_socket_address_get_serialization,
233
234 ops::blocklist::op_blocklist_new,
235 ops::blocklist::op_blocklist_add_address,
236 ops::blocklist::op_blocklist_add_range,
237 ops::blocklist::op_blocklist_add_subnet,
238 ops::blocklist::op_blocklist_check,
239
240 ops::buffer::op_is_ascii,
241 ops::buffer::op_is_utf8,
242 ops::buffer::op_transcode,
243 ops::constant::op_node_fs_constants,
244 ops::buffer::op_node_decode_utf8,
245 ops::crypto::op_node_check_prime_async,
246 ops::crypto::op_node_check_prime_bytes_async,
247 ops::crypto::op_node_check_prime_bytes,
248 ops::crypto::op_node_check_prime,
249 ops::crypto::op_node_cipheriv_encrypt,
250 ops::crypto::op_node_cipheriv_final,
251 ops::crypto::op_node_cipheriv_set_aad,
252 ops::crypto::op_node_cipheriv_take,
253 ops::crypto::op_node_create_cipheriv,
254 ops::crypto::op_node_create_decipheriv,
255 ops::crypto::op_node_create_hash,
256 ops::crypto::op_node_decipheriv_decrypt,
257 ops::crypto::op_node_decipheriv_final,
258 ops::crypto::op_node_decipheriv_set_aad,
259 ops::crypto::op_node_decipheriv_auth_tag,
260 ops::crypto::op_node_dh_compute_secret,
261 ops::crypto::op_node_diffie_hellman,
262 ops::crypto::op_node_ecdh_compute_public_key,
263 ops::crypto::op_node_ecdh_compute_secret,
264 ops::crypto::op_node_ecdh_encode_pubkey,
265 ops::crypto::op_node_ecdh_generate_keys,
266 ops::crypto::op_node_fill_random_async,
267 ops::crypto::op_node_fill_random,
268 ops::crypto::op_node_gen_prime_async,
269 ops::crypto::op_node_gen_prime,
270 ops::crypto::op_node_get_hash_size,
271 ops::crypto::op_node_get_hashes,
272 ops::crypto::op_node_hash_clone,
273 ops::crypto::op_node_hash_digest_hex,
274 ops::crypto::op_node_hash_digest,
275 ops::crypto::op_node_hash_update_str,
276 ops::crypto::op_node_hash_update,
277 ops::crypto::op_node_hkdf_async,
278 ops::crypto::op_node_hkdf,
279 ops::crypto::op_node_pbkdf2_async,
280 ops::crypto::op_node_pbkdf2,
281 ops::crypto::op_node_pbkdf2_validate,
282 ops::crypto::op_node_private_decrypt,
283 ops::crypto::op_node_private_encrypt,
284 ops::crypto::op_node_public_encrypt,
285 ops::crypto::op_node_random_int,
286 ops::crypto::op_node_scrypt_async,
287 ops::crypto::op_node_scrypt_sync,
288 ops::crypto::op_node_sign,
289 ops::crypto::op_node_sign_ed25519,
290 ops::crypto::op_node_verify,
291 ops::crypto::op_node_verify_ed25519,
292 ops::crypto::op_node_verify_spkac,
293 ops::crypto::op_node_cert_export_public_key,
294 ops::crypto::op_node_cert_export_challenge,
295 ops::crypto::keys::op_node_create_private_key,
296 ops::crypto::keys::op_node_create_ed_raw,
297 ops::crypto::keys::op_node_create_rsa_jwk,
298 ops::crypto::keys::op_node_create_ec_jwk,
299 ops::crypto::keys::op_node_create_public_key,
300 ops::crypto::keys::op_node_create_secret_key,
301 ops::crypto::keys::op_node_derive_public_key_from_private_key,
302 ops::crypto::keys::op_node_dh_keys_generate_and_export,
303 ops::crypto::keys::op_node_export_private_key_der,
304 ops::crypto::keys::op_node_export_private_key_jwk,
305 ops::crypto::keys::op_node_export_private_key_pem,
306 ops::crypto::keys::op_node_export_public_key_der,
307 ops::crypto::keys::op_node_export_public_key_pem,
308 ops::crypto::keys::op_node_export_public_key_jwk,
309 ops::crypto::keys::op_node_export_secret_key_b64url,
310 ops::crypto::keys::op_node_export_secret_key,
311 ops::crypto::keys::op_node_generate_dh_group_key_async,
312 ops::crypto::keys::op_node_generate_dh_group_key,
313 ops::crypto::keys::op_node_generate_dh_key_async,
314 ops::crypto::keys::op_node_generate_dh_key,
315 ops::crypto::keys::op_node_generate_dsa_key_async,
316 ops::crypto::keys::op_node_generate_dsa_key,
317 ops::crypto::keys::op_node_generate_ec_key_async,
318 ops::crypto::keys::op_node_generate_ec_key,
319 ops::crypto::keys::op_node_generate_ed25519_key_async,
320 ops::crypto::keys::op_node_generate_ed25519_key,
321 ops::crypto::keys::op_node_generate_rsa_key_async,
322 ops::crypto::keys::op_node_generate_rsa_key,
323 ops::crypto::keys::op_node_generate_rsa_pss_key,
324 ops::crypto::keys::op_node_generate_rsa_pss_key_async,
325 ops::crypto::keys::op_node_generate_secret_key_async,
326 ops::crypto::keys::op_node_generate_secret_key,
327 ops::crypto::keys::op_node_generate_x25519_key_async,
328 ops::crypto::keys::op_node_generate_x25519_key,
329 ops::crypto::keys::op_node_get_asymmetric_key_details,
330 ops::crypto::keys::op_node_get_asymmetric_key_type,
331 ops::crypto::keys::op_node_get_private_key_from_pair,
332 ops::crypto::keys::op_node_get_public_key_from_pair,
333 ops::crypto::keys::op_node_get_symmetric_key_size,
334 ops::crypto::keys::op_node_key_type,
335 ops::crypto::x509::op_node_x509_parse,
336 ops::crypto::x509::op_node_x509_ca,
337 ops::crypto::x509::op_node_x509_check_email,
338 ops::crypto::x509::op_node_x509_check_host,
339 ops::crypto::x509::op_node_x509_fingerprint,
340 ops::crypto::x509::op_node_x509_fingerprint256,
341 ops::crypto::x509::op_node_x509_fingerprint512,
342 ops::crypto::x509::op_node_x509_get_issuer,
343 ops::crypto::x509::op_node_x509_get_subject,
344 ops::crypto::x509::op_node_x509_get_valid_from,
345 ops::crypto::x509::op_node_x509_get_valid_to,
346 ops::crypto::x509::op_node_x509_get_serial_number,
347 ops::crypto::x509::op_node_x509_key_usage,
348 ops::crypto::x509::op_node_x509_public_key,
349 ops::dns::op_node_getaddrinfo<P>,
350 ops::fs::op_node_fs_exists_sync<P>,
351 ops::fs::op_node_fs_exists<P>,
352 ops::fs::op_node_cp_sync<P>,
353 ops::fs::op_node_cp<P>,
354 ops::fs::op_node_lchmod_sync<P>,
355 ops::fs::op_node_lchmod<P>,
356 ops::fs::op_node_lchown_sync<P>,
357 ops::fs::op_node_lchown<P>,
358 ops::fs::op_node_lutimes_sync<P>,
359 ops::fs::op_node_lutimes<P>,
360 ops::fs::op_node_mkdtemp_sync<P>,
361 ops::fs::op_node_mkdtemp<P>,
362 ops::fs::op_node_open_sync<P>,
363 ops::fs::op_node_open<P>,
364 ops::fs::op_node_statfs<P>,
365 ops::winerror::op_node_sys_to_uv_error,
366 ops::v8::op_v8_cached_data_version_tag,
367 ops::v8::op_v8_get_heap_statistics,
368 ops::v8::op_v8_get_wire_format_version,
369 ops::v8::op_v8_new_deserializer,
370 ops::v8::op_v8_new_serializer,
371 ops::v8::op_v8_read_double,
372 ops::v8::op_v8_read_header,
373 ops::v8::op_v8_read_raw_bytes,
374 ops::v8::op_v8_read_uint32,
375 ops::v8::op_v8_read_uint64,
376 ops::v8::op_v8_read_value,
377 ops::v8::op_v8_release_buffer,
378 ops::v8::op_v8_set_treat_array_buffer_views_as_host_objects,
379 ops::v8::op_v8_transfer_array_buffer,
380 ops::v8::op_v8_transfer_array_buffer_de,
381 ops::v8::op_v8_write_double,
382 ops::v8::op_v8_write_header,
383 ops::v8::op_v8_write_raw_bytes,
384 ops::v8::op_v8_write_uint32,
385 ops::v8::op_v8_write_uint64,
386 ops::v8::op_v8_write_value,
387 ops::vm::op_vm_create_script,
388 ops::vm::op_vm_create_context,
389 ops::vm::op_vm_script_run_in_context,
390 ops::vm::op_vm_is_context,
391 ops::vm::op_vm_compile_function,
392 ops::vm::op_vm_script_get_source_map_url,
393 ops::vm::op_vm_script_create_cached_data,
394 ops::idna::op_node_idna_domain_to_ascii,
395 ops::idna::op_node_idna_domain_to_unicode,
396 ops::idna::op_node_idna_punycode_to_ascii,
397 ops::idna::op_node_idna_punycode_to_unicode,
398 ops::idna::op_node_idna_punycode_decode,
399 ops::idna::op_node_idna_punycode_encode,
400 ops::zlib::op_zlib_crc32,
401 ops::zlib::op_zlib_crc32_string,
402 ops::handle_wrap::op_node_new_async_id,
403 ops::http::op_node_http_fetch_response_upgrade,
404 ops::http::op_node_http_request_with_conn<P>,
405 ops::http::op_node_http_await_information,
406 ops::http::op_node_http_await_response,
407 ops::http2::op_http2_connect,
408 ops::http2::op_http2_poll_client_connection,
409 ops::http2::op_http2_client_request,
410 ops::http2::op_http2_client_get_response,
411 ops::http2::op_http2_client_get_response_body_chunk,
412 ops::http2::op_http2_client_send_data,
413 ops::http2::op_http2_client_reset_stream,
414 ops::http2::op_http2_client_send_trailers,
415 ops::http2::op_http2_client_get_response_trailers,
416 ops::http2::op_http2_accept,
417 ops::http2::op_http2_listen,
418 ops::http2::op_http2_send_response,
419 ops::os::op_node_os_get_priority<P>,
420 ops::os::op_node_os_set_priority<P>,
421 ops::os::op_node_os_user_info<P>,
422 ops::os::op_geteuid<P>,
423 ops::os::op_getegid<P>,
424 ops::os::op_cpus<P>,
425 ops::os::op_homedir<P>,
426 op_node_build_os,
427 op_node_load_env_file,
428 ops::require::op_require_can_parse_as_esm,
429 ops::require::op_require_init_paths,
430 ops::require::op_require_node_module_paths<P, TSys>,
431 ops::require::op_require_proxy_path,
432 ops::require::op_require_is_deno_dir_package<TInNpmPackageChecker, TNpmPackageFolderResolver, TSys>,
433 ops::require::op_require_resolve_deno_dir<TInNpmPackageChecker, TNpmPackageFolderResolver, TSys>,
434 ops::require::op_require_is_maybe_cjs,
435 ops::require::op_require_is_request_relative,
436 ops::require::op_require_resolve_lookup_paths,
437 ops::require::op_require_try_self<P, TInNpmPackageChecker, TNpmPackageFolderResolver, TSys>,
438 ops::require::op_require_real_path<P, TSys>,
439 ops::require::op_require_path_is_absolute,
440 ops::require::op_require_path_dirname,
441 ops::require::op_require_stat<P, TSys>,
442 ops::require::op_require_path_resolve,
443 ops::require::op_require_path_basename,
444 ops::require::op_require_read_file<P>,
445 ops::require::op_require_as_file_path,
446 ops::require::op_require_resolve_exports<P, TInNpmPackageChecker, TNpmPackageFolderResolver, TSys>,
447 ops::require::op_require_read_package_scope<P, TSys>,
448 ops::require::op_require_package_imports_resolve<P, TInNpmPackageChecker, TNpmPackageFolderResolver, TSys>,
449 ops::require::op_require_break_on_next_statement,
450 ops::util::op_node_guess_handle_type,
451 ops::util::op_node_view_has_buffer,
452 ops::util::op_node_call_is_from_dependency<TInNpmPackageChecker, TNpmPackageFolderResolver, TSys>,
453 ops::util::op_node_in_npm_package<TInNpmPackageChecker, TNpmPackageFolderResolver, TSys>,
454 ops::worker_threads::op_worker_threads_filename<P, TSys>,
455 ops::ipc::op_node_child_ipc_pipe,
456 ops::ipc::op_node_ipc_write,
457 ops::ipc::op_node_ipc_read,
458 ops::ipc::op_node_ipc_ref,
459 ops::ipc::op_node_ipc_unref,
460 ops::process::op_node_process_kill,
461 ops::process::op_process_abort,
462 ops::tls::op_get_root_certificates,
463 ops::tls::op_tls_peer_certificate,
464 ops::tls::op_tls_canonicalize_ipv4_address,
465 ops::tls::op_node_tls_start,
466 ops::tls::op_node_tls_handshake,
467 ops::inspector::op_inspector_open<P>,
468 ops::inspector::op_inspector_close,
469 ops::inspector::op_inspector_url,
470 ops::inspector::op_inspector_wait,
471 ops::inspector::op_inspector_connect<P>,
472 ops::inspector::op_inspector_dispatch,
473 ops::inspector::op_inspector_disconnect,
474 ops::inspector::op_inspector_emit_protocol_event,
475 ops::inspector::op_inspector_enabled,
476 ],
477 objects = [
478 ops::perf_hooks::EldHistogram,
479 ops::sqlite::DatabaseSync,
480 ops::sqlite::Session,
481 ops::handle_wrap::AsyncWrap,
482 ops::handle_wrap::HandleWrap,
483 ops::sqlite::StatementSync,
484 ops::crypto::digest::Hasher,
485 ops::zlib::BrotliDecoder,
486 ops::zlib::BrotliEncoder,
487 ops::zlib::Zlib,
488 ],
489 esm_entry_point = "ext:deno_node/02_init.js",
490 esm = [
491 dir "polyfills",
492 "00_globals.js",
493 "02_init.js",
494 "_events.mjs",
495 "_fs/_fs_access.ts",
496 "_fs/_fs_appendFile.ts",
497 "_fs/_fs_chmod.ts",
498 "_fs/_fs_chown.ts",
499 "_fs/_fs_close.ts",
500 "_fs/_fs_common.ts",
501 "_fs/_fs_constants.ts",
502 "_fs/_fs_copy.ts",
503 "_fs/_fs_cp.js",
504 "_fs/_fs_dir.ts",
505 "_fs/_fs_exists.ts",
506 "_fs/_fs_fchmod.ts",
507 "_fs/_fs_fchown.ts",
508 "_fs/_fs_fdatasync.ts",
509 "_fs/_fs_fstat.ts",
510 "_fs/_fs_fsync.ts",
511 "_fs/_fs_ftruncate.ts",
512 "_fs/_fs_futimes.ts",
513 "_fs/_fs_glob.ts",
514 "_fs/_fs_lchmod.ts",
515 "_fs/_fs_lchown.ts",
516 "_fs/_fs_link.ts",
517 "_fs/_fs_lstat.ts",
518 "_fs/_fs_lutimes.ts",
519 "_fs/_fs_mkdir.ts",
520 "_fs/_fs_mkdtemp.ts",
521 "_fs/_fs_open.ts",
522 "_fs/_fs_opendir.ts",
523 "_fs/_fs_read.ts",
524 "_fs/_fs_readdir.ts",
525 "_fs/_fs_readFile.ts",
526 "_fs/_fs_readlink.ts",
527 "_fs/_fs_readv.ts",
528 "_fs/_fs_realpath.ts",
529 "_fs/_fs_rename.ts",
530 "_fs/_fs_rm.ts",
531 "_fs/_fs_rmdir.ts",
532 "_fs/_fs_stat.ts",
533 "_fs/_fs_statfs.js",
534 "_fs/_fs_symlink.ts",
535 "_fs/_fs_truncate.ts",
536 "_fs/_fs_unlink.ts",
537 "_fs/_fs_utimes.ts",
538 "_fs/_fs_watch.ts",
539 "_fs/_fs_write.mjs",
540 "_fs/_fs_writeFile.ts",
541 "_fs/_fs_writev.ts",
542 "_next_tick.ts",
543 "_process/exiting.ts",
544 "_process/process.ts",
545 "_process/streams.mjs",
546 "_readline.mjs",
547 "_util/_util_callbackify.js",
548 "_util/asserts.ts",
549 "_util/async.ts",
550 "_util/os.ts",
551 "_util/std_asserts.ts",
552 "_util/std_fmt_colors.ts",
553 "_util/std_testing_diff.ts",
554 "_utils.ts",
555 "_zlib_binding.mjs",
556 "assertion_error.ts",
557 "internal_binding/_libuv_winerror.ts",
558 "internal_binding/_listen.ts",
559 "internal_binding/_node.ts",
560 "internal_binding/_timingSafeEqual.ts",
561 "internal_binding/_utils.ts",
562 "internal_binding/ares.ts",
563 "internal_binding/async_wrap.ts",
564 "internal_binding/buffer.ts",
565 "internal_binding/cares_wrap.ts",
566 "internal_binding/connection_wrap.ts",
567 "internal_binding/constants.ts",
568 "internal_binding/crypto.ts",
569 "internal_binding/handle_wrap.ts",
570 "internal_binding/http_parser.ts",
571 "internal_binding/mod.ts",
572 "internal_binding/node_file.ts",
573 "internal_binding/node_options.ts",
574 "internal_binding/pipe_wrap.ts",
575 "internal_binding/stream_wrap.ts",
576 "internal_binding/string_decoder.ts",
577 "internal_binding/symbols.ts",
578 "internal_binding/tcp_wrap.ts",
579 "internal_binding/tty_wrap.ts",
580 "internal_binding/types.ts",
581 "internal_binding/udp_wrap.ts",
582 "internal_binding/util.ts",
583 "internal_binding/uv.ts",
584 "internal/assert/calltracker.js",
585 "internal/assert.mjs",
586 "internal/async_hooks.ts",
587 "internal/blocklist.mjs",
588 "internal/buffer.mjs",
589 "internal/child_process.ts",
590 "internal/cli_table.ts",
591 "internal/console/constructor.mjs",
592 "internal/constants.ts",
593 "internal/crypto/_keys.ts",
594 "internal/crypto/_randomBytes.ts",
595 "internal/crypto/_randomFill.mjs",
596 "internal/crypto/_randomInt.ts",
597 "internal/crypto/certificate.ts",
598 "internal/crypto/cipher.ts",
599 "internal/crypto/constants.ts",
600 "internal/crypto/diffiehellman.ts",
601 "internal/crypto/hash.ts",
602 "internal/crypto/hkdf.ts",
603 "internal/crypto/keygen.ts",
604 "internal/crypto/keys.ts",
605 "internal/crypto/pbkdf2.ts",
606 "internal/crypto/random.ts",
607 "internal/crypto/scrypt.ts",
608 "internal/crypto/sig.ts",
609 "internal/crypto/util.ts",
610 "internal/crypto/x509.ts",
611 "internal/dgram.ts",
612 "internal/dns/promises.ts",
613 "internal/dns/utils.ts",
614 "internal/dtrace.ts",
615 "internal/error_codes.ts",
616 "internal/errors.ts",
617 "internal/event_target.mjs",
618 "internal/events/abort_listener.mjs",
619 "internal/fixed_queue.ts",
620 "internal/fs/streams.mjs",
621 "internal/fs/utils.mjs",
622 "internal/fs/handle.ts",
623 "internal/hide_stack_frames.ts",
624 "internal/http.ts",
625 "internal/http2/util.ts",
626 "internal/idna.ts",
627 "internal/net.ts",
628 "internal/normalize_encoding.ts",
629 "internal/options.ts",
630 "internal/primordials.mjs",
631 "internal/process/per_thread.mjs",
632 "internal/process/report.ts",
633 "internal/process/warning.ts",
634 "internal/querystring.ts",
635 "internal/readline/callbacks.mjs",
636 "internal/readline/emitKeypressEvents.mjs",
637 "internal/readline/interface.mjs",
638 "internal/readline/promises.mjs",
639 "internal/readline/symbols.mjs",
640 "internal/readline/utils.mjs",
641 "internal/stream_base_commons.ts",
642 "internal/streams/add-abort-signal.js",
643 "internal/streams/compose.js",
644 "internal/streams/destroy.js",
645 "internal/streams/duplexify.js",
646 "internal/streams/duplexpair.js",
647 "internal/streams/end-of-stream.js",
648 "internal/streams/from.js",
649 "internal/streams/lazy_transform.js",
650 "internal/streams/legacy.js",
651 "internal/streams/operators.js",
652 "internal/streams/pipeline.js",
653 "internal/streams/state.js",
654 "internal/streams/utils.js",
655 "internal/test/binding.ts",
656 "internal/timers.mjs",
657 "internal/url.ts",
658 "internal/util.mjs",
659 "internal/util/comparisons.ts",
660 "internal/util/debuglog.ts",
661 "internal/util/inspect.mjs",
662 "internal/util/parse_args/parse_args.js",
663 "internal/util/parse_args/utils.js",
664 "internal/util/types.ts",
665 "internal/validators.mjs",
666 "internal/webstreams/adapters.js",
667 "path/_constants.ts",
668 "path/_interface.ts",
669 "path/_util.ts",
670 "path/_posix.ts",
671 "path/_win32.ts",
672 "path/common.ts",
673 "path/mod.ts",
674 "path/separator.ts",
675 "readline/promises.ts",
676 "node:_http_agent" = "_http_agent.mjs",
677 "node:_http_common" = "_http_common.ts",
678 "node:_http_outgoing" = "_http_outgoing.ts",
679 "node:_http_server" = "_http_server.ts",
680 "node:_stream_duplex" = "internal/streams/duplex.js",
681 "node:_stream_passthrough" = "internal/streams/passthrough.js",
682 "node:_stream_readable" = "internal/streams/readable.js",
683 "node:_stream_transform" = "internal/streams/transform.js",
684 "node:_stream_writable" = "internal/streams/writable.js",
685 "node:_tls_common" = "_tls_common.ts",
686 "node:_tls_wrap" = "_tls_wrap.js",
687 "node:assert" = "assert.ts",
688 "node:assert/strict" = "assert/strict.ts",
689 "node:async_hooks" = "async_hooks.ts",
690 "node:buffer" = "buffer.ts",
691 "node:child_process" = "child_process.ts",
692 "node:cluster" = "cluster.ts",
693 "node:console" = "console.ts",
694 "node:constants" = "constants.ts",
695 "node:crypto" = "crypto.ts",
696 "node:dgram" = "dgram.ts",
697 "node:diagnostics_channel" = "diagnostics_channel.js",
698 "node:dns" = "dns.ts",
699 "node:dns/promises" = "dns/promises.ts",
700 "node:domain" = "domain.ts",
701 "node:events" = "events.ts",
702 "node:fs" = "fs.ts",
703 "node:fs/promises" = "fs/promises.ts",
704 "node:http" = "http.ts",
705 "node:http2" = "http2.ts",
706 "node:https" = "https.ts",
707 "node:inspector" = "inspector.js",
708 "node:inspector/promises" = "inspector/promises.js",
709 "node:module" = "01_require.js",
710 "node:net" = "net.ts",
711 "node:os" = "os.ts",
712 "node:path" = "path.ts",
713 "node:path/posix" = "path/posix.ts",
714 "node:path/win32" = "path/win32.ts",
715 "node:perf_hooks" = "perf_hooks.js",
716 "node:process" = "process.ts",
717 "node:punycode" = "punycode.ts",
718 "node:querystring" = "querystring.js",
719 "node:readline" = "readline.ts",
720 "node:readline/promises" = "readline/promises.ts",
721 "node:repl" = "repl.ts",
722 "node:sqlite" = "sqlite.ts",
723 "node:stream" = "stream.ts",
724 "node:stream/consumers" = "stream/consumers.js",
725 "node:stream/promises" = "stream/promises.js",
726 "node:stream/web" = "stream/web.js",
727 "node:string_decoder" = "string_decoder.ts",
728 "node:sys" = "sys.ts",
729 "node:test" = "testing.ts",
730 "node:timers" = "timers.ts",
731 "node:timers/promises" = "timers/promises.ts",
732 "node:tls" = "tls.ts",
733 "node:trace_events" = "trace_events.ts",
734 "node:tty" = "tty.js",
735 "node:url" = "url.ts",
736 "node:util" = "util.ts",
737 "node:util/types" = "util/types.ts",
738 "node:v8" = "v8.ts",
739 "node:vm" = "vm.js",
740 "node:wasi" = "wasi.ts",
741 "node:worker_threads" = "worker_threads.ts",
742 "node:zlib" = "zlib.js",
743 ],
744 lazy_loaded_esm = [
745 dir "polyfills",
746 "deps/minimatch.js",
747 ],
748 options = {
749 maybe_init: Option<NodeExtInitServices<TInNpmPackageChecker, TNpmPackageFolderResolver, TSys>>,
750 fs: deno_fs::FileSystemRc,
751 },
752 state = |state, options| {
753 state.put(options.fs.clone());
754
755 if let Some(init) = &options.maybe_init {
756 state.put(init.sys.clone());
757 state.put(init.node_require_loader.clone());
758 state.put(init.node_resolver.clone());
759 state.put(init.pkg_json_resolver.clone());
760 }
761
762 state.put(AsyncId::default());
763 },
764 global_template_middleware = global_template_middleware,
765 global_object_middleware = global_object_middleware,
766 customizer = |ext: &mut deno_core::Extension| {
767 let external_references = [
768 vm::QUERY_MAP_FN.with(|query| {
769 ExternalReference {
770 named_query: *query,
771 }
772 }),
773 vm::GETTER_MAP_FN.with(|getter| {
774 ExternalReference {
775 named_getter: *getter,
776 }
777 }),
778 vm::SETTER_MAP_FN.with(|setter| {
779 ExternalReference {
780 named_setter: *setter,
781 }
782 }),
783 vm::DESCRIPTOR_MAP_FN.with(|descriptor| {
784 ExternalReference {
785 named_getter: *descriptor,
786 }
787 }),
788 vm::DELETER_MAP_FN.with(|deleter| {
789 ExternalReference {
790 named_deleter: *deleter,
791 }
792 }),
793 vm::ENUMERATOR_MAP_FN.with(|enumerator| {
794 ExternalReference {
795 enumerator: *enumerator,
796 }
797 }),
798 vm::DEFINER_MAP_FN.with(|definer| {
799 ExternalReference {
800 named_definer: *definer,
801 }
802 }),
803
804 vm::INDEXED_QUERY_MAP_FN.with(|query| {
805 ExternalReference {
806 indexed_query: *query,
807 }
808 }),
809 vm::INDEXED_GETTER_MAP_FN.with(|getter| {
810 ExternalReference {
811 indexed_getter: *getter,
812 }
813 }),
814 vm::INDEXED_SETTER_MAP_FN.with(|setter| {
815 ExternalReference {
816 indexed_setter: *setter,
817 }
818 }),
819 vm::INDEXED_DESCRIPTOR_MAP_FN.with(|descriptor| {
820 ExternalReference {
821 indexed_getter: *descriptor,
822 }
823 }),
824 vm::INDEXED_DELETER_MAP_FN.with(|deleter| {
825 ExternalReference {
826 indexed_deleter: *deleter,
827 }
828 }),
829 vm::INDEXED_DEFINER_MAP_FN.with(|definer| {
830 ExternalReference {
831 indexed_definer: *definer,
832 }
833 }),
834 vm::INDEXED_ENUMERATOR_MAP_FN.with(|enumerator| {
835 ExternalReference {
836 enumerator: *enumerator,
837 }
838 }),
839
840 global::GETTER_MAP_FN.with(|getter| {
841 ExternalReference {
842 named_getter: *getter,
843 }
844 }),
845 global::SETTER_MAP_FN.with(|setter| {
846 ExternalReference {
847 named_setter: *setter,
848 }
849 }),
850 global::QUERY_MAP_FN.with(|query| {
851 ExternalReference {
852 named_query: *query,
853 }
854 }),
855 global::DELETER_MAP_FN.with(|deleter| {
856 ExternalReference {
857 named_deleter: *deleter,
858 }
859 }),
860 global::ENUMERATOR_MAP_FN.with(|enumerator| {
861 ExternalReference {
862 enumerator: *enumerator,
863 }
864 }),
865 global::DEFINER_MAP_FN.with(|definer| {
866 ExternalReference {
867 named_definer: *definer,
868 }
869 }),
870 global::DESCRIPTOR_MAP_FN.with(|descriptor| {
871 ExternalReference {
872 named_getter: *descriptor,
873 }
874 }),
875 ];
876
877 ext.external_references.to_mut().extend(external_references);
878 },
879);
880
881#[sys_traits::auto_impl]
882pub trait ExtNodeSys:
883 sys_traits::BaseFsCanonicalize
884 + sys_traits::BaseFsMetadata
885 + sys_traits::BaseFsRead
886 + sys_traits::EnvCurrentDir
887 + Clone
888{
889}
890
891pub type NodeResolver<TInNpmPackageChecker, TNpmPackageFolderResolver, TSys> =
892 node_resolver::NodeResolver<
893 TInNpmPackageChecker,
894 DenoIsBuiltInNodeModuleChecker,
895 TNpmPackageFolderResolver,
896 TSys,
897 >;
898#[allow(clippy::disallowed_types)]
899pub type NodeResolverRc<TInNpmPackageChecker, TNpmPackageFolderResolver, TSys> =
900 deno_fs::sync::MaybeArc<
901 NodeResolver<TInNpmPackageChecker, TNpmPackageFolderResolver, TSys>,
902 >;
903
904#[allow(clippy::disallowed_types)]
905pub fn create_host_defined_options<'s>(
906 scope: &mut v8::HandleScope<'s>,
907) -> v8::Local<'s, v8::Data> {
908 let host_defined_options = v8::PrimitiveArray::new(scope, 1);
909 let value = v8::Boolean::new(scope, true);
910 host_defined_options.set(scope, 0, value.into());
911 host_defined_options.into()
912}