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);
             };
 
         "#)