querystringparser
Version:
Extremely fast querystring parser
106 lines (94 loc) • 3.24 kB
JavaScript
/**
* Copyright (c) 2013 Petka Antonov
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:</p>
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
;
module.exports = QueryStringSerializer;
var enc = encodeURIComponent;
var ARRAY = [];
var isArray = Array.isArray;
var getProto = Object.getPrototypeOf;
var oProto = getProto({});
function isObject(obj) {
if (isArray(obj)) {
return true;
}
if (obj === null || typeof obj !== "object") {
return false;
}
var proto = getProto(obj);
return proto === oProto || proto === null;
}
function QueryStringSerializer() {
}
QueryStringSerializer.prototype.serialize =
function QueryStringSerializer$serialize(obj) {
if (obj === null ||
typeof obj !== "object") {
throw new TypeError("the obj to stringify must be an object");
}
var keys = Object.keys(obj);
var len = keys.length;
var array = ARRAY;
var stack = [];
var ret = [];
var cur = obj;
var keyPrefix = "";
for (var i = 0; i < len; ++i) {
var key = keys === array ? i : keys[i];
var value = cur[key];
if (isObject(value)) {
stack.push(keyPrefix, cur, keys, len, i);
if (keyPrefix === "") {
keyPrefix = key;
}
else {
keyPrefix = keyPrefix + "[" + enc(key) + "]";
}
if (isArray(value)) {
keys = array;
len = value.length;
}
else {
keys = Object.keys(value);
len = keys.length;
}
i = -1;
cur = value;
}
else {
if (typeof value !== "string") {
value = "" + value;
}
var serializedKey = keyPrefix === ""
? enc(key)
: keyPrefix + "[" + enc(key) + "]";
ret.push(serializedKey + "=" + enc(value));
}
if(i === len - 1 && stack.length > 0) {
i = stack.pop();
len = stack.pop();
keys = stack.pop();
cur = stack.pop();
keyPrefix = stack.pop();
}
}
return ret.join("&");
};