@@ -55,6 +55,48 @@ describe('parse_route_id', () => {
5555 '/@-symbol/[id]' : {
5656 pattern : / ^ \/ @ - s y m b o l \/ ( [ ^ / ] + ?) \/ ? $ / ,
5757 params : [ { name : 'id' , matcher : undefined , optional : false , rest : false , chained : false } ]
58+ } ,
59+ '/blog/[page-slug]' : {
60+ pattern : / ^ \/ b l o g \/ ( [ ^ / ] + ?) \/ ? $ / ,
61+ params : [
62+ { name : 'page-slug' , matcher : undefined , optional : false , rest : false , chained : false }
63+ ]
64+ } ,
65+ '/blog/[page-slug=positive-integer]' : {
66+ pattern : / ^ \/ b l o g \/ ( [ ^ / ] + ?) \/ ? $ / ,
67+ params : [
68+ {
69+ name : 'page-slug' ,
70+ matcher : 'positive-integer' ,
71+ optional : false ,
72+ rest : false ,
73+ chained : false
74+ }
75+ ]
76+ } ,
77+ '/blog/[[page-slug=positive-integer]]/sub' : {
78+ pattern : / ^ \/ b l o g (?: \/ ( [ ^ / ] + ) ) ? \/ s u b \/ ? $ / ,
79+ params : [
80+ {
81+ name : 'page-slug' ,
82+ matcher : 'positive-integer' ,
83+ optional : true ,
84+ rest : false ,
85+ chained : true
86+ }
87+ ]
88+ } ,
89+ '/[...catch-all]' : {
90+ pattern : / ^ (?: \/ ( [ ^ ] * ) ) ? \/ ? $ / ,
91+ params : [
92+ { name : 'catch-all' , matcher : undefined , optional : false , rest : true , chained : true }
93+ ]
94+ } ,
95+ '/[...catch-all=some-matcher]' : {
96+ pattern : / ^ (?: \/ ( [ ^ ] * ) ) ? \/ ? $ / ,
97+ params : [
98+ { name : 'catch-all' , matcher : 'some-matcher' , optional : false , rest : true , chained : true }
99+ ]
58100 }
59101 } ;
60102
@@ -404,6 +446,21 @@ describe('resolve_route', () => {
404446 route : '/blog/[one]/[...two]-not-three/' ,
405447 params : { one : 'one' , two : 'two/2' } ,
406448 expected : '/blog/one/two/2-not-three/'
449+ } ,
450+ {
451+ route : '/blog/[page-slug]' ,
452+ params : { 'page-slug' : 'hello' } ,
453+ expected : '/blog/hello'
454+ } ,
455+ {
456+ route : '/blog/[page-slug=positive-integer]' ,
457+ params : { 'page-slug' : '42' } ,
458+ expected : '/blog/42'
459+ } ,
460+ {
461+ route : '/[...catch-all=some-matcher]' ,
462+ params : { 'catch-all' : 'a/b' } ,
463+ expected : '/a/b'
407464 }
408465 ] ;
409466
@@ -420,6 +477,12 @@ describe('resolve_route', () => {
420477 ) ;
421478 } ) ;
422479
480+ test ( 'resolvePath errors on missing params for required param with hyphenated name' , ( ) => {
481+ expect ( ( ) => resolve_route ( '/blog/[page-slug]' , { } ) ) . toThrow (
482+ "Missing parameter 'page-slug' in route /blog/[page-slug]"
483+ ) ;
484+ } ) ;
485+
423486 test ( 'resolvePath errors on params values starting or ending with slashes' , ( ) => {
424487 assert . throws (
425488 ( ) => resolve_route ( '/blog/[one]/[two]' , { one : 'one' , two : '/two' } ) ,
@@ -532,6 +595,22 @@ describe('find_route', () => {
532595 ) ;
533596 } ) ;
534597
598+ test ( 'respects matchers with hyphenated names' , ( ) => {
599+ const routes = [ create_route ( '/blog/[slug=positive-integer]' ) , create_route ( '/blog/[slug]' ) ] ;
600+ /** @type {import('@sveltejs/kit').ParamDefinition } */
601+ const positive_integer = ( param ) => ( / ^ \d + $ / . test ( param ) ? param : undefined ) ;
602+ const matchers = defineParams ( { 'positive-integer' : positive_integer } ) ;
603+
604+ // "42" matches the positive-integer matcher
605+ const result1 = find_route ( '/blog/42' , routes , matchers ) ;
606+ assert . equal ( result1 ?. route . id , '/blog/[slug=positive-integer]' ) ;
607+ assert . deepEqual ( result1 ?. params , { slug : '42' } ) ;
608+
609+ // "hello" doesn't match, falls through to [slug]
610+ const result2 = find_route ( '/blog/hello' , routes , matchers ) ;
611+ assert . equal ( result2 ?. route . id , '/blog/[slug]' ) ;
612+ } ) ;
613+
535614 test ( 'decodes params' , ( ) => {
536615 const routes = [ create_route ( '/blog/[slug]' ) ] ;
537616
0 commit comments