wasm-rquickjs 0.4.4

Tool for wrapping JavaScript modules as WebAssembly components using the QuickJS engine
Documentation
#[rquickjs::module(rename = "camelCase")]
pub mod native_module {
    use rquickjs::Ctx;

    #[cfg(feature = "typescript-runtime")]
    fn serialize_transform_result(
        ctx: &Ctx<'_>,
        result: Result<
            crate::internal::typescript::TypeScriptOutput,
            crate::internal::typescript::TypeScriptError,
        >,
    ) -> rquickjs::Result<String> {
        let output = match result {
            Ok(output) => output,
            Err(error) => {
                let constructor_name = match error.kind {
                    crate::internal::typescript::TypeScriptErrorKind::Error => "Error",
                    crate::internal::typescript::TypeScriptErrorKind::SyntaxError => "SyntaxError",
                };
                let constructor: rquickjs::Function<'_> = ctx.globals().get(constructor_name)?;
                let object: rquickjs::Object<'_> = constructor.call((error.message,))?;
                object.set("code", error.code)?;
                return Err(ctx.throw(object.into_value()));
            }
        };
        serde_json::to_string(&serde_json::json!({
            "code": output.code,
            "sourceMap": output.source_map,
        }))
        .map_err(|error| rquickjs::Exception::throw_message(ctx, &error.to_string()))
    }

    #[rquickjs::function]
    pub fn transform_typescript(
        ctx: Ctx<'_>,
        source: String,
        filename: String,
        mode: String,
        source_map: bool,
        module: Option<bool>,
    ) -> rquickjs::Result<String> {
        #[cfg(feature = "typescript-runtime")]
        {
            use crate::internal::typescript::TypeScriptMode;

            let mode = match mode.as_str() {
                "strip" => TypeScriptMode::Strip,
                "transform" => TypeScriptMode::Transform,
                _ => {
                    return Err(rquickjs::Exception::throw_range(
                        &ctx,
                        "invalid TypeScript mode",
                    ));
                }
            };
            serialize_transform_result(
                &ctx,
                crate::internal::typescript::transform(source, &filename, mode, source_map, module),
            )
        }
        #[cfg(not(feature = "typescript-runtime"))]
        {
            let _ = (source, filename, mode, source_map, module);
            Err(rquickjs::Exception::throw_message(
                &ctx,
                "TypeScript runtime support is not enabled",
            ))
        }
    }

    #[rquickjs::function]
    pub fn transform_typescript_module(
        ctx: Ctx<'_>,
        source: String,
        filename: String,
        module: Option<bool>,
    ) -> rquickjs::Result<String> {
        #[cfg(feature = "typescript-runtime")]
        {
            serialize_transform_result(
                &ctx,
                crate::internal::typescript::transform_module(source, &filename, false, module),
            )
        }
        #[cfg(not(feature = "typescript-runtime"))]
        {
            let _ = (source, filename, module);
            Err(rquickjs::Exception::throw_message(
                &ctx,
                "TypeScript runtime support is not enabled",
            ))
        }
    }

    #[rquickjs::function]
    pub fn test_observability_enabled() -> bool {
        cfg!(feature = "test-observability")
    }
}