in src/js/node/querystring.ts [203:332]
var parse = function (qs, sep, eq, options) {
const obj = new ParsedQueryString();
if (typeof qs !== "string" || qs.length === 0) {
return obj;
}
var sepCodes = !sep ? defSepCodes : charCodes(sep + "");
var eqCodes = !eq ? defEqCodes : charCodes(eq + "");
const sepLen = sepCodes.length;
const eqLen = eqCodes.length;
var pairs = 1000;
if (options && typeof options.maxKeys === "number") {
pairs = options.maxKeys > 0 ? options.maxKeys : -1;
}
var decode = QueryString.unescape;
if (options && typeof options.decodeURIComponent === "function") {
decode = options.decodeURIComponent;
}
const customDecode = decode !== qsUnescape;
const keys = [];
var posIdx = 0;
var lastPos = 0;
var sepIdx = 0;
var eqIdx = 0;
var key = "";
var value = "";
var keyEncoded = customDecode;
var valEncoded = customDecode;
var encodeCheck = 0;
for (var i2 = 0; i2 < qs.length; ++i2) {
const code = qs.charCodeAt(i2);
if (code === sepCodes[sepIdx]) {
if (++sepIdx === sepLen) {
const end = i2 - sepIdx + 1;
if (eqIdx < eqLen) {
if (lastPos < end) key += qs.slice(lastPos, end);
} else if (lastPos < end) value += qs.slice(lastPos, end);
if (keyEncoded) key = decodeStr(key, decode);
if (valEncoded) value = decodeStr(value, decode);
if (key || value || lastPos - posIdx > sepLen || i2 === 0) {
if (indexOf(keys, key) === -1) {
obj[key] = value;
keys[keys.length] = key;
} else {
const curValue = obj[key] || "";
if (curValue.pop) curValue[curValue.length] = value;
else if (curValue) obj[key] = [curValue, value];
}
} else if (i2 === 1) {
delete obj[key];
}
if (--pairs === 0) break;
keyEncoded = valEncoded = customDecode;
encodeCheck = 0;
key = value = "";
posIdx = lastPos;
lastPos = i2 + 1;
sepIdx = eqIdx = 0;
}
continue;
} else {
sepIdx = 0;
if (!valEncoded) {
if (code === 37) {
encodeCheck = 1;
} else if (
encodeCheck > 0 &&
((code >= 48 && code <= 57) || (code >= 65 && code <= 70) || (code >= 97 && code <= 102))
) {
if (++encodeCheck === 3) valEncoded = true;
} else {
encodeCheck = 0;
}
}
}
if (eqIdx < eqLen) {
if (code === eqCodes[eqIdx]) {
if (++eqIdx === eqLen) {
const end = i2 - eqIdx + 1;
if (lastPos < end) key += qs.slice(lastPos, end);
encodeCheck = 0;
lastPos = i2 + 1;
}
continue;
} else {
eqIdx = 0;
if (!keyEncoded) {
if (code === 37) {
encodeCheck = 1;
} else if (
encodeCheck > 0 &&
((code >= 48 && code <= 57) || (code >= 65 && code <= 70) || (code >= 97 && code <= 102))
) {
if (++encodeCheck === 3) keyEncoded = true;
} else {
encodeCheck = 0;
}
}
}
}
if (code === 43) {
if (eqIdx < eqLen) {
if (lastPos < i2) key += qs.slice(lastPos, i2);
key += "%20";
keyEncoded = true;
} else {
if (lastPos < i2) value += qs.slice(lastPos, i2);
value += "%20";
valEncoded = true;
}
lastPos = i2 + 1;
}
}
if (pairs !== 0 && (lastPos < qs.length || eqIdx > 0)) {
if (lastPos < qs.length) {
if (eqIdx < eqLen) key += qs.slice(lastPos);
else if (sepIdx < sepLen) value += qs.slice(lastPos);
}
if (keyEncoded) key = decodeStr(key, decode);
if (valEncoded) value = decodeStr(value, decode);
if (indexOf(keys, key) === -1) {
obj[key] = value;
keys[keys.length] = key;
} else {
const curValue = obj[key];
if (curValue.pop) curValue[curValue.length] = value;
else obj[key] = [curValue, value];
}
}
return obj;
};