@@ -80,6 +80,7 @@ function parse (str) {
80
80
optional : optional ,
81
81
repeat : repeat ,
82
82
partial : partial ,
83
+ asterisk : ! ! asterisk ,
83
84
pattern : escapeGroup ( pattern )
84
85
} )
85
86
}
@@ -108,13 +109,25 @@ function compile (str) {
108
109
}
109
110
110
111
/**
111
- * Encode characters for segment that could cause trouble for parsing .
112
+ * Prettier encoding of URI path segments .
112
113
*
113
114
* @param {string }
114
115
* @return {string }
115
116
*/
116
117
function encodeURIComponentPretty ( str ) {
117
- return encodeURI ( str ) . replace ( / [ / ? # ' " ] / g, function ( c ) {
118
+ return encodeURI ( str ) . replace ( / [ \/ ? # ] / g, function ( c ) {
119
+ return '%' + c . charCodeAt ( 0 ) . toString ( 16 ) . toUpperCase ( )
120
+ } )
121
+ }
122
+
123
+ /**
124
+ * Encode the asterisk parameter. Similar to `pretty`, but allows slashes.
125
+ *
126
+ * @param {string }
127
+ * @return {string }
128
+ */
129
+ function encodeAsterisk ( str ) {
130
+ return encodeURI ( str ) . replace ( / [ ? # ] / g, function ( c ) {
118
131
return '%' + c . charCodeAt ( 0 ) . toString ( 16 ) . toUpperCase ( )
119
132
} )
120
133
}
@@ -166,7 +179,7 @@ function tokensToFunction (tokens) {
166
179
167
180
if ( isarray ( value ) ) {
168
181
if ( ! token . repeat ) {
169
- throw new TypeError ( 'Expected "' + token . name + '" to not repeat, but received " ' + value + '" ' )
182
+ throw new TypeError ( 'Expected "' + token . name + '" to not repeat, but received ` ' + JSON . stringify ( value ) + '` ' )
170
183
}
171
184
172
185
if ( value . length === 0 ) {
@@ -181,7 +194,7 @@ function tokensToFunction (tokens) {
181
194
segment = encode ( value [ j ] )
182
195
183
196
if ( ! matches [ i ] . test ( segment ) ) {
184
- throw new TypeError ( 'Expected all "' + token . name + '" to match "' + token . pattern + '", but received " ' + segment + '" ' )
197
+ throw new TypeError ( 'Expected all "' + token . name + '" to match "' + token . pattern + '", but received ` ' + JSON . stringify ( segment ) + '` ' )
185
198
}
186
199
187
200
path += ( j === 0 ? token . prefix : token . delimiter ) + segment
@@ -190,7 +203,7 @@ function tokensToFunction (tokens) {
190
203
continue
191
204
}
192
205
193
- segment = encode ( value )
206
+ segment = token . asterisk ? encodeAsterisk ( value ) : encode ( value )
194
207
195
208
if ( ! matches [ i ] . test ( segment ) ) {
196
209
throw new TypeError ( 'Expected "' + token . name + '" to match "' + token . pattern + '", but received "' + segment + '"' )
@@ -263,8 +276,9 @@ function regexpToRegexp (path, keys) {
263
276
prefix : null ,
264
277
delimiter : null ,
265
278
optional : false ,
266
- partial : false ,
267
279
repeat : false ,
280
+ partial : false ,
281
+ asterisk : false ,
268
282
pattern : null
269
283
} )
270
284
}
0 commit comments