Skip to content

Commit d65de74

Browse files
authored
feat: typed definePage params.path (#2716)
1 parent db3a6b3 commit d65de74

11 files changed

Lines changed: 491 additions & 138 deletions

File tree

packages/playground-file-based/src/pages/u[name].vue

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,17 @@
1-
<script lang="ts" setup></script>
1+
<script lang="ts" setup>
2+
import { useRoute } from 'vue-router'
3+
4+
definePage({
5+
params: {
6+
path: {
7+
name: 'date',
8+
},
9+
},
10+
})
11+
12+
const route = useRoute()
13+
route.params.name
14+
</script>
215

316
<template>
417
<h1>Named param</h1>

packages/playground-file-based/src/pages/u[name]/24.vue

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,17 @@
1-
<script lang="ts" setup></script>
1+
<script lang="ts" setup>
2+
import { useRoute } from 'vue-router'
3+
4+
definePage({
5+
params: {
6+
path: {
7+
// name: 'date',
8+
},
9+
},
10+
})
11+
12+
const route = useRoute()
13+
route.params.name
14+
</script>
215

316
<template>
417
<h2>Nested [name] page</h2>

packages/playground-file-based/src/routes.d.ts

Lines changed: 91 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ declare module 'vue-router' {
3636
| 'semver'
3737
| 'version-range'
3838
RouteNamedMap: import('vue-router/auto-routes').RouteNamedMap
39+
_RouteFileInfoMap: import('vue-router/auto-routes')._RouteFileInfoMap
3940
}
4041
}
4142

