mirror of
https://github.com/whoisclebs/lodash.git
synced 2026-01-29 06:27:49 +00:00
Ensure placeholder properties are set for fp.convert() results. [closes #3440]
This commit is contained in:
@@ -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]) {
|
result.placeholder = func.placeholder = placeholder;
|
||||||
setPlaceholder = true;
|
|
||||||
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) {
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
Reference in New Issue
Block a user