'use strict'; var strictUriEncode = require('strict-uri-encode'); function encode(value, strict) { return strict ? strictUriEncode(value) : encodeURIComponent(value); } exports.extract = function (str) { return str.split('?')[1] || ''; }; exports.parse = function (str) { // Create an object with no prototype // https://github.com/sindresorhus/query-string/issues/47 var ret = Object.create(null); if (typeof str !== 'string') { return ret; } str = str.trim().replace(/^(\?|#|&)/, ''); if (!str) { return ret; } str.split('&').forEach(function (param) { var parts = param.replace(/\+/g, ' ').split('='); // Firefox (pre 40) decodes `%3D` to `=` // https://github.com/sindresorhus/query-string/pull/37 var key = parts.shift(); var val = parts.length > 0 ? parts.join('=') : undefined; key = decodeURIComponent(key); // missing `=` should be `null`: // http://w3.org/TR/2012/WD-url-20120524/#collect-url-parameters val = val === undefined ? null : decodeURIComponent(val); if (ret[key] === undefined) { ret[key] = val; } else if (Array.isArray(ret[key])) { ret[key].push(val); } else { ret[key] = [ret[key], val]; } }); return ret; }; exports.stringify = function (obj, opts) { opts = opts || {}; var strict = opts.strict !== false; return obj ? Object.keys(obj).sort().map(function (key) { var val = obj[key]; if (val === undefined) { return ''; } if (val === null) { return key; } if (Array.isArray(val)) { var result = []; val.slice().sort().forEach(function (val2) { if (val2 === undefined) { return; } if (val2 === null) { result.push(encode(key, strict)); } else { result.push(encode(key, strict) + '=' + encode(val2, strict)); } }); return result.join('&'); } return encode(key, strict) + '=' + encode(val, strict); }).filter(function (x) { return x.length > 0; }).join('&') : ''; };