Skip to content

Commit 35e070c

Browse files
arthur791004timdorr
authored andcommitted
Support react 16.6 for react-router v3 (remix-run#6806)
* Support react components with object type (React.memo, React.lazy and etc) * Update dev dependencies * Add object, number, symbol to component type * Add tests * Change to use elementType * Only import isValidElementType from react-is
1 parent 04b9069 commit 35e070c

File tree

5 files changed

+94
-19
lines changed

5 files changed

+94
-19
lines changed

modules/InternalPropTypes.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { func, object, arrayOf, oneOfType, element, shape, string } from 'prop-types'
1+
import { func, object, arrayOf, oneOfType, element, shape, elementType } from 'prop-types'
22

33
export function falsy(props, propName, componentName) {
44
if (props[propName])
@@ -14,7 +14,7 @@ export const history = shape({
1414
goForward: func.isRequired
1515
})
1616

17-
export const component = oneOfType([ func, string ])
17+
export const component = elementType
1818
export const components = oneOfType([ component, object ])
1919
export const route = oneOfType([ object, element ])
2020
export const routes = oneOfType([ route, arrayOf(route) ])

modules/RouterContext.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import invariant from 'invariant'
22
import React from 'react'
3+
import { isValidElementType } from 'react-is'
34
import createReactClass from 'create-react-class'
45
import { array, func, object } from 'prop-types'
56

@@ -73,7 +74,9 @@ const RouterContext = createReactClass({
7374
props[prop] = element[prop]
7475
}
7576

76-
if (typeof components === 'object') {
77+
// Handle components is object for { [name]: component } but not valid element
78+
// type of react, such as React.memo, React.lazy and so on.
79+
if (typeof components === 'object' && !isValidElementType(components)) {
7780
const elements = {}
7881

7982
for (const key in components) {

modules/__tests__/Router-test.js

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import expect from 'expect'
2-
import React, { Component } from 'react'
2+
import React, { Component, Fragment, forwardRef, memo } from 'react'
33
import { render, unmountComponentAtNode } from 'react-dom'
44
import createHistory from '../createMemoryHistory'
55
import Route from '../Route'
@@ -104,6 +104,41 @@ describe('Router', function () {
104104
})
105105
})
106106

107+
describe('components for React 16', function () {
108+
it('renders routes for React.memo', function (done) {
109+
render((
110+
<Router history={createHistory('/')}>
111+
<Route path="/" component={memo(() => <div>memo</div>)} />
112+
</Router>
113+
), node, function () {
114+
expect(node.textContent).toEqual('memo')
115+
done()
116+
})
117+
})
118+
119+
it('renders routes for React.forwardRef', function (done) {
120+
render((
121+
<Router history={createHistory('/')}>
122+
<Route path="/" component={forwardRef(() => <div>forwardRef</div>)} />
123+
</Router>
124+
), node, function () {
125+
expect(node.textContent).toEqual('forwardRef')
126+
done()
127+
})
128+
})
129+
130+
it('renders routes for React.Fragment', function (done) {
131+
render((
132+
<Router history={createHistory('/')}>
133+
<Route path="/" component={() => <Fragment><div>Fragment</div></Fragment>} />
134+
</Router>
135+
), node, function () {
136+
expect(node.textContent).toEqual('Fragment')
137+
done()
138+
})
139+
})
140+
})
141+
107142
describe('with named components', function () {
108143
class Parent extends Component {
109144
render() {

package.json

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,8 @@
3838
"hoist-non-react-statics": "^2.3.1",
3939
"invariant": "^2.2.1",
4040
"loose-envify": "^1.2.0",
41-
"prop-types": "^15.5.6",
41+
"prop-types": "^15.7.2",
42+
"react-is": "^16.8.6",
4243
"warning": "^3.0.0"
4344
},
4445
"peerDependencies": {
@@ -79,9 +80,9 @@
7980
"mocha": "^5.0.4",
8081
"pretty-bytes": "^4.0.2",
8182
"qs": "^6.2.1",
82-
"react": "^16.0.0-rc",
83+
"react": "^16.8.6",
8384
"react-addons-css-transition-group": "^15.6.0",
84-
"react-dom": "^16.0.0-rc",
85+
"react-dom": "^16.8.6",
8586
"rimraf": "^2.5.4",
8687
"style-loader": "^0.16.1",
8788
"webpack": "^1.13.1",

yarn.lock

Lines changed: 48 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3545,6 +3545,11 @@ js-tokens@^3.0.0, js-tokens@^3.0.2:
35453545
version "3.0.2"
35463546
resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b"
35473547

3548+
"js-tokens@^3.0.0 || ^4.0.0":
3549+
version "4.0.0"
3550+
resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
3551+
integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
3552+
35483553
[email protected], js-yaml@^3.5.1:
35493554
version "3.11.0"
35503555
resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.11.0.tgz#597c1a8bd57152f26d622ce4117851a51f5ebaef"
@@ -3861,12 +3866,19 @@ longest@^1.0.1:
38613866
version "1.0.1"
38623867
resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097"
38633868

3864-
loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3.1:
3869+
loose-envify@^1.0.0, loose-envify@^1.2.0, loose-envify@^1.3.1:
38653870
version "1.3.1"
38663871
resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848"
38673872
dependencies:
38683873
js-tokens "^3.0.0"
38693874

3875+
loose-envify@^1.1.0, loose-envify@^1.4.0:
3876+
version "1.4.0"
3877+
resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf"
3878+
integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==
3879+
dependencies:
3880+
js-tokens "^3.0.0 || ^4.0.0"
3881+
38703882
loud-rejection@^1.0.0:
38713883
version "1.6.0"
38723884
resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f"
@@ -4886,14 +4898,23 @@ promise@^7.1.1:
48864898
dependencies:
48874899
asap "~2.0.3"
48884900

4889-
prop-types@^15.5.6, prop-types@^15.6.0:
4901+
prop-types@^15.5.6:
48904902
version "15.6.1"
48914903
resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.1.tgz#36644453564255ddda391191fb3a125cbdf654ca"
48924904
dependencies:
48934905
fbjs "^0.8.16"
48944906
loose-envify "^1.3.1"
48954907
object-assign "^4.1.1"
48964908

4909+
prop-types@^15.6.2, prop-types@^15.7.2:
4910+
version "15.7.2"
4911+
resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5"
4912+
integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==
4913+
dependencies:
4914+
loose-envify "^1.4.0"
4915+
object-assign "^4.1.1"
4916+
react-is "^16.8.1"
4917+
48974918
proxy-addr@~2.0.2:
48984919
version "2.0.3"
48994920
resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.3.tgz#355f262505a621646b3130a728eb647e22055341"
@@ -5036,14 +5057,20 @@ react-addons-css-transition-group@^15.6.0:
50365057
dependencies:
50375058
react-transition-group "^1.2.0"
50385059

5039-
react-dom@^16.0.0-rc:
5040-
version "16.2.0"
5041-
resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.2.0.tgz#69003178601c0ca19b709b33a83369fe6124c044"
5060+
react-dom@^16.8.6:
5061+
version "16.8.6"
5062+
resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.8.6.tgz#71d6303f631e8b0097f56165ef608f051ff6e10f"
5063+
integrity sha512-1nL7PIq9LTL3fthPqwkvr2zY7phIPjYrT0jp4HjyEQrEROnw4dG41VVwi/wfoCneoleqrNX7iAD+pXebJZwrwA==
50425064
dependencies:
5043-
fbjs "^0.8.16"
50445065
loose-envify "^1.1.0"
50455066
object-assign "^4.1.1"
5046-
prop-types "^15.6.0"
5067+
prop-types "^15.6.2"
5068+
scheduler "^0.13.6"
5069+
5070+
react-is@^16.8.1, react-is@^16.8.6:
5071+
version "16.8.6"
5072+
resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.8.6.tgz#5bbc1e2d29141c9fbdfed456343fe2bc430a6a16"
5073+
integrity sha512-aUk3bHfZ2bRSVFFbbeVS4i+lNPZr3/WM5jT2J5omUVV1zzcs1nAaf3l51ctA5FFvCRbhrH0bdAsRRQddFJZPtA==
50475074

50485075
react-transition-group@^1.2.0:
50495076
version "1.2.1"
@@ -5055,14 +5082,15 @@ react-transition-group@^1.2.0:
50555082
prop-types "^15.5.6"
50565083
warning "^3.0.0"
50575084

5058-
react@^16.0.0-rc:
5059-
version "16.2.0"
5060-
resolved "https://registry.yarnpkg.com/react/-/react-16.2.0.tgz#a31bd2dab89bff65d42134fa187f24d054c273ba"
5085+
react@^16.8.6:
5086+
version "16.8.6"
5087+
resolved "https://registry.yarnpkg.com/react/-/react-16.8.6.tgz#ad6c3a9614fd3a4e9ef51117f54d888da01f2bbe"
5088+
integrity sha512-pC0uMkhLaHm11ZSJULfOBqV4tIZkx87ZLvbbQYunNixAAvjnC+snJCg0XQXn9VIsttVsbZP/H/ewzgsd5fxKXw==
50615089
dependencies:
5062-
fbjs "^0.8.16"
50635090
loose-envify "^1.1.0"
50645091
object-assign "^4.1.1"
5065-
prop-types "^15.6.0"
5092+
prop-types "^15.6.2"
5093+
scheduler "^0.13.6"
50665094

50675095
read-only-stream@^2.0.0:
50685096
version "2.0.0"
@@ -5426,6 +5454,14 @@ sax@~1.2.1:
54265454
version "1.2.4"
54275455
resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
54285456

5457+
scheduler@^0.13.6:
5458+
version "0.13.6"
5459+
resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.13.6.tgz#466a4ec332467b31a91b9bf74e5347072e4cd889"
5460+
integrity sha512-IWnObHt413ucAYKsD9J1QShUKkbKLQQHdxRyw73sw4FN26iWr3DY/H34xGPe4nmL1DwXyWmSWmMrA9TfQbE/XQ==
5461+
dependencies:
5462+
loose-envify "^1.1.0"
5463+
object-assign "^4.1.1"
5464+
54295465
"semver@2 || 3 || 4 || 5", semver@^5.3.0:
54305466
version "5.5.0"
54315467
resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab"

0 commit comments

Comments
 (0)