locutus
Version:
Locutus other languages' standard libraries to JavaScript for fun and educational purposes
41 lines (40 loc) • 1.5 kB
JavaScript
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('&');
}