1- import { isPresent , isBlank , StringWrapper } from 'angular2/src/facade/lang' ;
1+ import { CONST_EXPR , isPresent , isBlank , StringWrapper } from 'angular2/src/facade/lang' ;
22import {
33 Map ,
44 MapWrapper ,
@@ -7,28 +7,42 @@ import {
77 isListLikeIterable
88} from 'angular2/src/facade/collection' ;
99
10- function paramParser ( rawParams : string ) : Map < string , List < string > > {
10+ function paramParser ( rawParams : string = '' ) : Map < string , List < string > > {
1111 var map : Map < string , List < string > > = new Map ( ) ;
12- var params : List < string > = StringWrapper . split ( rawParams , new RegExp ( '&' ) ) ;
13- ListWrapper . forEach ( params , ( param : string ) => {
14- var split : List < string > = StringWrapper . split ( param , new RegExp ( '=' ) ) ;
15- var key = ListWrapper . get ( split , 0 ) ;
16- var val = ListWrapper . get ( split , 1 ) ;
17- var list = isPresent ( map . get ( key ) ) ? map . get ( key ) : [ ] ;
18- list . push ( val ) ;
19- map . set ( key , list ) ;
20- } ) ;
12+ if ( rawParams . length > 0 ) {
13+ var params : List < string > = StringWrapper . split ( rawParams , new RegExp ( '&' ) ) ;
14+ ListWrapper . forEach ( params , ( param : string ) => {
15+ var split : List < string > = StringWrapper . split ( param , new RegExp ( '=' ) ) ;
16+ var key = ListWrapper . get ( split , 0 ) ;
17+ var val = ListWrapper . get ( split , 1 ) ;
18+ var list = isPresent ( map . get ( key ) ) ? map . get ( key ) : [ ] ;
19+ list . push ( val ) ;
20+ map . set ( key , list ) ;
21+ } ) ;
22+ }
2123 return map ;
2224}
2325
26+ // TODO(caitp): This really should not be needed. Issue with ts2dart.
27+ export const URLSearchParamsUnionFixer : string = CONST_EXPR ( "UnionFixer" ) ;
28+
2429/**
2530 * Map-like representation of url search parameters, based on
26- * [URLSearchParams](https://url.spec.whatwg.org/#urlsearchparams) in the url living standard.
27- *
31+ * [URLSearchParams](https://url.spec.whatwg.org/#urlsearchparams) in the url living standard,
32+ * with several extensions for merging URLSearchParams objects:
33+ * - setAll()
34+ * - appendAll()
35+ * - replaceAll()
2836 */
2937export class URLSearchParams {
3038 paramsMap : Map < string , List < string > > ;
31- constructor ( public rawParams : string ) { this . paramsMap = paramParser ( rawParams ) ; }
39+ constructor ( public rawParams : string = '' ) { this . paramsMap = paramParser ( rawParams ) ; }
40+
41+ clone ( ) : URLSearchParams {
42+ var clone = new URLSearchParams ( ) ;
43+ clone . appendAll ( this ) ;
44+ return clone ;
45+ }
3246
3347 has ( param : string ) : boolean { return this . paramsMap . has ( param ) ; }
3448
@@ -46,13 +60,75 @@ export class URLSearchParams {
4660 return isPresent ( mapParam ) ? mapParam : [ ] ;
4761 }
4862
63+ set ( param : string , val : string ) {
64+ var mapParam = this . paramsMap . get ( param ) ;
65+ var list = isPresent ( mapParam ) ? mapParam : [ ] ;
66+ ListWrapper . clear ( list ) ;
67+ list . push ( val ) ;
68+ this . paramsMap . set ( param , list ) ;
69+ }
70+
71+ // A merge operation
72+ // For each name-values pair in `searchParams`, perform `set(name, values[0])`
73+ //
74+ // E.g: "a=[1,2,3], c=[8]" + "a=[4,5,6], b=[7]" = "a=[4], c=[8], b=[7]"
75+ //
76+ // TODO(@caitp): document this better
77+ setAll ( searchParams : URLSearchParams ) {
78+ MapWrapper . forEach ( searchParams . paramsMap , ( value , param ) => {
79+ var mapParam = this . paramsMap . get ( param ) ;
80+ var list = isPresent ( mapParam ) ? mapParam : [ ] ;
81+ ListWrapper . clear ( list ) ;
82+ list . push ( value [ 0 ] ) ;
83+ this . paramsMap . set ( param , list ) ;
84+ } ) ;
85+ }
86+
4987 append ( param : string , val : string ) : void {
5088 var mapParam = this . paramsMap . get ( param ) ;
5189 var list = isPresent ( mapParam ) ? mapParam : [ ] ;
5290 list . push ( val ) ;
5391 this . paramsMap . set ( param , list ) ;
5492 }
5593
94+ // A merge operation
95+ // For each name-values pair in `searchParams`, perform `append(name, value)`
96+ // for each value in `values`.
97+ //
98+ // E.g: "a=[1,2], c=[8]" + "a=[3,4], b=[7]" = "a=[1,2,3,4], c=[8], b=[7]"
99+ //
100+ // TODO(@caitp): document this better
101+ appendAll ( searchParams : URLSearchParams ) {
102+ MapWrapper . forEach ( searchParams . paramsMap , ( value , param ) => {
103+ var mapParam = this . paramsMap . get ( param ) ;
104+ var list = isPresent ( mapParam ) ? mapParam : [ ] ;
105+ for ( var i = 0 ; i < value . length ; ++ i ) {
106+ list . push ( value [ i ] ) ;
107+ }
108+ this . paramsMap . set ( param , list ) ;
109+ } ) ;
110+ }
111+
112+
113+ // A merge operation
114+ // For each name-values pair in `searchParams`, perform `delete(name)`,
115+ // followed by `set(name, values)`
116+ //
117+ // E.g: "a=[1,2,3], c=[8]" + "a=[4,5,6], b=[7]" = "a=[4,5,6], c=[8], b=[7]"
118+ //
119+ // TODO(@caitp): document this better
120+ replaceAll ( searchParams : URLSearchParams ) {
121+ MapWrapper . forEach ( searchParams . paramsMap , ( value , param ) => {
122+ var mapParam = this . paramsMap . get ( param ) ;
123+ var list = isPresent ( mapParam ) ? mapParam : [ ] ;
124+ ListWrapper . clear ( list ) ;
125+ for ( var i = 0 ; i < value . length ; ++ i ) {
126+ list . push ( value [ i ] ) ;
127+ }
128+ this . paramsMap . set ( param , list ) ;
129+ } ) ;
130+ }
131+
56132 toString ( ) : string {
57133 var paramsList = [ ] ;
58134 MapWrapper . forEach ( this . paramsMap , ( values , k ) => {
0 commit comments