locutus
Version:
Locutus other languages' standard libraries to JavaScript for fun and educational purposes
44 lines (43 loc) • 1.7 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.EncodeQuery = EncodeQuery;
const ParseQuery_ts_1 = require("./ParseQuery.js");
const QueryEscape_ts_1 = require("./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;
};
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' ? (0, ParseQuery_ts_1.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(`${(0, QueryEscape_ts_1.QueryEscape)(key)}=`);
continue;
}
for (const value of entries) {
pairs.push(`${(0, QueryEscape_ts_1.QueryEscape)(key)}=${(0, QueryEscape_ts_1.QueryEscape)(value)}`);
}
}
return pairs.join('&');
}