diff --git a/modules/__tests__/matchRoutes-test.js b/modules/__tests__/matchRoutes-test.js
index e69215fb5f..8e416b2e1f 100644
--- a/modules/__tests__/matchRoutes-test.js
+++ b/modules/__tests__/matchRoutes-test.js
@@ -12,7 +12,8 @@ describe('matchRoutes', function () {
let
RootRoute, UsersRoute, UsersIndexRoute, UserRoute, PostRoute, FilesRoute,
AboutRoute, TeamRoute, ProfileRoute, GreedyRoute, OptionalRoute,
- OptionalRouteChild, CatchAllRoute
+ OptionalRouteChild, CatchAllRoute, ContactRoute, ContactContainerRoute,
+ ContactIndexRoute
let createLocation = createMemoryHistory().createLocation
beforeEach(function () {
@@ -30,6 +31,11 @@ describe('matchRoutes', function () {
+
+
+
+
+
*/
routes = [
@@ -74,6 +80,14 @@ describe('matchRoutes', function () {
}
]
},
+ ContactRoute = {
+ path: '/contact',
+ childRoutes: [
+ ContactContainerRoute = {
+ indexRoute: (ContactIndexRoute = {})
+ }
+ ]
+ },
CatchAllRoute = {
path: '*'
}
@@ -91,6 +105,16 @@ describe('matchRoutes', function () {
})
})
+ describe('when the location matches an index route inside a pathless route', function () {
+ it('matches the correct routes', function (done) {
+ matchRoutes(routes, createLocation('/contact'), function (error, match) {
+ expect(match).toExist()
+ expect(match.routes).toEqual([ ContactRoute, ContactContainerRoute, ContactIndexRoute ])
+ done()
+ })
+ })
+ })
+
describe('when the location matches a nested route with params', function () {
it('matches the correct routes and params', function (done) {
matchRoutes(routes, createLocation('/users/5'), function (error, match) {
diff --git a/modules/matchRoutes.js b/modules/matchRoutes.js
index 29b8274cfd..a9fb2dc957 100644
--- a/modules/matchRoutes.js
+++ b/modules/matchRoutes.js
@@ -59,26 +59,40 @@ function getIndexRoute(route, location, paramNames, paramValues, callback) {
indexRoute => callback(null, createRoutes(indexRoute)[0]),
callback
)
- } else if (route.childRoutes) {
- const pathless = route.childRoutes.filter(childRoute => !childRoute.path)
+ } else if (route.childRoutes || route.getChildRoutes) {
+ const onChildRoutes = (error, childRoutes) => {
+ if (error) {
+ callback(error)
+ return
+ }
- loopAsync(pathless.length, function (index, next, done) {
- getIndexRoute(
- pathless[index], location, paramNames, paramValues,
- function (error, indexRoute) {
- if (error || indexRoute) {
- const routes = [ pathless[index] ].concat(
- Array.isArray(indexRoute) ? indexRoute : [ indexRoute ]
- )
- done(error, routes)
- } else {
- next()
+ const pathless = childRoutes.filter(childRoute => !childRoute.path)
+
+ loopAsync(pathless.length, function (index, next, done) {
+ getIndexRoute(
+ pathless[index], location, paramNames, paramValues,
+ function (error, indexRoute) {
+ if (error || indexRoute) {
+ const routes = [ pathless[index] ].concat(
+ Array.isArray(indexRoute) ? indexRoute : [ indexRoute ]
+ )
+ done(error, routes)
+ } else {
+ next()
+ }
}
- }
- )
- }, function (err, routes) {
- callback(null, routes)
- })
+ )
+ }, function (err, routes) {
+ callback(null, routes)
+ })
+ }
+
+ const result = getChildRoutes(
+ route, location, paramNames, paramValues, onChildRoutes
+ )
+ if (result) {
+ onChildRoutes(...result)
+ }
} else {
callback()
}