UNPKG

locutus

Version:

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

44 lines (43 loc) 1.7 kB
"use strict"; 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('&'); }