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. * @returns {Function|Object} Returns the converted function or object.
*/ */
function baseConvert(util, name, func, options) { function baseConvert(util, name, func, options) {
var setPlaceholder, var isLib = typeof name == 'function',
isLib = typeof name == 'function',
isObj = name === Object(name); isObj = name === Object(name);
if (isObj) { if (isObj) {
@@ -158,10 +157,10 @@ function baseConvert(util, name, func, options) {
'rearg': 'rearg' in options ? options.rearg : true '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, forceFixed = ('fixed' in options) && options.fixed,
forceRearg = ('rearg' in options) && options.rearg, forceRearg = ('rearg' in options) && options.rearg,
placeholder = isLib ? func : fallbackHolder,
pristine = isLib ? func.runInContext() : undefined; pristine = isLib ? func.runInContext() : undefined;
var helpers = isLib ? func : { var helpers = isLib ? func : {
@@ -466,7 +465,7 @@ function baseConvert(util, name, func, options) {
* @param {Function} func The function to wrap. * @param {Function} func The function to wrap.
* @returns {Function} Returns the converted function. * @returns {Function} Returns the converted function.
*/ */
function wrap(name, func) { function wrap(name, func, placeholder) {
var result, var result,
realName = mapping.aliasToReal[name] || name, realName = mapping.aliasToReal[name] || name,
wrapped = func, wrapped = func,
@@ -511,17 +510,15 @@ function baseConvert(util, name, func, options) {
}; };
} }
result.convert = createConverter(realName, func); result.convert = createConverter(realName, func);
if (mapping.placeholder[realName]) {
setPlaceholder = true;
result.placeholder = func.placeholder = placeholder; result.placeholder = func.placeholder = placeholder;
}
return result; return result;
} }
/*--------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------*/
if (!isObj) { if (!isObj) {
return wrap(name, func); return wrap(name, func, defaultHolder);
} }
var _ = func; var _ = func;
@@ -531,7 +528,8 @@ function baseConvert(util, name, func, options) {
each(mapping.aryMethod[aryKey], function(key) { each(mapping.aryMethod[aryKey], function(key) {
var func = _[mapping.remap[key] || key]; var func = _[mapping.remap[key] || key];
if (func) { 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; _.convert = convertLib;
if (setPlaceholder) { _.placeholder = _;
_.placeholder = placeholder;
}
// Assign aliases. // Assign aliases.
each(keys(_), function(key) { each(keys(_), function(key) {
each(mapping.realToAlias[key] || [], function(alias) { 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. */ /** Used to map real names to their aliases. */
exports.realToAlias = (function() { exports.realToAlias = (function() {
var hasOwnProperty = Object.prototype.hasOwnProperty, var hasOwnProperty = Object.prototype.hasOwnProperty,

View File

@@ -233,25 +233,14 @@
assert.strictEqual(add('2')('1'), '12'); 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); assert.expect(2);
if (!document) { 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 }); var lodash = convert({ 'add': _.add });
assert.notOk('placeholder' in lodash);
assert.strictEqual(lodash.placeholder, lodash);
assert.strictEqual(lodash.add.placeholder, lodash)
} }
else { else {
skipAssert(assert, 2); 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]; var func = fp[methodName];
QUnit.test('fp.' + methodName + '` should have a `placeholder` property', function(assert) { QUnit.test('fp.' + methodName + '` should have a `placeholder` property', function(assert) {