From cd9bdca5f682be33e4806beadb216a48bcfa6309 Mon Sep 17 00:00:00 2001
From: Rafael Almeida <rafaelalmeidatk@gmail.com>
Date: Fri, 11 Oct 2019 03:09:40 -0300
Subject: [PATCH] Add polyfill for React.createContext

---
 examples/using-inferno/README.md             |  1 +
 examples/using-inferno/lib/inferno-compat.js | 11 +++++++++++
 examples/using-inferno/package.json          |  1 +
 examples/using-inferno/server.js             |  5 +++--
 4 files changed, 16 insertions(+), 2 deletions(-)
 create mode 100644 examples/using-inferno/lib/inferno-compat.js

diff --git a/examples/using-inferno/README.md b/examples/using-inferno/README.md
index efbf117936b27..aaa47ca585949 100644
--- a/examples/using-inferno/README.md
+++ b/examples/using-inferno/README.md
@@ -44,3 +44,4 @@ This example uses [Inferno](https://github.com/infernojs/inferno), an insanely f
 Here's how we did it:
 
 - Use `next.config.js` to customize our webpack config to support [inferno-compat](https://www.npmjs.com/package/inferno-compat)
+- Create `lib/inferno-compat.js` to polyfill the `React.createContext` API (required by Next.js) that is not available by `inferno-compat`
diff --git a/examples/using-inferno/lib/inferno-compat.js b/examples/using-inferno/lib/inferno-compat.js
new file mode 100644
index 0000000000000..e21320e5f6f56
--- /dev/null
+++ b/examples/using-inferno/lib/inferno-compat.js
@@ -0,0 +1,11 @@
+const React = require('inferno-compat')
+const createContext = require('create-react-context/lib/implementation')
+
+Object.keys(React).forEach(key => {
+  if (key === 'default' || key === '__esModule') return
+  exports[key] = React[key]
+})
+
+// bypass export of React.createContext
+exports.createContext = createContext
+exports.default = React.default
diff --git a/examples/using-inferno/package.json b/examples/using-inferno/package.json
index abdd25ff7ead7..2f74fa7bf5cc7 100644
--- a/examples/using-inferno/package.json
+++ b/examples/using-inferno/package.json
@@ -7,6 +7,7 @@
     "start": "NODE_ENV=production node server.js"
   },
   "dependencies": {
+    "create-react-context": "0.3.0",
     "inferno": "7.3.2",
     "inferno-compat": "7.3.2",
     "inferno-server": "7.3.2",
diff --git a/examples/using-inferno/server.js b/examples/using-inferno/server.js
index 86b0cdcdee2f4..0e351d2cc4649 100644
--- a/examples/using-inferno/server.js
+++ b/examples/using-inferno/server.js
@@ -1,13 +1,14 @@
 const port = parseInt(process.env.PORT, 10) || 3000
 const dev = process.env.NODE_ENV !== 'production'
 const moduleAlias = require('module-alias')
+const path = require('path')
 
 // For the development version, we'll use React.
 // Because, it support react hot loading and so on.
 if (!dev) {
-  moduleAlias.addAlias('react', 'inferno-compat')
+  moduleAlias.addAlias('react', path.resolve('./lib/inferno-compat.js'))
   moduleAlias.addAlias('react-dom/server', 'inferno-server')
-  moduleAlias.addAlias('react-dom', 'inferno-compat')
+  moduleAlias.addAlias('react-dom', path.resolve('./lib/inferno-compat.js'))
 }
 
 const { createServer } = require('http')