@@ -229,23 +230,23 @@ declare module 'vue-router/auto-routes' {
229230
'/u[name]': RouteRecordInfo<
230231
'/u[name]',
231232
'/u:name',
232-
{ name: string },
233-
{ name: string },
233+
{ name: Exclude<Param_date, unknown[] | null> },
234+
{ name: Exclude<Param_date, unknown[] | null> },
234235
| '/u[name]/24'
235236
| '/u[name]/[userId=int]'
236237
>,
237238
'/u[name]/[userId=int]': RouteRecordInfo<
238239
'/u[name]/[userId=int]',
239240
'/u:name/:userId',
240-
{ name: string, userId: number },
241-
{ name: string, userId: number },
241+
{ name: Exclude<Param_date, unknown[] | null>, userId: number },
242+
{ name: Exclude<Param_date, unknown[] | null>, userId: number },
242243
| never
243244
>,
244245
'/u[name]/24': RouteRecordInfo<
245246
'/u[name]/24',
246247
'/u:name/24',
247-
{ name: string },
248-
{ name: string },
248+
{ name: Exclude<Param_date, unknown[] | null> },
249+
{ name: Exclude<Param_date, unknown[] | null> },
249250
| never
250251
>,
251252
'/users/[userId=int]': RouteRecordInfo<
@@ -301,6 +302,8 @@ declare module 'vue-router/auto-routes' {
301302
| '/(home)'
302303
views:
303304
| never
305+
pathParamNames:
306+
| never
304307
}
305308
'src/pages/(packages)/_parent.vue': {
306309
routes:
@@ -310,163 +313,227 @@ declare module 'vue-router/auto-routes' {
310313
| '/(packages)/package/[[org=npm-org]]/[pkgName]/[pkgVersion=semver]'
311314
views:
312315
| 'default'
316+
pathParamNames:
317+
| never
313318
}
314319
'src/pages/(packages)/package/[[org=npm-org]]/[pkgName]/[pkgVersion=semver].vue': {
315320
routes:
316321
| '/(packages)/package/[[org=npm-org]]/[pkgName]/[pkgVersion=semver]'
317322
views:
318323
| never
324+
pathParamNames:
325+
| 'org'
326+
| 'pkgName'
327+
| 'pkgVersion'
319328
}
320329
'src/pages/(packages)/package-old/[[org]]/[pkgName]/[pkgVersion].vue': {
321330
routes:
322331
| '/(packages)/package-old/[[org]]/[pkgName]/[pkgVersion]'
323332
views:
324333
| never
334+
pathParamNames:
335+
| 'org'
336+
| 'pkgName'
337+
| 'pkgVersion'
325338
}
326339
'src/pages/(packages)/package-range/[[org=npm-org]]/[pkgName]/[pkgVersion=version-range].vue': {
327340
routes:
328341
| '/(packages)/package-range/[[org=npm-org]]/[pkgName]/[pkgVersion=version-range]'
329342
views:
330343
| never
344+
pathParamNames:
345+
| 'org'
346+
| 'pkgName'
347+
| 'pkgVersion'
331348
}
332349
'src/pages/(packages)/package-zod/[[org=npm-org]]/[pkgName]/[pkgVersion].vue': {
333350
routes:
334351
| '/(packages)/package-zod/[[org=npm-org]]/[pkgName]/[pkgVersion]'
335352
views:
336353
| never
354+
pathParamNames:
355+
| 'org'
356+
| 'pkgName'
357+
| 'pkgVersion'
337358
}
338359
'src/pages/[...path].vue': {
339360
routes:
340361
| 'not-found'
341362
views:
342363
| never
364+
pathParamNames:
365+
| 'path'
343366
}
344367
'src/pages/a.[b].c.[d].vue': {
345368
routes:
346369
| '/a.[b].c.[d]'
347370
views:
348371
| never
372+
pathParamNames:
373+
| 'b'
374+
| 'd'
349375
}
350376
'src/pages/about.vue': {
351377
routes:
352378
| '/about'
353379
views:
354380
| never
381+
pathParamNames:
382+
| never
355383
}
356384
'src/pages/b.vue': {
357385
routes:
358386
| '/b'
359387
views:
360388
| never
389+
pathParamNames:
390+
| never
361391
}
362392
'src/pages/blog/[slug]+.vue': {
363393
routes:
364394
| '/blog/[slug]+'
365395
views:
366396
| never
397+
pathParamNames:
398+
| 'slug'
367399
}
368400
'src/pages/blog/[[slugOptional]]+.vue': {
369401
routes:
370402
| '/blog/[[slugOptional]]+'
371403
views:
372404
| never
405+
pathParamNames:
406+
| 'slugOptional'
373407
}
374408
'src/pages/blog/info/(info).vue': {
375409
routes:
376410
| '/blog/info/(info)'
377411
views:
378412
| never
413+
pathParamNames:
414+
| never
379415
}
380416
'src/pages/blog/info/[[section]].vue': {
381417
routes:
382418
| '/blog/info/[[section]]'
383419
views:
384420
| never
421+
pathParamNames:
422+
| 'section'
385423
}
386424
'src/pages/emoji-🤡.vue': {
387425
routes:
388426
| '/emoji-🤡'
389427
views:
390428
| never
429+
pathParamNames:
430+
| never
391431
}
392432
'src/pages/events/[when=date].vue': {
393433
routes:
394434
| '/events/[when=date]'
395435
views:
396436
| never
437+
pathParamNames:
438+
| 'when'
397439
}
398440
'src/pages/events/repeat/[when=date]+.vue': {
399441
routes:
400442
| '/events/repeat/[when=date]+'
401443
views:
402444
| never
445+
pathParamNames:
446+
| 'when'
403447
}
404448
'src/pages/it\'s-fine/(lol).vue': {
405449
routes:
406450
| '/it\'s-fine/(lol)'
407451
views:
408452
| never
453+
pathParamNames:
454+
| never
409455
}
410456
'src/pages/months/valibot-[month=month-valibot].vue': {
411457
routes:
412458
| '/months/valibot-[month=month-valibot]'
413459
views:
414460
| never
461+
pathParamNames:
462+
| 'month'
415463
}
416464
'src/pages/months/zod-[month=month-zod].vue': {
417465
routes:
418466
| '/months/zod-[month=month-zod]'
419467
views:
420468
| never
469+
pathParamNames:
470+
| 'month'
421471
}
422472
'src/pages/multi.[a].[b].vue': {
423473
routes:
424474
| '/multi.[a].[b]'
425475
views:
426476
| never
477+
pathParamNames:
478+
| 'a'
479+
| 'b'
427480
}
428481
'src/pages/nested/_parent.vue': {
429482
routes:
430483
| '/nested/'
431484
| '/nested/other'
432485
views:
433486
| 'default'
487+
pathParamNames:
488+
| never
434489
}
435490
'src/pages/nested/index.vue': {
436491
routes:
437492
| '/nested/'
438493
views:
439494
| never
495+
pathParamNames:
496+
| never
440497
}
441498
'src/pages/nested/other.vue': {
442499
routes:
443500
| '/nested/other'
444501
views:
445502
| never
503+
pathParamNames:
504+
| never
446505
}
447506
'src/pages/opt.[[num=int]].vue': {
448507
routes:
449508
| '/opt.[[num=int]]'
450509
views:
451510
| never
511+
pathParamNames:
512+
| 'num'
452513
}
453514
'src/pages/tests/[[optional]]/end.vue': {
454515
routes:
455516
| '/tests/[[optional]]/end'
456517
views:
457518
| never
519+
pathParamNames:
520+
| 'optional'
458521
}
459522
'src/pages/tests/users/[username]/(user-home)/(user-home).vue': {
460523
routes:
461524
| '/tests/users/[username]/(user-home)/(user-home)'
462525
views:
463526
| never
527+
pathParamNames:
528+
| 'username'
464529
}
465530
'src/pages/tests/users/[username]/(user)/profile.vue': {
466531
routes:
467532
| '/tests/users/[username]/(user)/profile'
468533
views:
469534
| never
535+
pathParamNames:
536+
| 'username'
470537
}
471538
'src/pages/u[name].vue': {
472539
routes:
@@ -475,48 +542,66 @@ declare module 'vue-router/auto-routes' {
475542
| '/u[name]/[userId=int]'
476543
views:
477544
| 'default'
545+
pathParamNames:
546+
| 'name'
478547
}
479548
'src/pages/u[name]/[userId=int].vue': {
480549
routes:
481550
| '/u[name]/[userId=int]'
482551
views:
483552
| never
553+
pathParamNames:
554+
| 'name'
555+
| 'userId'
484556
}
485557
'src/pages/u[name]/24.vue': {
486558
routes:
487559
| '/u[name]/24'
488560
views:
489561
| never
562+
pathParamNames:
563+
| 'name'
490564
}
491565
'src/pages/users/[userId=int].vue': {
492566
routes:
493567
| '/users/[userId=int]'
494568
views:
495569
| never
570+
pathParamNames:
571+
| 'userId'
496572
}
497573
'src/pages/users/sub-[first]-[second].vue': {
498574
routes:
499575
| '/users/sub-[first]-[second]'
500576
views:
501577
| never
578+
pathParamNames:
579+
| 'first'
580+
| 'second'
502581
}
503582
'src/pages/with-layout/(home).vue': {
504583
routes:
505584
| '/with-layout/(home)'
506585
views:
507586
| never
587+
pathParamNames:
588+
| never
508589
}
509590
'src/pages/with-layout/+layout.vue': {
510591
routes:
511592
| '/with-layout/+layout'
512593
views:
513594
| never
595+
pathParamNames:
596+
| never
514597
}
515598
'src/pages/with-layout/other.vue': {
516599
routes:
517600
| '/with-layout/other'
518601
views:
519602
| never
603+
pathParamNames:
604+
| never
520605
}
521606
}
522607

packages/router/src/experimental/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ export {
6262
type ParamParserType,
6363
type ParamParserType_Native,
6464
type DefinePageQueryParamOptions,
65+
type PathParamNamesForFilePath as _PathParamNamesForFilePath,
6566
} from './runtime'
6667

6768
// Data loaders exports

0 commit comments

Comments
 (0)