nodejs 0.4.0

Embedding Node.js in Rust
use fs_extra::dir::CopyOptions;
use nodejs::neon::{
    context::Context,
    reflect::eval,
    types::{JsFunction, JsNumber, JsString},
};
use std::path::PathBuf;

#[chazi::test(check_reach)]
fn test_require_builtin() {
    let mut script_result = String::new();
    let exit_code = unsafe {
        nodejs::run(|mut cx| {
            let script = cx.string("require('http').STATUS_CODES[418]");
            let status_text = neon::reflect::eval(&mut cx, script)?;
            script_result = status_text
                .downcast_or_throw::<JsString, _>(&mut cx)?
                .value(&mut cx);
            Ok(())
        })
    };
    assert_eq!(exit_code, 0);
    assert_eq!(script_result, "I'm a Teapot");
    chazi::reached::last()
}

#[chazi::test(check_reach, timeout_ms = 600000)]
fn test_require_external_napi() {
    let test_tmpdir = env!("CARGO_TARGET_TMPDIR");
    let napi_module_src_dir = PathBuf::from(env!("CARGO_MANIFEST_DIR"))
        .join("tests")
        .join("napi_module");

    let napi_module_installed_dir = PathBuf::from(test_tmpdir)
        .join("napi_module")
        .to_str()
        .unwrap()
        .to_string();

    fs_extra::dir::copy(
        napi_module_src_dir,
        &napi_module_installed_dir,
        &CopyOptions {
            copy_inside: true,
            overwrite: true,
            ..Default::default()
        },
    )
    .unwrap();
    let mut npm_install_cmd = if cfg!(target_os = "windows") {
        let mut cmd = std::process::Command::new("cmd");
        cmd.arg("/c").arg("npm");
        cmd
    } else {
        std::process::Command::new("npm")
    };
    npm_install_cmd
        .current_dir(&napi_module_installed_dir)
        .arg("install");
    if cfg!(target_arch = "x86") {
        npm_install_cmd.arg("--target_arch=ia32");
    }
    let npm_install_status = npm_install_cmd.status().unwrap();
    assert!(npm_install_status.success());

    let mut add_result = 0;
    let exit_code = unsafe {
        nodejs::run(|mut cx| {
            let module_path = cx.string(napi_module_installed_dir);
            let js_fn_script = cx.string(
                "module_path => { \
            const m = require(module_path);\
            return m.add(40, 2);\
        }",
            );
            let js_fn = eval(&mut cx, js_fn_script)?;
            let js_fn = js_fn.downcast_or_throw::<JsFunction, _>(&mut cx)?;
            let js_undefined = cx.undefined();
            let js_fn_result = js_fn.call(&mut cx, js_undefined, vec![module_path])?;
            let js_fn_result = js_fn_result.downcast_or_throw::<JsNumber, _>(&mut cx)?;
            add_result = js_fn_result.value(&mut cx) as _;
            Ok(())
        })
    };
    assert_eq!(add_result, 42);
    assert_eq!(exit_code, 0);
    chazi::reached::last();
}