elysia
Version:
Ergonomic Framework for Human
74 lines (73 loc) • 3.8 kB
JavaScript
// src/parse-query.ts
import decode from "fast-decode-uri-component";
function parseQueryFromURL(input, startIndex = 0) {
let result = /* @__PURE__ */ Object.create(null), KEY_PLUS_FLAG = 1, KEY_DECODE_FLAG = 2, VALUE_PLUS_FLAG = 4, VALUE_DECODE_FLAG = 8, flags = 0, startingIndex = startIndex - 1, equalityIndex = startingIndex, inputLength = input.length;
for (let i = startIndex; i < inputLength; i++)
switch (input.charCodeAt(i)) {
// '&'
case 38:
processKeyValuePair(i), startingIndex = i, equalityIndex = i, flags = 0;
break;
// '='
case 61:
equalityIndex <= startingIndex ? equalityIndex = i : flags |= VALUE_DECODE_FLAG;
break;
// '+'
case 43:
equalityIndex > startingIndex ? flags |= VALUE_PLUS_FLAG : flags |= KEY_PLUS_FLAG;
break;
// '%'
case 37:
equalityIndex > startingIndex ? flags |= VALUE_DECODE_FLAG : flags |= KEY_DECODE_FLAG;
break;
}
return processKeyValuePair(inputLength), result;
function processKeyValuePair(endIndex) {
let hasBothKeyValuePair = equalityIndex > startingIndex, keyEndIndex = hasBothKeyValuePair ? equalityIndex : endIndex;
if (keyEndIndex <= startingIndex + 1) return;
let keySlice = input.slice(startingIndex + 1, keyEndIndex);
if (flags & KEY_PLUS_FLAG && (keySlice = keySlice.replace(/\+/g, " ")), flags & KEY_DECODE_FLAG && (keySlice = decode(keySlice) || keySlice), result[keySlice] !== void 0) return;
let finalValue = "";
hasBothKeyValuePair && (finalValue = input.slice(equalityIndex + 1, endIndex), flags & VALUE_PLUS_FLAG && (finalValue = finalValue.replace(/\+/g, " ")), flags & VALUE_DECODE_FLAG && (finalValue = decode(finalValue) || finalValue)), result[keySlice] = finalValue;
}
}
function parseQuery(input) {
let result = /* @__PURE__ */ Object.create(null), flags = 0, KEY_HAS_PLUS = 1, KEY_NEEDS_DECODE = 2, VALUE_HAS_PLUS = 4, VALUE_NEEDS_DECODE = 8, inputLength = input.length, startingIndex = -1, equalityIndex = -1;
for (let i = 0; i < inputLength; i++)
switch (input.charCodeAt(i)) {
// '&'
case 38:
processKeyValuePair(input, i), startingIndex = i, equalityIndex = i, flags = 0;
break;
// '='
case 61:
equalityIndex <= startingIndex ? equalityIndex = i : flags |= VALUE_NEEDS_DECODE;
break;
// '+'
case 43:
equalityIndex > startingIndex ? flags |= VALUE_HAS_PLUS : flags |= KEY_HAS_PLUS;
break;
// '%'
case 37:
equalityIndex > startingIndex ? flags |= VALUE_NEEDS_DECODE : flags |= KEY_NEEDS_DECODE;
break;
}
return startingIndex < inputLength && processKeyValuePair(input, inputLength), result;
function processKeyValuePair(input2, endIndex) {
let hasBothKeyValuePair = equalityIndex > startingIndex, effectiveEqualityIndex = hasBothKeyValuePair ? equalityIndex : endIndex, keySlice = input2.slice(startingIndex + 1, effectiveEqualityIndex);
if (!hasBothKeyValuePair && keySlice.length === 0) return;
let finalKey = keySlice;
flags & KEY_HAS_PLUS && (finalKey = finalKey.replace(/\+/g, " ")), flags & KEY_NEEDS_DECODE && (finalKey = decode(finalKey) || finalKey);
let finalValue = "";
if (hasBothKeyValuePair) {
let valueSlice = input2.slice(equalityIndex + 1, endIndex);
flags & VALUE_HAS_PLUS && (valueSlice = valueSlice.replace(/\+/g, " ")), flags & VALUE_NEEDS_DECODE && (valueSlice = decode(valueSlice) || valueSlice), finalValue = valueSlice;
}
let currentValue = result[finalKey];
currentValue === void 0 ? result[finalKey] = finalValue : Array.isArray(currentValue) ? currentValue.push(finalValue) : result[finalKey] = [currentValue, finalValue];
}
}
export {
parseQuery,
parseQueryFromURL
};