From dddeb38bed21b8ae141ee630d33ac152cb7ec716 Mon Sep 17 00:00:00 2001 From: KycKyc Date: Thu, 17 Sep 2020 18:07:26 +0300 Subject: [PATCH] feat: support for language prefixes E.g. when `/user` node is children of `/` node as well as children of `/ko` node. Where: `/` - for English lang node `/ko` - for Korean lang node --- src/matchChildren.ts | 2 +- test/main.test.ts | 60 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 61 insertions(+), 1 deletion(-) diff --git a/src/matchChildren.ts b/src/matchChildren.ts index 5367738..ed884ac 100644 --- a/src/matchChildren.ts +++ b/src/matchChildren.ts @@ -27,7 +27,7 @@ const matchChildren = ( let remainingPath let segment = pathSegment - if (consumedBefore === '/' && child.path === '/') { + if (consumedBefore === '/' && child.path[0] === '/') { // when we encounter repeating slashes we add the slash // back to the URL to make it de facto pathless segment = '/' + pathSegment diff --git a/test/main.test.ts b/test/main.test.ts index 665c551..8bee976 100644 --- a/test/main.test.ts +++ b/test/main.test.ts @@ -868,6 +868,66 @@ describe('RouteNode', function() { }) }) }) + + describe('lang prefixes', () => { + const mainNodes = [ + new RouteNode('default', '/'), + new RouteNode('home', '/home'), + new RouteNode('user', '/user', [ + new RouteNode('default', '/'), + new RouteNode('orders', '/orders'), + new RouteNode('reviews', '/review/:page') + ]) + ] + const enNode = new RouteNode('en', '/', mainNodes) + const ruNode = new RouteNode('ru', '/ru', mainNodes) + const koNode = new RouteNode('ko', '/ko', mainNodes) + const appNodes = new RouteNode('', '', [enNode, ruNode, koNode]) + + it('should match prefix-less path (en-lang)', () => { + expect(appNodes.matchPath('/')).toEqual({ + name: 'en.default', + params: {}, + meta: { en: {}, 'en.default': {} } + }) + expect(appNodes.matchPath('/user')).toEqual({ + name: 'en.user.default', + params: {}, + meta: { en: {}, 'en.user': {}, 'en.user.default': {} } + }) + expect(appNodes.matchPath('/user/')).toEqual({ + name: 'en.user.default', + params: {}, + meta: { en: {}, 'en.user': {}, 'en.user.default': {} } + }) + expect( + appNodes.matchPath('/user/orders/', { strictTrailingSlash: true }) + ).toEqual(null) + }) + + it('should match path witl lang prefix (ko-lang)', () => { + expect(appNodes.matchPath('/ko')).toEqual({ + name: 'ko.default', + params: {}, + meta: { ko: {}, 'ko.default': {} } + }) + expect(appNodes.matchPath('/ko/user/orders?page=1')).toEqual({ + name: 'ko.user.orders', + params: { page: '1' }, + meta: { ko: {}, 'ko.user': {}, 'ko.user.orders': {} } + }) + expect(appNodes.matchPath('/ko/user/orders/?page=1')).toEqual({ + name: 'ko.user.orders', + params: { page: '1' }, + meta: { ko: {}, 'ko.user': {}, 'ko.user.orders': {} } + }) + expect( + appNodes.matchPath('/ko/user/orders/?page=1', { + strictTrailingSlash: true + }) + ).toEqual(null) + }) + }) }) function getRoutes(trailingSlash?: boolean) {