UNPKG

ufiber

Version:

Next-gen webserver for node-js developer

54 lines (52 loc) 2.04 kB
import { tryDecode } from "./url.js"; //#region src/utils/query.ts /** Decode percent & '+' safely */ const _decodeURI = (value) => { if (!/[%+]/.test(value)) return value; if (value.indexOf("+") !== -1) value = value.replace(/\+/g, " "); return value.indexOf("%") !== -1 ? tryDecode(value, decodeURIComponent) : value; }; function getQuery(url, key, multiple) { let encoded; if (!multiple && key && !/[%+]/.test(key)) { let keyIndex$1 = url.indexOf("?", 8); if (keyIndex$1 === -1) return; if (!url.startsWith(key, keyIndex$1 + 1)) keyIndex$1 = url.indexOf(`&${key}`, keyIndex$1 + 1); while (keyIndex$1 !== -1) { const trailingKeyCode = url.charCodeAt(keyIndex$1 + key.length + 1); if (trailingKeyCode === 61) { const valueIndex = keyIndex$1 + key.length + 2; const endIndex = url.indexOf("&", valueIndex); return _decodeURI(url.slice(valueIndex, endIndex === -1 ? void 0 : endIndex)); } else if (trailingKeyCode == 38 || isNaN(trailingKeyCode)) return ""; keyIndex$1 = url.indexOf(`&${key}`, keyIndex$1 + 1); } encoded = /[%+]/.test(url); if (!encoded) return; } const results = {}; encoded ??= /[%+]/.test(url); let keyIndex = url.indexOf("?", 8); while (keyIndex !== -1) { const nextKeyIndex = url.indexOf("&", keyIndex + 1); let valueIndex = url.indexOf("=", keyIndex); if (valueIndex > nextKeyIndex && nextKeyIndex !== -1) valueIndex = -1; let name = url.slice(keyIndex + 1, valueIndex === -1 ? nextKeyIndex === -1 ? void 0 : nextKeyIndex : valueIndex); if (encoded) name = _decodeURI(name); keyIndex = nextKeyIndex; if (name === "") continue; let value; if (valueIndex === -1) value = ""; else { value = url.slice(valueIndex + 1, nextKeyIndex === -1 ? void 0 : nextKeyIndex); if (encoded) value = _decodeURI(value); } if (multiple) { if (!(results[name] && Array.isArray(results[name]))) results[name] = []; results[name].push(value); } else results[name] ??= value; } return key ? results[key] : results; } //#endregion export { getQuery };