Skip to content

Commit

Permalink
[Refactor] remove “internals” pattern.
Browse files Browse the repository at this point in the history
This pattern creates extra object lookups for zero benefit - now it uses closures instead.
  • Loading branch information
ljharb committed Apr 28, 2016
1 parent 13b2aa1 commit a296cb4
Show file tree
Hide file tree
Showing 3 changed files with 42 additions and 40 deletions.
1 change: 1 addition & 0 deletions .eslintrc
Expand Up @@ -6,6 +6,7 @@
"rules": {
"complexity": [2, 19],
"consistent-return": [1],
"id-length": [2, { "min": 1, "max": 25, "properties": "never" }],
"indent": [2, 4],
"max-params": [2, 9],
"max-statements": [2, 33],
Expand Down
36 changes: 18 additions & 18 deletions lib/parse.js
Expand Up @@ -2,7 +2,7 @@

var Utils = require('./utils');

var internals = {
var defaults = {
delimiter: '&',
depth: 5,
arrayLimit: 20,
Expand All @@ -13,7 +13,7 @@ var internals = {
allowDots: false
};

internals.parseValues = function (str, options) {
var parseValues = function parseValues(str, options) {
var obj = {};
var parts = str.split(options.delimiter, options.parameterLimit === Infinity ? undefined : options.parameterLimit);

Expand Down Expand Up @@ -42,7 +42,7 @@ internals.parseValues = function (str, options) {
return obj;
};

internals.parseObject = function (chain, val, options) {
var parseObject = function parseObject(chain, val, options) {
if (!chain.length) {
return val;
}
Expand All @@ -52,7 +52,7 @@ internals.parseObject = function (chain, val, options) {
var obj;
if (root === '[]') {
obj = [];
obj = obj.concat(internals.parseObject(chain, val, options));
obj = obj.concat(parseObject(chain, val, options));
} else {
obj = options.plainObjects ? Object.create(null) : {};
var cleanRoot = root[0] === '[' && root[root.length - 1] === ']' ? root.slice(1, root.length - 1) : root;
Expand All @@ -65,16 +65,16 @@ internals.parseObject = function (chain, val, options) {
(options.parseArrays && index <= options.arrayLimit)
) {
obj = [];
obj[index] = internals.parseObject(chain, val, options);
obj[index] = parseObject(chain, val, options);
} else {
obj[cleanRoot] = internals.parseObject(chain, val, options);
obj[cleanRoot] = parseObject(chain, val, options);
}
}

return obj;
};

internals.parseKeys = function (givenKey, val, options) {
var parseKeys = function parseKeys(givenKey, val, options) {
if (!givenKey) {
return;
}
Expand Down Expand Up @@ -125,34 +125,34 @@ internals.parseKeys = function (givenKey, val, options) {
keys.push('[' + key.slice(segment.index) + ']');
}

return internals.parseObject(keys, val, options);
return parseObject(keys, val, options);
};

module.exports = function (str, opts) {
var options = opts || {};
options.delimiter = typeof options.delimiter === 'string' || Utils.isRegExp(options.delimiter) ? options.delimiter : internals.delimiter;
options.depth = typeof options.depth === 'number' ? options.depth : internals.depth;
options.arrayLimit = typeof options.arrayLimit === 'number' ? options.arrayLimit : internals.arrayLimit;
options.delimiter = typeof options.delimiter === 'string' || Utils.isRegExp(options.delimiter) ? options.delimiter : defaults.delimiter;
options.depth = typeof options.depth === 'number' ? options.depth : defaults.depth;
options.arrayLimit = typeof options.arrayLimit === 'number' ? options.arrayLimit : defaults.arrayLimit;
options.parseArrays = options.parseArrays !== false;
options.allowDots = typeof options.allowDots === 'boolean' ? options.allowDots : internals.allowDots;
options.plainObjects = typeof options.plainObjects === 'boolean' ? options.plainObjects : internals.plainObjects;
options.allowPrototypes = typeof options.allowPrototypes === 'boolean' ? options.allowPrototypes : internals.allowPrototypes;
options.parameterLimit = typeof options.parameterLimit === 'number' ? options.parameterLimit : internals.parameterLimit;
options.strictNullHandling = typeof options.strictNullHandling === 'boolean' ? options.strictNullHandling : internals.strictNullHandling;
options.allowDots = typeof options.allowDots === 'boolean' ? options.allowDots : defaults.allowDots;
options.plainObjects = typeof options.plainObjects === 'boolean' ? options.plainObjects : defaults.plainObjects;
options.allowPrototypes = typeof options.allowPrototypes === 'boolean' ? options.allowPrototypes : defaults.allowPrototypes;
options.parameterLimit = typeof options.parameterLimit === 'number' ? options.parameterLimit : defaults.parameterLimit;
options.strictNullHandling = typeof options.strictNullHandling === 'boolean' ? options.strictNullHandling : defaults.strictNullHandling;

if (str === '' || str === null || typeof str === 'undefined') {
return options.plainObjects ? Object.create(null) : {};
}

var tempObj = typeof str === 'string' ? internals.parseValues(str, options) : str;
var tempObj = typeof str === 'string' ? parseValues(str, options) : str;
var obj = options.plainObjects ? Object.create(null) : {};

// Iterate over the keys and setup the new object

var keys = Object.keys(tempObj);
for (var i = 0; i < keys.length; ++i) {
var key = keys[i];
var newObj = internals.parseKeys(key, tempObj[key], options);
var newObj = parseKeys(key, tempObj[key], options);
obj = Utils.merge(obj, newObj, options);
}

Expand Down
45 changes: 23 additions & 22 deletions lib/stringify.js
Expand Up @@ -2,25 +2,26 @@

var Utils = require('./utils');

var internals = {
delimiter: '&',
arrayPrefixGenerators: {
brackets: function (prefix) {
return prefix + '[]';
},
indices: function (prefix, key) {
return prefix + '[' + key + ']';
},
repeat: function (prefix) {
return prefix;
}
var arrayPrefixGenerators = {
brackets: function brackets(prefix) {
return prefix + '[]';
},
indices: function indices(prefix, key) {
return prefix + '[' + key + ']';
},
repeat: function repeat(prefix) {
return prefix;
}
};

var defaults = {
delimiter: '&',
strictNullHandling: false,
skipNulls: false,
encode: true
};

internals.stringify = function (object, prefix, generateArrayPrefix, strictNullHandling, skipNulls, encode, filter, sort, allowDots) {
var stringify = function stringify(object, prefix, generateArrayPrefix, strictNullHandling, skipNulls, encode, filter, sort, allowDots) {
var obj = object;
if (typeof filter === 'function') {
obj = filter(prefix, obj);
Expand Down Expand Up @@ -65,9 +66,9 @@ internals.stringify = function (object, prefix, generateArrayPrefix, strictNullH
}

if (Array.isArray(obj)) {
values = values.concat(internals.stringify(obj[key], generateArrayPrefix(prefix, key), generateArrayPrefix, strictNullHandling, skipNulls, encode, filter, sort, allowDots));
values = values.concat(stringify(obj[key], generateArrayPrefix(prefix, key), generateArrayPrefix, strictNullHandling, skipNulls, encode, filter, sort, allowDots));
} else {
values = values.concat(internals.stringify(obj[key], prefix + (allowDots ? '.' + key : '[' + key + ']'), generateArrayPrefix, strictNullHandling, skipNulls, encode, filter, sort, allowDots));
values = values.concat(stringify(obj[key], prefix + (allowDots ? '.' + key : '[' + key + ']'), generateArrayPrefix, strictNullHandling, skipNulls, encode, filter, sort, allowDots));
}
}

Expand All @@ -77,10 +78,10 @@ internals.stringify = function (object, prefix, generateArrayPrefix, strictNullH
module.exports = function (object, opts) {
var obj = object;
var options = opts || {};
var delimiter = typeof options.delimiter === 'undefined' ? internals.delimiter : options.delimiter;
var strictNullHandling = typeof options.strictNullHandling === 'boolean' ? options.strictNullHandling : internals.strictNullHandling;
var skipNulls = typeof options.skipNulls === 'boolean' ? options.skipNulls : internals.skipNulls;
var encode = typeof options.encode === 'boolean' ? options.encode : internals.encode;
var delimiter = typeof options.delimiter === 'undefined' ? defaults.delimiter : options.delimiter;
var strictNullHandling = typeof options.strictNullHandling === 'boolean' ? options.strictNullHandling : defaults.strictNullHandling;
var skipNulls = typeof options.skipNulls === 'boolean' ? options.skipNulls : defaults.skipNulls;
var encode = typeof options.encode === 'boolean' ? options.encode : defaults.encode;
var sort = typeof options.sort === 'function' ? options.sort : null;
var allowDots = typeof options.allowDots === 'undefined' ? false : options.allowDots;
var objKeys;
Expand All @@ -99,15 +100,15 @@ module.exports = function (object, opts) {
}

var arrayFormat;
if (options.arrayFormat in internals.arrayPrefixGenerators) {
if (options.arrayFormat in arrayPrefixGenerators) {
arrayFormat = options.arrayFormat;
} else if ('indices' in options) {
arrayFormat = options.indices ? 'indices' : 'repeat';
} else {
arrayFormat = 'indices';
}

var generateArrayPrefix = internals.arrayPrefixGenerators[arrayFormat];
var generateArrayPrefix = arrayPrefixGenerators[arrayFormat];

if (!objKeys) {
objKeys = Object.keys(obj);
Expand All @@ -124,7 +125,7 @@ module.exports = function (object, opts) {
continue;
}

keys = keys.concat(internals.stringify(obj[key], key, generateArrayPrefix, strictNullHandling, skipNulls, encode, filter, sort, allowDots));
keys = keys.concat(stringify(obj[key], key, generateArrayPrefix, strictNullHandling, skipNulls, encode, filter, sort, allowDots));
}

return keys.join(delimiter);
Expand Down

0 comments on commit a296cb4

Please sign in to comment.