UNPKG

locutus

Version:

Locutus other languages' standard libraries to JavaScript for fun and educational purposes

41 lines (40 loc) 1.5 kB
import { ParseQuery } from "./ParseQuery.js"; import { QueryEscape } from "./QueryEscape.js"; const normalizeValues = (input) => { const out = {}; for (const key of Object.keys(input)) { const raw = input[key]; if (Array.isArray(raw)) { out[key] = raw.map((value) => String(value)); continue; } out[key] = [String(raw)]; } return out; }; export function EncodeQuery(values) { // discuss at: https://locutus.io/golang/url/EncodeQuery // parity verified: Go 1.23 // original by: Kevin van Zonneveld (https://kvz.io) // note 1: Encodes query values with deterministic key ordering, mirroring Go's url.Values.Encode. // example 1: EncodeQuery('b=2&b=3&a=1') // returns 1: 'a=1&b=2&b=3' // example 2: EncodeQuery('z=last&a=first') // returns 2: 'a=first&z=last' // example 3: EncodeQuery('flag&empty=') // returns 3: 'empty=&flag=' const parsed = typeof values === 'string' ? ParseQuery(values) : normalizeValues(values); const pairs = []; const keys = Object.keys(parsed).sort(); for (const key of keys) { const entries = parsed[key] ?? []; if (entries.length === 0) { pairs.push(`${QueryEscape(key)}=`); continue; } for (const value of entries) { pairs.push(`${QueryEscape(key)}=${QueryEscape(value)}`); } } return pairs.join('&'); }