diff --git a/src/js.rs b/src/js.rs index 34f30169..d2c8eada 100644 --- a/src/js.rs +++ b/src/js.rs @@ -1066,6 +1066,15 @@ extern "C" { /// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect/preventExtensions #[wasm_bindgen(static_method_of = Reflect, js_name = preventExtensions, catch)] pub fn prevent_extensions(target: &Object) -> Result; + + /// The static Reflect.set() method works like setting a + /// property on an object. + /// + /// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect/set + #[wasm_bindgen(static_method_of = Reflect, catch)] + pub fn set(target: &JsValue, property_key: &JsValue, value: &JsValue) -> Result; + #[wasm_bindgen(static_method_of = Reflect, js_name = set, catch)] + pub fn set_with_receiver(target: &JsValue, property_key: &JsValue, value: &JsValue, receiver: &JsValue) -> Result; } // Set diff --git a/tests/all/js_globals/Reflect.rs b/tests/all/js_globals/Reflect.rs index 0ad3945f..5f9f5b31 100644 --- a/tests/all/js_globals/Reflect.rs +++ b/tests/all/js_globals/Reflect.rs @@ -560,7 +560,7 @@ fn prevent_extensions() { import * as wasm from "./out"; export function test() { - var object1 = {}; + const object1 = {}; wasm.prevent_extensions(object1); @@ -569,4 +569,92 @@ fn prevent_extensions() { "#, ) .test() +} + +#[test] +fn set() { + project() + .file( + "src/lib.rs", + r#" + #![feature(proc_macro, wasm_custom_section)] + + extern crate wasm_bindgen; + use wasm_bindgen::prelude::*; + use wasm_bindgen::js; + + #[wasm_bindgen] + pub fn set(target: &JsValue, property_key: &JsValue, value: &JsValue) -> JsValue { + let result = js::Reflect::set(target, property_key, value); + let result = match result { + Ok(val) => val, + Err(_err) => "TypeError".into() + }; + result + } + "#, + ) + .file( + "test.ts", + r#" + import * as assert from "assert"; + import * as wasm from "./out"; + + export function test() { + const object = {}; + const array: number[] = [1, 2, 3, 4]; + assert.equal(wasm.set(object, "key", "value"), true); + assert.equal(wasm.set(array, 0, 100), true); + + assert.equal(Reflect.get(object, "key"), "value"); + assert.equal(array[0], 100); + assert.equal(wasm.set("", "key", "value"), "TypeError"); + } + "#, + ) + .test() +} + +#[test] +fn set_with_receiver() { + project() + .file( + "src/lib.rs", + r#" + #![feature(proc_macro, wasm_custom_section)] + + extern crate wasm_bindgen; + use wasm_bindgen::prelude::*; + use wasm_bindgen::js; + + #[wasm_bindgen] + pub fn set_with_receiver(target: &JsValue, property_key: &JsValue, value: &JsValue, receiver: &JsValue) -> JsValue { + let result = js::Reflect::set_with_receiver(target, property_key, value, receiver); + let result = match result { + Ok(val) => val, + Err(_err) => "TypeError".into() + }; + result + } + "#, + ) + .file( + "test.ts", + r#" + import * as assert from "assert"; + import * as wasm from "./out"; + + export function test() { + const object = {}; + const array: number[] = [1, 2, 3, 4]; + assert.equal(wasm.set_with_receiver({}, "key", "value", object), true); + assert.equal(wasm.set_with_receiver([], 0, 100, array), true); + + assert.equal(Reflect.get(object, "key"), "value"); + assert.equal(array[0], 100); + assert.equal(wasm.set_with_receiver("", "key", "value", ""), "TypeError"); + } + "#, + ) + .test() } \ No newline at end of file