diff --git a/build.js b/build.js index b8402dc19..8ea094a37 100755 --- a/build.js +++ b/build.js @@ -950,6 +950,9 @@ // flag used to specify if the build should include the "use strict" directive var useStrict = isStrict || !(isLegacy || isMobile); + // flag used to specify replacing Lo-Dash's `_.clone` with Underscore's + var useUnderscoreClone = isUnderscore; + /*------------------------------------------------------------------------*/ // names of methods to include in the build @@ -974,6 +977,11 @@ (result = getDependencies(optionToMethodsArray(source, value))); }); + // use Lo-Dash's clone if explicitly requested + if (result && result.indexOf('clone') > -1) { + useUnderscoreClone = false; + } + // add method names required by Backbone and Underscore builds if (isBackbone && !result) { result = getDependencies(backboneDependencies); @@ -1038,7 +1046,6 @@ } else if (isUnderscore) { // update dependencies - dependencyMap.clone = ['extend', 'isArray']; dependencyMap.isEqual = ['isArray', 'isFunction']; dependencyMap.isEmpty = ['isArray']; @@ -1051,13 +1058,16 @@ source = removeVar(source, 'largeArraySize'); // replace `_.clone` - source = source.replace(/( +)function clone[\s\S]+?\n\1}/, [ - ' function clone(value) {', - ' return value && objectTypes[typeof value]', - ' ? (isArray(value) ? slice.call(value) : extend({}, value))', - ' : value', - ' }' - ].join('\n')); + if (useUnderscoreClone) { + dependencyMap.clone = ['extend', 'isArray']; + source = source.replace(/( +)function clone[\s\S]+?\n\1}/, [ + ' function clone(value) {', + ' return value && objectTypes[typeof value]', + ' ? (isArray(value) ? slice.call(value) : extend({}, value))', + ' : value', + ' }' + ].join('\n')); + } // replace `_.difference` source = source.replace(/( +)function difference[\s\S]+?\n\1}/, [ diff --git a/test/test-build.js b/test/test-build.js index 342785655..67148f92f 100644 --- a/test/test-build.js +++ b/test/test-build.js @@ -633,6 +633,24 @@ start(); }); }); + + asyncTest('`lodash underscore plus=clone`', function() { + var start = _.after(2, _.once(QUnit.start)); + + build(['-s', 'underscore', 'plus=clone'], function(source, filePath) { + var array = [{ 'value': 1 }], + basename = path.basename(filePath, '.js'), + context = createContext(); + + vm.runInContext(source, context); + var lodash = context._, + clone = lodash.clone(array, true); + + deepEqual(array, clone, basename); + notEqual(array, clone, basename); + start(); + }); + }); }()); /*--------------------------------------------------------------------------*/