| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118 | 'use strict';var has = Object.prototype.hasOwnProperty  , undef;/** * Decode a URI encoded string. * * @param {String} input The URI encoded string. * @returns {String|Null} The decoded string. * @api private */function decode(input) {  try {    return decodeURIComponent(input.replace(/\+/g, ' '));  } catch (e) {    return null;  }}/** * Attempts to encode a given input. * * @param {String} input The string that needs to be encoded. * @returns {String|Null} The encoded string. * @api private */function encode(input) {  try {    return encodeURIComponent(input);  } catch (e) {    return null;  }}/** * Simple query string parser. * * @param {String} query The query string that needs to be parsed. * @returns {Object} * @api public */function querystring(query) {  var parser = /([^=?#&]+)=?([^&]*)/g    , result = {}    , part;  while (part = parser.exec(query)) {    var key = decode(part[1])      , value = decode(part[2]);    //    // Prevent overriding of existing properties. This ensures that build-in    // methods like `toString` or __proto__ are not overriden by malicious    // querystrings.    //    // In the case if failed decoding, we want to omit the key/value pairs    // from the result.    //    if (key === null || value === null || key in result) continue;    result[key] = value;  }  return result;}/** * Transform a query string to an object. * * @param {Object} obj Object that should be transformed. * @param {String} prefix Optional prefix. * @returns {String} * @api public */function querystringify(obj, prefix) {  prefix = prefix || '';  var pairs = []    , value    , key;  //  // Optionally prefix with a '?' if needed  //  if ('string' !== typeof prefix) prefix = '?';  for (key in obj) {    if (has.call(obj, key)) {      value = obj[key];      //      // Edge cases where we actually want to encode the value to an empty      // string instead of the stringified value.      //      if (!value && (value === null || value === undef || isNaN(value))) {        value = '';      }      key = encode(key);      value = encode(value);      //      // If we failed to encode the strings, we should bail out as we don't      // want to add invalid strings to the query.      //      if (key === null || value === null) continue;      pairs.push(key +'='+ value);    }  }  return pairs.length ? prefix + pairs.join('&') : '';}//// Expose the module.//exports.stringify = querystringify;exports.parse = querystring;
 |