@@ -285,6 +285,7 @@ export default class ApiRequest extends LitElement {
285
285
// let exampleList = [];
286
286
let paramStyle = 'form' ;
287
287
let paramExplode = true ;
288
+ let paramAllowReserved = false ;
288
289
if ( paramType === 'query' ) {
289
290
if ( param . style && 'form spaceDelimited pipeDelimited' . includes ( param . style ) ) {
290
291
paramStyle = param . style ;
@@ -294,6 +295,9 @@ export default class ApiRequest extends LitElement {
294
295
if ( typeof param . explode === 'boolean' ) {
295
296
paramExplode = param . explode ;
296
297
}
298
+ if ( typeof param . allowReserved === 'boolean' ) {
299
+ paramAllowReserved = param . allowReserved ;
300
+ }
297
301
}
298
302
299
303
// openapi 3.1.0 spec based examples (which must be Object(string : { value:any, summary?: string, description?: string})
@@ -345,6 +349,7 @@ export default class ApiRequest extends LitElement {
345
349
data-example = "${ Array . isArray ( example . exampleVal ) ? example . exampleVal . join ( '~|~' ) : example . exampleVal } "
346
350
data-param-serialize-style = "${ paramStyle } "
347
351
data-param-serialize-explode = "${ paramExplode } "
352
+ data-param-allow-reserved = "${ paramAllowReserved } "
348
353
data-array = "true "
349
354
placeholder = "add-multiple ↩ "
350
355
.value = "${ Array . isArray ( example . exampleVal ) ? example . exampleVal : example . exampleVal } "
@@ -373,6 +378,7 @@ export default class ApiRequest extends LitElement {
373
378
data-example = "${ example . exampleVal } "
374
379
data-param-serialize-style = "${ paramStyle } "
375
380
data-param-serialize-explode = "${ paramExplode } "
381
+ data-param-allow-reserved = "${ paramAllowReserved } "
376
382
spellcheck = "false "
377
383
.textContent = "${ this . fillRequestFieldsWithExample === 'true' ? example . exampleVal : '' } "
378
384
style = "resize:vertical; width:100%; height: ${ 'read focused' . includes ( this . renderStyle ) ? '180px' : '120px' } ; "
@@ -400,6 +406,7 @@ export default class ApiRequest extends LitElement {
400
406
data-ptype ="${ paramType } "
401
407
data-pname ="${ param . name } "
402
408
data-example ="${ Array . isArray ( example . exampleVal ) ? example . exampleVal . join ( '~|~' ) : example . exampleVal } "
409
+ data-param-allow-reserved = "${ paramAllowReserved } "
403
410
data-array ="false "
404
411
.value ="${ live ( this . fillRequestFieldsWithExample === 'true' ? example . exampleVal : '' ) } "
405
412
/> `
@@ -1062,12 +1069,17 @@ export default class ApiRequest extends LitElement {
1062
1069
} ) ;
1063
1070
1064
1071
// Query Params
1065
- const urlQueryParam = new URLSearchParams ( ) ;
1072
+ const urlQueryParamsMap = new Map ( ) ;
1073
+ const queryParamsWithReservedCharsAllowed = [ ] ;
1066
1074
if ( queryParamEls . length > 0 ) {
1067
1075
queryParamEls . forEach ( ( el ) => {
1076
+ const queryParam = new URLSearchParams ( ) ;
1077
+ if ( el . dataset . paramAllowReserved === 'true' ) {
1078
+ queryParamsWithReservedCharsAllowed . push ( el . dataset . pname ) ;
1079
+ }
1068
1080
if ( el . dataset . array === 'false' ) {
1069
1081
if ( el . value !== '' ) {
1070
- urlQueryParam . append ( el . dataset . pname , el . value ) ;
1082
+ queryParam . append ( el . dataset . pname , el . value ) ;
1071
1083
}
1072
1084
} else {
1073
1085
const paramSerializeStyle = el . dataset . paramSerializeStyle ;
@@ -1076,64 +1088,88 @@ export default class ApiRequest extends LitElement {
1076
1088
vals = Array . isArray ( vals ) ? vals . filter ( ( v ) => v !== '' ) : [ ] ;
1077
1089
if ( vals . length > 0 ) {
1078
1090
if ( paramSerializeStyle === 'spaceDelimited' ) {
1079
- urlQueryParam . append ( el . dataset . pname , vals . join ( ' ' ) . replace ( / ^ \s | \s $ / g, '' ) ) ;
1091
+ queryParam . append ( el . dataset . pname , vals . join ( ' ' ) . replace ( / ^ \s | \s $ / g, '' ) ) ;
1080
1092
} else if ( paramSerializeStyle === 'pipeDelimited' ) {
1081
- urlQueryParam . append ( el . dataset . pname , vals . join ( '|' ) . replace ( / ^ \| | \| $ / g, '' ) ) ;
1093
+ queryParam . append ( el . dataset . pname , vals . join ( '|' ) . replace ( / ^ \| | \| $ / g, '' ) ) ;
1082
1094
} else {
1083
1095
if ( paramSerializeExplode === 'true' ) { // eslint-disable-line no-lonely-if
1084
- vals . forEach ( ( v ) => { urlQueryParam . append ( el . dataset . pname , v ) ; } ) ;
1096
+ vals . forEach ( ( v ) => { queryParam . append ( el . dataset . pname , v ) ; } ) ;
1085
1097
} else {
1086
- urlQueryParam . append ( el . dataset . pname , vals . join ( ',' ) . replace ( / ^ , | , $ / g, '' ) ) ;
1098
+ queryParam . append ( el . dataset . pname , vals . join ( ',' ) . replace ( / ^ , | , $ / g, '' ) ) ;
1087
1099
}
1088
1100
}
1089
1101
}
1090
1102
}
1103
+ if ( queryParam . toString ( ) ) {
1104
+ urlQueryParamsMap . set ( el . dataset . pname , queryParam ) ;
1105
+ }
1091
1106
} ) ;
1092
1107
}
1093
1108
1094
1109
// Query Params (Dynamic - create from JSON)
1095
1110
if ( queryParamObjTypeEls . length > 0 ) {
1096
1111
queryParamObjTypeEls . map ( ( el ) => {
1112
+ const queryParam = new URLSearchParams ( ) ;
1097
1113
try {
1098
1114
let queryParamObj = { } ;
1099
1115
const paramSerializeStyle = el . dataset . paramSerializeStyle ;
1100
1116
const paramSerializeExplode = el . dataset . paramSerializeExplode ;
1101
1117
queryParamObj = Object . assign ( queryParamObj , JSON . parse ( el . value . replace ( / \s + / g, ' ' ) ) ) ;
1118
+ if ( el . dataset . paramAllowReserved === 'true' ) {
1119
+ queryParamsWithReservedCharsAllowed . push ( el . dataset . pname ) ;
1120
+ }
1102
1121
if ( 'json xml' . includes ( paramSerializeStyle ) ) {
1103
1122
if ( paramSerializeStyle === 'json' ) {
1104
- urlQueryParam . append ( el . dataset . pname , JSON . stringify ( queryParamObj ) ) ;
1123
+ queryParam . append ( el . dataset . pname , JSON . stringify ( queryParamObj ) ) ;
1105
1124
} else if ( paramSerializeStyle === 'xml' ) {
1106
- urlQueryParam . append ( el . dataset . pname , json2xml ( queryParamObj ) ) ;
1125
+ queryParam . append ( el . dataset . pname , json2xml ( queryParamObj ) ) ;
1107
1126
}
1108
1127
} else {
1109
1128
for ( const key in queryParamObj ) {
1110
1129
if ( typeof queryParamObj [ key ] === 'object' ) {
1111
1130
if ( Array . isArray ( queryParamObj [ key ] ) ) {
1112
1131
if ( paramSerializeStyle === 'spaceDelimited' ) {
1113
- urlQueryParam . append ( key , queryParamObj [ key ] . join ( ' ' ) ) ;
1132
+ queryParam . append ( key , queryParamObj [ key ] . join ( ' ' ) ) ;
1114
1133
} else if ( paramSerializeStyle === 'pipeDelimited' ) {
1115
- urlQueryParam . append ( key , queryParamObj [ key ] . join ( '|' ) ) ;
1134
+ queryParam . append ( key , queryParamObj [ key ] . join ( '|' ) ) ;
1116
1135
} else {
1117
1136
if ( paramSerializeExplode === 'true' ) { // eslint-disable-line no-lonely-if
1118
1137
queryParamObj [ key ] . forEach ( ( v ) => {
1119
- urlQueryParam . append ( key , v ) ;
1138
+ queryParam . append ( key , v ) ;
1120
1139
} ) ;
1121
1140
} else {
1122
- urlQueryParam . append ( key , queryParamObj [ key ] ) ;
1141
+ queryParam . append ( key , queryParamObj [ key ] ) ;
1123
1142
}
1124
1143
}
1125
1144
}
1126
1145
} else {
1127
- urlQueryParam . append ( key , queryParamObj [ key ] ) ;
1146
+ queryParam . append ( key , queryParamObj [ key ] ) ;
1128
1147
}
1129
1148
}
1130
1149
}
1131
1150
} catch ( err ) {
1132
1151
console . log ( 'RapiDoc: unable to parse %s into object' , el . value ) ; // eslint-disable-line no-console
1133
1152
}
1153
+ if ( queryParam . toString ( ) ) {
1154
+ urlQueryParamsMap . set ( el . dataset . pname , queryParam ) ;
1155
+ }
1156
+ } ) ;
1157
+ }
1158
+ let urlQueryParamString = '' ;
1159
+ if ( urlQueryParamsMap . size ) {
1160
+ urlQueryParamString = '?' ;
1161
+ urlQueryParamsMap . forEach ( ( val , pname ) => {
1162
+ if ( queryParamsWithReservedCharsAllowed . includes ( pname ) ) {
1163
+ urlQueryParamString += `${ pname } =` ;
1164
+ urlQueryParamString += val . getAll ( pname ) . join ( `&${ pname } =` ) ;
1165
+ urlQueryParamString += '&' ;
1166
+ } else {
1167
+ urlQueryParamString += `${ val . toString ( ) } &` ;
1168
+ }
1134
1169
} ) ;
1170
+ urlQueryParamString = urlQueryParamString . slice ( 0 , - 1 ) ;
1135
1171
}
1136
- fetchUrl = `${ fetchUrl } ${ urlQueryParam . toString ( ) ? '?' : '' } ${ urlQueryParam . toString ( ) } ` ;
1172
+ fetchUrl = `${ fetchUrl } ${ urlQueryParamString } ` ;
1137
1173
1138
1174
// Add authentication Query-Param if provided
1139
1175
this . api_keys
0 commit comments