Skip to content

Commit ef45922

Browse files
committed
Merge branch 'actinium15-issue/631'
2 parents 91f92f7 + 3e512a4 commit ef45922

File tree

1 file changed

+50
-14
lines changed

1 file changed

+50
-14
lines changed

src/components/api-request.js

Lines changed: 50 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -285,6 +285,7 @@ export default class ApiRequest extends LitElement {
285285
// let exampleList = [];
286286
let paramStyle = 'form';
287287
let paramExplode = true;
288+
let paramAllowReserved = false;
288289
if (paramType === 'query') {
289290
if (param.style && 'form spaceDelimited pipeDelimited'.includes(param.style)) {
290291
paramStyle = param.style;
@@ -294,6 +295,9 @@ export default class ApiRequest extends LitElement {
294295
if (typeof param.explode === 'boolean') {
295296
paramExplode = param.explode;
296297
}
298+
if (typeof param.allowReserved === 'boolean') {
299+
paramAllowReserved = param.allowReserved;
300+
}
297301
}
298302

299303
// 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 {
345349
data-example = "${Array.isArray(example.exampleVal) ? example.exampleVal.join('~|~') : example.exampleVal}"
346350
data-param-serialize-style = "${paramStyle}"
347351
data-param-serialize-explode = "${paramExplode}"
352+
data-param-allow-reserved = "${paramAllowReserved}"
348353
data-array = "true"
349354
placeholder = "add-multiple ↩"
350355
.value = "${Array.isArray(example.exampleVal) ? example.exampleVal : example.exampleVal}"
@@ -373,6 +378,7 @@ export default class ApiRequest extends LitElement {
373378
data-example = "${example.exampleVal}"
374379
data-param-serialize-style = "${paramStyle}"
375380
data-param-serialize-explode = "${paramExplode}"
381+
data-param-allow-reserved = "${paramAllowReserved}"
376382
spellcheck = "false"
377383
.textContent = "${this.fillRequestFieldsWithExample === 'true' ? example.exampleVal : ''}"
378384
style = "resize:vertical; width:100%; height: ${'read focused'.includes(this.renderStyle) ? '180px' : '120px'};"
@@ -400,6 +406,7 @@ export default class ApiRequest extends LitElement {
400406
data-ptype="${paramType}"
401407
data-pname="${param.name}"
402408
data-example="${Array.isArray(example.exampleVal) ? example.exampleVal.join('~|~') : example.exampleVal}"
409+
data-param-allow-reserved = "${paramAllowReserved}"
403410
data-array="false"
404411
.value="${live(this.fillRequestFieldsWithExample === 'true' ? example.exampleVal : '')}"
405412
/>`
@@ -1062,12 +1069,17 @@ export default class ApiRequest extends LitElement {
10621069
});
10631070

10641071
// Query Params
1065-
const urlQueryParam = new URLSearchParams();
1072+
const urlQueryParamsMap = new Map();
1073+
const queryParamsWithReservedCharsAllowed = [];
10661074
if (queryParamEls.length > 0) {
10671075
queryParamEls.forEach((el) => {
1076+
const queryParam = new URLSearchParams();
1077+
if (el.dataset.paramAllowReserved === 'true') {
1078+
queryParamsWithReservedCharsAllowed.push(el.dataset.pname);
1079+
}
10681080
if (el.dataset.array === 'false') {
10691081
if (el.value !== '') {
1070-
urlQueryParam.append(el.dataset.pname, el.value);
1082+
queryParam.append(el.dataset.pname, el.value);
10711083
}
10721084
} else {
10731085
const paramSerializeStyle = el.dataset.paramSerializeStyle;
@@ -1076,64 +1088,88 @@ export default class ApiRequest extends LitElement {
10761088
vals = Array.isArray(vals) ? vals.filter((v) => v !== '') : [];
10771089
if (vals.length > 0) {
10781090
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, ''));
10801092
} else if (paramSerializeStyle === 'pipeDelimited') {
1081-
urlQueryParam.append(el.dataset.pname, vals.join('|').replace(/^\||\|$/g, ''));
1093+
queryParam.append(el.dataset.pname, vals.join('|').replace(/^\||\|$/g, ''));
10821094
} else {
10831095
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); });
10851097
} else {
1086-
urlQueryParam.append(el.dataset.pname, vals.join(',').replace(/^,|,$/g, ''));
1098+
queryParam.append(el.dataset.pname, vals.join(',').replace(/^,|,$/g, ''));
10871099
}
10881100
}
10891101
}
10901102
}
1103+
if (queryParam.toString()) {
1104+
urlQueryParamsMap.set(el.dataset.pname, queryParam);
1105+
}
10911106
});
10921107
}
10931108

10941109
// Query Params (Dynamic - create from JSON)
10951110
if (queryParamObjTypeEls.length > 0) {
10961111
queryParamObjTypeEls.map((el) => {
1112+
const queryParam = new URLSearchParams();
10971113
try {
10981114
let queryParamObj = {};
10991115
const paramSerializeStyle = el.dataset.paramSerializeStyle;
11001116
const paramSerializeExplode = el.dataset.paramSerializeExplode;
11011117
queryParamObj = Object.assign(queryParamObj, JSON.parse(el.value.replace(/\s+/g, ' ')));
1118+
if (el.dataset.paramAllowReserved === 'true') {
1119+
queryParamsWithReservedCharsAllowed.push(el.dataset.pname);
1120+
}
11021121
if ('json xml'.includes(paramSerializeStyle)) {
11031122
if (paramSerializeStyle === 'json') {
1104-
urlQueryParam.append(el.dataset.pname, JSON.stringify(queryParamObj));
1123+
queryParam.append(el.dataset.pname, JSON.stringify(queryParamObj));
11051124
} else if (paramSerializeStyle === 'xml') {
1106-
urlQueryParam.append(el.dataset.pname, json2xml(queryParamObj));
1125+
queryParam.append(el.dataset.pname, json2xml(queryParamObj));
11071126
}
11081127
} else {
11091128
for (const key in queryParamObj) {
11101129
if (typeof queryParamObj[key] === 'object') {
11111130
if (Array.isArray(queryParamObj[key])) {
11121131
if (paramSerializeStyle === 'spaceDelimited') {
1113-
urlQueryParam.append(key, queryParamObj[key].join(' '));
1132+
queryParam.append(key, queryParamObj[key].join(' '));
11141133
} else if (paramSerializeStyle === 'pipeDelimited') {
1115-
urlQueryParam.append(key, queryParamObj[key].join('|'));
1134+
queryParam.append(key, queryParamObj[key].join('|'));
11161135
} else {
11171136
if (paramSerializeExplode === 'true') { // eslint-disable-line no-lonely-if
11181137
queryParamObj[key].forEach((v) => {
1119-
urlQueryParam.append(key, v);
1138+
queryParam.append(key, v);
11201139
});
11211140
} else {
1122-
urlQueryParam.append(key, queryParamObj[key]);
1141+
queryParam.append(key, queryParamObj[key]);
11231142
}
11241143
}
11251144
}
11261145
} else {
1127-
urlQueryParam.append(key, queryParamObj[key]);
1146+
queryParam.append(key, queryParamObj[key]);
11281147
}
11291148
}
11301149
}
11311150
} catch (err) {
11321151
console.log('RapiDoc: unable to parse %s into object', el.value); // eslint-disable-line no-console
11331152
}
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+
}
11341169
});
1170+
urlQueryParamString = urlQueryParamString.slice(0, -1);
11351171
}
1136-
fetchUrl = `${fetchUrl}${urlQueryParam.toString() ? '?' : ''}${urlQueryParam.toString()}`;
1172+
fetchUrl = `${fetchUrl}${urlQueryParamString}`;
11371173

11381174
// Add authentication Query-Param if provided
11391175
this.api_keys

0 commit comments

Comments
 (0)