From e385b3499bd52dd13899131c9ca112c5c23ae056 Mon Sep 17 00:00:00 2001 From: John-David Dalton Date: Mon, 15 Jul 2013 08:20:16 -0700 Subject: [PATCH] Remove `dependencyObject`. Former-commit-id: 374611a2f1180402700fad5ba7f86e390150d37b --- build.js | 52 ++++++++++++++++++++++++++++---------------- build/pre-compile.js | 12 ---------- lodash.js | 14 +++++------- 3 files changed, 38 insertions(+), 40 deletions(-) diff --git a/build.js b/build.js index e5a526ca2..e39cbfc48 100644 --- a/build.js +++ b/build.js @@ -231,6 +231,12 @@ 'findWhere': ['where'] }; + /** Used to track circular dependencies of identifiers */ + var circularDependencyMap = { + 'createCallback': ['isEqual'], + 'createIterator': ['keys'] + }; + /** Used to track Lo-Dash property dependencies of identifiers */ var propDependencyMap = { 'at': ['support'], @@ -252,19 +258,19 @@ var varDependencyMap = { 'bind': ['reNative'], 'bindKey': ['indicatorObject'], - 'createCallback': ['dependencyObject', 'indicatorObject'], - 'createIterator': ['dependencyObject', 'indicatorObject', 'objectTypes'], + 'createCallback': ['indicatorObject'], + 'createIterator': ['indicatorObject', 'objectTypes'], 'createObject': ['reNative'], 'defer': ['objectTypes', 'reNative'], 'escape': ['reUnescapedHtml'], 'escapeHtmlChar': ['htmlEscapes'], 'htmlUnescapes': ['htmlEscapes'], 'isArray': ['reNative'], - 'isEqual': ['dependencyObject', 'indicatorObject'], + 'isEqual': ['indicatorObject'], 'isObject': ['objectTypes'], 'isPlainObject': ['reNative'], 'isRegExp': ['objectTypes'], - 'keys': ['dependencyObject', 'reNative'], + 'keys': ['reNative'], 'merge': ['indicatorObject'], 'partialRight': ['indicatorObject'], 'reEscapedHtml': ['htmlUnescapes'], @@ -827,14 +833,14 @@ var getDepPaths = function(dependencies, fromPath) { fromPath || (fromPath = ''); - return dependencies.map(function(depName) { - var toPath = getPath(depName), + return dependencies.map(function(dep) { + var toPath = getPath(dep), relative = path.relative(fromPath, toPath).replace(RegExp(path.sepEscaped, 'g'), sep); if (relative.charAt(0) != '.') { relative = '.' + (relative ? sep + relative : ''); } - return relative + sep + depName; + return relative + sep + dep; }); }; @@ -846,10 +852,14 @@ // create modules for each identifier identifiers.forEach(function(identifier) { - var deps = getDependencies(identifier, true) - .concat(propDependencyMap[identifier] || []) - .concat(varDependencyMap[identifier] || []) - .sort(); + var circDeps = circularDependencyMap[identifier]; + + var deps = _.difference( + getDependencies(identifier, true) + .concat(propDependencyMap[identifier] || []) + .concat(varDependencyMap[identifier] || []) + , circDeps) + .sort(); var modulePath = getPath(identifier), depArgs = deps.join(', '), @@ -870,7 +880,16 @@ 'include=' + identifier, 'iife=' + iife.join('\n'), '-o', path.join(outputPath, modulePath + identifier + '.js') - )); + ), function(data) { + // replace deps inline + _.each(circDeps, function(dep) { + // avoid identifiers in strings + data.source = data.source.replace(RegExp('(["\'])(?:(?!\\1)[^\\n\\\\]|\\\\.)*\\1|\\b' + dep + '\\b', 'g'), function(match) { + return /^["']/.test(match) ? match : "require('" + match + "')"; + }); + }); + defaultBuildCallback(data); + }); }); // create category modules @@ -2681,11 +2700,6 @@ } }); } - if (isNoDep) { - // avoid circular dependencies - funcDependencyMap.createCallback = _.without(funcDependencyMap.createCallback, 'isEqual'); - funcDependencyMap.createIterator = _.without(funcDependencyMap.createIterator, 'keys'); - } else if (isModularize) { _.forOwn(funcDependencyMap, function(deps, funcName) { if (_.contains(deps, 'getIndexOf')) { @@ -3293,7 +3307,7 @@ // replace `_.isEqual` if (!isLodash('isEqual')) { source = replaceFunction(source, 'isEqual', [ - 'var isEqual = dependencyObject.isEqual = function(a, b, stackA, stackB) {', + 'function isEqual(a, b, stackA, stackB) {', ' if (a === b) {', ' return a !== 0 || (1 / a == 1 / b);', ' }', @@ -3389,7 +3403,7 @@ ' });', ' }', ' return result;', - '};' + '}' ].join('\n')); } // replace `_.memoize` diff --git a/build/pre-compile.js b/build/pre-compile.js index a73da1271..5ca64c551 100644 --- a/build/pre-compile.js +++ b/build/pre-compile.js @@ -331,11 +331,6 @@ 'sortBy' ]; - var depObjProps = [ - 'isEqual', - 'keys' - ]; - var props = [ 'cache', 'criteria', @@ -343,13 +338,6 @@ 'value' ]; - // minify `dependencyObject` properties - depObjProps.forEach(function(prop, index) { - source = source.replace(RegExp("\\b(dependencyObject(?:\\.|\\['))" + prop + '\\b', 'g'), function(match, prelude) { - return prelude + minNames[iteratorOptions.length + props.length + index]; - }); - }); - // minify other properties used in functions var snippets = source.match(RegExp('^( *)(?:var|function) +(?:' + funcNames.join('|') + ')\\b[\\s\\S]+?\\n\\1}', 'gm')); if (!snippets) { diff --git a/lodash.js b/lodash.js index f6a108e4d..6f876dfbb 100644 --- a/lodash.js +++ b/lodash.js @@ -21,9 +21,6 @@ /** Used internally to indicate various things */ var indicatorObject = {}; - /** Used to avoid reference errors and circular dependency errors */ - var dependencyObject = {}; - /** Used to prefix keys to avoid issues with `__proto__` and properties on `Object.prototype` */ var keyPrefix = +new Date + ''; @@ -1121,8 +1118,7 @@ * @returns {Function} Returns the compiled function. */ function createIterator() { - var data = getObject(), - keys = dependencyObject.keys; + var data = getObject(); // data properties data.shadowedProps = shadowedProps; @@ -1335,7 +1331,7 @@ * _.keys({ 'one': 1, 'two': 2, 'three': 3 }); * // => ['one', 'two', 'three'] (order is not guaranteed) */ - var keys = dependencyObject.keys = !nativeKeys ? shimKeys : function(object) { + var keys = !nativeKeys ? shimKeys : function(object) { if (!isObject(object)) { return []; } @@ -1917,7 +1913,7 @@ * }); * // => true */ - var isEqual = dependencyObject.isEqual = function(a, b, callback, thisArg, stackA, stackB) { + function isEqual(a, b, callback, thisArg, stackA, stackB) { // used to indicate that when comparing objects, `a` has at least the properties of `b` var whereIndicator = callback === indicatorObject; if (typeof callback == 'function' && !whereIndicator) { @@ -2073,7 +2069,7 @@ releaseArray(stackB); } return result; - }; + } /** * Checks if `value` is, or can be coerced to, a finite number. @@ -4767,7 +4763,7 @@ var length = props.length, result = false; while (length--) { - if (!(result = dependencyObject.isEqual(object[props[length]], func[props[length]], indicatorObject))) { + if (!(result = isEqual(object[props[length]], func[props[length]], indicatorObject))) { break; } }