diff --git a/crates/cli-support/src/js/mod.rs b/crates/cli-support/src/js/mod.rs index 5364decc..33ee3998 100644 --- a/crates/cli-support/src/js/mod.rs +++ b/crates/cli-support/src/js/mod.rs @@ -2626,7 +2626,11 @@ impl<'a> Context<'a> { Intrinsic::JsonSerialize => { assert_eq!(args.len(), 1); - format!("JSON.stringify({})", args[0]) + // Turns out `JSON.stringify(undefined) === undefined`, so if + // we're passed `undefined` reinterpret it as `null` for JSON + // purposes. + prelude.push_str(&format!("const obj = {};\n", args[0])); + "JSON.stringify(obj === undefined ? null : obj)".to_string() } Intrinsic::AnyrefHeapLiveCount => { diff --git a/tests/wasm/js_objects.rs b/tests/wasm/js_objects.rs index 3c0ea3eb..38263e00 100644 --- a/tests/wasm/js_objects.rs +++ b/tests/wasm/js_objects.rs @@ -144,4 +144,5 @@ fn serde() { assert_eq!(foo.d.a, 4); assert_eq!(JsValue::from("bar").into_serde::().unwrap(), "bar"); + assert_eq!(JsValue::undefined().into_serde::().ok(), None); }