var parse = function()

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;
  };