Limit the category build option to adding only those methods available for specific builds (i.e. underscore and backbone builds).

Former-commit-id: 63a5509cd953b20376723335d42fb5a136eb3a5c
This commit is contained in:
John-David Dalton
2013-03-18 02:38:06 -06:00
parent f5dd05ba8e
commit 4e2ef908dc
2 changed files with 72 additions and 52 deletions

View File

@@ -893,7 +893,10 @@
* @returns {Array} Returns the new converted array. * @returns {Array} Returns the new converted array.
*/ */
function optionToArray(value) { function optionToArray(value) {
return _.compact(value.match(/\w+=(.*)$/)[1].split(/, */)); return _.compact(_.isArray(value)
? value
: value.match(/\w+=(.*)$/)[1].split(/, */)
);
} }
/** /**
@@ -908,11 +911,6 @@
function optionToMethodsArray(source, value) { function optionToMethodsArray(source, value) {
var methodNames = optionToArray(value); var methodNames = optionToArray(value);
// convert categories to method names
methodNames.forEach(function(category) {
push.apply(methodNames, getMethodsByCategory(source, category));
});
// convert aliases to real method names // convert aliases to real method names
methodNames = methodNames.map(getRealName); methodNames = methodNames.map(getRealName);
@@ -1606,11 +1604,6 @@
// flag to specify a legacy build // flag to specify a legacy build
var isLegacy = !(isModern || isUnderscore) && options.indexOf('legacy') > -1; var isLegacy = !(isModern || isUnderscore) && options.indexOf('legacy') > -1;
// used to specify methods of specific categories
var categories = options.reduce(function(result, value) {
return /category/.test(value) ? optionToArray(value) : result;
}, []);
// used to specify the ways to export the `lodash` function // used to specify the ways to export the `lodash` function
var exportsOptions = options.reduce(function(result, value) { var exportsOptions = options.reduce(function(result, value) {
return /exports/.test(value) ? optionToArray(value).sort() : result; return /exports/.test(value) ? optionToArray(value).sort() : result;
@@ -1644,7 +1637,7 @@
: result; : result;
}, ''); }, '');
// used when precompiling template files // used as the template settings for precompiled templates
var templateSettings = options.reduce(function(result, value) { var templateSettings = options.reduce(function(result, value) {
var match = value.match(/settings=(.+)$/); var match = value.match(/settings=(.+)$/);
return match return match
@@ -1701,6 +1694,17 @@
: accumulator; : accumulator;
}, []); }, []);
var categories = options.reduce(function(accumulator, value) {
if (/category|exclude|include|minus|plus/.test(value)) {
var array = optionToArray(value);
accumulator = _.union(accumulator, /category/.test(value)
? array
: array.filter(function(category) { return /^[A-Z]/.test(category); })
);
}
return accumulator;
}, []);
// set flags to include Lo-Dash's methods if explicitly requested // set flags to include Lo-Dash's methods if explicitly requested
if (isUnderscore) { if (isUnderscore) {
var methods = _.without.apply(_, [_.union(includeMethods, plusMethods)].concat(minusMethods)); var methods = _.without.apply(_, [_.union(includeMethods, plusMethods)].concat(minusMethods));
@@ -1775,8 +1779,21 @@
// add method names by category // add method names by category
if (categories.length) { if (categories.length) {
result = _.union(result || [], getDependencies(categories.reduce(function(accumulator, category) { result = _.union(result || [], getDependencies(categories.reduce(function(accumulator, category) {
// resolve method names belonging to each category (case-insensitive) // get method names belonging to each category (case-insensitive)
return accumulator.concat(getMethodsByCategory(source, capitalize(category))); var methodNames = getMethodsByCategory(source, capitalize(category));
// limit category methods to those available for specific builds
if (isBackbone) {
methodNames = methodNames.filter(function(methodName) {
return _.contains(backboneDependencies, methodName);
});
}
else if (isUnderscore) {
methodNames = methodNames.filter(function(methodName) {
return _.contains(underscoreMethods, methodName);
});
}
return accumulator.concat(methodNames);
}, []))); }, [])));
} }
if (!result) { if (!result) {

View File

@@ -33,6 +33,9 @@
global.QUnit global.QUnit
); );
/** Shortcut used to push arrays of values to an array */
var push = Array.prototype.push;
/** The time limit for the tests to run (milliseconds) */ /** The time limit for the tests to run (milliseconds) */
var timeLimit = process.argv.reduce(function(result, value, index) { var timeLimit = process.argv.reduce(function(result, value, index) {
if (/--time-limit/.test(value)) { if (/--time-limit/.test(value)) {
@@ -308,6 +311,17 @@
/*--------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------*/
/**
* Capitalizes a given string.
*
* @private
* @param {String} string The string to capitalize.
* @returns {String} Returns the capitalized string.
*/
function capitalize(string) {
return string[0].toUpperCase() + string.toLowerCase().slice(1);
}
/** /**
* Creates a context object to use with `vm.runInContext`. * Creates a context object to use with `vm.runInContext`.
* *
@@ -331,7 +345,7 @@
function expandMethodNames(methodNames) { function expandMethodNames(methodNames) {
return methodNames.reduce(function(result, methodName) { return methodNames.reduce(function(result, methodName) {
var realName = getRealName(methodName); var realName = getRealName(methodName);
result.push.apply(result, [realName].concat(getAliases(realName))); push.apply(result, [realName].concat(getAliases(realName)));
return result; return result;
}, []); }, []);
} }
@@ -1365,12 +1379,9 @@
var methodNames, var methodNames,
basename = path.basename(data.outputPath, '.js'), basename = path.basename(data.outputPath, '.js'),
context = createContext(), context = createContext(),
isUnderscore = /backbone|underscore/.test(command), isBackbone = /backbone/.test(command),
isUnderscore = isBackbone || /underscore/.test(command),
exposeAssign = !isUnderscore, exposeAssign = !isUnderscore,
exposeCreateCallback = !isUnderscore,
exposeForIn = !isUnderscore,
exposeForOwn = !isUnderscore,
exposeIsPlainObject = !isUnderscore,
exposeZipObject = !isUnderscore; exposeZipObject = !isUnderscore;
try { try {
@@ -1389,21 +1400,14 @@
if (isUnderscore) { if (isUnderscore) {
if (methodNames) { if (methodNames) {
exposeAssign = methodNames.indexOf('assign') > -1; exposeAssign = methodNames.indexOf('assign') > -1;
exposeCreateCallback = methodNames.indexOf('createCallback') > -1;
exposeZipObject = methodNames.indexOf('zipObject') > -1; exposeZipObject = methodNames.indexOf('zipObject') > -1;
} else { } else {
methodNames = underscoreMethods.slice(); methodNames = underscoreMethods.slice();
} }
} }
// add method names explicitly by category
if (/category/.test(command)) { if (/category/.test(command)) {
// resolve method names belonging to each category (case-insensitive) methodNames = (methodNames || []).concat(command.match(/category=(\S*)/)[1].split(/, */).map(capitalize));
methodNames = command.match(/category=(\S*)/)[1].split(/, */).reduce(function(result, category) {
var capitalized = category[0].toUpperCase() + category.toLowerCase().slice(1);
return result.concat(getMethodsByCategory(capitalized));
}, methodNames || []);
} }
// init `methodNames` if it hasn't been inited
if (!methodNames) { if (!methodNames) {
methodNames = allMethods.slice(); methodNames = allMethods.slice();
} }
@@ -1411,40 +1415,39 @@
methodNames = methodNames.concat(command.match(/plus=(\S*)/)[1].split(/, */)); methodNames = methodNames.concat(command.match(/plus=(\S*)/)[1].split(/, */));
} }
if (/minus/.test(command)) { if (/minus/.test(command)) {
methodNames = _.without.apply(_, [methodNames] methodNames = _.without.apply(_, [methodNames].concat(expandMethodNames(command.match(/minus=(\S*)/)[1].split(/, */))));
.concat(expandMethodNames(command.match(/minus=(\S*)/)[1].split(/, */))));
} }
if (/exclude/.test(command)) { if (/exclude/.test(command)) {
methodNames = _.without.apply(_, [methodNames] methodNames = _.without.apply(_, [methodNames].concat(expandMethodNames(command.match(/exclude=(\S*)/)[1].split(/, */))));
.concat(expandMethodNames(command.match(/exclude=(\S*)/)[1].split(/, */))));
} }
// expand aliases and categories to real method names // expand categories to real method names
methodNames = expandMethodNames(methodNames).reduce(function(result, methodName) { methodNames.slice().forEach(function(category) {
return result.concat(methodName, getMethodsByCategory(methodName)); var result = getMethodsByCategory(category);
}, []);
// remove nonexistent and duplicate method names // limit category methods to those available for specific builds
if (isBackbone) {
result = result.filter(function(methodName) {
return _.contains(backboneDependencies, methodName);
});
}
else if (isUnderscore) {
result = result.filter(function(methodName) {
return _.contains(underscoreMethods, methodName);
});
}
if (result.length) {
methodNames = _.without(methodNames, category);
push.apply(methodNames, result);
}
});
// expand aliases and remove nonexistent and duplicate method names
methodNames = _.uniq(_.intersection(allMethods, expandMethodNames(methodNames))); methodNames = _.uniq(_.intersection(allMethods, expandMethodNames(methodNames)));
if (isUnderscore) {
methodNames = _.without.apply(_, [methodNames].concat(['findIndex', 'findKey']));
}
if (!exposeAssign) { if (!exposeAssign) {
methodNames = _.without(methodNames, 'assign'); methodNames = _.without(methodNames, 'assign');
} }
if (!exposeCreateCallback) {
methodNames = _.without(methodNames, 'createCallback');
}
if (!exposeForIn) {
methodNames = _.without(methodNames, 'forIn');
}
if (!exposeForOwn) {
methodNames = _.without(methodNames, 'forOwn');
}
if (!exposeIsPlainObject) {
methodNames = _.without(methodNames, 'isPlainobject');
}
if (!exposeZipObject) { if (!exposeZipObject) {
methodNames = _.without(methodNames, 'zipObject'); methodNames = _.without(methodNames, 'zipObject');
} }