From 3338dbf03ab8e665fdf886c5907c1111cd2061f9 Mon Sep 17 00:00:00 2001
From: Dan Abramov <dan.abramov@gmail.com>
Date: Sat, 20 May 2017 19:05:39 +0100
Subject: [PATCH] Wrap console calls into a check

---
 .../react-dev-utils/webpackHotDevClient.js    | 26 ++++++----
 .../src/effects/proxyConsole.js               | 50 +++++++++++--------
 2 files changed, 45 insertions(+), 31 deletions(-)

diff --git a/packages/react-dev-utils/webpackHotDevClient.js b/packages/react-dev-utils/webpackHotDevClient.js
index 64725367378..05c2bb2b7ab 100644
--- a/packages/react-dev-utils/webpackHotDevClient.js
+++ b/packages/react-dev-utils/webpackHotDevClient.js
@@ -172,9 +172,11 @@ var connection = new SockJS(
 // to avoid spamming the console. Disconnect usually happens
 // when developer stops the server.
 connection.onclose = function() {
-  console.info(
-    'The development server has disconnected.\nRefresh the page if necessary.'
-  );
+  if (typeof console !== 'undefined') {
+    console.info(
+      'The development server has disconnected.\nRefresh the page if necessary.'
+    );
+  }
 };
 
 // Remember some state related to hot module replacement.
@@ -184,8 +186,10 @@ var hasCompileErrors = false;
 
 function clearOutdatedErrors() {
   // Clean up outdated compile errors, if any.
-  if (hasCompileErrors && typeof console.clear === 'function') {
-    console.clear();
+  if (typeof console !== 'undefined') {
+    if (hasCompileErrors && typeof console.clear === 'function') {
+      console.clear();
+    }
   }
 }
 
@@ -222,8 +226,10 @@ function handleWarnings(warnings) {
       errors: [],
     });
 
-    for (var i = 0; i < formatted.warnings.length; i++) {
-      console.warn(stripAnsi(formatted.warnings[i]));
+    if (typeof console !== 'undefined') {
+      for (var i = 0; i < formatted.warnings.length; i++) {
+        console.warn(stripAnsi(formatted.warnings[i]));
+      }
     }
   }
 
@@ -260,8 +266,10 @@ function handleErrors(errors) {
   showErrorOverlay(formatted.errors[0]);
 
   // Also log them to the console.
-  for (var i = 0; i < formatted.errors.length; i++) {
-    console.error(stripAnsi(formatted.errors[i]));
+  if (typeof console !== 'undefined') {
+    for (var i = 0; i < formatted.errors.length; i++) {
+      console.error(stripAnsi(formatted.errors[i]));
+    }
   }
 
   // Do not attempt to reload now.
diff --git a/packages/react-error-overlay/src/effects/proxyConsole.js b/packages/react-error-overlay/src/effects/proxyConsole.js
index 6b40ff0e125..f17d01890c2 100644
--- a/packages/react-error-overlay/src/effects/proxyConsole.js
+++ b/packages/react-error-overlay/src/effects/proxyConsole.js
@@ -26,17 +26,21 @@ export type { ReactFrame };
 /// TODO: a more comprehensive implementation.
 
 const registerReactStack = () => {
-  // $FlowFixMe
-  console.reactStack = frames => reactFrameStack.push(frames);
-  // $FlowFixMe
-  console.reactStackEnd = frames => reactFrameStack.pop();
+  if (typeof console !== 'undefined') {
+    // $FlowFixMe
+    console.reactStack = frames => reactFrameStack.push(frames);
+    // $FlowFixMe
+    console.reactStackEnd = frames => reactFrameStack.pop();
+  }
 };
 
 const unregisterReactStack = () => {
-  // $FlowFixMe
-  console.reactStack = undefined;
-  // $FlowFixMe
-  console.reactStackEnd = undefined;
+  if (typeof console !== 'undefined') {
+    // $FlowFixMe
+    console.reactStack = undefined;
+    // $FlowFixMe
+    console.reactStackEnd = undefined;
+  }
 };
 
 type ConsoleProxyCallback = (message: string, frames: ReactFrame[]) => void;
@@ -44,21 +48,23 @@ const permanentRegister = function proxyConsole(
   type: string,
   callback: ConsoleProxyCallback
 ) {
-  const orig = console[type];
-  console[type] = function __stack_frame_overlay_proxy_console__() {
-    try {
-      const message = arguments[0];
-      if (typeof message === 'string' && reactFrameStack.length > 0) {
-        callback(message, reactFrameStack[reactFrameStack.length - 1]);
+  if (typeof console !== 'undefined') {
+    const orig = console[type];
+    console[type] = function __stack_frame_overlay_proxy_console__() {
+      try {
+        const message = arguments[0];
+        if (typeof message === 'string' && reactFrameStack.length > 0) {
+          callback(message, reactFrameStack[reactFrameStack.length - 1]);
+        }
+      } catch (err) {
+        // Warnings must never crash. Rethrow with a clean stack.
+        setTimeout(function() {
+          throw err;
+        });
       }
-    } catch (err) {
-      // Warnings must never crash. Rethrow with a clean stack.
-      setTimeout(function() {
-        throw err;
-      });
-    }
-    return orig.apply(this, arguments);
-  };
+      return orig.apply(this, arguments);
+    };
+  }
 };
 
 export { permanentRegister, registerReactStack, unregisterReactStack };