From 07a726b9dc0dd2410fc6732fe0fd9b06a5883027 Mon Sep 17 00:00:00 2001 From: Jannik Keye Date: Wed, 4 Jul 2018 12:17:01 +0200 Subject: [PATCH] feat: add Reflect.defineProperty --- src/js.rs | 7 ++++++ tests/all/js_globals/Reflect.rs | 40 +++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+) diff --git a/src/js.rs b/src/js.rs index e1d43b74..51d5fc4f 100644 --- a/src/js.rs +++ b/src/js.rs @@ -998,6 +998,13 @@ extern "C" { pub fn construct(target: &Function, arguments_list: &Array) -> Result; #[wasm_bindgen(static_method_of = Reflect, js_name = construct, catch)] pub fn construct_with_new_target(target: &Function, arguments_list: &Array, new_target: &Function) -> Result; + + /// The static Reflect.defineProperty() method is like Object.defineProperty() + /// but returns a Boolean. + /// + /// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect/defineProperty + #[wasm_bindgen(static_method_of = Reflect, js_name = defineProperty, catch)] + pub fn define_property(target: &Object, property_key: &JsString, attributes: &Object) -> Result; } // Set diff --git a/tests/all/js_globals/Reflect.rs b/tests/all/js_globals/Reflect.rs index 7fb12670..906b350d 100644 --- a/tests/all/js_globals/Reflect.rs +++ b/tests/all/js_globals/Reflect.rs @@ -163,4 +163,44 @@ fn construct_with_new_target() { "#, ) .test() +} + +#[test] +fn define_property() { + 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 define_property(target: &js::Object, property_key: &js::JsString, attributes: &js::Object) -> JsValue { + let result = js::Reflect::define_property(target, property_key, attributes); + 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 = {}; + + assert.equal(wasm.define_property(object, "key", { value: 42}), true) + assert.equal(wasm.define_property("", "key", { value: 42 }), "TypeError"); + } + "#, + ) + .test() } \ No newline at end of file