Skip to main content

deno_node/
lib.rs

1// Copyright 2018-2026 the Deno authors. MIT license.
2
3#![deny(clippy::print_stderr)]
4#![deny(clippy::print_stdout)]
5#![allow(clippy::too_many_arguments)]
6
7use std::borrow::Cow;
8use std::env;
9use std::fs;
10use std::path::Path;
11
12use deno_core::FastString;
13use deno_core::OpState;
14use deno_core::op2;
15use deno_core::url::Url;
16#[allow(unused_imports)]
17use deno_core::v8;
18use deno_core::v8::ExternalReference;
19use deno_error::JsErrorBox;
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;
28
29extern crate libz_sys as zlib;
30
31mod global;
32pub mod ops;
33
34use deno_dotenv::parse_env_content_hook;
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
55#[allow(clippy::disallowed_types)]
56pub type NodeRequireLoaderRc = std::rc::Rc<dyn NodeRequireLoader>;
57
58pub trait NodeRequireLoader {
59  #[must_use = "the resolved return value to mitigate time-of-check to time-of-use issues"]
60  fn ensure_read_permission<'a>(
61    &self,
62    permissions: &mut PermissionsContainer,
63    path: Cow<'a, Path>,
64  ) -> Result<Cow<'a, Path>, JsErrorBox>;
65
66  fn load_text_file_lossy(&self, path: &Path)
67  -> Result<FastString, JsErrorBox>;
68
69  /// Get if the module kind is maybe CJS and loading should determine
70  /// if its CJS or ESM.
71  fn is_maybe_cjs(&self, specifier: &Url)
72  -> Result<bool, PackageJsonLoadError>;
73
74  fn resolve_require_node_module_paths(&self, from: &Path) -> Vec<String> {
75    default_resolve_require_node_module_paths(from)
76  }
77}
78
79pub fn default_resolve_require_node_module_paths(from: &Path) -> Vec<String> {
80  let mut paths = Vec::with_capacity(from.components().count());
81  let mut current_path = from;
82  let mut maybe_parent = Some(current_path);
83  while let Some(parent) = maybe_parent {
84    if !parent.ends_with("node_modules") {
85      paths.push(parent.join("node_modules").to_string_lossy().into_owned());
86    }
87    current_path = parent;
88    maybe_parent = current_path.parent();
89  }
90
91  paths
92}
93
94#[op2]
95#[string]
96fn op_node_build_os() -> String {
97  env!("TARGET").split('-').nth(2).unwrap().to_string()
98}
99
100#[derive(Debug, thiserror::Error, deno_error::JsError)]
101enum DotEnvLoadErr {
102  #[class(inherit)]
103  #[error("{0}")]
104  Io(#[from] std::io::Error),
105  #[class(inherit)]
106  #[error(transparent)]
107  Permission(
108    #[from]
109    #[inherit]
110    PermissionCheckError,
111  ),
112}
113
114#[op2(fast)]
115#[undefined]
116fn op_node_load_env_file(
117  state: &mut OpState,
118  #[string] path: &str,
119) -> Result<(), DotEnvLoadErr> {
120  let path = state
121    .borrow::<PermissionsContainer>()
122    .check_open(
123      Cow::Borrowed(Path::new(path)),
124      OpenAccessKind::ReadNoFollow,
125      Some("process.loadEnvFile"),
126    )
127    .map_err(DotEnvLoadErr::Permission)?;
128
129  #[allow(clippy::disallowed_methods)]
130  let contents = fs::read_to_string(path)?;
131
132  parse_env_content_hook(&contents, |key, value| {
133    // Follows Node.js behavior where null bytes are stripped from env keys and values
134    let key = if let Some(null_pos) = key.find('\0') {
135      &key[..null_pos]
136    } else {
137      key
138    };
139
140    if key.is_empty() {
141      return;
142    }
143
144    let value = if let Some(null_pos) = value.find('\0') {
145      &value[..null_pos]
146    } else {
147      value
148    };
149
150    #[allow(clippy::undocumented_unsafe_blocks)]
151    unsafe {
152      env::set_var(key, value);
153    }
154  });
155
156  Ok(())
157}
158
159#[derive(Clone)]
160pub struct NodeExtInitServices<
161  TInNpmPackageChecker: InNpmPackageChecker,
162  TNpmPackageFolderResolver: NpmPackageFolderResolver,
163  TSys: ExtNodeSys,
164> {
165  pub node_require_loader: NodeRequireLoaderRc,
166  pub node_resolver:
167    NodeResolverRc<TInNpmPackageChecker, TNpmPackageFolderResolver, TSys>,
168  pub pkg_json_resolver: PackageJsonResolverRc<TSys>,
169  pub sys: TSys,
170}
171
172deno_core::extension!(deno_node,
173  deps = [ deno_io, deno_fs ],
174  parameters = [TInNpmPackageChecker: InNpmPackageChecker, TNpmPackageFolderResolver: NpmPackageFolderResolver, TSys: ExtNodeSys],
175  ops = [
176    ops::assert::op_node_get_first_expression,
177
178    ops::blocklist::op_socket_address_parse,
179    ops::blocklist::op_socket_address_get_serialization,
180
181    ops::blocklist::op_blocklist_new,
182    ops::blocklist::op_blocklist_add_address,
183    ops::blocklist::op_blocklist_add_range,
184    ops::blocklist::op_blocklist_add_subnet,
185    ops::blocklist::op_blocklist_check,
186
187    ops::buffer::op_is_ascii,
188    ops::buffer::op_is_utf8,
189    ops::buffer::op_transcode,
190    ops::buffer::op_node_buffer_compare,
191    ops::buffer::op_node_buffer_compare_offset,
192    ops::constant::op_node_fs_constants,
193    ops::buffer::op_node_decode_utf8,
194    ops::dns::op_node_getaddrinfo,
195    ops::dns::op_node_getnameinfo,
196    ops::fs::op_node_fs_exists_sync,
197    ops::fs::op_node_fs_exists,
198    ops::fs::op_node_lchmod_sync,
199    ops::fs::op_node_lchmod,
200    ops::fs::op_node_lchown_sync,
201    ops::fs::op_node_lchown,
202    ops::fs::op_node_lutimes_sync,
203    ops::fs::op_node_lutimes,
204    ops::fs::op_node_mkdtemp_sync,
205    ops::fs::op_node_mkdtemp,
206    ops::fs::op_node_open_sync,
207    ops::fs::op_node_open,
208    ops::fs::op_node_rmdir_sync,
209    ops::fs::op_node_rmdir,
210    ops::fs::op_node_statfs_sync,
211    ops::fs::op_node_statfs,
212    ops::fs::op_node_file_from_fd,
213    ops::winerror::op_node_sys_to_uv_error,
214    ops::v8::op_v8_cached_data_version_tag,
215    ops::v8::op_v8_get_heap_statistics,
216    ops::v8::op_v8_get_wire_format_version,
217    ops::v8::op_v8_new_deserializer,
218    ops::v8::op_v8_new_serializer,
219    ops::v8::op_v8_read_double,
220    ops::v8::op_v8_read_header,
221    ops::v8::op_v8_read_raw_bytes,
222    ops::v8::op_v8_read_uint32,
223    ops::v8::op_v8_read_uint64,
224    ops::v8::op_v8_read_value,
225    ops::v8::op_v8_release_buffer,
226    ops::v8::op_v8_set_treat_array_buffer_views_as_host_objects,
227    ops::v8::op_v8_transfer_array_buffer,
228    ops::v8::op_v8_transfer_array_buffer_de,
229    ops::v8::op_v8_write_double,
230    ops::v8::op_v8_write_header,
231    ops::v8::op_v8_write_raw_bytes,
232    ops::v8::op_v8_write_uint32,
233    ops::v8::op_v8_write_uint64,
234    ops::v8::op_v8_write_value,
235    ops::vm::op_vm_create_script,
236    ops::vm::op_vm_create_context,
237    ops::vm::op_vm_script_run_in_context,
238    ops::vm::op_vm_is_context,
239    ops::vm::op_vm_compile_function,
240    ops::vm::op_vm_script_get_source_map_url,
241    ops::vm::op_vm_script_create_cached_data,
242    ops::idna::op_node_idna_domain_to_ascii,
243    ops::idna::op_node_idna_domain_to_unicode,
244    ops::idna::op_node_idna_punycode_to_ascii,
245    ops::idna::op_node_idna_punycode_to_unicode,
246    ops::idna::op_node_idna_punycode_decode,
247    ops::idna::op_node_idna_punycode_encode,
248    ops::zlib::op_zlib_crc32,
249    ops::zlib::op_zlib_crc32_string,
250    ops::handle_wrap::op_node_new_async_id,
251    ops::http::op_node_http_fetch_response_upgrade,
252    ops::http::op_node_http_request_with_conn,
253    ops::http::op_node_http_response_reclaim_conn,
254    ops::http::op_node_http_await_information,
255    ops::http::op_node_http_await_response,
256    ops::http2::op_http2_connect,
257    ops::http2::op_http2_poll_client_connection,
258    ops::http2::op_http2_client_request,
259    ops::http2::op_http2_client_get_response,
260    ops::http2::op_http2_client_get_response_body_chunk,
261    ops::http2::op_http2_client_send_data,
262    ops::http2::op_http2_client_reset_stream,
263    ops::http2::op_http2_client_send_trailers,
264    ops::http2::op_http2_client_get_response_trailers,
265    ops::http2::op_http2_accept,
266    ops::http2::op_http2_listen,
267    ops::http2::op_http2_send_response,
268    ops::os::op_node_os_get_priority,
269    ops::os::op_node_os_set_priority,
270    ops::os::op_node_os_user_info,
271    ops::os::op_geteuid,
272    ops::os::op_getegid,
273    ops::os::op_cpus,
274    ops::os::op_homedir,
275    op_node_build_os,
276    op_node_load_env_file,
277    ops::require::op_require_can_parse_as_esm,
278    ops::require::op_require_init_paths,
279    ops::require::op_require_node_module_paths<TSys>,
280    ops::require::op_require_proxy_path,
281    ops::require::op_require_is_deno_dir_package<TInNpmPackageChecker, TNpmPackageFolderResolver, TSys>,
282    ops::require::op_require_resolve_deno_dir<TInNpmPackageChecker, TNpmPackageFolderResolver, TSys>,
283    ops::require::op_require_is_maybe_cjs,
284    ops::require::op_require_is_request_relative,
285    ops::require::op_require_resolve_lookup_paths,
286    ops::require::op_require_try_self<TInNpmPackageChecker, TNpmPackageFolderResolver, TSys>,
287    ops::require::op_require_real_path<TSys>,
288    ops::require::op_require_path_is_absolute,
289    ops::require::op_require_path_dirname,
290    ops::require::op_require_stat<TSys>,
291    ops::require::op_require_path_resolve,
292    ops::require::op_require_path_basename,
293    ops::require::op_require_read_file,
294    ops::require::op_require_as_file_path,
295    ops::require::op_require_resolve_exports<TInNpmPackageChecker, TNpmPackageFolderResolver, TSys>,
296    ops::require::op_require_read_package_scope<TSys>,
297    ops::require::op_require_package_imports_resolve<TInNpmPackageChecker, TNpmPackageFolderResolver, TSys>,
298    ops::require::op_require_break_on_next_statement,
299    ops::util::op_node_guess_handle_type,
300    ops::util::op_node_is_tty,
301    ops::util::op_node_view_has_buffer,
302    ops::util::op_node_get_own_non_index_properties,
303    ops::util::op_node_call_is_from_dependency<TInNpmPackageChecker, TNpmPackageFolderResolver, TSys>,
304    ops::util::op_node_in_npm_package<TInNpmPackageChecker, TNpmPackageFolderResolver, TSys>,
305    ops::util::op_node_parse_env,
306    ops::worker_threads::op_worker_threads_filename<TSys>,
307    ops::ipc::op_node_child_ipc_pipe,
308    ops::ipc::op_node_ipc_write_json,
309    ops::ipc::op_node_ipc_read_json,
310    ops::ipc::op_node_ipc_read_advanced,
311    ops::ipc::op_node_ipc_write_advanced,
312    ops::ipc::op_node_ipc_buffer_constructor,
313    ops::ipc::op_node_ipc_ref,
314    ops::ipc::op_node_ipc_unref,
315    ops::process::op_node_process_kill,
316    ops::process::op_node_process_setegid,
317    ops::process::op_node_process_seteuid,
318    ops::process::op_node_process_setgid,
319    ops::process::op_node_process_setuid,
320    ops::process::op_process_abort,
321    ops::process::op_node_process_constrained_memory<TSys>,
322    ops::node_cli_parser::op_node_translate_cli_args,
323    ops::shell::op_node_parse_shell_args,
324    ops::tls::op_get_root_certificates,
325    ops::tls::op_set_default_ca_certificates,
326    ops::tls::op_tls_peer_certificate,
327    ops::tls::op_tls_canonicalize_ipv4_address,
328    ops::tls::op_node_tls_start,
329    ops::tls::op_node_tls_handshake,
330    ops::inspector::op_inspector_open,
331    ops::inspector::op_inspector_close,
332    ops::inspector::op_inspector_url,
333    ops::inspector::op_inspector_wait,
334    ops::inspector::op_inspector_connect,
335    ops::inspector::op_inspector_dispatch,
336    ops::inspector::op_inspector_disconnect,
337    ops::inspector::op_inspector_emit_protocol_event,
338    ops::inspector::op_inspector_enabled,
339  ],
340  objects = [
341    ops::perf_hooks::EldHistogram,
342    ops::handle_wrap::AsyncWrap,
343    ops::handle_wrap::HandleWrap,
344    ops::zlib::BrotliDecoder,
345    ops::zlib::BrotliEncoder,
346    ops::zlib::Zlib,
347    ops::zlib::ZstdCompress,
348    ops::zlib::ZstdDecompress,
349  ],
350  esm_entry_point = "ext:deno_node/02_init.js",
351  esm = [
352    dir "polyfills",
353    "00_globals.js",
354    "02_init.js",
355    "_events.mjs",
356    "_fs/_fs_access.ts",
357    "_fs/_fs_appendFile.ts",
358    "_fs/_fs_chmod.ts",
359    "_fs/_fs_chown.ts",
360    "_fs/_fs_close.ts",
361    "_fs/_fs_common.ts",
362    "_fs/_fs_constants.ts",
363    "_fs/_fs_copy.ts",
364    "_fs/_fs_cp.ts",
365    "_fs/cp/cp.ts",
366    "_fs/cp/cp_sync.ts",
367    "_fs/_fs_dir.ts",
368    "_fs/_fs_exists.ts",
369    "_fs/_fs_fchmod.ts",
370    "_fs/_fs_fchown.ts",
371    "_fs/_fs_fdatasync.ts",
372    "_fs/_fs_fstat.ts",
373    "_fs/_fs_fsync.ts",
374    "_fs/_fs_ftruncate.ts",
375    "_fs/_fs_futimes.ts",
376    "_fs/_fs_glob.ts",
377    "_fs/_fs_lchmod.ts",
378    "_fs/_fs_lchown.ts",
379    "_fs/_fs_link.ts",
380    "_fs/_fs_lstat.ts",
381    "_fs/_fs_lutimes.ts",
382    "_fs/_fs_mkdir.ts",
383    "_fs/_fs_mkdtemp.ts",
384    "_fs/_fs_open.ts",
385    "_fs/_fs_opendir.ts",
386    "_fs/_fs_read.ts",
387    "_fs/_fs_readdir.ts",
388    "_fs/_fs_readFile.ts",
389    "_fs/_fs_readlink.ts",
390    "_fs/_fs_readv.ts",
391    "_fs/_fs_realpath.ts",
392    "_fs/_fs_rename.ts",
393    "_fs/_fs_rm.ts",
394    "_fs/_fs_rmdir.ts",
395    "_fs/_fs_stat.ts",
396    "_fs/_fs_statfs.ts",
397    "_fs/_fs_symlink.ts",
398    "_fs/_fs_truncate.ts",
399    "_fs/_fs_unlink.ts",
400    "_fs/_fs_utimes.ts",
401    "_fs/_fs_watch.ts",
402    "_fs/_fs_write.ts",
403    "_fs/_fs_writeFile.ts",
404    "_fs/_fs_writev.ts",
405    "_next_tick.ts",
406    "_process/exiting.ts",
407    "_process/process.ts",
408    "_process/streams.mjs",
409    "_readline.mjs",
410    "_util/_util_callbackify.js",
411    "_util/async.ts",
412    "_util/os.ts",
413    "_utils.ts",
414    "_zlib_binding.mjs",
415    "internal_binding/_libuv_winerror.ts",
416    "internal_binding/_listen.ts",
417    "internal_binding/_node.ts",
418    "internal_binding/_timingSafeEqual.ts",
419    "internal_binding/_utils.ts",
420    "internal_binding/ares.ts",
421    "internal_binding/async_wrap.ts",
422    "internal_binding/buffer.ts",
423    "internal_binding/cares_wrap.ts",
424    "internal_binding/connection_wrap.ts",
425    "internal_binding/constants.ts",
426    "internal_binding/crypto.ts",
427    "internal_binding/handle_wrap.ts",
428    "internal_binding/http_parser.ts",
429    "internal_binding/mod.ts",
430    "internal_binding/node_file.ts",
431    "internal_binding/node_options.ts",
432    "internal_binding/pipe_wrap.ts",
433    "internal_binding/stream_wrap.ts",
434    "internal_binding/string_decoder.ts",
435    "internal_binding/symbols.ts",
436    "internal_binding/tcp_wrap.ts",
437    "internal_binding/tty_wrap.ts",
438    "internal_binding/types.ts",
439    "internal_binding/udp_wrap.ts",
440    "internal_binding/util.ts",
441    "internal_binding/uv.ts",
442    "internal/assert/assertion_error.js",
443    "internal/assert/calltracker.js",
444    "internal/assert/myers_diff.js",
445    "internal/assert/utils.ts",
446    "internal/assert.mjs",
447    "internal/async_hooks.ts",
448    "internal/blocklist.mjs",
449    "internal/buffer.mjs",
450    "internal/child_process.ts",
451    "internal/cli_table.ts",
452    "internal/console/constructor.mjs",
453    "internal/constants.ts",
454    "internal/crypto/_keys.ts",
455    "internal/crypto/_randomBytes.ts",
456    "internal/crypto/_randomFill.mjs",
457    "internal/crypto/_randomInt.ts",
458    "internal/crypto/certificate.ts",
459    "internal/crypto/cipher.ts",
460    "internal/crypto/constants.ts",
461    "internal/crypto/diffiehellman.ts",
462    "internal/crypto/hash.ts",
463    "internal/crypto/hkdf.ts",
464    "internal/crypto/keygen.ts",
465    "internal/crypto/keys.ts",
466    "internal/crypto/pbkdf2.ts",
467    "internal/crypto/random.ts",
468    "internal/crypto/scrypt.ts",
469    "internal/crypto/sig.ts",
470    "internal/crypto/util.ts",
471    "internal/crypto/x509.ts",
472    "internal/dgram.ts",
473    "internal/dns/promises.ts",
474    "internal/dns/utils.ts",
475    "internal/dtrace.ts",
476    "internal/error_codes.ts",
477    "internal/errors.ts",
478    "internal/errors/error_source.ts",
479    "internal/event_target.mjs",
480    "internal/events/abort_listener.mjs",
481    "internal/fixed_queue.ts",
482    "internal/fs/streams.mjs",
483    "internal/fs/utils.mjs",
484    "internal/fs/handle.ts",
485    "internal/hide_stack_frames.ts",
486    "internal/http.ts",
487    "internal/http2/util.ts",
488    "internal/idna.ts",
489    "internal/net.ts",
490    "internal/normalize_encoding.ts",
491    "internal/options.ts",
492    "internal/primordials.mjs",
493    "internal/process/per_thread.mjs",
494    "internal/process/report.ts",
495    "internal/process/warning.ts",
496    "internal/querystring.ts",
497    "internal/readline/callbacks.mjs",
498    "internal/readline/emitKeypressEvents.mjs",
499    "internal/readline/interface.mjs",
500    "internal/readline/promises.mjs",
501    "internal/readline/symbols.mjs",
502    "internal/readline/utils.mjs",
503    "internal/stream_base_commons.ts",
504    "internal/streams/add-abort-signal.js",
505    "internal/streams/compose.js",
506    "internal/streams/destroy.js",
507    "internal/streams/duplexify.js",
508    "internal/streams/duplexpair.js",
509    "internal/streams/end-of-stream.js",
510    "internal/streams/from.js",
511    "internal/streams/lazy_transform.js",
512    "internal/streams/legacy.js",
513    "internal/streams/operators.js",
514    "internal/streams/pipeline.js",
515    "internal/streams/state.js",
516    "internal/streams/utils.js",
517    "internal/test/binding.ts",
518    "internal/timers.mjs",
519    "internal/url.ts",
520    "internal/util.mjs",
521    "internal/util/colors.ts",
522    "internal/util/comparisons.ts",
523    "internal/util/debuglog.ts",
524    "internal/util/inspect.mjs",
525    "internal/util/parse_args/parse_args.js",
526    "internal/util/parse_args/utils.js",
527    "internal/util/types.ts",
528    "internal/validators.mjs",
529    "internal/webstreams/adapters.js",
530    "path/_constants.ts",
531    "path/_interface.ts",
532    "path/_util.ts",
533    "path/_posix.ts",
534    "path/_win32.ts",
535    "path/common.ts",
536    "path/mod.ts",
537    "path/separator.ts",
538    "readline/promises.ts",
539    "node:_http_agent" = "_http_agent.mjs",
540    "node:_http_common" = "_http_common.ts",
541    "node:_http_outgoing" = "_http_outgoing.ts",
542    "node:_http_server" = "_http_server.ts",
543    "node:_stream_duplex" = "internal/streams/duplex.js",
544    "node:_stream_passthrough" = "internal/streams/passthrough.js",
545    "node:_stream_readable" = "internal/streams/readable.js",
546    "node:_stream_transform" = "internal/streams/transform.js",
547    "node:_stream_writable" = "internal/streams/writable.js",
548    "node:_tls_common" = "_tls_common.ts",
549    "node:_tls_wrap" = "_tls_wrap.js",
550    "node:assert" = "assert.ts",
551    "node:assert/strict" = "assert/strict.ts",
552    "node:async_hooks" = "async_hooks.ts",
553    "node:buffer" = "buffer.ts",
554    "node:child_process" = "child_process.ts",
555    "node:cluster" = "cluster.ts",
556    "node:console" = "console.ts",
557    "node:constants" = "constants.ts",
558    "node:crypto" = "crypto.ts",
559    "node:dgram" = "dgram.ts",
560    "node:diagnostics_channel" = "diagnostics_channel.js",
561    "node:dns" = "dns.ts",
562    "node:dns/promises" = "dns/promises.ts",
563    "node:domain" = "domain.ts",
564    "node:events" = "events.ts",
565    "node:fs" = "fs.ts",
566    "node:fs/promises" = "fs/promises.ts",
567    "node:http" = "http.ts",
568    "node:http2" = "http2.ts",
569    "node:https" = "https.ts",
570    "node:inspector" = "inspector.js",
571    "node:inspector/promises" = "inspector/promises.js",
572    "node:module" = "01_require.js",
573    "node:net" = "net.ts",
574    "node:os" = "os.ts",
575    "node:path" = "path.ts",
576    "node:path/posix" = "path/posix.ts",
577    "node:path/win32" = "path/win32.ts",
578    "node:perf_hooks" = "perf_hooks.js",
579    "node:process" = "process.ts",
580    "node:punycode" = "punycode.ts",
581    "node:querystring" = "querystring.js",
582    "node:readline" = "readline.ts",
583    "node:readline/promises" = "readline/promises.ts",
584    "node:repl" = "repl.ts",
585    "node:sqlite" = "sqlite.ts",
586    "node:stream" = "stream.ts",
587    "node:stream/consumers" = "stream/consumers.js",
588    "node:stream/promises" = "stream/promises.js",
589    "node:stream/web" = "stream/web.js",
590    "node:string_decoder" = "string_decoder.ts",
591    "node:sys" = "sys.ts",
592    "node:test" = "testing.ts",
593    "node:timers" = "timers.ts",
594    "node:timers/promises" = "timers/promises.ts",
595    "node:tls" = "tls.ts",
596    "node:trace_events" = "trace_events.ts",
597    "node:tty" = "tty.js",
598    "node:url" = "url.ts",
599    "node:util" = "util.ts",
600    "node:util/types" = "util/types.ts",
601    "node:v8" = "v8.ts",
602    "node:vm" = "vm.js",
603    "node:wasi" = "wasi.ts",
604    "node:worker_threads" = "worker_threads.ts",
605    "node:zlib" = "zlib.js",
606  ],
607  lazy_loaded_esm = [
608    dir "polyfills",
609    "deps/minimatch.js",
610  ],
611  options = {
612    maybe_init: Option<NodeExtInitServices<TInNpmPackageChecker, TNpmPackageFolderResolver, TSys>>,
613    fs: deno_fs::FileSystemRc,
614  },
615  state = |state, options| {
616    state.put(options.fs.clone());
617
618    if let Some(init) = &options.maybe_init {
619      state.put(init.sys.clone());
620      state.put(init.node_require_loader.clone());
621      state.put(init.node_resolver.clone());
622      state.put(init.pkg_json_resolver.clone());
623    }
624
625    state.put(AsyncId::default());
626  },
627  global_template_middleware = global_template_middleware,
628  global_object_middleware = global_object_middleware,
629  customizer = |ext: &mut deno_core::Extension| {
630    let external_references = [
631      vm::QUERY_MAP_FN.with(|query| {
632        ExternalReference {
633          named_query: *query,
634        }
635      }),
636      vm::GETTER_MAP_FN.with(|getter| {
637        ExternalReference {
638          named_getter: *getter,
639        }
640      }),
641      vm::SETTER_MAP_FN.with(|setter| {
642        ExternalReference {
643          named_setter: *setter,
644        }
645      }),
646      vm::DESCRIPTOR_MAP_FN.with(|descriptor| {
647        ExternalReference {
648          named_getter: *descriptor,
649        }
650      }),
651      vm::DELETER_MAP_FN.with(|deleter| {
652        ExternalReference {
653          named_deleter: *deleter,
654        }
655      }),
656      vm::ENUMERATOR_MAP_FN.with(|enumerator| {
657        ExternalReference {
658          enumerator: *enumerator,
659        }
660      }),
661      vm::DEFINER_MAP_FN.with(|definer| {
662        ExternalReference {
663          named_definer: *definer,
664        }
665      }),
666
667      vm::INDEXED_QUERY_MAP_FN.with(|query| {
668        ExternalReference {
669          indexed_query: *query,
670        }
671      }),
672      vm::INDEXED_GETTER_MAP_FN.with(|getter| {
673        ExternalReference {
674          indexed_getter: *getter,
675        }
676      }),
677      vm::INDEXED_SETTER_MAP_FN.with(|setter| {
678        ExternalReference {
679          indexed_setter: *setter,
680        }
681      }),
682      vm::INDEXED_DESCRIPTOR_MAP_FN.with(|descriptor| {
683        ExternalReference {
684          indexed_getter: *descriptor,
685        }
686      }),
687      vm::INDEXED_DELETER_MAP_FN.with(|deleter| {
688        ExternalReference {
689          indexed_deleter: *deleter,
690        }
691      }),
692      vm::INDEXED_DEFINER_MAP_FN.with(|definer| {
693        ExternalReference {
694          indexed_definer: *definer,
695        }
696      }),
697      vm::INDEXED_ENUMERATOR_MAP_FN.with(|enumerator| {
698        ExternalReference {
699          enumerator: *enumerator,
700        }
701      }),
702
703      global::GETTER_MAP_FN.with(|getter| {
704        ExternalReference {
705          named_getter: *getter,
706        }
707      }),
708      global::SETTER_MAP_FN.with(|setter| {
709        ExternalReference {
710          named_setter: *setter,
711        }
712      }),
713      global::QUERY_MAP_FN.with(|query| {
714        ExternalReference {
715          named_query: *query,
716        }
717      }),
718      global::DELETER_MAP_FN.with(|deleter| {
719        ExternalReference {
720          named_deleter: *deleter,
721        }
722      }),
723      global::ENUMERATOR_MAP_FN.with(|enumerator| {
724        ExternalReference {
725          enumerator: *enumerator,
726        }
727      }),
728      global::DEFINER_MAP_FN.with(|definer| {
729        ExternalReference {
730          named_definer: *definer,
731        }
732      }),
733      global::DESCRIPTOR_MAP_FN.with(|descriptor| {
734        ExternalReference {
735          named_getter: *descriptor,
736        }
737      }),
738    ];
739
740    ext.external_references.to_mut().extend(external_references);
741  },
742);
743
744#[sys_traits::auto_impl]
745pub trait ExtNodeSys:
746  node_resolver::NodeResolverSys + sys_traits::EnvCurrentDir + Clone
747{
748}
749
750pub type NodeResolver<TInNpmPackageChecker, TNpmPackageFolderResolver, TSys> =
751  node_resolver::NodeResolver<
752    TInNpmPackageChecker,
753    DenoIsBuiltInNodeModuleChecker,
754    TNpmPackageFolderResolver,
755    TSys,
756  >;
757#[allow(clippy::disallowed_types)]
758pub type NodeResolverRc<TInNpmPackageChecker, TNpmPackageFolderResolver, TSys> =
759  deno_fs::sync::MaybeArc<
760    NodeResolver<TInNpmPackageChecker, TNpmPackageFolderResolver, TSys>,
761  >;
762
763#[allow(clippy::disallowed_types)]
764pub fn create_host_defined_options<'s>(
765  scope: &mut v8::PinScope<'s, '_>,
766) -> v8::Local<'s, v8::Data> {
767  let host_defined_options = v8::PrimitiveArray::new(scope, 1);
768  let value = v8::Boolean::new(scope, true);
769  host_defined_options.set(scope, 0, value.into());
770  host_defined_options.into()
771}