From cbd1a95b2d9a75febb3eb58d2f9d5a513e432540 Mon Sep 17 00:00:00 2001 From: Alexander Gundermann Date: Mon, 7 Nov 2016 14:19:40 +0100 Subject: [PATCH] fix index routes inside async pathless routes (#4147) --- modules/__tests__/matchRoutes-test.js | 26 +++++++++++++- modules/matchRoutes.js | 50 +++++++++++++++++---------- 2 files changed, 57 insertions(+), 19 deletions(-) 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() }