@@ -51,7 +51,13 @@ describe('extractRoutesAndCreateRouteTree', () => {
5151 expect ( routeTree . toObject ( ) ) . toEqual ( [
5252 { route : '/' , renderMode : RenderMode . Server } ,
5353 { route : '/home' , renderMode : RenderMode . Client } ,
54- { route : '/redirect' , renderMode : RenderMode . Server , status : 301 , redirectTo : '/home' } ,
54+ {
55+ route : '/redirect' ,
56+ renderMode : RenderMode . Server ,
57+ status : 301 ,
58+ redirectTo : '/home' ,
59+ relativeRedirect : true ,
60+ } ,
5561 { route : '/user/*' , renderMode : RenderMode . Server } ,
5662 ] ) ;
5763 } ) ;
@@ -371,10 +377,25 @@ describe('extractRoutesAndCreateRouteTree', () => {
371377
372378 expect ( errors ) . toHaveSize ( 0 ) ;
373379 expect ( routeTree . toObject ( ) ) . toEqual ( [
374- { route : '/' , renderMode : RenderMode . Prerender , redirectTo : '/some' } ,
375- { route : '/some' , renderMode : RenderMode . Prerender , redirectTo : '/some/thing' } ,
380+ {
381+ route : '/' ,
382+ renderMode : RenderMode . Prerender ,
383+ redirectTo : '/some' ,
384+ relativeRedirect : true ,
385+ } ,
386+ {
387+ route : '/some' ,
388+ renderMode : RenderMode . Prerender ,
389+ redirectTo : '/some/thing' ,
390+ relativeRedirect : true ,
391+ } ,
376392 { route : '/some/thing' , renderMode : RenderMode . Prerender } ,
377- { redirectTo : '/*/thing' , route : '/*' , renderMode : RenderMode . Server } ,
393+ {
394+ redirectTo : '/*/thing' ,
395+ relativeRedirect : true ,
396+ route : '/*' ,
397+ renderMode : RenderMode . Server ,
398+ } ,
378399 { route : '/*/thing' , renderMode : RenderMode . Server } ,
379400 ] ) ;
380401 } ) ;
@@ -496,8 +517,13 @@ describe('extractRoutesAndCreateRouteTree', () => {
496517 const { routeTree, errors } = await extractRoutesAndCreateRouteTree ( { url } ) ;
497518 expect ( errors ) . toHaveSize ( 0 ) ;
498519 expect ( routeTree . toObject ( ) ) . toEqual ( [
499- { route : '/' , renderMode : RenderMode . Server , redirectTo : '/some' } ,
500- { route : '/*' , renderMode : RenderMode . Server , redirectTo : '/*/thing' } ,
520+ { route : '/' , renderMode : RenderMode . Server , redirectTo : '/some' , relativeRedirect : true } ,
521+ {
522+ route : '/*' ,
523+ renderMode : RenderMode . Server ,
524+ redirectTo : '/*/thing' ,
525+ relativeRedirect : true ,
526+ } ,
501527 { route : '/*/thing' , renderMode : RenderMode . Server } ,
502528 ] ) ;
503529 } ) ;
@@ -526,11 +552,70 @@ describe('extractRoutesAndCreateRouteTree', () => {
526552 const { routeTree, errors } = await extractRoutesAndCreateRouteTree ( { url } ) ;
527553 expect ( errors ) . toHaveSize ( 0 ) ;
528554 expect ( routeTree . toObject ( ) ) . toEqual ( [
529- { route : '/*/*' , renderMode : RenderMode . Server , redirectTo : '/*/*/thing' } ,
555+ {
556+ route : '/*/*' ,
557+ renderMode : RenderMode . Server ,
558+ redirectTo : '/*/*/thing' ,
559+ relativeRedirect : true ,
560+ } ,
530561 { route : '/*/*/thing' , renderMode : RenderMode . Server } ,
531562 ] ) ;
532563 } ) ;
533564
565+ it ( 'should not mark absolute redirects as relative' , async ( ) => {
566+ setAngularAppTestingManifest (
567+ [
568+ { path : 'server' , redirectTo : '/home' } ,
569+ { path : 'prerender' , redirectTo : '/home' } ,
570+ { path : 'home' , component : DummyComponent } ,
571+ ] ,
572+ [
573+ { path : 'prerender' , renderMode : RenderMode . Prerender } ,
574+ { path : '**' , renderMode : RenderMode . Server } ,
575+ ] ,
576+ ) ;
577+
578+ const { routeTree, errors } = await extractRoutesAndCreateRouteTree ( { url } ) ;
579+ expect ( errors ) . toHaveSize ( 0 ) ;
580+ expect ( routeTree . toObject ( ) ) . toEqual ( [
581+ { route : '/server' , renderMode : RenderMode . Server , redirectTo : '/home' } ,
582+ { route : '/prerender' , renderMode : RenderMode . Prerender , redirectTo : '/home' } ,
583+ { route : '/home' , renderMode : RenderMode . Server } ,
584+ ] ) ;
585+ } ) ;
586+
587+ it ( 'should ignore the query and fragment of relative redirect targets' , async ( ) => {
588+ setAngularAppTestingManifest (
589+ [
590+ { path : 'server' , redirectTo : 'home?param=value#fragment' } ,
591+ { path : 'prerender' , redirectTo : 'home?param=value#fragment' } ,
592+ { path : 'home' , component : DummyComponent } ,
593+ ] ,
594+ [
595+ { path : 'prerender' , renderMode : RenderMode . Prerender } ,
596+ { path : '**' , renderMode : RenderMode . Server } ,
597+ ] ,
598+ ) ;
599+
600+ const { routeTree, errors } = await extractRoutesAndCreateRouteTree ( { url } ) ;
601+ expect ( errors ) . toHaveSize ( 0 ) ;
602+ expect ( routeTree . toObject ( ) ) . toEqual ( [
603+ {
604+ route : '/server' ,
605+ renderMode : RenderMode . Server ,
606+ redirectTo : '/home' ,
607+ relativeRedirect : true ,
608+ } ,
609+ {
610+ route : '/prerender' ,
611+ renderMode : RenderMode . Prerender ,
612+ redirectTo : '/home' ,
613+ relativeRedirect : true ,
614+ } ,
615+ { route : '/home' , renderMode : RenderMode . Server } ,
616+ ] ) ;
617+ } ) ;
618+
534619 it ( 'should not resolve parameterized routes for SSG when `invokeGetPrerenderParams` is false' , async ( ) => {
535620 setAngularAppTestingManifest (
536621 [
0 commit comments