From ae51c3b6f741b69dc3faa9c35ef4be77ff680c24 Mon Sep 17 00:00:00 2001 From: Ashley Williams <ashley666ashley@gmail.com> Date: Thu, 29 Mar 2018 17:11:28 +0200 Subject: [PATCH] feat(node): support node enums --- crates/wasm-bindgen-cli-support/src/js.rs | 18 +++++++++++++++--- tests/node.rs | 23 +++++++++++++++++++++++ 2 files changed, 38 insertions(+), 3 deletions(-) diff --git a/crates/wasm-bindgen-cli-support/src/js.rs b/crates/wasm-bindgen-cli-support/src/js.rs index bb68974d..e0f7f0f7 100644 --- a/crates/wasm-bindgen-cli-support/src/js.rs +++ b/crates/wasm-bindgen-cli-support/src/js.rs @@ -1565,9 +1565,21 @@ impl<'a, 'b> SubContext<'a, 'b> { for variant in enum_.variants.iter() { variants.push_str(&format!("{}:{},", variant.name, variant.value)); } - self.cx.globals.push_str(&format!("export const {} = {{", enum_.name)); - self.cx.globals.push_str(&variants); - self.cx.globals.push_str("}\n"); + let global_export = if self.cx.config.nodejs { + let mut enum_string = format!("const {} = Object.freeze({{", enum_.name); + enum_string.push_str(&variants); + enum_string.push_str("})\n"); + let export = format!("module.exports.{} = {};\n", enum_.name, enum_.name); + enum_string.push_str(&export); + enum_string + } else { + let mut enum_string = format!("export const {} = {{", enum_.name); + enum_string.push_str(&variants); + enum_string.push_str("}\n"); + enum_string + }; + self.cx.globals.push_str(&global_export); + self.cx.typescript.push_str(&format!("export enum {} {{", enum_.name)); variants.clear(); diff --git a/tests/node.rs b/tests/node.rs index d0118e6b..71945434 100644 --- a/tests/node.rs +++ b/tests/node.rs @@ -39,6 +39,21 @@ fn works() { self.contents } } + + #[wasm_bindgen] + pub enum Color { + Green, + Yellow, + Red, + } + #[wasm_bindgen] + pub fn cycle(color: Color) -> Color { + match color { + Color::Green => Color::Yellow, + Color::Yellow => Color::Red, + Color::Red => Color::Green, + } + } "#) .file("test.js", r#" const assert = require('assert'); @@ -68,6 +83,14 @@ fn works() { assert.strictEqual(r2.add(1), 1); assert.strictEqual(r2.add(2), 2); r2.free(); + + var Color = run.Color; + + assert.strictEqual(Color.Green, 0); + assert.strictEqual(Color.Yellow, 1); + assert.strictEqual(Color.Red, 2); + assert.strictEqual(Object.keys(Color).length, 3); + assert.strictEqual(Color.cycle(Color.Green), Color.Yellow); }; "#)