mirror of
https://github.com/whoisclebs/lodash.git
synced 2026-02-10 02:47:50 +00:00
Add warnings to build.js for passing invalid method names to include, minus, and plus.
Former-commit-id: 918ecc8818874b59a292e913a4b8c62d34824f4c
This commit is contained in:
302
build.js
302
build.js
@@ -1177,22 +1177,15 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Converts a comma separated options string into an array containing
|
* Converts a comma separated options string into an array of method names.
|
||||||
* only real method names.
|
|
||||||
*
|
*
|
||||||
* @private
|
* @private
|
||||||
* @param {String} source The source to inspect.
|
|
||||||
* @param {String} value The option to convert.
|
* @param {String} value The option to convert.
|
||||||
* @returns {Array} Returns the new converted array.
|
* @returns {Array} Returns the new converted array.
|
||||||
*/
|
*/
|
||||||
function optionToMethodsArray(source, value) {
|
function optionToMethodsArray(value) {
|
||||||
var methodNames = optionToArray(value);
|
|
||||||
|
|
||||||
// convert aliases to real method names
|
// convert aliases to real method names
|
||||||
methodNames = methodNames.map(getRealName);
|
return optionToArray(value).map(getRealName);
|
||||||
|
|
||||||
// remove nonexistent and duplicate method names
|
|
||||||
return _.uniq(_.intersection(allMethods, methodNames));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -1945,96 +1938,9 @@
|
|||||||
// used to specify the source map URL
|
// used to specify the source map URL
|
||||||
var sourceMapURL;
|
var sourceMapURL;
|
||||||
|
|
||||||
// methods categories to include in the build
|
|
||||||
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.map(function(category) { return capitalize(category.toLowerCase()); })
|
|
||||||
: array.filter(function(category) { return /^[A-Z]/.test(category); })
|
|
||||||
);
|
|
||||||
}
|
|
||||||
return accumulator;
|
|
||||||
}, []);
|
|
||||||
|
|
||||||
// used to specify the ways to export the `lodash` function
|
|
||||||
var exportsOptions = options.reduce(function(result, value) {
|
|
||||||
return /^exports=.*$/.test(value) ? optionToArray(value).sort() : result;
|
|
||||||
}, isUnderscore
|
|
||||||
? ['commonjs', 'global', 'node']
|
|
||||||
: exportsAll.slice()
|
|
||||||
);
|
|
||||||
|
|
||||||
// used to detect invalid command-line arguments
|
|
||||||
var invalidArgs = _.reject(options.slice(reNode.test(options[0]) ? 2 : 0), function(value, index, options) {
|
|
||||||
if (/^(?:-o|--output)$/.test(options[index - 1]) ||
|
|
||||||
/^(?:category|exclude|exports|iife|include|moduleId|minus|plus|settings|template)=[\s\S]*$/.test(value)) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
var result = _.contains([
|
|
||||||
'backbone',
|
|
||||||
'csp',
|
|
||||||
'legacy',
|
|
||||||
'mobile',
|
|
||||||
'modern',
|
|
||||||
'modularize',
|
|
||||||
'strict',
|
|
||||||
'underscore',
|
|
||||||
'-c', '--stdout',
|
|
||||||
'-d', '--debug',
|
|
||||||
'-h', '--help',
|
|
||||||
'-m', '--minify',
|
|
||||||
'-n', '--no-dep',
|
|
||||||
'-o', '--output',
|
|
||||||
'-p', '--source-map',
|
|
||||||
'-s', '--silent',
|
|
||||||
'-V', '--version'
|
|
||||||
], value);
|
|
||||||
|
|
||||||
if (!result && /^(?:-p|--source-map)$/.test(options[index - 1])) {
|
|
||||||
result = true;
|
|
||||||
sourceMapURL = value;
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
});
|
|
||||||
|
|
||||||
// used to capture warnings for invalid command-line arguments
|
// used to capture warnings for invalid command-line arguments
|
||||||
var warnings = [];
|
var warnings = [];
|
||||||
|
|
||||||
// report invalid command and option arguments
|
|
||||||
if (invalidArgs.length) {
|
|
||||||
warnings.push('Invalid argument' + (invalidArgs.length > 1 ? 's' : '') + ' passed: ' + invalidArgs.join(', '));
|
|
||||||
}
|
|
||||||
// report invalid command combinations
|
|
||||||
invalidArgs = _.intersection(options, ['backbone', 'legacy', 'mobile', 'modern', 'underscore']);
|
|
||||||
if (invalidArgs.length > 1) {
|
|
||||||
warnings.push('The `' + invalidArgs.slice(0, -1).join('`, `') + '`' + (invalidArgs.length > 2 ? ',' : '') + ' and `' + _.last(invalidArgs) + '` commands may not be combined.');
|
|
||||||
}
|
|
||||||
// report invalid command entries
|
|
||||||
_.forOwn({
|
|
||||||
'category': {
|
|
||||||
'entries': categories,
|
|
||||||
'validEntries': ['Arrays', 'Chaining', 'Collections', 'Functions', 'Objects', 'Utilities']
|
|
||||||
},
|
|
||||||
'exports': {
|
|
||||||
'entries': exportsOptions,
|
|
||||||
'validEntries': ['amd', 'commonjs', 'global', 'node', 'none']
|
|
||||||
}
|
|
||||||
}, function(data, commandName) {
|
|
||||||
invalidArgs = _.difference(data.entries, data.validEntries);
|
|
||||||
if (invalidArgs.length) {
|
|
||||||
warnings.push('Invalid `' + commandName + '` entr' + (invalidArgs.length > 1 ? 'ies' : 'y') + ' passed: ' + invalidArgs.join(', '));
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
if (warnings.length) {
|
|
||||||
console.log([''].concat(
|
|
||||||
warnings,
|
|
||||||
'For more information type: lodash --help'
|
|
||||||
).join('\n'));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// display help message
|
// display help message
|
||||||
if (_.find(options, function(arg) {
|
if (_.find(options, function(arg) {
|
||||||
return /^(?:-h|--help)$/.test(arg);
|
return /^(?:-h|--help)$/.test(arg);
|
||||||
@@ -2112,12 +2018,165 @@
|
|||||||
// flag to specify a legacy build
|
// flag to specify a legacy build
|
||||||
var isLegacy = !(isModern || isUnderscore) && _.contains(options, 'legacy');
|
var isLegacy = !(isModern || isUnderscore) && _.contains(options, 'legacy');
|
||||||
|
|
||||||
|
// methods categories to include in the build
|
||||||
|
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.map(function(category) { return capitalize(category.toLowerCase()); })
|
||||||
|
: array.filter(function(category) { return /^[A-Z]/.test(category); })
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return accumulator;
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
// used to specify the ways to export the `lodash` function
|
||||||
|
var exportsOptions = options.reduce(function(result, value) {
|
||||||
|
return /^exports=.*$/.test(value) ? optionToArray(value).sort() : result;
|
||||||
|
}, isUnderscore
|
||||||
|
? ['commonjs', 'global', 'node']
|
||||||
|
: exportsAll.slice()
|
||||||
|
);
|
||||||
|
|
||||||
// used to specify the AMD module ID of Lo-Dash used by precompiled templates
|
// used to specify the AMD module ID of Lo-Dash used by precompiled templates
|
||||||
var moduleId = options.reduce(function(result, value) {
|
var moduleId = options.reduce(function(result, value) {
|
||||||
var match = value.match(/^moduleId=(.*)$/);
|
var match = value.match(/^moduleId=(.*)$/);
|
||||||
return match ? match[1] : result;
|
return match ? match[1] : result;
|
||||||
}, 'lodash');
|
}, 'lodash');
|
||||||
|
|
||||||
|
// flags to specify export options
|
||||||
|
var isAMD = _.contains(exportsOptions, 'amd'),
|
||||||
|
isCommonJS = _.contains(exportsOptions, 'commonjs'),
|
||||||
|
isGlobal = _.contains(exportsOptions, 'global'),
|
||||||
|
isNode = _.contains(exportsOptions, 'node');
|
||||||
|
|
||||||
|
// delete the `_.findWhere` dependency map to enable its alias mapping
|
||||||
|
if (!isUnderscore || isLodashMethod('findWhere')) {
|
||||||
|
delete dependencyMap.findWhere;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
var isExcluded = function() {
|
||||||
|
return _.every(arguments, function(methodName) {
|
||||||
|
return !_.contains(buildMethods, methodName);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
var isLodashMethod = function(methodName) {
|
||||||
|
if (_.contains(lodashOnlyMethods, methodName) || /^(?:assign|zipObject)$/.test(methodName)) {
|
||||||
|
var methods = _.without.apply(_, [_.union(includeMethods, plusMethods)].concat(minusMethods));
|
||||||
|
return _.contains(methods, methodName);
|
||||||
|
}
|
||||||
|
methods = _.without.apply(_, [plusMethods].concat(minusMethods));
|
||||||
|
return _.contains(methods, methodName);
|
||||||
|
};
|
||||||
|
|
||||||
|
// methods to include in the build
|
||||||
|
var includeMethods = options.reduce(function(accumulator, value) {
|
||||||
|
return /^include=.*$/.test(value)
|
||||||
|
? _.union(accumulator, optionToMethodsArray(value))
|
||||||
|
: accumulator;
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
// methods to remove from the build
|
||||||
|
var minusMethods = options.reduce(function(accumulator, value) {
|
||||||
|
return /^(?:exclude|minus)=.*$/.test(value)
|
||||||
|
? _.union(accumulator, optionToMethodsArray(value))
|
||||||
|
: accumulator;
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
// methods to add to the build
|
||||||
|
var plusMethods = options.reduce(function(accumulator, value) {
|
||||||
|
return /^plus=.*$/.test(value)
|
||||||
|
? _.union(accumulator, optionToMethodsArray(value))
|
||||||
|
: accumulator;
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
// used to detect invalid command-line arguments
|
||||||
|
var invalidArgs = _.reject(options.slice(reNode.test(options[0]) ? 2 : 0), function(value, index, options) {
|
||||||
|
if (/^(?:-o|--output)$/.test(options[index - 1]) ||
|
||||||
|
/^(?:category|exclude|exports|iife|include|moduleId|minus|plus|settings|template)=[\s\S]*$/.test(value)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
var result = _.contains([
|
||||||
|
'backbone',
|
||||||
|
'csp',
|
||||||
|
'legacy',
|
||||||
|
'mobile',
|
||||||
|
'modern',
|
||||||
|
'modularize',
|
||||||
|
'strict',
|
||||||
|
'underscore',
|
||||||
|
'-c', '--stdout',
|
||||||
|
'-d', '--debug',
|
||||||
|
'-h', '--help',
|
||||||
|
'-m', '--minify',
|
||||||
|
'-n', '--no-dep',
|
||||||
|
'-o', '--output',
|
||||||
|
'-p', '--source-map',
|
||||||
|
'-s', '--silent',
|
||||||
|
'-V', '--version'
|
||||||
|
], value);
|
||||||
|
|
||||||
|
if (!result && /^(?:-p|--source-map)$/.test(options[index - 1])) {
|
||||||
|
result = true;
|
||||||
|
sourceMapURL = value;
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
});
|
||||||
|
|
||||||
|
// report invalid command and option arguments
|
||||||
|
if (invalidArgs.length) {
|
||||||
|
warnings.push('Invalid argument' + (invalidArgs.length > 1 ? 's' : '') + ' passed: ' + invalidArgs.join(', '));
|
||||||
|
}
|
||||||
|
// report invalid command combinations
|
||||||
|
invalidArgs = _.intersection(options, ['backbone', 'legacy', 'mobile', 'modern', 'underscore']);
|
||||||
|
if (invalidArgs.length > 1) {
|
||||||
|
warnings.push('The `' + invalidArgs.slice(0, -1).join('`, `') + '`' + (invalidArgs.length > 2 ? ',' : '') + ' and `' + _.last(invalidArgs) + '` commands may not be combined.');
|
||||||
|
}
|
||||||
|
// report invalid command entries
|
||||||
|
_.forOwn({
|
||||||
|
'category': {
|
||||||
|
'entries': categories,
|
||||||
|
'validEntries': ['Arrays', 'Chaining', 'Collections', 'Functions', 'Objects', 'Utilities']
|
||||||
|
},
|
||||||
|
'exports': {
|
||||||
|
'entries': exportsOptions,
|
||||||
|
'validEntries': ['amd', 'commonjs', 'global', 'node', 'none']
|
||||||
|
},
|
||||||
|
'include': {
|
||||||
|
'entries': includeMethods,
|
||||||
|
'validEntries': allMethods
|
||||||
|
},
|
||||||
|
'minus': {
|
||||||
|
'entries': minusMethods,
|
||||||
|
'validEntries': allMethods
|
||||||
|
},
|
||||||
|
'plus': {
|
||||||
|
'entries': plusMethods,
|
||||||
|
'validEntries': allMethods
|
||||||
|
}
|
||||||
|
}, function(data, commandName) {
|
||||||
|
invalidArgs = _.difference(data.entries, data.validEntries);
|
||||||
|
if (invalidArgs.length) {
|
||||||
|
warnings.push('Invalid `' + commandName + '` entr' + (invalidArgs.length > 1 ? 'ies' : 'y') + ' passed: ' + invalidArgs.join(', '));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
if (warnings.length) {
|
||||||
|
dependencyMap = dependencyMapBackup;
|
||||||
|
console.log([''].concat(
|
||||||
|
warnings,
|
||||||
|
'For more information type: lodash --help'
|
||||||
|
).join('\n'));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------------*/
|
||||||
|
|
||||||
// used to specify the output path for builds
|
// used to specify the output path for builds
|
||||||
var outputPath = options.reduce(function(result, value, index) {
|
var outputPath = options.reduce(function(result, value, index) {
|
||||||
if (/^(?:-o|--output)$/.test(value)) {
|
if (/^(?:-o|--output)$/.test(value)) {
|
||||||
@@ -2153,55 +2212,8 @@
|
|||||||
// the lodash.js source
|
// the lodash.js source
|
||||||
var source = fs.readFileSync(filePath, 'utf8');
|
var source = fs.readFileSync(filePath, 'utf8');
|
||||||
|
|
||||||
// flags to specify export options
|
|
||||||
var isAMD = _.contains(exportsOptions, 'amd'),
|
|
||||||
isCommonJS = _.contains(exportsOptions, 'commonjs'),
|
|
||||||
isGlobal = _.contains(exportsOptions, 'global'),
|
|
||||||
isNode = _.contains(exportsOptions, 'node');
|
|
||||||
|
|
||||||
/*------------------------------------------------------------------------*/
|
/*------------------------------------------------------------------------*/
|
||||||
|
|
||||||
var isExcluded = function() {
|
|
||||||
return _.every(arguments, function(methodName) {
|
|
||||||
return !_.contains(buildMethods, methodName);
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
var isLodashMethod = function(methodName) {
|
|
||||||
if (_.contains(lodashOnlyMethods, methodName) || /^(?:assign|zipObject)$/.test(methodName)) {
|
|
||||||
var methods = _.without.apply(_, [_.union(includeMethods, plusMethods)].concat(minusMethods));
|
|
||||||
return _.contains(methods, methodName);
|
|
||||||
}
|
|
||||||
methods = _.without.apply(_, [plusMethods].concat(minusMethods));
|
|
||||||
return _.contains(methods, methodName);
|
|
||||||
};
|
|
||||||
|
|
||||||
// delete the `_.findWhere` dependency map to enable its alias mapping
|
|
||||||
if (!isUnderscore || isLodashMethod('findWhere')) {
|
|
||||||
delete dependencyMap.findWhere;
|
|
||||||
}
|
|
||||||
|
|
||||||
// methods to include in the build
|
|
||||||
var includeMethods = options.reduce(function(accumulator, value) {
|
|
||||||
return /^include=.*$/.test(value)
|
|
||||||
? _.union(accumulator, optionToMethodsArray(source, value))
|
|
||||||
: accumulator;
|
|
||||||
}, []);
|
|
||||||
|
|
||||||
// methods to remove from the build
|
|
||||||
var minusMethods = options.reduce(function(accumulator, value) {
|
|
||||||
return /^(?:exclude|minus)=.*$/.test(value)
|
|
||||||
? _.union(accumulator, optionToMethodsArray(source, value))
|
|
||||||
: accumulator;
|
|
||||||
}, []);
|
|
||||||
|
|
||||||
// methods to add to the build
|
|
||||||
var plusMethods = options.reduce(function(accumulator, value) {
|
|
||||||
return /^plus=.*$/.test(value)
|
|
||||||
? _.union(accumulator, optionToMethodsArray(source, value))
|
|
||||||
: accumulator;
|
|
||||||
}, []);
|
|
||||||
|
|
||||||
// names of methods to include in the build
|
// names of methods to include in the build
|
||||||
var buildMethods = !isTemplate && (function() {
|
var buildMethods = !isTemplate && (function() {
|
||||||
var result;
|
var result;
|
||||||
@@ -3452,7 +3464,7 @@
|
|||||||
.replace(/\(\(__t *= *\( *([\s\S]+?) *\)\) *== *null *\? *'' *: *__t\)/g, '($1)');
|
.replace(/\(\(__t *= *\( *([\s\S]+?) *\)\) *== *null *\? *'' *: *__t\)/g, '($1)');
|
||||||
|
|
||||||
// remove the with-statement
|
// remove the with-statement
|
||||||
snippet = snippet.replace(/ *with *\(.+?\) *{/, '\n').replace(/}([^}]*}[^}]*$)/, '$1');
|
snippet = snippet.replace(/^ *with *\(.+?\) *{\n/m, '\n').replace(/}([^}]*}[^}]*$)/, '$1');
|
||||||
|
|
||||||
// minor cleanup
|
// minor cleanup
|
||||||
snippet = snippet
|
snippet = snippet
|
||||||
|
|||||||
Reference in New Issue
Block a user