@@ -13,6 +13,21 @@ describe('EXPERIMENTAL_generateRouteParams', () => {
1313 return tree . insert ( segment , `${ segment } .vue` )
1414 }
1515
16+ function makeParsersMap ( name : string , isRaw : boolean ) : ParamParsersMap {
17+ return new Map ( [
18+ [
19+ name ,
20+ {
21+ name,
22+ typeName : `Param_${ name } ` ,
23+ relativePath : `parsers/${ name } ` ,
24+ absolutePath : `/abs/parsers/${ name } ` ,
25+ isRaw,
26+ } ,
27+ ] ,
28+ ] )
29+ }
30+
1631 describe ( 'excludes null from custom parser types' , ( ) => {
1732 it ( 'required path param excludes null' , ( ) => {
1833 const node = createTreeWithParam ( '[version=semver]' )
@@ -74,21 +89,6 @@ describe('EXPERIMENTAL_generateRouteParams', () => {
7489 } )
7590
7691 describe ( 'raw param parsers' , ( ) => {
77- function makeParsersMap ( name : string , isRaw : boolean ) : ParamParsersMap {
78- return new Map ( [
79- [
80- name ,
81- {
82- name,
83- typeName : `Param_${ name } ` ,
84- relativePath : `parsers/${ name } ` ,
85- absolutePath : `/abs/parsers/${ name } ` ,
86- isRaw,
87- } ,
88- ] ,
89- ] )
90- }
91-
9292 it ( 'emits Param_X /* raw param parser */ for raw path params' , ( ) => {
9393 const node = createTreeWithParam ( '[id=raw]' )
9494 const result = EXPERIMENTAL_generateRouteParams (
@@ -154,4 +154,76 @@ describe('EXPERIMENTAL_generateRouteParams', () => {
154154 expect ( result ) . toBe ( '{ id: Exclude<Param_plain, unknown[] | null> }' )
155155 } )
156156 } )
157+
158+ describe ( 'raw query param parsers' , ( ) => {
159+ function createNodeWithQueryParam (
160+ paramName : string ,
161+ parserName : string
162+ ) : TreeNode {
163+ const tree = new PrefixTree ( RESOLVED_OPTIONS )
164+ const node = tree . insert ( 'b' , 'b.vue' )
165+ node . setCustomRouteBlock ( 'b.vue' , {
166+ params : {
167+ query : {
168+ [ paramName ] : { parser : parserName , format : 'value' } ,
169+ } ,
170+ } ,
171+ } )
172+ return node
173+ }
174+
175+ it ( 'omits | undefined on route.params for raw query parsers' , ( ) => {
176+ const node = createNodeWithQueryParam ( 'test' , 'set' )
177+ // route.params side (isRaw=false): runtime always calls the raw parser
178+ // with the array form, so the value never ends up undefined.
179+ const result = EXPERIMENTAL_generateRouteParams (
180+ node ,
181+ [ 'Param_set' ] ,
182+ false ,
183+ makeParsersMap ( 'set' , true )
184+ )
185+ expect ( result ) . toBe ( '{ test: Param_set /* raw param parser */ }' )
186+ } )
187+
188+ it ( 'adds explicit | undefined on router.push for raw query parsers' , ( ) => {
189+ const node = createNodeWithQueryParam ( 'test' , 'set' )
190+ // router.push side (isRaw=true): allow users to pass `undefined`
191+ // explicitly even under exactOptionalPropertyTypes.
192+ const result = EXPERIMENTAL_generateRouteParams (
193+ node ,
194+ [ 'Param_set' ] ,
195+ true ,
196+ makeParsersMap ( 'set' , true )
197+ )
198+ expect ( result ) . toBe (
199+ '{ test?: Param_set /* raw param parser */ | undefined }'
200+ )
201+ } )
202+
203+ it ( 'keeps | undefined on route.params for non-raw query parsers' , ( ) => {
204+ const node = createNodeWithQueryParam ( 'test' , 'plain' )
205+ const result = EXPERIMENTAL_generateRouteParams (
206+ node ,
207+ [ 'Param_plain' ] ,
208+ false ,
209+ makeParsersMap ( 'plain' , false )
210+ )
211+ expect ( result ) . toBe (
212+ '{ test: Exclude<Param_plain, unknown[] | null> | undefined }'
213+ )
214+ } )
215+
216+ it ( 'adds | undefined on router.push for non-raw query parsers' , ( ) => {
217+ const node = createNodeWithQueryParam ( 'test' , 'plain' )
218+ const result = EXPERIMENTAL_generateRouteParams (
219+ node ,
220+ [ 'Param_plain' ] ,
221+ true ,
222+ makeParsersMap ( 'plain' , false )
223+ )
224+ expect ( result ) . toBe (
225+ '{ test?: Exclude<Param_plain, unknown[] | null> | undefined }'
226+ )
227+ } )
228+ } )
157229} )
0 commit comments