@@ -15,11 +15,12 @@ export interface QueryParamAddFunction {
1515}
1616
1717export interface Route {
18- tokens : string [ ] [ ] ;
19- defaults : RouteDefaults ;
20- requirements : RouteRequirements ;
21- hosttokens : string [ ] ;
18+ tokens : ( [ string , string ] | [ string , string , string ] | [ string , string , string , string ] | [ string , string , string , string , boolean ] ) [ ] ;
19+ defaults : undefined [ ] | RouteDefaults ;
20+ requirements : undefined [ ] | RouteRequirements ;
21+ hosttokens : string [ ] [ ] ;
2222 schemes : string [ ] ;
23+ methods : string [ ] ;
2324}
2425
2526export interface RoutesMap {
@@ -30,7 +31,7 @@ export interface Context {
3031 base_url : string ;
3132 prefix : string ;
3233 host : string ;
33- port : string ;
34+ port : string | null ;
3435 scheme : string ;
3536 locale : string ;
3637}
@@ -40,12 +41,14 @@ export interface RoutingData {
4041 routes : RoutesMap ;
4142 prefix ?: string ;
4243 host : string ;
43- scheme : string ;
44+ port ?: string | null ;
45+ scheme ?: string ;
46+ locale ?: string ;
4447}
4548
4649export class Router {
4750 private context_ : Context ;
48- private routes_ : RoutesMap ;
51+ private routes_ ! : RoutesMap ;
4952
5053 static getInstance ( ) : Router {
5154 return Routing ;
@@ -66,18 +69,21 @@ export class Router {
6669 this . setBaseUrl ( data [ 'base_url' ] ) ;
6770 this . setRoutes ( data [ 'routes' ] ) ;
6871
69- if ( ' prefix' in data ) {
72+ if ( typeof data . prefix !== 'undefined' ) {
7073 this . setPrefix ( data [ 'prefix' ] ) ;
7174 }
72- if ( ' port' in data ) {
75+ if ( typeof data . port !== 'undefined' ) {
7376 this . setPort ( data [ 'port' ] ) ;
7477 }
75- if ( ' locale' in data ) {
78+ if ( typeof data . locale !== 'undefined' ) {
7679 this . setLocale ( data [ 'locale' ] ) ;
7780 }
7881
7982 this . setHost ( data [ 'host' ] ) ;
80- this . setScheme ( data [ 'scheme' ] ) ;
83+
84+ if ( typeof data . scheme !== 'undefined' ) {
85+ this . setScheme ( data [ 'scheme' ] ) ;
86+ }
8187 }
8288
8389 setRoutes ( routes : RoutesMap ) : void {
@@ -116,11 +122,11 @@ export class Router {
116122 return this . context_ . host ;
117123 }
118124
119- setPort ( port : string ) {
125+ setPort ( port : string | null ) {
120126 this . context_ . port = port ;
121127 }
122128
123- getPort ( ) : string {
129+ getPort ( ) : string | null {
124130 return this . context_ . port ;
125131 } ;
126132
@@ -179,13 +185,13 @@ export class Router {
179185 * Generates the URL for a route.
180186 */
181187 generate ( name : string , opt_params ?: RouteParams , absolute ?: boolean ) : string {
182- let route = ( this . getRoute ( name ) ) ,
183- params = opt_params || { } ,
184- unusedParams = Object . assign ( { } , params ) ,
185- url = '' ,
186- optional = true ,
187- host = '' ,
188- port = ( typeof this . getPort ( ) == 'undefined' || this . getPort ( ) === null ) ? '' : this . getPort ( ) ;
188+ let route = ( this . getRoute ( name ) ) ;
189+ let params = opt_params || { } ;
190+ let unusedParams = Object . assign ( { } , params ) ;
191+ let url = '' ;
192+ let optional = true ;
193+ let host = '' ;
194+ let port = ( typeof this . getPort ( ) == 'undefined' || this . getPort ( ) === null ) ? '' : this . getPort ( ) ;
189195
190196 route . tokens . forEach ( ( token ) => {
191197 if ( 'text' === token [ 0 ] ) {
@@ -196,14 +202,14 @@ export class Router {
196202 }
197203
198204 if ( 'variable' === token [ 0 ] ) {
199- let hasDefault = route . defaults && ( token [ 3 ] in route . defaults ) ;
200- if ( false === optional || ! hasDefault || ( ( token [ 3 ] in params ) && params [ token [ 3 ] ] != route . defaults [ token [ 3 ] ] ) ) {
205+ let hasDefault = route . defaults && ! Array . isArray ( route . defaults ) && token [ 3 ] && ( token [ 3 ] in route . defaults ) ;
206+ if ( false === optional || ! hasDefault || ( ( token [ 3 ] && token [ 3 ] in params ) && ! Array . isArray ( route . defaults ) && params [ token [ 3 ] ] != route . defaults [ token [ 3 ] ] ) ) {
201207 let value ;
202208
203- if ( token [ 3 ] in params ) {
209+ if ( token [ 3 ] && token [ 3 ] in params ) {
204210 value = params [ token [ 3 ] ] ;
205211 delete unusedParams [ token [ 3 ] ] ;
206- } else if ( hasDefault ) {
212+ } else if ( token [ 3 ] && hasDefault && ! Array . isArray ( route . defaults ) ) {
207213 value = route . defaults [ token [ 3 ] ] ;
208214 } else if ( optional ) {
209215 return ;
@@ -224,7 +230,7 @@ export class Router {
224230 }
225231
226232 optional = false ;
227- } else if ( hasDefault && ( token [ 3 ] in unusedParams ) ) {
233+ } else if ( hasDefault && ( token [ 3 ] && token [ 3 ] in unusedParams ) ) {
228234 delete unusedParams [ token [ 3 ] ] ;
229235 }
230236
@@ -251,7 +257,7 @@ export class Router {
251257 if ( token [ 3 ] in params ) {
252258 value = params [ token [ 3 ] ] ;
253259 delete unusedParams [ token [ 3 ] ] ;
254- } else if ( route . defaults && ( token [ 3 ] in route . defaults ) ) {
260+ } else if ( route . defaults && ! Array . isArray ( route . defaults ) && ( token [ 3 ] in route . defaults ) ) {
255261 value = route . defaults [ token [ 3 ] ] ;
256262 }
257263
@@ -276,9 +282,8 @@ export class Router {
276282 }
277283
278284 if ( Object . keys ( unusedParams ) . length > 0 ) {
279- let prefix ;
280- let queryParams = [ ] ;
281- let add = ( key , value ) => {
285+ let queryParams : string [ ] = [ ] ;
286+ let add = ( key : string , value : string | ( ( ) => string ) ) => {
282287 // if value is a function then call it and assign it's return value as value
283288 value = ( typeof value === 'function' ) ? value ( ) : value ;
284289
@@ -288,8 +293,10 @@ export class Router {
288293 queryParams . push ( Router . encodeQueryComponent ( key ) + '=' + Router . encodeQueryComponent ( value ) ) ;
289294 } ;
290295
291- for ( prefix in unusedParams ) {
292- this . buildQueryParams ( prefix , unusedParams [ prefix ] , add ) ;
296+ for ( const prefix in unusedParams ) {
297+ if ( unusedParams . hasOwnProperty ( prefix ) ) {
298+ this . buildQueryParams ( prefix , unusedParams [ prefix ] , add ) ;
299+ }
293300 }
294301
295302 url = url + '?' + queryParams . join ( '&' ) ;
0 commit comments