| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205 | 
							- 'use strict';
 
- var strictUriEncode = require('strict-uri-encode');
 
- var objectAssign = require('object-assign');
 
- function encoderForArrayFormat(opts) {
 
- 	switch (opts.arrayFormat) {
 
- 		case 'index':
 
- 			return function (key, value, index) {
 
- 				return value === null ? [
 
- 					encode(key, opts),
 
- 					'[',
 
- 					index,
 
- 					']'
 
- 				].join('') : [
 
- 					encode(key, opts),
 
- 					'[',
 
- 					encode(index, opts),
 
- 					']=',
 
- 					encode(value, opts)
 
- 				].join('');
 
- 			};
 
- 		case 'bracket':
 
- 			return function (key, value) {
 
- 				return value === null ? encode(key, opts) : [
 
- 					encode(key, opts),
 
- 					'[]=',
 
- 					encode(value, opts)
 
- 				].join('');
 
- 			};
 
- 		default:
 
- 			return function (key, value) {
 
- 				return value === null ? encode(key, opts) : [
 
- 					encode(key, opts),
 
- 					'=',
 
- 					encode(value, opts)
 
- 				].join('');
 
- 			};
 
- 	}
 
- }
 
- function parserForArrayFormat(opts) {
 
- 	var result;
 
- 	switch (opts.arrayFormat) {
 
- 		case 'index':
 
- 			return function (key, value, accumulator) {
 
- 				result = /\[(\d*)\]$/.exec(key);
 
- 				key = key.replace(/\[\d*\]$/, '');
 
- 				if (!result) {
 
- 					accumulator[key] = value;
 
- 					return;
 
- 				}
 
- 				if (accumulator[key] === undefined) {
 
- 					accumulator[key] = {};
 
- 				}
 
- 				accumulator[key][result[1]] = value;
 
- 			};
 
- 		case 'bracket':
 
- 			return function (key, value, accumulator) {
 
- 				result = /(\[\])$/.exec(key);
 
- 				key = key.replace(/\[\]$/, '');
 
- 				if (!result) {
 
- 					accumulator[key] = value;
 
- 					return;
 
- 				} else if (accumulator[key] === undefined) {
 
- 					accumulator[key] = [value];
 
- 					return;
 
- 				}
 
- 				accumulator[key] = [].concat(accumulator[key], value);
 
- 			};
 
- 		default:
 
- 			return function (key, value, accumulator) {
 
- 				if (accumulator[key] === undefined) {
 
- 					accumulator[key] = value;
 
- 					return;
 
- 				}
 
- 				accumulator[key] = [].concat(accumulator[key], value);
 
- 			};
 
- 	}
 
- }
 
- function encode(value, opts) {
 
- 	if (opts.encode) {
 
- 		return opts.strict ? strictUriEncode(value) : encodeURIComponent(value);
 
- 	}
 
- 	return value;
 
- }
 
- function keysSorter(input) {
 
- 	if (Array.isArray(input)) {
 
- 		return input.sort();
 
- 	} else if (typeof input === 'object') {
 
- 		return keysSorter(Object.keys(input)).sort(function (a, b) {
 
- 			return Number(a) - Number(b);
 
- 		}).map(function (key) {
 
- 			return input[key];
 
- 		});
 
- 	}
 
- 	return input;
 
- }
 
- exports.extract = function (str) {
 
- 	return str.split('?')[1] || '';
 
- };
 
- exports.parse = function (str, opts) {
 
- 	opts = objectAssign({arrayFormat: 'none'}, opts);
 
- 	var formatter = parserForArrayFormat(opts);
 
- 	// 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;
 
- 		// missing `=` should be `null`:
 
- 		// http://w3.org/TR/2012/WD-url-20120524/#collect-url-parameters
 
- 		val = val === undefined ? null : decodeURIComponent(val);
 
- 		formatter(decodeURIComponent(key), val, ret);
 
- 	});
 
- 	return Object.keys(ret).sort().reduce(function (result, key) {
 
- 		var val = ret[key];
 
- 		if (Boolean(val) && typeof val === 'object' && !Array.isArray(val)) {
 
- 			// Sort object keys, not values
 
- 			result[key] = keysSorter(val);
 
- 		} else {
 
- 			result[key] = val;
 
- 		}
 
- 		return result;
 
- 	}, Object.create(null));
 
- };
 
- exports.stringify = function (obj, opts) {
 
- 	var defaults = {
 
- 		encode: true,
 
- 		strict: true,
 
- 		arrayFormat: 'none'
 
- 	};
 
- 	opts = objectAssign(defaults, opts);
 
- 	var formatter = encoderForArrayFormat(opts);
 
- 	return obj ? Object.keys(obj).sort().map(function (key) {
 
- 		var val = obj[key];
 
- 		if (val === undefined) {
 
- 			return '';
 
- 		}
 
- 		if (val === null) {
 
- 			return encode(key, opts);
 
- 		}
 
- 		if (Array.isArray(val)) {
 
- 			var result = [];
 
- 			val.slice().forEach(function (val2) {
 
- 				if (val2 === undefined) {
 
- 					return;
 
- 				}
 
- 				result.push(formatter(key, val2, result.length));
 
- 			});
 
- 			return result.join('&');
 
- 		}
 
- 		return encode(key, opts) + '=' + encode(val, opts);
 
- 	}).filter(function (x) {
 
- 		return x.length > 0;
 
- 	}).join('&') : '';
 
- };
 
 
  |