Ensure placeholder properties are set for fp.convert() results. [closes #3440]

This commit is contained in:
John-David Dalton
2018-08-30 23:57:31 -07:00
parent 278c6dd33d
commit 2de676fe76
3 changed files with 25 additions and 40 deletions

View File

@@ -136,8 +136,7 @@ function wrapImmutable(func, cloner) {
* @returns {Function|Object} Returns the converted function or object.
*/
function baseConvert(util, name, func, options) {
var setPlaceholder,
isLib = typeof name == 'function',
var isLib = typeof name == 'function',
isObj = name === Object(name);
if (isObj) {
@@ -158,10 +157,10 @@ function baseConvert(util, name, func, options) {
'rearg': 'rearg' in options ? options.rearg : true
};
var forceCurry = ('curry' in options) && options.curry,
var defaultHolder = isLib ? func : fallbackHolder,
forceCurry = ('curry' in options) && options.curry,
forceFixed = ('fixed' in options) && options.fixed,
forceRearg = ('rearg' in options) && options.rearg,
placeholder = isLib ? func : fallbackHolder,
pristine = isLib ? func.runInContext() : undefined;
var helpers = isLib ? func : {
@@ -466,7 +465,7 @@ function baseConvert(util, name, func, options) {
* @param {Function} func The function to wrap.
* @returns {Function} Returns the converted function.
*/
function wrap(name, func) {
function wrap(name, func, placeholder) {
var result,
realName = mapping.aliasToReal[name] || name,
wrapped = func,
@@ -511,17 +510,15 @@ function baseConvert(util, name, func, options) {
};
}
result.convert = createConverter(realName, func);
if (mapping.placeholder[realName]) {
setPlaceholder = true;
result.placeholder = func.placeholder = placeholder;
}
result.placeholder = func.placeholder = placeholder;
return result;
}
/*--------------------------------------------------------------------------*/
if (!isObj) {
return wrap(name, func);
return wrap(name, func, defaultHolder);
}
var _ = func;
@@ -531,7 +528,8 @@ function baseConvert(util, name, func, options) {
each(mapping.aryMethod[aryKey], function(key) {
var func = _[mapping.remap[key] || key];
if (func) {
pairs.push([key, wrap(key, func)]);
pairs.push([key, wrap(key, func, _)]);
}
});
});
@@ -557,9 +555,8 @@ function baseConvert(util, name, func, options) {
});
_.convert = convertLib;
if (setPlaceholder) {
_.placeholder = placeholder;
}
_.placeholder = _;
// Assign aliases.
each(keys(_), function(key) {
each(mapping.realToAlias[key] || [], function(alias) {

View File

@@ -261,16 +261,6 @@ exports.mutate = {
}
};
/** Used to track methods with placeholder support */
exports.placeholder = {
'bind': true,
'bindKey': true,
'curry': true,
'curryRight': true,
'partial': true,
'partialRight': true
};
/** Used to map real names to their aliases. */
exports.realToAlias = (function() {
var hasOwnProperty = Object.prototype.hasOwnProperty,

View File

@@ -233,25 +233,14 @@
assert.strictEqual(add('2')('1'), '12');
});
QUnit.test('should only add a `placeholder` property if needed', function(assert) {
QUnit.test('should add a `placeholder` property', function(assert) {
assert.expect(2);
if (!document) {
var methodNames = _.keys(mapping.placeholder),
expected = _.map(methodNames, _.constant(true));
var actual = _.map(methodNames, function(methodName) {
var object = {};
object[methodName] = _[methodName];
var lodash = convert(object);
return methodName in lodash;
});
assert.deepEqual(actual, expected);
var lodash = convert({ 'add': _.add });
assert.notOk('placeholder' in lodash);
assert.strictEqual(lodash.placeholder, lodash);
assert.strictEqual(lodash.add.placeholder, lodash)
}
else {
skipAssert(assert, 2);
@@ -645,7 +634,16 @@
});
});
_.forOwn(mapping.placeholder, function(truthy, methodName) {
var methodNames = [
'bind',
'bindKey',
'curry',
'curryRight',
'partial',
'partialRight'
]
_.each(methodNames, function(methodName) {
var func = fp[methodName];
QUnit.test('fp.' + methodName + '` should have a `placeholder` property', function(assert) {