Skip to main content

ferrijs_std/node/
mod.rs

1//! Node modules with no usable upstream in llrt, written here so the
2//! runtime has exactly one implementation of each.
3
4use rquickjs::{Ctx, Object, Value};
5
6pub mod assert;
7pub mod bytes;
8pub mod deep_equal;
9pub mod inspect;
10pub mod path;
11pub mod process;
12pub mod require_resolve;
13pub mod system_error;
14pub mod timers;
15pub mod util;
16
17/// Throw an `Error` carrying a specific `name` (`TypeError`,
18/// `RangeError`, ...). QuickJS's own constructors are used so the thrown
19/// value is a real `Error` with a stack.
20pub fn throw_named<'js>(ctx: &Ctx<'js>, name: &str, message: impl Into<String>) -> rquickjs::Error {
21  let message = message.into();
22  let built: rquickjs::Result<Value<'js>> = (|| {
23    let ctor: rquickjs::function::Constructor<'js> = ctx.globals().get("Error")?;
24    let err: Object<'js> = ctor.construct((message.as_str(),))?;
25    err.set("name", name)?;
26    Ok(err.into_value())
27  })();
28  match built {
29    Ok(v) => ctx.throw(v),
30    Err(_) => rquickjs::Exception::throw_message(ctx, &message),
31  }
32}