@@ -68,12 +68,12 @@ describe('extractRoutesAndCreateRouteTree', () => {
6868 ) ;
6969 } ) ;
7070
71- it ( "should error when 'getPrerenderParams' is used with a '** ' route" , async ( ) => {
71+ it ( "should error when 'getPrerenderParams' is used with a '*' route" , async ( ) => {
7272 setAngularAppTestingManifest (
73- [ { path : 'home ' , component : DummyComponent } ] ,
73+ [ { path : 'invalid/:id ' , component : DummyComponent } ] ,
7474 [
7575 {
76- path : '* *' ,
76+ path : 'invalid/ *' ,
7777 renderMode : RenderMode . Prerender ,
7878 getPrerenderParams ( ) {
7979 return Promise . resolve ( [ ] ) ;
@@ -84,27 +84,54 @@ describe('extractRoutesAndCreateRouteTree', () => {
8484
8585 const { errors } = await extractRoutesAndCreateRouteTree ( { url } ) ;
8686 expect ( errors [ 0 ] ) . toContain (
87- "Invalid '** ' route configuration: 'getPrerenderParams' cannot be used with a '*' or '* *' route." ,
87+ "Invalid 'invalid/* ' route configuration: 'getPrerenderParams' cannot be used with a '*' route." ,
8888 ) ;
8989 } ) ;
9090
91- it ( "should error when 'getPrerenderParams' is used with a '* ' route" , async ( ) => {
91+ it ( "should throw an error when 'getPrerenderParams' returns an array for a parameterized ':param ' route" , async ( ) => {
9292 setAngularAppTestingManifest (
9393 [ { path : 'invalid/:id' , component : DummyComponent } ] ,
9494 [
9595 {
96- path : 'invalid/* ' ,
96+ path : 'invalid/:param ' ,
9797 renderMode : RenderMode . Prerender ,
98- getPrerenderParams ( ) {
99- return Promise . resolve ( [ ] ) ;
98+ async getPrerenderParams ( ) {
99+ return [ [ '1' ] ] ;
100100 } ,
101101 } ,
102102 ] ,
103103 ) ;
104104
105- const { errors } = await extractRoutesAndCreateRouteTree ( { url } ) ;
105+ const { errors } = await extractRoutesAndCreateRouteTree ( {
106+ url,
107+ invokeGetPrerenderParams : true ,
108+ } ) ;
109+ expect ( errors [ 0 ] ) . toContain (
110+ `The 'getPrerenderParams' function for the 'invalid/:id' route returned an array '["1"]', which is not valid for catch-all routes.` ,
111+ ) ;
112+ } ) ;
113+
114+ it ( "should throw an error when 'getPrerenderParams' returns an object for a parameterized catch-all route" , async ( ) => {
115+ setAngularAppTestingManifest (
116+ [ { path : 'invalid/**' , component : DummyComponent } ] ,
117+ [
118+ {
119+ path : 'invalid/**' ,
120+ renderMode : RenderMode . Prerender ,
121+ async getPrerenderParams ( ) {
122+ return [ { param : '1' } ] ;
123+ } ,
124+ } ,
125+ ] ,
126+ ) ;
127+
128+ const { errors } = await extractRoutesAndCreateRouteTree ( {
129+ url,
130+ invokeGetPrerenderParams : true ,
131+ } ) ;
106132 expect ( errors [ 0 ] ) . toContain (
107- "Invalid 'invalid/*' route configuration: 'getPrerenderParams' cannot be used with a '*' or '**' route." ,
133+ `The 'getPrerenderParams' function for the 'invalid/**' route returned an object '{"param":"1"}'` +
134+ `, which is not valid for parameterized routes.` ,
108135 ) ;
109136 } ) ;
110137
@@ -259,7 +286,7 @@ describe('extractRoutesAndCreateRouteTree', () => {
259286 ] ) ;
260287 } ) ;
261288
262- it ( 'should resolve parameterized routes for SSG and not add a fallback route if fallback is None ' , async ( ) => {
289+ it ( 'should resolve parameterized routes for SSG add a fallback route if fallback is Server ' , async ( ) => {
263290 setAngularAppTestingManifest (
264291 [
265292 { path : 'home' , component : DummyComponent } ,
@@ -296,6 +323,44 @@ describe('extractRoutesAndCreateRouteTree', () => {
296323 ] ) ;
297324 } ) ;
298325
326+ it ( 'should resolve catch all routes for SSG and not add a fallback route if fallback is Server' , async ( ) => {
327+ setAngularAppTestingManifest (
328+ [
329+ { path : 'home' , component : DummyComponent } ,
330+ { path : 'user/**' , component : DummyComponent } ,
331+ ] ,
332+ [
333+ {
334+ path : 'user/**' ,
335+ renderMode : RenderMode . Prerender ,
336+ fallback : PrerenderFallback . Server ,
337+ async getPrerenderParams ( ) {
338+ return [
339+ [ 'joe' , 'role' , 'admin' ] ,
340+ [ 'jane' , 'role' , 'writer' ] ,
341+ ] ;
342+ } ,
343+ } ,
344+ { path : '**' , renderMode : RenderMode . Server } ,
345+ ] ,
346+ ) ;
347+
348+ const { routeTree, errors } = await extractRoutesAndCreateRouteTree ( {
349+ url,
350+ invokeGetPrerenderParams : true ,
351+ } ) ;
352+ expect ( errors ) . toHaveSize ( 0 ) ;
353+ expect ( routeTree . toObject ( ) ) . toEqual ( [
354+ { route : '/home' , renderMode : RenderMode . Server } ,
355+ { route : '/user/joe/role/admin' , renderMode : RenderMode . Prerender } ,
356+ {
357+ route : '/user/jane/role/writer' ,
358+ renderMode : RenderMode . Prerender ,
359+ } ,
360+ { route : '/user/**' , renderMode : RenderMode . Server } ,
361+ ] ) ;
362+ } ) ;
363+
299364 it ( 'should extract nested redirects that are not explicitly defined.' , async ( ) => {
300365 setAngularAppTestingManifest (
301366 [
0 commit comments